在databricks SQL中的字段中输出分号分隔的值

Posted

技术标签:

【中文标题】在databricks SQL中的字段中输出分号分隔的值【英文标题】:output semicolon separated values in field in databricks SQL 【发布时间】:2021-02-09 16:05:42 【问题描述】:

期望的结果:

+---------+-----------------------------+
| ID PR   | Related Repeating Event(s)  |
+---------+-----------------------------+
| 1658503 | 1615764;1639329             |
+---------+-----------------------------+  

有没有一种方法可以在不使用用户定义的聚合函数 (UDAF) 的情况下在 sql / databricks 中编写查询?我已经尝试过 concat()、GROUP_CONCAT()、LISTAGG,但这些都不起作用,或者在 databricks 中不受支持(“此函数既不是注册的临时函数,也不是在数据库‘默认’中注册的永久函数。”。

我在 databricks 文档中找到了这个用户定义的聚合函数 (UDAF) 描述,但不知道如何实现它 (https://docs.databricks.com/spark/latest/spark-sql/language-manual/sql-ref-functions-udf-aggregate.html#user-defined-aggregate-functions-udafs&language-sql)

有人能给我提示或链接吗?

我拥有的是这个基本查询:

%sql
SELECT
  pr_id,
  data_field_nm,
  field_value
FROM
  gms_us_mart.txn_pr_addtl_data_detail_trkw_glbl --(18)
WHERE
 pr_id = 1658503
 AND data_field_nm = 'Related Repeating Deviation(s)'

作为输出给出:

+---------+--------------------------------+-------------+
| pr_id   | data_field_nm                  | field_value |
+---------+--------------------------------+-------------+
| 1658503 | Related Repeating Deviation(s) | 1615764     |
| 1658503 | Related Repeating Deviation(s) | 1639329     |
+---------+--------------------------------+-------------+

正确答案是(感谢@Alex Ott):

%sql
SELECT
 pr_id AS IDPR,
  concat_ws(';', collect_list(field_value)) AS RelatedRepeatingDeviations
FROM
  gms_us_mart.txn_pr_addtl_data_detail_trkw_glbl
WHERE
  data_field_nm = 'Related Repeating Deviation(s)'
  AND pr_id = 1658503
GROUP BY
  pr_id,
  data_field_nm;

给出期望的结果:

+---------+-----------------------------+
| IDPR    | RelatedRepeatingDeviations  |
+---------+-----------------------------+
| 1658503 | 1615764;1639329             |
+---------+-----------------------------+  

【问题讨论】:

不是 udaf 方面 你能不能全部显示代码, 添加了更多上下文的基本查询 所以你有 n 行并且想要从它们中获得一个 rev。请显示输入和预期输出 我已经用我拥有的所有信息更新了问题,请参阅查询及其输出。 【参考方案1】:

只需将group bycollect_listconcat_ws 一起使用,如下所示:

获取数据
from pyspark.sql import Row
df = spark.createDataFrame([Row(**'pr_id':1658503, 'data_field_nm':'related', 'field_value':1615764), 
                            Row(**'pr_id':1658503, 'data_field_nm':'related', 'field_value':1639329)])
df.createOrReplaceTempView("abc")
然后进行查询:
%sql

select pr_id, 
  data_field_nm, 
  concat_ws(';', collect_list(field_value)) as combined 
from abc 
group by pr_id, data_field_nm

虽然这将为您提供具有固定名称的列 (combined)

【讨论】:

感谢@alex,我已经用修改后的答案更新/编辑了我的问题并得到了预期的结果。 是的,对于像我这样的菜鸟来说,手册很糟糕。您在 databricks 文档网站上获得的所有信息:“collect_list(expr) - 收集并返回非唯一元素的列表。”一个小例子对我有很大帮助,节省了数小时的搜索和尝试 是的,这是个问题 - sql 文档大多来自 Spark 文档本身。在这些情况下,sparkbyexamples.com 之类的网站可能会有所帮助 感谢 spark 网站 - 这正是我想要的 :)

以上是关于在databricks SQL中的字段中输出分号分隔的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Azure Databricks SQL 中将字段值转换为逗号分隔

Databricks/Spark SQL - 如何在地图类型字段中获取数据

databricks sql分析中的参数

使用带有 python 公式的 Databricks 数据框创建一个新的计算字段写回 sql 表

在分号分隔的列表中搜索 SQL 中的特定值

Databricks - CSV 未正确加载