Pyspark dataframe не сбрасывает все дубликаты - PullRequest
0 голосов
/ 19 апреля 2019

Я застрял на том, что кажется простой проблемой, но я не вижу, что я делаю неправильно, или почему не работает ожидаемое поведение .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". Это то, что я не могу понять.

Некоторые вещи, которые я уже исключил: - типы столбцов - неправильный тип ПК в - вручную передается в именах столбцов для двойной проверки

Единственное, о чем я могу думать, это то, что данные разбиваются на разделы, и, насколько мне известно, .dropDuplicates () сохраняет только первое вхождение в каждом разделе (см. Здесь: spark, dataframe отбрасывает дубликаты и сохраняет их первым ). Это кажется маловероятным в моем случае, так как мои тестовые данные невелики.

У меня нет идей. Кто-нибудь видит, почему происходит такое поведение?

1 Ответ

0 голосов
/ 20 апреля 2019

Проблема здесь должна быть с "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|
+-------+-------+-------+-------+-------------+-----------------+
...