在 SparkSql 中使用 get_json_object() 提取属性名称中带有星号的 JSON 属性
Posted
技术标签:
【中文标题】在 SparkSql 中使用 get_json_object() 提取属性名称中带有星号的 JSON 属性【英文标题】:Extract a JSON property with an asterisk in the property name using get_json_object() in SparkSql 【发布时间】:2019-01-10 22:48:27 【问题描述】:我在 Databricks 中有一个表,其中有一列(称为“属性”),其中包含 JSON 数据。我已经成功地在 SparkSql 笔记本中使用 get_json_object() 来从中检索属性,如下所示:
%sql
select distinct_id, get_json_object(properties, "$.time")
from my_table
这很好用。但是,属性列中有名称中带有星号的子属性,例如*计划。以标准方式访问这些属性,例如$.*Plan 不起作用,因为 * 对于 get_json_object() 具有特殊含义。我尝试使用转义字符访问这些属性,如下所示:
%sql
select distinct_id, get_json_object(properties, "$.\*Plan")
from my_table
... 以及其他逃生方法,但无济于事。有没有办法提取可以转义星号的 JSON 子属性?
谢谢!
【问题讨论】:
【参考方案1】:您可以使用LATERAL VIEW
和json_tuple
作为解决方法。对特殊字符并不那么挑剔,例如:
SELECT x.*
FROM my_table
LATERAL VIEW json_tuple( properties, '*Plan' ) x
或者,如果您喜欢使用 get_json_object
,您可以事先清理字符串(尽管您已经在某种程度上打败了使用 JSON 的意义):
%sql
select
distinct_id,
get_json_object(replace(properties, '*', ''), '$.Plan' ) z
from my_table
我个人无法使用任何转义方法(例如 \u0042 或 \ ),但很高兴得到纠正。
理想情况下,首先不要在您的 JSON 中放入这些奇怪的字符。
【讨论】:
以上是关于在 SparkSql 中使用 get_json_object() 提取属性名称中带有星号的 JSON 属性的主要内容,如果未能解决你的问题,请参考以下文章
Spark:在 SparkSql 中使用 map 和 reduce