Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark shell:列数不为';不匹配_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala Spark shell:列数不为';不匹配

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读取数据时,是否有任何直接方法可以丢弃这些行,而不会出现

我有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读取数据时,是否有任何直接方法可以丢弃这些行,而不会出现异常,如下所示

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如果不指定数据集的模式,将无法正常工作