Pyspark dataframe не сбрасывает все дубликаты
Я застрял на том, что кажется простой проблемой, но я не вижу, что я делаю неправильно, или почему ожидаемое поведение.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 отбрасывает дубликаты и сохраняет их первым). Это кажется маловероятным в моем случае, поскольку мои тестовые данные невелики.
У меня нет идей. Кто-нибудь видит, почему происходит такое поведение?
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|
+-------+-------+-------+-------+-------------+-----------------+