我有一个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方法之后,可以使用不可预测的模式更改来处理嵌套数据。
任何想法都会非常感激。
答案 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中查找详细信息。
希望,这有帮助。