【问题标题】:Pyspark dataframe not dropping all duplicatesPyspark 数据框不删除所有重复项
【发布时间】:2019-09-09 17:37:03
【问题描述】:

我被困在一个看似简单的问题上,但我看不出我做错了什么,或者为什么 .dropDuplicates() 的预期行为不起作用。

我使用的变量:

print type(pk)
<type 'tuple'>
print pk
('column1', 'column4')

我有一个数据框:

df_new.show()
+-------+----------------+---------+-------+-------------+-----------------+
|column1|         column2|  column3|column4|dml_operation|      ingest_date|
+-------+----------------+---------+-------+-------------+-----------------+
|  data6|               z|   update|      z|            2|20190308190720942|
|  data7|               y|   update|      y|            2|20190308190720942|
|  data8|               x|   update|      x|            2|20190308190720942|
|  data9|               f|        f|      f|            0|20190308190720942|
|  data1|               d|        b|      c|            2|20190308190720942|
|  data4|               f|        c|      b|            1|20190308190720942|
|  data3|               a|        b|      b|            0|20190308190720942|
|  date6|this should drop|more text|      z|            2|20190308190720942|
|  data8|this should drop|     here|      x|            1|20190308190720942|
|  date6|this should drop|more text|      z|            0|20190308190720942|
+-------+----------------+---------+-------+-------------+-----------------+

然后我执行:

print_df = df_new.dropDuplicates(pk)
print_df.show()
+-------+----------------+---------+-------+-------------+-----------------+
|column1|         column2|  column3|column4|dml_operation|      ingest_date|
+-------+----------------+---------+-------+-------------+-----------------+
|  data3|               a|        b|      b|            0|20190308190720942|
|  date6|this should drop|more text|      z|            2|20190308190720942|
|  data7|               y|   update|      y|            2|20190308190720942|
|  data8|               x|   update|      x|            2|20190308190720942|
|  data9|               f|        f|      f|            0|20190308190720942|
|  data4|               f|        c|      b|            1|20190308190720942|
|  data6|               z|   update|      z|            2|20190308190720942|
|  data1|               d|        b|      c|            2|20190308190720942|
+-------+----------------+---------+-------+-------------+-----------------+

如您所见,该函数对包含“data8 和 x”的行按预期工作,但只删除“data6 和 z”的两个重复项之一。这是我想不通的。

我已经排除了一些事情: - 列类型 - 输入的 pk 类型错误 - 手动传入列名以进行仔细检查

我唯一能想到的另一件事是数据正在被分区,据我所知 .dropDuplicates() 只保留每个分区中的第一次出现(参见此处:spark dataframe drop duplicates and keep first)。在我的情况下这似乎不太可能,因为我的测试数据很小。

我没有想法。有谁知道为什么会发生这种行为?

【问题讨论】:

  • 为什么它是“date6”而不是“data6”,不像其他列值?...尝试将其更改为“data6”并执行,它工作正常。但是,我不确定原因。可能是“日期”是内置数据类型。
  • @JimTodd 你是对的。一个非常简单而尴尬的疏忽。如果你想发布答案,我会给你信用

标签: python pyspark drop-duplicates


【解决方案1】:

这里的问题应该是“date6”。如果它是“data6”,则会按预期删除重复项。这可能是因为date 在 python 中被认为是一种数据类型。

>>> df_new.show()
+-------+----------------+---------+-------+-------------+-----------------+
|column1|         column2|  column3|column4|dml_operation|      ingest_date|
+-------+----------------+---------+-------+-------------+-----------------+
|  data6|               z|   update|      z|            2|20190308190720942|
|  data7|               y|   update|      y|            2|20190308190720942|
|  data8|               x|   update|      x|            2|20190308190720942|
|  data9|               f|        f|      f|            0|20190308190720942|
|  data1|               d|        b|      c|            2|20190308190720942|
|  data4|               f|        c|      b|            1|20190308190720942|
|  data3|               a|        b|      b|            0|20190308190720942|
|  data6|this should drop|more text|      z|            2|20190308190720942|
|  data8|this should drop|     here|      x|            1|20190308190720942|
|  data6|this should drop|more text|      z|            0|20190308190720942|
+-------+----------------+---------+-------+-------------+-----------------+

>>> df_new.dropDuplicates(['column1','column4']).show()
+-------+-------+-------+-------+-------------+-----------------+
|column1|column2|column3|column4|dml_operation|      ingest_date|
+-------+-------+-------+-------+-------------+-----------------+
|  data3|      a|      b|      b|            0|20190308190720942|
|  data7|      y| update|      y|            2|20190308190720942|
|  data8|      x| update|      x|            2|20190308190720942|
|  data9|      f|      f|      f|            0|20190308190720942|
|  data4|      f|      c|      b|            1|20190308190720942|
|  data6|      z| update|      z|            2|20190308190720942|
|  data1|      d|      b|      c|            2|20190308190720942|
+-------+-------+-------+-------+-------------+-----------------+

【讨论】:

  • 很好,总是简单的事情!谢谢!
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 2021-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
相关资源
最近更新 更多