假设我有以下数据集:
+--------+--------+--------+--------+
| field1 | field2 | field3 | field4 |
+--------+--------+--------+--------+
| 0 | 1 | 0.15 | 2.132 |
| 1 | 2 | 0.72 | 0.15 |
| 2 | 12 | error | |
| 3 | 75 | error | |
+--------+--------+--------+--------+
正如你所看到的,
第三场
可能包含
double
或
string
价值观。只有可能
一串
这里的值是
错误
. 万一
error
价值
第四场
完全不包含任何值(实际上在
第三场
为了可读性,我省略了这个规则,并为它们应用了相同的规则)
因此,我正在尝试完成以下任务:
-
使用窄模式读取输入(其中只包含前三个字段的描述)
-
过滤器错误
-
应用包含所有字段的新架构
所以,阅读如下:
val er_schema =
StructType(
Array(
StructField("field1", IntegerType, true),
StructField("field2", IntegerType, true),
StructField("field3", StringType, true)))
val c_schema =
StructType(
Array(
StructField("field1", IntegerType, true),
StructField("field2", IntegerType, true),
// StringType only for now, DoubleType would be used instead
StructField("field3", StringType, true),
StructField("field4", StringType, true)))
val raw = sc.read.schema(er_schema).csv(PATH)
val correctOnly = filterErr(raw)
ss.createDataframe(
correctOnly,
c_schema))
此代码属于例外:
java.lang.arrayindexoutofboundsException:3
据我所知,这是因为底层RDD只包含前三个字段。
所以,这里有一个问题:是否可以使用缩小(字段数减少的意思)模式,然后将数据帧转换为正常(包含所有字段)模式?
编辑1:
源文件在
CSV
格式如下:
0,1,0.15,2.132
1,2,0.72,0.15
2,12,error
3,75,error
我想到的可能的解决方案是在过滤错误的行后使用RDD和应用完整的模式,但我想知道是否可以只使用数据帧来完成
编辑2:
我想要的结果是:
正确的一个:
+--------+--------+--------+--------+
| field1 | field2 | field3 | field4 |
+--------+--------+--------+--------+
| 0 | 1 | 0.15 | 2.132 |
| 1 | 2 | 0.72 | 0.15 |
+--------+--------+--------+--------+
使用正确的数据类型(字段
field3
和
field4
作为双重类型)
编辑3:
这里的主要问题是
第三场
列-它不仅可以包含
双重的
价值观,但也
strings
. 我想摆脱与
一串
只使用双值保存。我试过使用两种不同的模式,但不起作用。