可以采用以下方法来实现: 首先用regexp_replace函数将双引号替换为空格,并用str_to_map函数将字符串转为map类型。这里需要用到两个正则表达式,一个替换双引号,一个替换逗号: select map_from_entries(split(regexp_replace(regexp_replace('"4066-FP00096","4056-FP00056","4056-FP00103","4056-FP00102","4056-FP00069","4034-FP00006"', '[",]', ''), ' ', ','), ',', '\"\"', ''), null) as k_map; 然后使用lateral view和posexplode函数将map中的键值对按行展开,注意使用lateral view需要将map类型的列用lateral view关键字包裹起来: select uid, col as k_pair from table_name lateral view explode(k_map) t as col_val, col; 这样就可以将map展开成2列,一列是键名,一列是键值。 最后用split函数将键值拆分成两个字段: select uid, split(k_pair, '-')[0] as k1, split(k_pair, '-')[1] as k2 from table_name lateral view explode(k_map) t as col_val, col as k_pair; 这样就得到了最终的结果,3列,分别是 uid、4066 和 FP00096。
萌攻
2024-11-25 08:41:34
以下是可以实现所述思路的SQL代码:
SELECT uid, split(kv,'-')[0] AS col1, split(kv,'-')[1] AS col2 FROM ( SELECT uid, str_to_map(regexp_replace(k, '"', ''), ',', ':"', '","') AS map FROM my_table ) t LATERAL VIEW explode(map) exploded_table AS kv, v WHERE kv IN ('4066-FP00096','4056-FP00056','4056-FP00103','4056-FP00102','4056-FP00069','4034-FP00006')
SELECT uid, split(kv_pairs[0], "-")[0] AS col1, split(kv_pairs[0], "-")[1] AS col2 FROM (SELECT 'A001' AS uid, split(trim(replace(replace(k, '"', ''), ',', ':')), ':') AS kv_pairs FROM table_name ) t LATERAL VIEW explode( str_to_map(concat('{', concat_ws(',', kv_pairs), '}')) ) exploded_kv AS k, v WHERE exploded_kv.key = '"4066-FP00096"'; 该查询的输出应为: