【问题标题】:How to merge rows using SQL only?如何仅使用 SQL 合并行?
【发布时间】:2020-10-15 05:47:53
【问题描述】:
我既不能使用 pyspark 也不能使用 scala。我只能写SQL代码。
我有一个包含 2 列项目 ID、名称的表。
item_id, name
1 name1
1 name2
1 name3
2 name4
2 name5
我想用item_id 的名称生成结果。
item_id, names
1 name1-name2-name3
2 name4-name5
如何使用 Spark sql 创建这样的表?
【问题讨论】:
标签:
sql
apache-spark
apache-spark-sql
【解决方案1】:
Spark SQL 的美妙之处在于,一旦您拥有任何支持的语言(Scala、Java、Python、R 或 SQL)的解决方案,您就可以在某种程度上找出其他变体。
下面的 SQL 语句似乎符合您的要求:
SELECT item_id, array_join(collect_list(name), '-') as names
FROM tableName
GROUP BY item_id
在spark-shell 中,它给出以下结果:
scala> sql("select item_id, array_join(collect_list(name), '-') as names from so group by item_id").show
+-------+-----------------+
|item_id| names|
+-------+-----------------+
| 1|name1-name2-name3|
| 2| name4-name5|
+-------+-----------------+
【解决方案2】:
你可以试试下面的-
df.orderBy('names', ascending=False)
.groupBy('item_id')
.agg(
array_join(
collect_list('names'),
delimiter='-',
).alias('names')
)
【解决方案3】:
您可以使用 Spark 数据框的 groupBy 和 agg 方法以及 concat_ws 函数:
df.groupBy($"item_id").agg(concat_ws("-", collect_list($"name")).alias("names")).show()
按item_id 对字段进行分组,并通过将它们连接在一起来聚合每个名称字段。