Как сопоставить столбец для создания нового столбца в spark sql dataframe?

#python #pandas #dataframe #apache-spark

#python #pandas #dataframe #apache-spark

Вопрос:

В python и pandas я могу создать новый столбец следующим образом:

Использование двух столбцов в pandas dataframe для создания dict.

  dict1 = dict(zip(data["id"], data["duration"]))
 

Затем я могу применить этот dict для создания нового столбца во втором фрейме данных.

 df['id_duration'] = df['id'].map(lambda x: dict1[x] if x in dict1.keys() else -1)
 

Как я могу создать новый столбец id_duration в spark sql dataframe, если у меня есть dataframe data (имеющий два столбца: id и duration ) и dataframe df (имеющий столбец id )?

Комментарии:

1. внезапно я понимаю, что это может быть решено с помощью sql join

Ответ №1:

Использование словаря было бы позором, потому что вам нужно было бы собрать весь data фрейм данных в драйвере, что очень плохо скажется на производительности и может вызвать ошибку ООМ.

Вы могли бы просто выполнить левое внешнее соединение между двумя фреймами данных и использовать na.fill для заполнения пустых значений -1 .

 data = spark.createDataFrame([(1, 10), (2, 20), (3, 30)], ['id', 'duration'])
df = spark.createDataFrame([(1, 2), (3, 4)], ['id', 'x'])

df
    .join(data.withColumnRenamed("duration", "id_duration"), ['id'], 'left')
    .na.fill(-1).show()
 
  --- --- ----------- 
| id|  x|id_duration|
 --- --- ----------- 
|  5|  6|         -1|
|  1|  2|         10|
|  3|  4|         30|
 --- --- ----------- 
 

Комментарии:

1. спасибо, это полезно. Но использование Map idea для решения этой проблемы также приветствуется, я думаю, что это может быть более распространенным.

2. Я не уверен, что понимаю. Вы хотели бы получить решение, которое использует словарь?

3. больше решений, больше свободы. я просто думаю, что это также полезно в какой-то ситуации.