我正在尝试读取JSON文件并解析“ jsonString”和包含数组的基础字段,并将其包含到pyspark数据框中。
这是json文件的内容。
tf.train.slice_input_producer
我能够使用以下逻辑解析字符串'jsonString'的内容并选择所需的列
[{"jsonString": "{\"uid\":\"value1\",\"adUsername\":\"value3\",\"courseCertifications\":[{\"uid\":\"value2\",\"courseType\":\"TRAINING\"},{\"uid\":\"TEST\",\"courseType\":\"TRAINING\"}],\"modifiedBy\":\"value4\"}","transactionId": "value5"}]
现在,我的最终目标是解析“ courseCertifications”中的字段“ courseType”,并为每个实例创建一行。
我正在使用以下逻辑获取“ courseType”
df = spark.read.json('path.json',multiLine=True)
df = df.withColumn('courseCertifications', explode(array(get_json_object(df['jsonString'],'$.courseCertifications'))))
我能够获取“ courseType”的内容,但是可以是如下所示的字符串
df = df.withColumn('new',get_json_object(df.courseCertifications, '$[*].courseType'))
我的最终目标是创建一个具有transactionId,adUsername,courseType列的数据框,并确保每个courseType实例一行。
答案 0 :(得分:0)
解决问题的一种优雅方法是创建json字符串的架构,然后使用from_json
函数对其进行解析
import pyspark.sql.functions as f
from pyspark.shell import spark
from pyspark.sql.types import ArrayType, StringType, StructType, StructField
df = spark.read.json('your_path', multiLine=True)
schema = StructType([
StructField('uid', StringType()),
StructField('adUsername', StringType()),
StructField('modifiedBy', StringType()),
StructField('courseCertifications', ArrayType(
StructType([
StructField('uid', StringType()),
StructField('courseType', StringType())
])
))
])
df = df \
.withColumn('tmp', f.from_json(df.jsonString, schema)) \
.withColumn('adUsername', f.col('tmp').adUsername) \
.withColumn('uid', f.col('tmp').uid) \
.withColumn('modifiedBy', f.col('tmp').modifiedBy) \
.withColumn('tmp', f.explode(f.col('tmp').courseCertifications)) \
.withColumn('course_uid', f.col('tmp').uid) \
.withColumn('course_type', f.col('tmp').courseType) \
.drop('jsonString', 'tmp')
df.show()
输出:
+-------------+------+----------+----------+----------+-----------+
|transactionId|uid |adUsername|modifiedBy|course_uid|course_type|
+-------------+------+----------+----------+----------+-----------+
|value5 |value1|value3 |value4 |value2 |TRAINING |
|value5 |value1|value3 |value4 |TEST |TRAINING |
+-------------+------+----------+----------+----------+-----------+