【问题标题】: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')
        )
    

    【讨论】:

    • 我只能使用 SQL
    【解决方案3】:

    您可以使用 Spark 数据框的 groupBy 和 agg 方法以及 concat_ws 函数:

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

    item_id 对字段进行分组,并通过将它们连接在一起来聚合每个名称字段。

    【讨论】:

    • 我只能使用 SQL
    猜你喜欢
    • 2021-02-09
    • 2018-04-22
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 2013-01-12
    相关资源
    最近更新 更多