问题描述
我正在通过以下代码读取数据框中的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提供的用于调试目的的实用程序。