pyspark:如何 get_json_object 用于带空格的名称(或名称中的其他奇怪字符)?

pyspark: how to get_json_object for names with spaces (or other weird characters in the name)?

通常,

F.get_json_object(name, "$.element_name")

可以很好地从这样的 JSON 对象中提取 element_name

{"element_name" : 1}

但是如果名称中有 space 怎么办?怎么引用名字?

{"element name" : 1}

这显然行不通

F.get_json_object(name, "$.elementname")

通常,这不是 pyspark 特有的问题,但似乎 pyspark(可能 java)的 jsonpath 规范可能略有不同。

对于名称对属性不友好的 JSON 键,您需要使用索引器语法。

$["element name"]

(单引号也应该有效。)

对于 Spark,以下两个之一应该有效:(1) dot-notation .name 名称不包含任何点 . 或左括号 [;或 (2) bracket-notation ['name'] 名称不包含任何单引号 ' 或 question-mark ?,例如:

F.get_json_object('name', "$['element name']")
F.get_json_object('name', "$.element name")

请参阅下面来自 source code 的 Scala JsonPathParser:

// parse `.name` or `['name']` child expressions
def named: Parser[List[PathInstruction]] =
  for {
    name <- '.' ~> "[^\.\[]+".r | "['" ~> "[^\'\?]+".r <~ "']"
  } yield {
    Key :: Named(name) :: Nil
  }

因此,如果名称包含左括号,则使用['name'],如果名称包含单引号问号,使用.name。否则你可以 select 任一个。更多工作表达式示例:

F.get_json_object('name', "$.Trader Joe's")
F.get_json_object('name', "$['amazon.com']")