Python 获取路径基于行的\u json\u对象?

Python 获取路径基于行的\u json\u对象?,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,我有一张这样的桌子: row | key | json 0 | a | {'something':{'a':1}} 1 | b | {'something':{'a':2, 'b':3 }} 我想检索键列中定义的json中的值: row | value 0 | 1 // from $.something.a 1 | 3 // from $.something.b 在蜂巢里,你能做什么 select get_json_object(json, c

我有一张这样的桌子:

row  | key   |  json
0    | a     |  {'something':{'a':1}}
1    | b     |  {'something':{'a':2, 'b':3 }}
我想检索
列中定义的json中的值:

row | value
0   | 1 // from $.something.a
1   | 3 // from $.something.b
在蜂巢里,你能做什么

select get_json_object(json, concat("$.something.", key) from table;
它将返回正确的值。然而,在pyspark上,我没有找到复制这种行为的方法,它似乎无法基于列构建路径。我试过了

context.table("table").select(
    get_json_object(F.col("json", concat("$something.", F.col("key"))
);
它告诉我“栏目不可编辑”。但是,仅使用concat效果很好:

context.table("table")
 .select(
    concat("$something.", F.col("key").alias(path)
 );

row | path
0   | $.something.a
1   | $.something.b

我可以使用一个UDF来完成这项工作,但是有什么方法可以用PySpark现成的来完成吗?

当前的spark实现没有提供一种方法来将第二个参数作为
get\u json\u object
中的列传递(尽管它在内部将其转换为文本列并使用它)

我使用UDF实现了同样的目标:

我有输入JSON,我感兴趣的字段路径(每个JSON的路径可能不同)来自不同的文件

创建了一个UDF,它接受两个参数(JSON列和path列),并在JSON中返回该路径上的字符串值。 `

其中Path.csv是:

id,path
1, b
2, c.b
3, b
4, f.a
这是输出:

+---+----------------------------------+----+-----------+
|id |value                             |path|valfromJson|
+---+----------------------------------+----+-----------+
|1  |{ "id": 1, "b": "in 1" }          | b  |"in 1"     |
|2  |{ "id": 2, "c": {  "b": "in 2" } }| c.b|"in 2"     |
|3  |{ "id": 3, "b": "in 3" }          | b  |"in 3"     |
|4  |{ "id": 4, "f": {  "a": "in 4" } }| f.a|"in 4"     |
+---+----------------------------------+----+-----------+

当前的spark实现没有提供将第二个参数作为
get_json_object
中的列传递的方法(尽管它在内部将其转换为文字列并使用它)

我使用UDF实现了同样的目标:

我有输入JSON,我感兴趣的字段路径(每个JSON的路径可能不同)来自不同的文件

创建了一个UDF,它接受两个参数(JSON列和path列),并在JSON中返回该路径上的字符串值。 `

其中Path.csv是:

id,path
1, b
2, c.b
3, b
4, f.a
这是输出:

+---+----------------------------------+----+-----------+
|id |value                             |path|valfromJson|
+---+----------------------------------+----+-----------+
|1  |{ "id": 1, "b": "in 1" }          | b  |"in 1"     |
|2  |{ "id": 2, "c": {  "b": "in 2" } }| c.b|"in 2"     |
|3  |{ "id": 3, "b": "in 3" }          | b  |"in 3"     |
|4  |{ "id": 4, "f": {  "a": "in 4" } }| f.a|"in 4"     |
+---+----------------------------------+----+-----------+

get\u json\u对象
将字符串作为第二个参数。。。您通过调用
concat()
给它一个列,我知道这一点。但是如何根据行传递字符串呢?这是我的问题。这是一个昂贵的操作,通常不是首选操作,但您可以使用
df.flatmap
df.foreach
对行进行迭代并应用函数。您尝试过字符串串联吗<代码>“$.something.”+F.col(“key”)?我最终使用了sql,而配置单元版本的get\u json\u object
get\u json\u object
将字符串作为第二个参数。。。您通过调用
concat()
给它一个列,我知道这一点。但是如何根据行传递字符串呢?这是我的问题。这是一个昂贵的操作,通常不是首选操作,但您可以使用
df.flatmap
df.foreach
对行进行迭代并应用函数。您尝试过字符串串联吗<代码>“$.something.”+F.col(“key”)?我最终使用了sql和配置单元版本的get\u json\u对象