Trino/Presto数组操作:移除元素、排序及生成哈希实现咨询
Trino/Presto 数组三步操作实现方案
你当前用的json_array_length是针对JSON格式字符串的长度计算函数,要完成过滤、排序、算哈希三个操作,建议先把JSON数组转成Trino/Presto原生的ARRAY类型处理,最后再做序列化算哈希,避免格式不一致问题。
各步骤对应函数说明
- 移除匹配规则的元素:用
filter()函数,传入数组和自定义匹配谓词即可,比如要移除所有值为"b"的元素,谓词写x -> x <> 'b',复杂规则直接修改谓词逻辑即可(比如移除空值写x -> x is not null、移除长度大于3的字符串写x -> length(x) <=3) - 数组重排序:用
array_sort()函数,默认按元素自然顺序升序排列,需要自定义排序逻辑时也支持传入自定义比较函数 - 生成哈希值:先把处理完成的数组用
json_format()序列化为标准JSON字符串(保证序列化结果稳定,不会因为内部存储格式差异导致哈希结果不一致),再调用对应哈希函数即可,常用的有sha256()、md5(),按业务需求选择。
可直接运行的完整示例
针对你给出的JSON数组输入["b", "a", "b", "c"],完整SQL如下:
WITH source_data AS ( -- 原始输入:你的JSON数组字符串 SELECT '["b", "a", "b", "c"]' AS raw_json_arr ) SELECT final_arr, -- 计算SHA256哈希,需要MD5的话直接把sha256替换为md5即可 sha256(to_utf8(json_format(final_arr))) AS arr_sha256_hash FROM ( SELECT -- 第二步:过滤后排序 array_sort(filtered_arr) AS final_arr FROM ( SELECT -- 第一步:JSON转原生数组 + 过滤掉值为'b'的元素 filter( cast(json_parse(raw_json_arr) AS array(varchar)), x -> x <> 'b' ) AS filtered_arr FROM source_data ) t ) t2;
运行后得到的final_arr结果为['a', 'c'],同时输出对应的稳定哈希值。
如果你的输入本身就是Trino/Presto原生的ARRAY类型字段,直接去掉cast(json_parse(xxx) as array(varchar))这层转换,把字段名直接传入filter()即可。
内容的提问来源于stack exchange,提问作者user10765213
相关产品推荐
相关产品推荐

