Pyspark Неподдерживаемый класс литерала java.util.ArrayList

Я использую python3 в Spark (2.2.0). Я хочу применить свой UDF к указанному списку строк.

df = ['Apps A','Chrome', 'BBM', 'Apps B', 'Skype']

def calc_app(app, app_list):

    browser_list = ['Chrome', 'Firefox', 'Opera']
    chat_list = ['WhatsApp', 'BBM', 'Skype']
    sum = 0
    for data in app:
        name = data['name']
        if name in app_list:
            sum += 1
    return sum

calc_appUDF = udf(calc_app)
df = df.withColumn('app_browser', calc_appUDF(df['apps'], browser_list))
df = df.withColumn('app_chat', calc_appUDF(df['apps'], chat_list))

Но это не удалось и возвращает: «Неподдерживаемый класс литерала java.util.ArrayList»


person Radityo Tody    schedule 13.01.2018    source источник
comment
спасибо за ответ, я правильно передал 2 аргумента udf, но все равно возвращает ту же ошибку   -  person Radityo Tody    schedule 14.01.2018
comment
Есть новости по этому вопросу? Я столкнулся с той же проблемой.   -  person seiya    schedule 29.06.2018


Ответы (1)


Если я правильно понял ваше требование, вам следует попробовать это

from pyspark.sql.functions import udf, col

#sample data
df_list = ['Apps A','Chrome', 'BBM', 'Apps B', 'Skype']
df = sqlContext.createDataFrame([(l,) for l in df_list], ['apps'])
df.show()

#some lists definition
browser_list = ['Chrome', 'Firefox', 'Opera']
chat_list = ['WhatsApp', 'BBM', 'Skype']

#udf definition    
def calc_app(app, app_list):
    if app in app_list:
        return 1
    else:
        return 0
def calc_appUDF(app_list):
    return udf(lambda l: calc_app(l, app_list))

#add new columns
df = df.withColumn('app_browser', calc_appUDF(browser_list)(col('apps')))
df = df.withColumn('app_chat', calc_appUDF(chat_list)(col('apps')))
df.show()

Пример ввода:

+------+
|  apps|
+------+
|Apps A|
|Chrome|
|   BBM|
|Apps B|
| Skype|
+------+

Выход:

+------+-----------+--------+
|  apps|app_browser|app_chat|
+------+-----------+--------+
|Apps A|          0|       0|
|Chrome|          1|       0|
|   BBM|          0|       1|
|Apps B|          0|       0|
| Skype|          0|       1|
+------+-----------+--------+
person 1.618    schedule 14.01.2018
comment
Ваш подход работает, но не могли бы вы объяснить, почему функция lit () не работает? - person seiya; 29.06.2018
comment
@seiya Я не могу найти lit() в своем коде. Кстати, попробуйте добавить from pyspark.sql.functions import lit в начале, если вы использовали его в дополнение к фрагменту кода, адаптированному из моего кода. - person 1.618; 29.06.2018
comment
@Seiya, когда я пытаюсь отфильтровать столбец существующего фрейма данных, я получаю аналогичную ошибку. Что я здесь делаю не так? stackoverflow.com/questions/53374838 / - person BdEngineer; 19.11.2018