Как добавить столбец в DataFrame pyspark, применив функцию к уже существующему столбцу? - PullRequest
0 голосов
/ 03 апреля 2019

Я хотел бы применить функцию бининга к данным в столбце DataFrame и сохранить результат в новом столбце, который добавляется в DataFrame.

В идеале я хочу убедиться, что могу использовать любую пользовательскую функцию python с рекурсией, потому что строки в столбце могут быть массивами, и я хочу поместить каждый элемент в каждый массив. Я также хотел бы выполнить другие операции, помимо простого объединения данных в конце концов.

Я знаю, что могу добавить новый столбец с помощью withColumn(...), но я не знаю, как правильно вставить функцию, которая генерирует данные для этого нового столбца.

EDIT: Этот аналогичный вопрос решил часть проблемы - создание пользовательских функций. Однако кажется, что списки не принимаются в качестве аргументов:

def put_number_in_bin(number, bins):
    if is_number(number):
        number = float(number)
        for i, b in enumerate(bins):
            if number <= b:
                bin_selected = str(i)
                break
        return bin_selected
    else:
        return str("NULL")

binning_udf = udf(lambda (x, bins): put_number_in_bin(x, bins), StringType())

bins = [0.0, 182.0, 309.4000000000001, 540.0, 846.0, 2714.0, 5872.561999999998, 10655.993999999999, 20183.062, 46350.379999999976, 4852207.7]

df_augment = df_all.withColumn("newCol1", binning_udf(df_all.total_cost, bins))

Результатом является эта ошибка:

TypeError: Invalid argument, not a string or column: [0.0, 182.0, 309.4000000000001, 540.0, 846.0, 2714.0, 5872.561999999998, 10655.993999999999, 20183.062, 46350.379999999976, 4852207.7] of type <type 'list'>. For column literals, use 'lit', 'array', 'struct' or 'create_map' function.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...