繁体   English   中英

在 spark-sql/pyspark 中取消旋转

[英]Unpivot in spark-sql/pyspark

我手头有一个问题陈述,其中我想在 spark-sql/pyspark 中取消透视表。 我已经阅读了文档,我可以看到目前仅支持枢轴,但不支持非枢轴。 有没有办法实现这一目标?

让我的初始表看起来像这样:

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

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

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

我得到这个作为输出:

数据透视表后看起来像这样

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

到目前为止,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中的表。 我已经阅读了文档,并且可以看到到目前为止仅支持数据透视,但不支持取消数据透视。 有没有办法可以做到这一点?

让我的初始表如下所示:

让我的初始表格如下所示

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

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

我得到这个作为输出:

枢纽分析表看起来像这样之后

现在,我想取消透视表。 通常,此操作可能会/可能不会基于我对原始表的透视方式产生原始表。

截至目前,Spark-sql尚未提供对unpivot的开箱即用支持。 有没有办法可以做到这一点?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM