В Spark, как вызвать UDF с UDO в качестве параметров, чтобы избежать двоичной ошибки

В моем случае эта проблема возникла из-за ConnectionString в моем 64-битном Machine.Config

C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\Config

Вместо стандартного 32-битного

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Config

Чтобы исправить удаление 32-битной настройки предпочтения на вкладке «Сборка» свойств проекта

0
задан Tommy Tan 13 July 2018 в 08:01
поделиться

1 ответ

в общем случае вы не можете передавать пользовательские объекты в UDF, и вы должны вызывать только udf для ненулевых строк, иначе в вашем UDF будет исключение NullPointerException. попробуйте:

val logCount = (logs: Seq[Row]) => logs.size()
val logCountUdf = udf(logCount)

df.withColumn("LogCount", when($"LogRecords".isNotNull,logCountUdf($"LogRecords")))

или просто используйте встроенную функцию size, чтобы получить logCount:

df.withColumn("LogCount", size($"LogRecords"))
0
ответ дан Raphael Roth 17 August 2018 в 13:23
поделиться
  • 1
    Фактически, столбец не будет пустым, так как перед этим у нас есть логика фильтрации. То, что я получил здесь, упоминается в вопросе: org.apache.spark.SparkException: Не удалось выполнить определенную пользователем функцию ($ anonfun $ 1: (array & lt; binary & gt;) = & gt; int) – Tommy Tan 16 July 2018 в 02:41
  • 2
    Я вижу, что параметры udf здесь вы просто задали как Seq [Row], поэтому мы не можем использовать параметр с типами, отличными от Row? – Tommy Tan 16 July 2018 в 02:45
  • 3
    @TommyTan Извините, я не знал о том, что Sparks User-Defined-Types (это было удалено в Spark 2). Возможно, вы можете передать UDT в UDF, но проблема в другом месте – Raphael Roth 16 July 2018 в 09:21
  • 4
    Теперь он работает для UDO в качестве параметра. Но у меня есть вопрос о UDO как возвращаемом значении. – Tommy Tan 30 July 2018 в 03:19
Другие вопросы по тегам:

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