如何使用 Spark/Scala 在 DataFrame 行中创建嵌套 JSON 对象的计数
How to create a count of nested JSON objects in a DataFrame row using Spark/Scala
我有一列 JSON 个对象字符串,如下所示:
"steps":{
"step_1":{
"conditions":{
"complete_by":"2022-05-17",
"requirement":100
},
"status":"eligible",
"type":"buy"
},
"step_2":{
"conditions":{
"complete_by":"2022-05-27",
"requirement":100
},
"status":"eligible",
"type":"buy"
}
在步骤对象中,可以有任意数量的步骤(在合理范围内)。
我的问题是,如何创建另一个 Dataframe 列来计算 row/column 中每个 JSON 字符串的步数?
我正在使用 Spark/Scala,所以我使用以下内容创建了一个 UDF:
def jsonCount (col):
val jsonCountUDF = udf(jsonCount)
val stepDF = stepData.withColumn("NumberOfSteps", jsonCountUDF(col("steps")))
这就是我卡住的地方。我想遍历步骤列中的每一行并计算步骤对象 JSON 字符串中的步骤对象。有没有人有类似任务的经验或知道简化此任务的功能?
您可以尝试 select 该子结构,然后获取列大小。
stepSize= df.select($"steps.*").columns.size
然后将其添加到您的 df
df_steps = df.withColumn("NumberOfSteps",lit(stepSize))
编辑:不要为此目的使用 UDF ...
#make some data
str = "{\"steps\":{ \"step_1\":{\"conditions\":{ \"complete_by\":\"2022-05-17\", \"requirement\":100} } , \"step_2\":{ \"status\":\"eligible\", \"type\":\"buy\" } }}"
#implement a function to return the count
def jsonCount ( jsonString ):
import json
json_obj = json.loads(jsonString)
return len( json_obj["steps"] )
#define the udf
JSONCount = udf(jsonCount, IntegerType())
#create sample dataframe
df = spark.createDataFrame( [ [str] ], ["json"] )
#run udf on dataframe
df.select( df.json, JSONCount( df.json ).alias("StepCount") ).show()
+--------------------+---------+
| json|StepCount|
+--------------------+---------+
|{"steps":{ "step_...| 2|
+--------------------+---------+
我有一列 JSON 个对象字符串,如下所示:
"steps":{
"step_1":{
"conditions":{
"complete_by":"2022-05-17",
"requirement":100
},
"status":"eligible",
"type":"buy"
},
"step_2":{
"conditions":{
"complete_by":"2022-05-27",
"requirement":100
},
"status":"eligible",
"type":"buy"
}
在步骤对象中,可以有任意数量的步骤(在合理范围内)。
我的问题是,如何创建另一个 Dataframe 列来计算 row/column 中每个 JSON 字符串的步数?
我正在使用 Spark/Scala,所以我使用以下内容创建了一个 UDF:
def jsonCount (col):
val jsonCountUDF = udf(jsonCount)
val stepDF = stepData.withColumn("NumberOfSteps", jsonCountUDF(col("steps")))
这就是我卡住的地方。我想遍历步骤列中的每一行并计算步骤对象 JSON 字符串中的步骤对象。有没有人有类似任务的经验或知道简化此任务的功能?
您可以尝试 select 该子结构,然后获取列大小。
stepSize= df.select($"steps.*").columns.size
然后将其添加到您的 df
df_steps = df.withColumn("NumberOfSteps",lit(stepSize))
编辑:不要为此目的使用 UDF ...
#make some data
str = "{\"steps\":{ \"step_1\":{\"conditions\":{ \"complete_by\":\"2022-05-17\", \"requirement\":100} } , \"step_2\":{ \"status\":\"eligible\", \"type\":\"buy\" } }}"
#implement a function to return the count
def jsonCount ( jsonString ):
import json
json_obj = json.loads(jsonString)
return len( json_obj["steps"] )
#define the udf
JSONCount = udf(jsonCount, IntegerType())
#create sample dataframe
df = spark.createDataFrame( [ [str] ], ["json"] )
#run udf on dataframe
df.select( df.json, JSONCount( df.json ).alias("StepCount") ).show()
+--------------------+---------+
| json|StepCount|
+--------------------+---------+
|{"steps":{ "step_...| 2|
+--------------------+---------+