在pyspark中解析JSON文件 - 在创建spark数据帧时忽略格式错误的记录

时间:2017-10-31 17:08:59

标签: python pyspark spark-dataframe

我正在创建一个spark数据帧,其中模式是从json记录中推断出来的。但是json数据集的某些行比其他行具有更多的列,因此数据帧解析失败。无论如何,我可以将空值替换为缺少额外列的记录。

raw_event_data_rdd = sc.textFile(INPUT_DATA_DIR)
pre_processed_raw_event_data_rdd = raw_event_data_rdd.map(lambda raw_event: json.loads(raw_event))
rdd_of_rows = pre_processed_raw_event_data_rdd.map(lambda x: Row(**x))
pre_processed_raw_event_data_df = sqlContext.createDataFrame(rdd_of_rows,samplingRatio=1,verifySchema=False)

我的架构非常复杂,因此我使用推断架构。如何使用pyspark处理这样的json数据集并将它们转换为数据帧。

错误:

  

:org.apache.spark.SparkException:作业因阶段失败而中止:   阶段2.0中的任务0失败4次,最近失败:丢失任务0.3   在阶段2.0(TID 255,adpiaddn-1dd28x-24a87926.us-east-1.amazon.com,   executor 49):java.lang.IllegalStateException:输入行没有   模式所需的预期值数。 8个领域   需要提供7个值。

1 个答案:

答案 0 :(得分:1)

您可以使用sqlContext.read.json将json直接加载到结构化数据框中。

假设我们在INPUT_DATA_DIR

处有样本数据
{"a":1,"b":1}
{"a":2,"b":2,"c":2}

然后,

from pyspark.sql import Row
import json
raw_event_data_rdd = sc.textFile(INPUT_DATA_DIR)
pre_processed_raw_event_data_rdd = raw_event_data_rdd.map(lambda raw_event: json.loads(raw_event))
rdd_of_rows = pre_processed_raw_event_data_rdd.map(lambda x: Row(**x))
pre_processed_raw_event_data_df = sqlContext.createDataFrame(rdd_of_rows,samplingRatio=1,verifySchema=False)
pre_processed_raw_event_data_df.show()

会产生与您相同的错误:

  

引起:java.lang.IllegalStateException:输入行没有架构所需的预期值数。需要3个字段,同时提供2个值。

但是,

pre_processed_raw_event_data_df = sqlContext.read.json(INPUT_DATA_DIR)
pre_processed_raw_event_data_df.show()

    +---+---+----+
    |  a|  b|   c|
    +---+---+----+
    |  1|  1|null|
    |  2|  2|   2|
    +---+---+----+