数据块 SQL string_agg

Databricks SQL string_agg

希望快点;

将一些本地 SQL 视图迁移到 Databricks 并努力寻找某些功能的转换。主要的是 string_agg 函数。

string_agg(field_name, ', ')

有谁知道如何将其转换为 Databricks SQL?

提前致谢。

您可以按照此处所述使用连接函数 https://spark.apache.org/docs/latest/api/sql/index.html#concat_ws

SELECT concat_ws(' ', 'Spark', 'SQL');

大致相当于使用 collect_setarray_join 但请注意您丢失了顺序:

%sql
SELECT col1, array_join(collect_set(col2), ',') j
FROM tmp
GROUP BY col1

我认为 STRING_AGG 不能保证顺序(除非您指定 WITHIN GROUP...ORDER BY 子句)但您应该期望顺序 not 匹配。希望订单对您的流程无关紧要,但您应该仔细检查它对您的流程没有任何影响。根据 official documentation:

[collect_list] is non-deterministic because the order of collected results depends on the order of the rows which may be non-deterministic after a shuffle.

他们最近将 STRING_AGG 的序数参数添加到 Azure SQL 数据库、托管实例和 Synapse,但大概您还没有本地功能。

Databricks SQL 支持仅针对基本 SQL 查询。因此,当前的 Databricks SQL 版本不支持面向过程的查询。这将属于新功能请求。您只能处理基本 SQL 功能 link

注意:Databricks SQL 为 SQL 用户提供了一种简单的体验,他们希望 运行 在他们的数据湖上进行快速临时查询,创建多种可视化类型来探索查询结果从不同的角度,构建和共享仪表板。它不应该取代我们目前正在处理的 Python/PySpark 中的 ETL 工作负载 运行ning。

感谢@wBob 的回答。我可以通过以下方式修改您的代码来保证排序:

array_join(array_sort(collect_set(col2)),",") j

array_sort()[= 返回的项目进行排序28=]()array_join() 将输出转换为单个字符串.