Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 在spark sql/pyspark中取消Pivot_Apache Spark_Pyspark_Apache Spark Sql_Unpivot - Fatal编程技术网

Apache spark 在spark sql/pyspark中取消Pivot

Apache spark 在spark sql/pyspark中取消Pivot,apache-spark,pyspark,apache-spark-sql,unpivot,Apache Spark,Pyspark,Apache Spark Sql,Unpivot,我手头有一个问题陈述,我想在spark sql/pyspark中取消Pivot表。我已经阅读了文档,我可以看到目前只支持pivot,但不支持un pivot。 有什么办法可以做到这一点吗 让我的初始表如下所示: 当我使用下面提到的命令在pyspark中旋转此文件时: df.groupBy("A").pivot("B").sum("C") 我将此作为输出: 现在,我要取消Pivot数据透视表。通常,根据我对原始表的透视方式,此操作可能/可能不会生成原始表 Spark sql目前还不提供对un

我手头有一个问题陈述,我想在spark sql/pyspark中取消Pivot表。我已经阅读了文档,我可以看到目前只支持pivot,但不支持un pivot。 有什么办法可以做到这一点吗

让我的初始表如下所示:

当我使用下面提到的命令在pyspark中旋转此文件时:

df.groupBy("A").pivot("B").sum("C")
我将此作为输出:

现在,我要取消Pivot数据透视表。通常,根据我对原始表的透视方式,此操作可能/可能不会生成原始表


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|
+---+---+---+
或者在Pypark中:

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|
+---+---+---+

为什么不按
A,B
对原始表进行分组?您是否总是希望X、Y和Z的行,即使它们没有值(例如,g没有Z)?另请参阅,我尝试使用此处给出的pyspark代码,但其性能似乎很差。与此代码相比,使用UNIONALL查询实现pivot down给了我更好的性能。我们可以在这里做一些调整来提高性能吗?太棒了。请发送stack()文档的链接好吗?找不到。它的用法与配置单元中的用法相同:您确定这是结果吗?编写“as(B,C)”不起作用,因为他希望输出1列。我的结果是一个包含所有值的单列,即C列。缺少B列。我做错了什么?这很有趣-我一直在想一个函数来取消Pivot数据帧,这是我第一次看到干净的东西。对于那些对基准测试感兴趣的人来说,不要忘记由
explode(array({struct(,)}*)
组成的解决方案。