在 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 VIEWjson_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

如何在 sparkSQL 中使用从子查询中获取单个值

sparksql怎么去掉na

在字节跳动,一个更好的企业级SparkSQL Server这么做

从 SparkSQL 在 scala 中保存 JSON

RDD和SparkSQL综合应用