将 Hive 查询转换为雪花

Posted

技术标签:

【中文标题】将 Hive 查询转换为雪花【英文标题】:Convert Hive query to Snowflake 【发布时间】:2020-10-20 10:03:16 【问题描述】:

我们想更改以下查询以使用 Snowflake。

INSERT OVERWRITE INTO events_scoring.profile_to_json_with_classified_campaigns_results
SELECT to_json.ksname,
       to_json.cust_profile_id,
       concat("",concat_ws('$',sort_array(collect_list(concat($$"$$,cast(to_json.portfolio_type AS STRING),$$":"$$, cast(to_json.counter AS STRING),$$"$$)))),'') AS json_of_campaign_counters_according_to_portfolio_types
FROM
  (SELECT final.ksname,
          final.cust_profile_id,
          final.portfolio_type_final AS portfolio_type,
          count(*) AS counter
   FROM events_scoring.campaign_to_portfolio_type FINAL
   GROUP BY final.ksname,
            final.cust_profile_id,
            final.portfolio_type_final
            ORDER BY portfolio_type) to_json
GROUP BY to_json.ksname,
         to_json.cust_profile_id

提及"\"" 已替换为$$"$$

但我没有找到合适的替代 sort_array 函数。

谁能帮忙?

【问题讨论】:

【参考方案1】:

listagg 聚合函数返回与分隔符连接的字符串,类似于 concat_ws。可以与 group by 或 over() 一起使用。

select listagg(concat($$"$$,cast(to_json.portfolio_type AS STRING),$$":"$$, cast(to_json.counter AS STRING),$$"$$), "$") within group (ORDER BY cast(to_json.portfolio_type AS STRING), cast(to_json.counter AS STRING) )

【讨论】:

【参考方案2】:

您是否尝试过使用 ARRAY_AGG 而不是 collect_list?

https://docs.snowflake.com/en/sql-reference/functions/array_agg.html

类似的东西(所以它也对数组进行排序):

select array_agg(X) within group (order by X asc) from your_table;

【讨论】:

以上是关于将 Hive 查询转换为雪花的主要内容,如果未能解决你的问题,请参考以下文章

使用错误处理将整数转换为雪花中的日期

使用分区的雪花到 Hive 数据移动

雪花中的相关子查询

如何在雪花中将时间戳转换为日期

使基于雪花 Javascript 的过程查询更快

将多行转换为雪花中的一个逗号分隔值