在Hive中,当路径中有$符号时,如何正确使用get_json_object提取值

时间:2019-02-12 10:38:20

标签: json hive dollar-sign

value
{"$screen_width":375,"$app_version":"2.5.0"}

假设我有上面显示的表格。值"2.5.0"是我想要的。 我尝试使用get_json_object,但失败。 因为路径"$app_version"包含一个$符号,并且Hive将其视为根目录符号。

我尝试了几种编码方式,但都失败了,并返回了NULL

select get_json_object(value,"$.$app_version")
select get_json_object(value,"$.\\$app_version")
select get_json_object(value,"$.\$app_version")
select get_json_object(value,"$..app_version")

任何高级Hive用户都知道要修复它吗?

暂时,我使用正则表达式来解决它。

select 
    regexp_extract(
        properties
        ,'\\"\\$os_version\\":\\"[\\d?]+\\.[\\d?]+\\.[\\d?]+\\"'
        ,0
    )
    ,properties
from opd.test_json_object

但是,我很好奇这里没有使用get_json_object的机会吗?

1 个答案:

答案 0 :(得分:1)

不确定如何直接获得带有$符号的值,但是通常,您应该考虑将lateral viewjson_tuple(请参阅doc)而不是{{1 }}。在性能方面,它要快得多,我个人喜欢json列成为“正常”列的事实。

对于您的示例,我建议以下内容:

get_json_object

结果是:

-- CTE to simulate a temporary table
with json as (
  select '{"$screen_width":375,"$app_version":"2.5.0"} ' as value
)
-- actual query
select *
from json 
lateral view 
  json_tuple(value, "$screen_width", "$app_version") lv as 
    screen_width, app_version;

因此,您现在可以在+------------------------------------------------+------------------+-----------------+ | json.value | lv.screen_width | lv.app_version | +------------------------------------------------+------------------+-----------------+ | {"$screen_width":375,"$app_version":"2.5.0"} | 375 | 2.5.0 | +------------------------------------------------+------------------+-----------------+ 语句中使用lv.app_version(而不是我的select)来获取您想要的值。