Spark SQL 不支持 JSONPATH 通配符的任何解决方法
Any workaround for JSONPATH wildcard not supported in Spark SQL
spark.sql("""select get_json_object('{"k":{"value":"abc"}}', '$.*.value') as j""").show()
这会导致 null,而它应该 return 'abc'。如果我用 k
.
替换 *
它会起作用
我知道 JSONPath 支持有限 (https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-get_json_object)
但是 Spark SQL.
有办法实现吗
有一个 Spark JIRA“Any depth search not working in get_json_object ($..foo)”开放以获得完整的 JsonPath 支持。
在解决之前,恐怕创建一个使用“general-purpose”JsonPath 实现的 UDF 可能是唯一的选择:
> spark-shell --jars "json-path-2.7.0.jar"
:
scala> import com.jayway.jsonpath.JsonPath
import com.jayway.jsonpath.JsonPath
scala> val r = JsonPath.read[net.minidev.json.JSONArray]("""
| {"k":{"value":"abc"},
| "m":{"value":"def"}}
| ""","$.*.value")
r: net.minidev.json.JSONArray = ["abc","def"]
scala>
spark.sql("""select get_json_object('{"k":{"value":"abc"}}', '$.*.value') as j""").show()
这会导致 null,而它应该 return 'abc'。如果我用 k
.
*
它会起作用
我知道 JSONPath 支持有限 (https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-get_json_object)
但是 Spark SQL.
有办法实现吗有一个 Spark JIRA“Any depth search not working in get_json_object ($..foo)”开放以获得完整的 JsonPath 支持。
在解决之前,恐怕创建一个使用“general-purpose”JsonPath 实现的 UDF 可能是唯一的选择:
> spark-shell --jars "json-path-2.7.0.jar"
:
scala> import com.jayway.jsonpath.JsonPath
import com.jayway.jsonpath.JsonPath
scala> val r = JsonPath.read[net.minidev.json.JSONArray]("""
| {"k":{"value":"abc"},
| "m":{"value":"def"}}
| ""","$.*.value")
r: net.minidev.json.JSONArray = ["abc","def"]
scala>