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
的机会吗?
答案 0 :(得分:1)
不确定如何直接获得带有$
符号的值,但是通常,您应该考虑将lateral view
与json_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
)来获取您想要的值。