Spark Java - 将同一列合并多行

时间:2017-05-23 10:04:20

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

我正在使用Java Spark,我有1个像这样的Dataframe

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

2 个答案:

答案 0 :(得分:2)

你可以按" id"分组然后使用collect_list函数获取聚合值。

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

希望这有帮助

答案 1 :(得分:0)

对我有用的实际功能是:

dataframe.groupBy(“ id”)。agg(collect_list(“ color”)。as(“ color”), collect_list(“ date”)。as(“ date”)) dataframe.createOrReplaceTempView(“ dataframe”)

然后创建一个新查询,您可以在其中使用struct()

dffinal = spark.sql(s“”“ SELECT struct(a.color)AS颜色, struct(a.date)来自数据框““”“的AS日期