Databricks pyspark,使用header ='false'

问题描述

我正在通过以下代码读取数据框中的CSV文件(存在于Azure datalake存储中):

df = spark.read.load(filepath,format="csv",schema = mySchema,header="false",mode="DROPMALFORMED");

文件 filepath 包含100行和标题。我想在读取时忽略文件头,所以我定义了header="false"。 (因为有时文件带有标头,有时没有)

在读取数据框后,当我通过display(df)语句显示数据框时,我得到了所有数据并显示了100行是正确的。但是当我以前使用df.count()检查数据帧的计数时,它显示了101行。数据框是否显示带有标头的计数?还是我想念什么?

mySchema filepath 已在单元格中分别定义。

解决方法

您在读取csv文件时拥有mode="DROPMALFORMED"

  • 当有一些格式不正确的记录触发时,将其丢弃 df.show() but counts them in df.count().
  • 在您的情况下,因为标头为false并指定了架构,所以如果出现问题,spark会根据您指定的类型读取数据,因此不会显示记录

Example:

#sample data
#cat employee.csv
#id,name,salary,deptid
#1,a,1000,101
#2,b,2000,201

ss=StructType([StructField("id",IntegerType()),StructField("name",StringType()),StructField("salary",StructField("deptid",StringType())])

df=spark.read.load("employee.csv",format="csv",schema=ss,header="false",mode="DROPMALFORMED")


df.show()
#+---+----+------+------+
#| id|name|salary|deptid|
#+---+----+------+------+
#|  1|   a|  1000|   101|
#|  2|   b|  2000|   201|
#+---+----+------+------+

#issue in df.count
df.count()
#3 #has to be 2

To Fix:

在读取为数据框时添加 notNull 过滤器。

df=spark.read.load("employee.csv",mode="DROPMALFORMED").filter(col("id").isNotNull())

df.show()
#+---+----+------+------+
#| id|name|salary|deptid|
#+---+----+------+------+
#|  1|   a|  1000|   101|
#|  2|   b|  2000|   201|
#+---+----+------+------+

#fixed count
df.count()
#2

要查看格式错误的数据,请删除模式

spark.read.load("employee.csv",schema= mySchema,header="false").show(100,False)
,

根据pyspark文档,

https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrameReader

header – uses the first line as names of columns. If None is set,it uses the default value,false.

您可能需要标准化获取数据的方式(带标头或不带标头),然后设置标志。

如果您设置header = False,则火花引擎将简单地将第一行读取为数据行。

为回答您的问题,数据帧计数不计算标题。 我建议先读取数据,然后再删除标题以用于调试。

此外,display(df)是Ipython提供的python操作,我将使用dataframe.show(),它是spark提供的用于调试目的的实用程序。