【问题标题】:In Hive, how to properly use get_json_object to extract value when there is a `$` sign in the path在 Hive 中,当路径中有 `$` 符号时如何正确使用 get_json_object 提取值
【发布时间】:2019-07-05 23:38:21
【问题描述】:
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

【问题讨论】:

    标签: json hive dollar-sign


    【解决方案1】:

    不确定如何使用$ 符号直接获取值,但通常,您应该考虑使用lateral viewjson_tuple(参见doc)而不是get_json_object。性能方面它更快,我个人喜欢 json 列成为“普通”列的事实。

    对于你的例子,我建议如下:

    -- 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           |
    +------------------------------------------------+------------------+-----------------+
    

    因此,您现在只需在您的select 语句中使用lv.app_version(而不是我的*)即可获得您正在寻找的价值。

    【讨论】:

    • 快速回复和很大的帮助。谢谢。
    猜你喜欢
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多