问题描述
通常
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']")