如何在使用模式Spark读取csv时删除格式错误的行?

时间:2018-04-09 02:46:12

标签: apache-spark apache-spark-dataset

当我使用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中过滤掉。谢谢!

2 个答案:

答案 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)
))

使用csvschema作为

阅读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

获取更多详细信息

希望这有帮助!