从csv加载数据帧,丢弃所有不符合';不要遵循模式
我试图从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
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|
+----+-----+
在第2strutfield
中,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)
至少在没有嵌套结构/数组的情况下