hive lateral view如何炸开?

select 'A001' as uid,'"4066-FP00096","4056-FP00056","4056-FP00103","4056-FP00102","4056-FP00069","4034-FP00006"' as k

上面sql中的k字段是字符串格式且有重复的值,思路:先把双引号替换空,字符串转str_to_map这个函数可以自动剔除重复的值,然后lateral view 炸开, 要把4066 和 FP00096 拆分成两列,最后想得到3列, uid、4066、FP00096
最新回答
崾莣记‘伱’

2024-11-25 17:13:34

可以采用以下方法来实现:
首先用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')

这个查询首先使用regexp_replace()函数将字符串中的双引号替换为空格。然后使用str_to_map()函数将修改后的字符串转换为Map类型,并使用逗号作为键值对之间的分隔符,冒号和双引号作为键和值之间的分隔符。
接下来使用explode()函数将Map转换为多行数据。最后使用split()函数将“-”字符用作列分隔符,将结果分为两个列并重命名它们为col1和col2。
最后,过滤掉不需要的行(即包含在IN子句中的行),并返回三列uid、col1和col2的数据。
迩璇大爺哟ˇ

2024-11-25 09:54:38

你可以像下面这样使用lateral view和str_to_map函数来解决这个问题:

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"';
该查询的输出应为:

uid col1 col2
---- ---- --------
A001 4066 FP00096
最终结果中有3个字段:uid、4066和FP00096,其中uid表示唯一标识符,4066是k字段中冒号前面的部分,FP00096是冒号后面的部分。还要注意一点,上面查询中要先将字符串中的双引号替换为空格,然后再使用trim函数去除空格,这是因为在使用str_to_map函数时,它不能处理空格和双引号字符串。