2017-02-26 63 views
7

我手边有一个问题陈述,其中我想在spark-sql/pyspark中取消转换表。我已经通过了文档,我可以看到只支持pivot,但不支持un-pivot。 有没有办法实现这个目标?spark-sql/pyspark中的unpivot

让我最初的表看起来像这样

Let my initial table look like this

当我使用下述命令

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

转动这pyspark我得到这个作为输出

After pivot table looks like this

现在我想要旋转旋转的表格。一般来说,这个操作可能会/不会根据我如何旋转原始表格来生成原始表格。

Spark-sql截至目前并未提供对unpivot的开箱即用支持。有没有办法实现这一目标?

感谢 马尼什

+0

请添加包括所需结果的数据样本 –

+0

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

+0

@DuduMarkovitz现在加入 –

回答

13

您可以使用内置的堆栈功能,例如在斯卡拉:

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