Перевести функцию с python на pyspark - PullRequest
0 голосов
/ 23 ноября 2018

Я бы хотел сравнить два фрейма данных pyspark и получить различия в новой таблице.

Я протестировал способ сделать это с помощью python:

мой фрейм данных

data = {'name': ['NO_VALUE', 'Molly', 'Tina', 'Jake', 'Amy'],
    'year': [2012, -999999, 2013, 2014, 2014],
    'reports': [4, 24, 31, 2, 3]}
df3 = pd.DataFrame(data, index = ['Cochice', 'Pima', 'Santa Cruz', 'Maricopa', 'Yuma'])
df3

мой ссылочный фрейм данных

data_ref = {'name': ['Jaso', 'Molly', 'Tina', 'Jake', 'Amy'],
    'year': [2012, 202, 2013, 2014, 2014],
    'reports': [4, 24, 31, 2, 3]}
df_ref3 = pd.DataFrame(data_ref, index = ['Cochice', 'Pima', 'Santa Cruz', 'Maricopa', 'Yuma'])
df_ref3

Сравнение строк:

def compare_datasets(df, df_ref):
    ne_stacked = (df != df_ref).stack()
    changed = ne_stacked[ne_stacked]
    changed.index.names = ['id', 'col']
    difference_locations = np.where(df != df_ref)
    changed_from = df.values[difference_locations]
    changed_to = df_ref.values[difference_locations]
    error_test = pd.DataFrame({'from': changed_from, 'to': changed_to}, index=changed.index)
    return error_test

compare_datasets(df3, df_ref3)

Однако я хотел бы сделать это в pyspark.У кого-нибудь есть идея?

Спасибо!

1 Ответ

0 голосов
/ 23 ноября 2018

Вероятно, трудно воспроизвести именно это поведение.Я предлагаю вам одно частичное решение:

df.show()
+----------+--------+-------+-------+
|     index|    name|   year|reports|
+----------+--------+-------+-------+
|   Cochice|NO_VALUE|   2012|      4|
|      Pima|   Molly|-999999|     24|
|Santa Cruz|    Tina|   2013|     31|
|  Maricopa|    Jake|   2014|      2|
|      Yuma|     Amy|   2014|      3|
+----------+--------+-------+-------+

df_ref.show()
+----------+-----+----+-------+
|     index| name|year|reports|
+----------+-----+----+-------+
|   Cochice| Jaso|2012|      4|
|      Pima|Molly|2012|     24|
|Santa Cruz| Tina|2013|     31|
|  Maricopa| Jake|2014|      2|
|      Yuma|  Amy|2014|      3|
+----------+-----+----+-------+

df.subtract(df_ref).show()
+-------+--------+-------+-------+
|  index|    name|   year|reports|
+-------+--------+-------+-------+
|   Pima|   Molly|-999999|     24|
|Cochice|NO_VALUE|   2012|      4|
+-------+--------+-------+-------+

Или вы можете сделать медленное:

for col in df_ref.columns:
  out = df.select(col).subtract(df_ref.select(col))
  if out.first():
    print(out.collect())

[Row(name=u'NO_VALUE')]
[Row(year=-999999)]
...