Как ссылаться на значение строки DataFrame в пользовательской функции Spark SQL? [Дубликат]

  1. Всегда пытайтесь отправлять заголовки в почтовую функцию.
  2. Если вы отправляете почту через localhost, выполните настройки smtp для отправки почты.
  3. Если вы отправляете почту через затем проверьте, включена ли функция отправки электронной почты на вашем сервере.
9
задан zero323 25 May 2016 в 04:59
поделиться

2 ответа

Самое чистое решение - передать дополнительные аргументы с помощью закрытия:

def make_topic_word(topic_words):
     return udf(lambda c: label_maker_topic(c, topic_words))

df = sc.parallelize([(["union"], )]).toDF(["tokens"])

(df.withColumn("topics", make_topic_word(keyword_list)(col("tokens")))
    .show())

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

Если вы хотите использовать свой текущий UDF и передать topic_words прямо, вам придется преобразовать его в литерал столбца first:

from pyspark.sql.functions import array, lit

ks_lit = array(*[array(*[lit(k) for k in ks]) for ks in keyword_list])
df.withColumn("ad", topicWord(col("tokens"), ks_lit)).show()

В зависимости от ваших данных и требований могут быть альтернативные, более эффективные решения, которые не требуют UDF (взорвать + агрегат + сбой) или поисковые запросы (хеширование + векторные операции).

23
ответ дан zero323 22 August 2018 в 02:21
поделиться
  • 1
    Я думаю, вам также нужно указать тип вашего вызова udf в make_topic_word – user2739472 28 June 2018 в 05:24

Следующее работает отлично, когда любой внешний параметр может быть передан в UDF (измененный код, чтобы помочь кому-либо)

topicWord=udf(lambda tkn: label_maker_topic(tkn,topic_words),StringType())
myDF=myDF.withColumn("topic_word_count",topicWord(myDF.bodyText_token))
8
ответ дан Jay 22 August 2018 в 02:21
поделиться
  • 1
    Это работает, но я был бы осторожен с этим, потому что udf будет иметь значение topic_words в момент определения udf. Поэтому изменение topic_words и повторное использование udf позже не сработает - оно будет по-прежнему использовать значение topic_words во время определения udf. – CHP 24 February 2018 в 01:13
Другие вопросы по тегам:

Похожие вопросы: