Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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
从csv加载数据帧,丢弃所有不符合';不要遵循模式_Csv_Apache Spark_Apache Spark Sql - Fatal编程技术网

从csv加载数据帧,丢弃所有不符合';不要遵循模式

从csv加载数据帧,丢弃所有不符合';不要遵循模式,csv,apache-spark,apache-spark-sql,Csv,Apache Spark,Apache Spark Sql,我试图从csv文件中读取数据并将其加载到数据帧中。现在,我尝试了以下方法 val schema=StructType(Seq( StructField(“键”,StringType,true), StructField(“值”,双重类型,false) )) val df=sc.read.schema(schema) .选项(“模式”、“格式不正确”) .csv(“C:\\Users\\raam\\IdeaProjects\\myplayway\\abc.csv”) df.show() 我的cs

我试图从csv文件中读取数据并将其加载到数据帧中。现在,我尝试了以下方法

val schema=StructType(Seq(
StructField(“键”,StringType,true),
StructField(“值”,双重类型,false)
))
val df=sc.read.schema(schema)
.选项(“模式”、“格式不正确”)
.csv(“C:\\Users\\raam\\IdeaProjects\\myplayway\\abc.csv”)
df.show()
我的csv看起来像这样

qqq
a,1
b,2.2
c,xyz
d,4.5
e,asfsdfsdf 
dd,
f,3.1
2,
,6.6
我的输出是

+----+-----+
| key|value|
+----+-----+
|   a|  1.0|
|   b|  2.2|
|   d|  4.5|
|  dd| null|
|   f|  3.1|
|   2| null|
|null|  6.6|
+----+-----+
在第2
strutfield
中,nullable为false为什么我的df中的第4行和第6行是空的?
另外,它们是一种在读取时创建两个单独df的方法,这样我就可以将丢弃的行放在一个单独的文件中?

DROPMALFORMED模式会删除不符合模式的记录(在您的记录中,值是非数字的),但它会忽略可为空性。看看这些问题:,并了解其基本原理。正如你所见,它不受欢迎,一些人试图修复它,但迄今为止没有成功

然后,您需要显式地处理您这边的空记录

val schema = StructType(Seq(
  StructField("key", StringType, true),
  StructField("value", DoubleType, false),
  StructField("corruptRecord", StringType, true)
))

val df = spark.read.schema(schema).
  option("mode", "PERMISSIVE").
  option("columnNameOfCorruptRecord", "corruptRecord").
  csv("abc.csv")

def isValid = 'corruptRecord.isNull && 'value.isNotNull
val validDf = df.filter(isValid)
val invalidDf = df.filter(!isValid)
isValid
可以用更通用的方式定义:

def isValid = schema.filter(!_.nullable)
  .foldLeft('corruptRecord.isNull)((acc, f) => acc && col(f.name).isNotNull)
至少在没有嵌套结构/数组的情况下