我正在创建一个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个值。
答案 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|
+---+---+----+