2015-10-07 2 views
1

Когда я пытаюсь использовать пользовательскую функцию, которая возвращает объект вектор, Спарк бросает следующее исключение:нельзя использовать Vector от искрового ML Lib для DataFrame

Cause: java.lang.UnsupportedOperationException: Not supported DataType: [email protected] 

Как я могу использовать вектор в моей UDF, ? Версия Spark - 1.5.1.

UPD

val dataFrame: DataFrame = sqlContext.createDataFrame(Seq(
    (0, 1, 2), 
    (0, 3, 4), 
    (0, 5, 6) 
)).toDF("key", "a", "b") 

val someUdf = udf { 
    (a: Double, b: Double) => Vectors.dense(a, b) 
} 

dataFrame.groupBy(col("key")) 
    .agg(someUdf(avg("a"), avg("b"))) 

ответ

1

Там нет ничего плохого с UDF таковой. Похоже, вы получаете исключение, потому что вы вызываете его внутри метода agg для агрегатных столбцов. Чтобы заставить его работать, вы можете просто нажать его снаружи agg шаг:

dataFrame 
    .groupBy($"key") 
    .agg(avg($"a").alias("a"), avg($"b").alias("b")) 
    .select($"key", someUdf($"a", $"b")) 
+0

Благодарим вас за ответ. Этот же код работает, если я изменяю Vectors.dense() на i.e Array(). – Zyoma

+0

Я знаю. Похоже, что проблема связана с комбинацией вычисляемых столбцов 'agg' и' VectorUDT'. – zero323

+0

Ваш пример работает для меня. Еще раз спасибо. Но я думаю, что это поведение странно. 'SomeUdf' хорошо работает в методе' agg', если я использую некоторый примитивный тип или, например, 'Array'. Может кто-нибудь объяснить, почему это происходит? – Zyoma

Смежные вопросы