有没有办法将rdd转换为df忽略不适合模式的行?

时间:2018-01-11 19:13:27

标签: python apache-spark pyspark spark-dataframe rdd

我有一个jsons的大文件(不能发帖,对不起),键的数量和相同键的值的数据类型也各不相同 - 有没有办法放置跟随模式的所有行(硬编码或推断)到数据帧中并将所有不符合模式的行留在rdd中? 最后,我想迭代这样一个过程,最后得到几个df,每个df都有自己的模式。

这是一个接近现实的例子:

a = [['aaa', 'bbb', 'ccc']]*22
b =[['aaa', 'bbb', 'ccc', 'ddd']]*22
rdd_1 = sc.parallelize(a+b)

rdd_1.toDF().show(30)

这失败了:

Caused by: java.lang.IllegalStateException: Input row doesn't have 
expected number of values required by the schema. 3 fields are 
required while 4 values are provided.

在这个特定的情况下,我可以形成一个函数,在少于max字段的情况下添加null,但是我在更通用的try和except方法之后,可以使用不可预测的模式更改来处理嵌套数据。

任何想法都会非常感激。

1 个答案:

答案 0 :(得分:1)

您可以将此文件加载到数据框(如果它存在于HDFS / Amazone S3等任何稳定存储中),而不是使用 rdd ,模式= PERMISSIVE。首先准备一个你的通用模式来使用。代码如下。

df = sqlContext.read.schema(<your-schema>).option("mode", "PERMISSIVE").json(<file-path>)

spark文档说 -

PERMISSIVE :在遇到损坏的记录时将其他字段设置为null,并将格式错误的字符串放入由spark.sql.columnNameOfCorruptRecord配置的新字段中。当用户设置架构时,它会为额外的字段设置null。

DROPMALFORMED :忽略整个损坏的记录。

FAILFAST :遇到损坏的记录时会抛出异常。

在此link中查找详细信息。

希望,这有帮助。