如何仅使用sql合并行?

ezykj2lf  于 2021-05-22  发布在  Spark
关注(0)|答案(3)|浏览(435)

我既不能用pyspark也不能用scala。我只能写sql代码。我有一个表,有两列item id,name。

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

如何使用sparksql创建这样的表?

ffvjumwh

ffvjumwh1#

你可以试试下面的-

df.orderBy('names', ascending=False)
    .groupBy('item_id')
    .agg(
        array_join(
            collect_list('names'),
            delimiter='-',
        ).alias('names')
    )
ttygqcqt

ttygqcqt2#

您可以使用spark data frame的groupby和agg方法以及concat\u ws函数:

df.groupBy($"item_id").agg(concat_ws("-", collect_list($"name")).alias("names")).show()

字段分组依据 item_id 以及通过将每个名称字段串联在一起来聚合它们。

m1m5dgzv

m1m5dgzv3#

sparksql的妙处在于,一旦您有了任何受支持语言(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|
+-------+-----------------+

相关问题