如何从Presto的ARRAY(MAP(VARCHAR, VARCHAR))中提取指定字段
解决方案
错误原因说明
element_at报错:该函数对数组类型要求第二个参数是整数索引(用于取数组第N个元素),只有参数是MAP类型时,才支持用字符串key取值。你直接给数组传字符串key,参数不匹配导致报错。json_extract_scalar报错:该函数仅支持JSON格式字符串作为输入,但你的Item_Details是原生的ARRAY(MAP(VARCHAR, VARCHAR))类型,并非JSON字符串,所以无法直接调用。
输出形式1:聚合后的结构化数组
通过transform函数遍历数组中的每个MAP,提取指定字段并重新组织成结构化数组:
方式1:返回MAP元素组成的数组
SELECT transform(Item_Details, map_item -> map( 'product', element_at(map_item, 'product'), 'amount', element_at(map_item, 'amount') )) AS structured_product_array FROM your_table;
方式2:返回结构体元素组成的数组(支持Spark SQL、Trino等引擎)
SELECT transform(Item_Details, map_item -> struct( element_at(map_item, 'product') AS product, element_at(map_item, 'amount') AS amount )) AS structured_product_array FROM your_table;
输出形式2:行展开的多列结构
先通过UNNEST(或Hive的LATERAL VIEW EXPLODE)将数组拆分为多行,再提取每个MAP中的字段:
标准SQL(Trino、Spark SQL等)
SELECT -- 保留原表关联字段,比如id t.id, element_at(map_item, 'product') AS product, element_at(map_item, 'amount') AS amount FROM your_table t, UNNEST(t.Item_Details) AS map_item;
Hive SQL
SELECT t.id, element_at(map_item, 'product') AS product, element_at(map_item, 'amount') AS amount FROM your_table t LATERAL VIEW EXPLODE(Item_Details) exploded_table AS map_item;
内容的提问来源于stack exchange,提问作者Jancos
相关产品推荐
相关产品推荐

