Spark-sql/pysparkでテーブルのピボットを解除したいという問題ステートメントが手元にあります。私はドキュメントを調べましたが、ピボットのみのサポートがありますが、これまでのピボット解除のサポートはありませんでした。これを達成する方法はありますか?
私の最初のテーブルは次のようになります。
以下のコマンドを使用してpysparkでこれをピボットすると:
df.groupBy("A").pivot("B").sum("C")
出力としてこれを取得します:
次に、ピボットテーブルのピボットを解除します。一般に、この操作は、元のテーブルをピボットした方法に基づいて元のテーブルを生成する場合と生成しない場合があります。
現在のSpark-sqlは、アンピボットの標準サポートを提供していません。これを達成する方法はありますか?
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|
+---+---+---+