当我使用Spark DataSet加载csv文件时。我更喜欢清楚地指定架构。但我发现有几行不符合我的架构。列应为double,但某些行为非数字值。是否可以轻松地从DataSet过滤所有不符合我的架构的行?
val schema = StructType(StructField("col", DataTypes.DoubleType) :: Nil)
val ds = spark.read.format("csv").option("delimiter", "\t").schema(schema).load("f.csv")
f.csv:
a
1.0
我更喜欢“a”可以轻松地从我的DataSet中过滤掉。谢谢!
答案 0 :(得分:4)
.option("mode", "DROPMALFORMED")
应该做的工作。
mode
(默认PERMISSIVE
):允许在解析过程中处理损坏记录的模式。
PERMISSIVE
:在遇到损坏的记录时将其他字段设置为null
,并将格式错误的字符串放入由columnNameOfCorruptRecord
配置的新字段中。什么时候
模式由用户设置,它为额外字段设置null
。
DROPMALFORMED
:忽略整个损坏的记录。
FAILFAST
:遇到损坏的记录时会抛出异常。
答案 1 :(得分:2)
如果您正在阅读CSV
文件,并且想要删除与架构不匹配的行。您可以通过将mode
选项添加为DROPMALFORMED
输入数据
a,1.0
b,2.2
c,xyz
d,4.5
e,asfsdfsdf
f,3.1
架构
val schema = StructType(Seq(
StructField("key", StringType, false),
StructField("value", DoubleType, false)
))
使用csv
和schema
作为
option
个文件
val df = spark.read.schema(schema)
.option("mode", "DROPMALFORMED")
.csv("/path to csv file ")
输出:
+-----+-----+
|key |value|
+-----+-----+
|hello|1.0 |
|hi |2.2 |
|how |3.1 |
|you |4.5 |
+-----+-----+
您可以在spark-csv
获取更多详细信息希望这有帮助!