Apache Drill:Hive表JSON字符串转对象并提取cdrreasun值
解决方案:在Apache Drill中提取Hive表JSON字符串列的指定键值
我来帮你搞定这个问题!你遇到的报错是因为FLATTEN只适用于数组类型数据,而你的列是单个JSON对象的字符串;KVGEN也需要作用在MAP/STRUCT这类结构化类型上,直接用在字符串上当然不行。下面给你两种简单可行的方法:
方法1:直接解析JSON字符串并提取指定键
Drill提供了json_parse()函数,可以把JSON格式的字符串转换成可访问的MAP类型,之后直接通过键名取值即可:
-- 使用箭头符号访问键 SELECT json_parse(your_json_column)->'cdrreasun' AS cdrreasun_value FROM your_hive_table; -- 或者用方括号语法(适合键名包含特殊字符的情况,比如你的数据里的cdrdnrar.1un、xa:lnqruup) SELECT json_parse(your_json_column)['cdrreasun'] AS cdrreasun_value FROM your_hive_table;
这个方法最直接,如果你只需要提取单个键的值,用这个就足够了。
方法2:展开所有键值对后过滤(适合需要提取多个键的场景)
如果你之后可能需要提取多个键,可以先把JSON字符串转成MAP,再用kvgen配合LATERAL VIEW展开所有键值对,最后过滤出你需要的键:
SELECT kv.key, kv.value FROM your_hive_table, LATERAL VIEW kvgen(json_parse(your_json_column)) t AS kv WHERE kv.key = 'cdrreasun';
补充说明
- 你的JSON里有些键名包含特殊字符(比如点、冒号、空格),这类键用箭头符号
->访问可能会报错,这时候方括号[]语法会更可靠,比如json_parse(your_json_column)['cdrdnrar.1un']。 - 如果JSON字符串存在格式不规范的情况,可以先使用
json_valid()函数校验,比如SELECT json_valid(your_json_column) FROM your_hive_table,确保数据格式没问题再解析。
内容的提问来源于stack exchange,提问作者Srihari Karanth
相关产品推荐
相关产品推荐

