【问题标题】:Spark Java - Merge same column multiple rowsSpark Java - 合并同一列多行
【发布时间】:2020-01-22 02:09:07
【问题描述】:

我正在使用 Java Spark,我有 1 个这样的数据框

+---+-----+------+
|id |color|datas |
+----------------+
|1  |blue  |data1|
|1  |red   |data2|
|1  |orange|data3|
|2  |black |data4|
|2  |      |data5|
|2  |yellow|     |
|3  |white |data7|
|3  |      |data8|
+----------------+

我需要修改这个数据框看起来像这样:

+---+--------------------+---------------------+
|id |color               |datas                |
+----------------------------------------------+
|1  |[blue, red, orange] |[data1, data2, data3]|
|2  |[black, yellow]     |[data4, data5]       |
|3  |[white]             |[data7, data8]       |
+----------------------------------------------+

我想合并数据以创建一个包含同一列但基于“id”列的不同行的“数组”。

我可以通过 UserDefinedAggregateFunction 完成,但我一次只能完成一列,而且处理时间太长。

谢谢

编辑:我使用的是 Spark 1.6

【问题讨论】:

    标签: java apache-spark apache-spark-sql


    【解决方案1】:

    您可以按“id”分组,然后使用collect_list 函数获取聚合值。

    dataframe.groupBy("id").agg(collect_list(struct("color")).as("color"), collect_list(struct("dates")).as("dates") )
    

    希望对你有帮助

    【讨论】:

    • 感谢您的快速回答,但不幸的是,当我尝试使用 collect_list 时,我得到了一个“org.apache.spark.sql.AnalysisException: undefined function collect_list”,我使用的是 Spark 1.6
    • 你导入函数了吗??导入静态 org.apache.spark.sql.functions.*;
    • 是的,我找到了未定义函数stackoverflow.com/questions/35324049/…的答案,我正在尝试解决它
    • 如果你从 spark sql 导入函数,它应该可以工作。
    【解决方案2】:

    对我有用的实际功能是:

    dataframe.groupBy("id").agg(collect_list("color").as("color"), 收集列表(“日期”).as(“日期”)) dataframe.createOrReplaceTempView("dataframe")

    然后创建一个可以使用 struct() 的新查询

    dffinal = spark.sql(s"""SELECT struct(a.color) AS 颜色, struct(a.date) AS dates FROM dataframe a """)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 2020-06-09
      相关资源
      最近更新 更多