有没有办法将 rdd 转换为 df 忽略不符合模式的行?
is there a way to convert an rdd to df ignoring lines that don't fit the schema?
我有一个很大的 jsons 文件(不能 post 任何,抱歉)键的数量和相同键值的数据类型也不同 - 有没有办法把所有的遵循模式(硬编码或推断)的行到数据帧中,并将所有不适合模式的行留在 rdd 中?
最终,我想遍历这样一个过程,最后得到几个 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.
在这种特定情况下,我可以形成一个函数,在小于最大字段的情况下添加 null,但我正在使用更通用的 try and except 方法,该方法可以处理具有不可预测的架构更改的嵌套数据。
如有任何想法,我们将不胜感激。
您可以将此文件加载到 dataframe 而不是使用 rdd(如果它存在于任何稳定存储中,例如 HDFS/Amazone 当然是 S3),模式 = PERMISSIVE。首先准备您的通用模式以供使用。代码如下。
df = sqlContext.read.schema(<your-schema>).option("mode", "PERMISSIVE").json(<file-path>)
spark 文档说 -
PERMISSIVE :遇到损坏的记录时将其他字段设置为空,并将格式错误的字符串放入spark.sql.columnNameOfCorruptRecord配置的新字段中。当用户设置模式时,它会为额外的字段设置 null。
DROPMALFORMED : 忽略整个损坏的记录。
FAILFAST: 遇到损坏的记录时抛出异常。
在此 link 中查找详细信息。
希望,这有帮助。
我有一个很大的 jsons 文件(不能 post 任何,抱歉)键的数量和相同键值的数据类型也不同 - 有没有办法把所有的遵循模式(硬编码或推断)的行到数据帧中,并将所有不适合模式的行留在 rdd 中? 最终,我想遍历这样一个过程,最后得到几个 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.
在这种特定情况下,我可以形成一个函数,在小于最大字段的情况下添加 null,但我正在使用更通用的 try and except 方法,该方法可以处理具有不可预测的架构更改的嵌套数据。
如有任何想法,我们将不胜感激。
您可以将此文件加载到 dataframe 而不是使用 rdd(如果它存在于任何稳定存储中,例如 HDFS/Amazone 当然是 S3),模式 = PERMISSIVE。首先准备您的通用模式以供使用。代码如下。
df = sqlContext.read.schema(<your-schema>).option("mode", "PERMISSIVE").json(<file-path>)
spark 文档说 -
PERMISSIVE :遇到损坏的记录时将其他字段设置为空,并将格式错误的字符串放入spark.sql.columnNameOfCorruptRecord配置的新字段中。当用户设置模式时,它会为额外的字段设置 null。
DROPMALFORMED : 忽略整个损坏的记录。
FAILFAST: 遇到损坏的记录时抛出异常。
在此 link 中查找详细信息。
希望,这有帮助。