【问题标题】:Spark Pivot String in PySpark [duplicate]PySpark中的Spark Pivot字符串[重复]
【发布时间】:2017-03-19 11:34:04
【问题描述】:

我在使用 Spark 重组数据时遇到问题。原始数据如下所示:

df = sqlContext.createDataFrame([
    ("ID_1", "VAR_1", "Butter"),
    ("ID_1", "VAR_2", "Toast"),
    ("ID_1", "VAR_3", "Ham"),
    ("ID_2", "VAR_1", "Jam"),
    ("ID_2", "VAR_2", "Toast"),
    ("ID_2", "VAR_3", "Egg"),
], ["ID", "VAR", "VAL"])

>>> df.show()
+----+-----+------+
|  ID|  VAR|   VAL|
+----+-----+------+
|ID_1|VAR_1|Butter|
|ID_1|VAR_2| Toast|
|ID_1|VAR_3|   Ham|
|ID_2|VAR_1|   Jam|
|ID_2|VAR_2| Toast|
|ID_2|VAR_3|   Egg|
+----+-----+------+

这是我尝试实现的结构:

+----+------+-----+-----+
|  ID| VAR_1|VAR_2|VAR_3|
+----+------+-----+-----+
|ID_1|Butter|Toast|  Ham|
|ID_2|   Jam|Toast|  Egg|
+----+------+-----+-----+

我的想法是使用:

df.groupBy("ID").pivot("VAR").show()

但我收到以下错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'GroupedData' object has no attribute 'show'

任何建议!谢谢!

【问题讨论】:

    标签: apache-spark pivot pyspark


    【解决方案1】:

    您需要在 pivot() 之后添加一个聚合。如果您确定每个 ("ID", "VAR") 对只有一个 "VAL",则可以使用 first():

    from pyspark.sql import functions as f
    
    result = df.groupBy("ID").pivot("VAR").agg(f.first("VAL"))
    result.show()
    
    +----+------+-----+-----+
    |  ID| VAR_1|VAR_2|VAR_3|
    +----+------+-----+-----+
    |ID_1|Butter|Toast|  Ham|
    |ID_2|   Jam|Toast|  Egg|
    +----+------+-----+-----+
    

    【讨论】:

    • 作为第一个“动作”,您可以让它运行缓慢。也许另一个可能的解决方案是:df.groupBy("ID").pivot("VAR").agg(concat_ws('', collect_list(col("VAL"))))。这应该运行得更快。
    • @LucasMendesMotaDaFonseca,first 在这种情况下不是一个动作,只有在直接用于 RDD 或 DF 时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 2021-10-08
    • 2020-01-02
    • 2015-07-05
    相关资源
    最近更新 更多