Scala Spark shell:列数不为';不匹配
我有csv格式的文件,由分隔符管道“|”分隔。数据集有2列,如下所示Scala Spark shell:列数不为';不匹配,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有csv格式的文件,由分隔符管道“|”分隔。数据集有2列,如下所示 Column1|Column2 1|Name_a 2|Name_b 但有时我们只收到一列值,而另一列值丢失,如下所示 Column1|Column2 1|Name_a 2|Name_b 3 4 5|Name_c 6 7|Name_f 因此,任何列号不匹配的行对我们来说都是垃圾值。对于上面的示例,它将是列值为3、4和6的行,我们希望丢弃这些行。在从spark shell读取数据时,是否有任何直接方法可以丢弃这些行,而不会出现
Column1|Column2
1|Name_a
2|Name_b
但有时我们只收到一列值,而另一列值丢失,如下所示
Column1|Column2
1|Name_a
2|Name_b
3
4
5|Name_c
6
7|Name_f
因此,任何列号不匹配的行对我们来说都是垃圾值。对于上面的示例,它将是列值为3、4和6
的行,我们希望丢弃这些行。在从spark shell读取数据时,是否有任何直接方法可以丢弃这些行,而不会出现异常,如下所示
val readFile = spark.read.option("delimiter", "|").csv("File.csv").toDF(Seq("Column1", "Column2"): _*)
当我们试图读取该文件时,会出现以下异常
java.lang.IllegalArgumentException: requirement failed: The number of columns doesn't match.
Old column names (1): _c0
New column names (2): Column1, Column2
at scala.Predef$.require(Predef.scala:224)
at org.apache.spark.sql.Dataset.toDF(Dataset.scala:435)
... 49 elided
您可以指定数据文件的架构,并允许某些列为空。在scala中,它可能看起来像:
val schm = StructType(
StructField("Column1", StringType, nullable = true) ::
StructField("Column3", StringType, nullable = true) :: Nil)
val readFile = spark.read.
option("delimiter", "|")
.schema(schm)
.csv("File.csv").toDF
如果列不为空,则可以按列筛选数据集。阅读时,只需将
dropmorformed
模式添加到以下选项中即可。设置此选项将使Spark删除损坏的记录
val readFile = spark.read
.option("delimiter", "|")
.option("mode", "DROPMALFORMED") // Option to drop invalid rows.
.csv("File.csv")
.toDF(Seq("Column1", "Column2"): _*)
这是记录在案的。它不起作用。。还是有同样的问题。。甚至检查了doc:(我相信mode:DROPMALFORMED如果不指定数据集的模式,将无法正常工作