Как заставить spark udf принимать список с разными типами данных? - PullRequest
0 голосов
/ 27 августа 2018

Моя основная функция определяется следующим образом:

def rowToSHA1(s: Seq[Any]): String = {
   //return sha1 of sequence
 } 
}

Вот определение моего udf:

val toSha = udf[String, Seq[Any]](rowToSHA1)

df.withColumn("shavalue",(toSha(array($"id",$"name",$"description",$"accepted")))

Это работает, когда я передаю только список строк в качестве параметра, ноя получаю сообщение об ошибке, когда есть логическое значение.

org.apache.spark.sql.AnalysisException: cannot resolve 'array(`id`, `name`, 
`description`, `accepted`)' due to data type mismatch: input to function 
array should all be the same type, but it's [string, string, string, 
boolean];;

Я изучаю использование универсальной функции, это хорошая идея?

FIX :преобразовал мой столбец в строку перед применением функции

df.withColumn("shavalue",(toSha(array($"id",$"name",$"description",$"accepted".cast("string)))

1 Ответ

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

Лучшее решение, которое я знаю для такой ситуации, - просто преобразовать все в String. Когда вы читаете / создаете DataFrame, убедитесь, что все является String, или преобразуйте его в какой-то момент. Позже вы можете конвертировать обратно в любой другой тип.

...