Pyspark datafame.limit() 和 drop_duplicates() 给出错误的输出

Pyspark datafame.limit() and drop_duplicates() giving wrong outputs

我正在使用 Azure Databricks 集群。

  1. Worker 和 Driver 类型:Standard_DS4_v2 规格:28.0 GB 内存,8 内核,1.5 DBU
  2. Databricks 运行时版本:6.1(包括 Apache Spark 2.4.4、Scala 2.11)

我有一个 pyspark 数据框 ttonag_algnd_prdictn_df1。这有大约 32,000 rows.This 数据帧是使用 spark.read(...) 从 DB2 中提取的。我只是使用 limit 关键字从中取出 10 行。


a = ttonag_algnd_prdictn_df1.limit(10)

a.show() 给出(为了便于阅读,我确实将文件放入文本文件并使其在 1 行中全部可见)

TONAG_ALGND_PRDICTN_ID,TONAG_MGT_YR,LINE_SGMT_NBR|TRAK_TYP_CD|BGN_MP_NBR|END_MP_NBR|TRAK_SDTRAK_NBR|ALGND_BGN_MP_NBR|ALGND_END_MP_NBR 1 2017 1 M 165.475 168.351 0 165.475 168.351 1 2018 1 M 165.475 168.351 0 165.475 168.351 1 2019 1 M 165.475 168.351 0 165.475 168.351 2 2016 1 M 395.225 405.698 0 395.225 405.698 2 2017 1 M 395.225 405.698 0 395.225 405.698 2 2018 1 M 395.225 405.698 0 395.225 405.698 2 2019 1 M 395.225 405.698 0 395.225 405.698 3 2016 1 M 412.005 422.198 0 412.005 422.198 3 2017 1 M 412.005 422.198 0 412.005 422.198

现在我进行以下操作

  1. select 来自 'a' 和 drop_duplicates.
  2. 的列子集

unique_mp_pair_df = a.select("LINE_SGMT_NBR","TRAK_TYP_CD","TRAK_SDTRAK_NBR","ALGND_BGN_MP_NBR","ALGND_END_MP_NBR") unique_mp_pair_df.show()

+-------------+-----------+---------------+----------------+----------------+ |LINE_SGMT_NBR|TRAK_TYP_CD|TRAK_SDTRAK_NBR|ALGND_BGN_MP_NBR|ALGND_END_MP_NBR| +-------------+-----------+---------------+----------------+----------------+ | 1| M| 0 | 165.47500| 168.35100| | 1| M| 0 | 165.47500| 168.35100| | 1| M| 0 | 165.47500| 168.35100| | 1| M| 0 | 165.47500| 168.35100| | 1| M| 0 | 395.22500| 405.69800| | 1| M| 0 | 395.22500| 405.69800| | 1| M| 0 | 395.22500| 405.69800| | 1| M| 0 | 395.22500| 405.69800| | 1| M| 0 | 412.00500| 422.19800| | 1| M| 0 | 412.00500| 422.19800| +-------------+-----------+---------------+----------------+----------------+

unique_mp_pair_df = unique_mp_pair_df.drop_duplicates()

现在我希望行是唯一的。但是我得到的值根本没有意义。

unique_mp_pair_df.show()

+-------------+-----------+---------------+----------------+----------------+ |LINE_SGMT_NBR|TRAK_TYP_CD|TRAK_SDTRAK_NBR|ALGND_BGN_MP_NBR|ALGND_END_MP_NBR| +-------------+-----------+---------------+----------------+----------------+ | 7101| M| 0 | 11.29000| 24.88200| +-------------+-----------+---------------+----------------+----------------+

以上是ttonag_algnd_prdictn_df1中的一行。但是在将行限制为 10 之后,这不包括在内。如上图所示 a.show()

有人请帮助我理解这一点。我究竟做错了什么?非常感谢任何帮助。

你要明白spark执行的惰性,limit是随机的

你的第一个 a.limit().show() 和第二个 a.limit().drop_duplicates.show() 是两个不同的执行。而且由于limit是随机选择10行,所以两次不同的show可能会导致两种不同的结果。