Pyspark 数据框不删除所有重复项
Pyspark dataframe not dropping all duplicates
我被一个看似简单的问题困住了,但我看不出我做错了什么,或者为什么 .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 and x" 的行按预期工作,但只删除 "data6 and z" 的两个重复项之一。这是我想不通的。
有些事情我已经排除了:
- 列类型
- 输入的 pk 类型错误
- 手动传递列名以进行双重检查
我唯一能想到的另一件事是数据正在被分区,据我所知,.dropDuplicates() 只保留每个分区中的第一次出现(参见此处:spark dataframe drop duplicates and keep first)。这在我看来不太可能,因为我的测试数据很小。
我没主意了。有谁知道为什么会发生这种行为?
这里的问题应该与“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|
+-------+-------+-------+-------+-------------+-----------------+
我被一个看似简单的问题困住了,但我看不出我做错了什么,或者为什么 .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 and x" 的行按预期工作,但只删除 "data6 and z" 的两个重复项之一。这是我想不通的。
有些事情我已经排除了: - 列类型 - 输入的 pk 类型错误 - 手动传递列名以进行双重检查
我唯一能想到的另一件事是数据正在被分区,据我所知,.dropDuplicates() 只保留每个分区中的第一次出现(参见此处:spark dataframe drop duplicates and keep first)。这在我看来不太可能,因为我的测试数据很小。
我没主意了。有谁知道为什么会发生这种行为?
这里的问题应该与“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|
+-------+-------+-------+-------+-------------+-----------------+