2017-02-26 16 views
7

spark-sql/pysparkのテーブルをunpivotしたい問題文があります。私はドキュメンテーションを見てきましたが、私はピボットだけのサポートがあることが分かりましたが、これまでのピボットをサポートしていませんでした。 これを達成する方法はありますか?spark-sql/pysparkのunpivot

私は以下の使用pysparkでこれを旋回したときに私の最初の表は、この

Let my initial table look like this

のように見てみましょう、私は、出力

After pivot table looks like this

としてこれを取得するコマンド

df.groupBy("A").pivot("B").sum("C") 

を述べました

今度はピボットテーブルをピボット解除したい。一般に、この操作は元のテーブルをどのように旋回させたかに基づいて元のテーブルを生成することができます。

現在、Spark-sqlはunpivotのサポートをデフォルトで提供していません。私はこれを達成する方法はありますか?

おかげ マニッシュ

+0

必要な結果を含むデータサンプルを追加してください。 –

+0

? ........................... –

+0

@DuduMarkovitzが今追加されました –

答えて

13

あなたはScalaでは、たとえば、スタック機能で構築を使用することができます。

scala> val df = Seq(("G",Some(4),2,None),("H",None,4,Some(5))).toDF("A","X","Y", "Z") 
df: org.apache.spark.sql.DataFrame = [A: string, X: int ... 2 more fields] 

scala> df.show 
+---+----+---+----+ 
| A| X| Y| Z| 
+---+----+---+----+ 
| G| 4| 2|null| 
| H|null| 4| 5| 
+---+----+---+----+ 


scala> df.select($"A", expr("stack(3, 'X', X, 'Y', Y, 'Z', Z) as (B, C)")).where("C is not null").show 
+---+---+---+ 
| A| B| C| 
+---+---+---+ 
| G| X| 4| 
| G| Y| 2| 
| H| Y| 4| 
| H| Z| 5| 
+---+---+---+ 

またはpyspark中:

In [1]: df = spark.createDataFrame([("G",4,2,None),("H",None,4,5)],list("AXYZ")) 

In [2]: df.show() 
+---+----+---+----+ 
| A| X| Y| Z| 
+---+----+---+----+ 
| G| 4| 2|null| 
| H|null| 4| 5| 
+---+----+---+----+ 

In [3]: df.selectExpr("A", "stack(3, 'X', X, 'Y', Y, 'Z', Z) as (B, C)").where("C is not null").show() 
+---+---+---+ 
| A| B| C| 
+---+---+---+ 
| G| X| 4| 
| G| Y| 2| 
| H| Y| 4| 
| H| Z| 5| 
+---+---+---+ 
+0

上記の答えに相当するpysparkコードを入力してください。 – Afaq

+0

ありがとうございます。 :) – Afaq

+0

私はここに与えられたpysparkコードを使ってみましたが、その性能は悪いと思われます。ユニオンを使用してすべてのクエリをピボット・ダウンすると、このコードに比べてパフォーマンスが向上しました。パフォーマンスを改善するためにここで行うことができる調整がありますか? – Afaq

関連する問題