pyspark применить функцию к столбцу - PullRequest
0 голосов
/ 24 августа 2018

Я хочу запустить пользовательскую функцию для столбца данных. Столбец содержит длинную строку, которая содержит некоторую информацию об открытом или нажатом. Формат строки примерно такой в ​​столбце Path:

+---------------------------------------------------------------+               
|                                                           Path|
+---------------------------------------------------------------+
|/utility/tracking/opened/50DD3254-BA1D-4D0B-ADB5-6529E9C90982/0|
|/utility/tracking/tracking/ClickedUrl                          |
+---------------------------------------------------------------+

и исходный фрейм данных выглядит следующим образом

введите описание изображения здесь

Теперь я запускаю следующую пользовательскую функцию pyspark, чтобы применить ее к столбцу «путь», который находит «открыт» или «щелкнул» столбец и дает мне новый фрейм данных со столбцом «путь», который имеет значения 10 или 20, в зависимости от нуля открыто нажал или еще условие

def clickopen(x):
    if 'opened' in x.lower().split('/'):
        print(10)
    elif 'clickedurl' in x.lower().split('/'):
        print(20)
    else:
        print('null')
hunter = udf(clickopen)  
new_df = new_df.withColumn("Path", hunter("Path"))
new_df.show(n=20)

И показанные результаты равны нулю в столбце «Путь» вместо значения 10 или 20

введите описание изображения здесь

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

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Как уже упоминали другие, ваша главная проблема заключается в том, что вы печатаете значение, а не возвращаете его.Однако даже после этого исправления использование udf здесь очень неэффективно.

Вместо этого вы можете использовать pyspark.sql.functions.when() и pyspark.sql.Column.like().

Попробуйте:

import pyspark.sql.functions as f

new_df = new_df.withColumn(
    "Path",
    f.when(
        f.lower(f.col("Path")).like(r"%opened%"),
        f.lit(10)
    ).when(
        f.lower(f.col("Path")).like(r"%clickedurl"),
        f.lit(20)
    )
)

По умолчанию when вернет null, если не выполнено ни одно из условий.

0 голосов
/ 24 августа 2018

Вам нужно возвращать значения из функции, а не печатать их.Вот так -

def clickopen(x):
    if 'opened' in x.lower().split('/'):
        return 10
    elif 'clickedurl' in x.lower().split('/'):
        return 20
    else:
        return None

Я не уверен, как вернуть null в pySpark.

...