解析一个JSON字符串Pyspark dataframe列,该列之一中具有数组字符串

时间:2019-06-01 02:43:00

标签: arrays json pyspark

我正在尝试读取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实例一行。

1 个答案:

答案 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   |
+-------------+------+----------+----------+----------+-----------+