在 spark-sql/pyspark 中反转
Unpivot in spark-sql/pyspark
我手头有一个问题陈述,其中我想在 spark-sql/pyspark 中反转 table。我已经阅读了文档,我可以看到目前仅支持 pivot 但不支持 un-pivot。
有什么办法可以实现吗?
让我的初始 table 看起来像这样:
当我使用下面提到的命令在 pyspark 中旋转它时:
df.groupBy("A").pivot("B").sum("C")
我得到这个作为输出:
现在我想取消旋转的旋转 table。一般来说,这个操作 may/may 不会根据我对原始 table.
的旋转方式产生原始 table
Spark-sql 目前不提供对 unpivot 的开箱即用支持。有什么办法可以实现吗?
您可以使用内置的堆栈函数,例如在 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|
+---+---+---+
我手头有一个问题陈述,其中我想在 spark-sql/pyspark 中反转 table。我已经阅读了文档,我可以看到目前仅支持 pivot 但不支持 un-pivot。 有什么办法可以实现吗?
让我的初始 table 看起来像这样:
当我使用下面提到的命令在 pyspark 中旋转它时:
df.groupBy("A").pivot("B").sum("C")
我得到这个作为输出:
现在我想取消旋转的旋转 table。一般来说,这个操作 may/may 不会根据我对原始 table.
的旋转方式产生原始 tableSpark-sql 目前不提供对 unpivot 的开箱即用支持。有什么办法可以实现吗?
您可以使用内置的堆栈函数,例如在 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|
+---+---+---+