PySpark 数据框显示错误的值

Posted

技术标签:

【中文标题】PySpark 数据框显示错误的值【英文标题】:PySpark dataframe shows wrong values 【发布时间】:2018-02-27 22:59:35 【问题描述】:

我刚刚从 Pandas 切换到 PySpark 数据帧,发现在 PySpark 数据帧中打印出相同的列会给出错误的值。这是一个例子: 使用熊猫:

df_pandas=pd.read_csv("crime.csv", low_memory=False)
print(df_pandas["CRIMEID"].head(5))

Output:

1321797
1344185
1181882
1182632
1195867

而使用 PySpark 数据框:

df_spark = sqlContext.read.format('csv').options(header='true', inferSchema='true').load('crime.csv')
df_spark.select("CRIMEID").show(5)

Output:

+-------+
|CRIMEID|
+-------+
|1321797|
|   null|
|   null|
|1344185|
|   null|
+-------+

我也没有删除任何空行。有人可以解释为什么会这样吗?非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

这是发生了什么:

当您在 Pandas 中读取 csv 文件时,会保留记录的顺序。而且由于 pandas 没有分布并将所有内容保存在内存中,因此当您在 pandas 数据帧上调用“head”方法时,该顺序不会改变。因此,您获得的输出与 pandas 从 csv 读取时的顺序相同。 另一方面,Spark 数据帧在从有序文件(例如 csv)读取时也会保留顺序,但是当您在 Spark 数据帧上调用诸如“显示”之类的操作方法时,由于洗牌的性质,会发生洗牌您可能会看到返回的记录的随机顺序。

在像 Spark 这样的分布式框架中,数据被划分并分布在集群中,肯定会发生数据的混洗。

总而言之,Spark 并没有给你错误的值,只是它以与你从 pandas 得到的不同的随机顺序返回记录。

【讨论】:

感谢@Abhishek 的精彩解释。

以上是关于PySpark 数据框显示错误的值的主要内容,如果未能解决你的问题,请参考以下文章

如何将 pyspark 数据框列中的值与 pyspark 中的另一个数据框进行比较

Pyspark - 基于列表中的值爆炸数据框

pyspark:比较给定列的值时从数据框中获取公共数据

pyspark 数据框为每一行获得第二低的值

Pyspark - 从每列中选择不同的值

PYSPARK:如何在 pyspark 数据框中找到两列的余弦相似度?