PySpark 数据框显示错误的值

PySpark dataframe shows wrong values

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

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|
+-------+

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

这是正在发生的事情:

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

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

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