环境:spark 2.4.5
来源:test.csv
id,date,item1,item2,item3
0,1,111,,
0,1,,222,
0,1,,,333
1,1,111,,
1,1,,222,
1,1,,,333
目标:test.csv
id,date,item1,item2,item3
0,1,111,222,333
1,1,111,222,333
如您所见,我想将具有相同id和日期的行合并为一行。
我的解决方案:
我尝试使用zip函数来处理它,但失败了:
val soruce = spark.read("/home/user/test.csv").csv.options("header", "true")
spark.sql("SELECT id , date, arrays_zip( collect_list(item1), collect_list(item2), collect_list(item3)) FROM source GROUP BY id,date").show(false)
+---+----+-------------------------------------------------------------------------+
|id |date|arrays_zip(collect_list(item1), collect_list(item2), collect_list(item3))|
+---+----+-------------------------------------------------------------------------+
|0 |1 |[[111, 222, 333]] |
|1 |1 |[[111, 222, 333]] |
+---+----+-------------------------------------------------------------------------+
也许我应该把这个阵列炸成cols?
如果你能给我一些建议,我将不胜感激。
1条答案
按热度按时间prdp8dxp1#
使用
flatten
以及array
而不是arrays_zip
然后使用element_at
函数从每个元素中获取项。