get_json_object() - 在 Impala 中解析 json 字符串 - 无法解析以数字开头的键

Posted

技术标签:

【中文标题】get_json_object() - 在 Impala 中解析 json 字符串 - 无法解析以数字开头的键【英文标题】:get_json_object() - parsing a json string in Impala - Unable to parse the key starting with a number 【发布时间】:2021-07-03 08:19:06 【问题描述】:

我正在处理一个大表(mytable),我必须在其中解析一个字符串类型的列。 column(value) 是一个 json 字符串,如下所示。 我的表 -->

id key value
1 bgtn "3Dtyu":"4gg","3tyi":34.98,"rty_amt":45.99,"4ftyh":"5AA"

我已经在 Impala (Hue) 中尝试过下面提到的查询

select get_json_object(value,"$.3Dtyu") as value
from mytable
where id=1;

错误信息:

errorMessage="UDF 错误: 无法解析 json 路径'$.3Dtyu': 位置 2 的预期键\n"

我也尝试了几件事:

    代码 1
select get_json_object(value,"$.*") as value
from mytable
where id=1;

输出:

value
["4gg",34.98,45.99,"5AA"]
    代码 2
select get_json_object(value,"$.rty_amt") as value
from mytable
where id=1;

输出:

value
[45.99]

但是当解析其中以数字开头的特定键时,get_json_object 失败。 我将非常感谢您的帮助。

谢谢!

【问题讨论】:

看起来你需要更新你的数据库引擎:issues.apache.org/jira/plugins/servlet/mobile#issue/IMPALA-8547 【参考方案1】:

尝试转换为 MAP:删除大括号和双引号,然后使用 str_to_map 函数。

演示:

select mymap['3Dtyu'] as `3Dtyu`,
       mymap['3tyi'] as `3tyi`
from
(
select str_to_map(regexp_replace('"3Dtyu":"4gg","3tyi":34.98,"rty_amt":45.99,"4ftyh":"5AA"', '\\|\\|"','')) as mymap
)s

结果:

 3dtyu       3tyi
  
  4gg        34.98

【讨论】:

我收到您提供的演示的语法错误。错误:ParseException:第 7 行中的语法错误:未定义:选择 mymap['3Dtyu'] 作为3Dtyu,^ 遇到:[ 预期:AND、AS、BETWEEN、DEFAULT、DIV、FROM、ILIKE、IN、IREGEXP、IS , LIKE, LIMIT, NOT, OR, ORDER, REGEXP, RLIKE, UNION, COMMA, IDENTIFIER 引起:异常:语法错误 @AnukritiSingh 我在 Hive 上对其进行了测试。不幸的是,我没有 Impala 来测试它。尝试以不同的方式命名列。

以上是关于get_json_object() - 在 Impala 中解析 json 字符串 - 无法解析以数字开头的键的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Hive (get_json_object) 查询结构数组?

get_json_object() - 在 Impala 中解析 json 字符串 - 无法解析以数字开头的键

在 SparkSql 中使用 get_json_object() 提取属性名称中带有星号的 JSON 属性

json数组直接解析

Hive -解析json(get_json_object)

Hive 中 get_json_object 函数的使用