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

问题描述

通常

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

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

{"element_name" : 1}

但是如果名称中有空格怎么办?如何引用名字?

{"element name" : 1}

这显然行不通

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

通常,这不是pyspark特有的问题,但似乎pyspark(也许还有Java)对于jsonpath的规格可能略有不同。

解决方法

对于名称不适合属性的JSON密钥,您需要使用索引器语法。

$["element name"]

(单引号也可以。)

,

对于Spark,应使用以下两个之一:(1)点号.name,其名称不包括任何点.或左括号[;或(2)括号符号['name']的名称不包括任何单引号'或问号?,例如:

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
  }

因此,如果名称包含 dot 开括号,则使用['name'](如果名称包含单引号或问号,请使用.name。否则,您可以选择其中一个。工作表达式的更多示例:

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