2016-11-28 68 views
1

我有一個數據框,我groupByKey在我的第一個列有一個字符串數組,我想實例在我的數據框的新列中的新對象。Spark DataFrame實例新列

+-----------+-----------------------------------------------------------+ 
|name  |Thing              | 
+-----------+-----------------------------------------------------------+ 
|253  |[a, b, c, d, e]           | 
|095  |[f, g]              | 
|282  |[h, i, j]             | 
+-----------+-----------------------------------------------------------+ 

我的目標,我會實例有這樣的結構:

public MyObject(String name, 
       String[] Thing) 

我定義了一個caseclass使用數據框:

case class Myclass(name: String, Thing: Array[String]) 

爲了實現這個目標我使用UDF功能:

def myFunction(name : String, Thing: Array[String]): MyObject= { 
    return new MyObject(name , Thing) 
} 

我這樣的代碼:

var my_df = my_old_df.map(line=>(line(0).asInstanceOf[String],line(1).asInstanceOf[String])) 
    .groupByKey() 

val my_next_df : DataFrame= my_df.map(line => Myclass(line._1.toString,line._2.toArray)).toDF() 

val myudf= sqlContext.udf.register("myudf", myFunction _) 

val my_df_problem = my_next_df.withColumn("Object", myudf($"name", $"Thing")) 

我有instanciation問題:java.lang.UnsupportedOperationException:不支持架構類型Library.class

+0

不應該你的UDF讀取'...:MyClass'不是'...:MyObject'嗎?無論如何,你已經完成了第二行代碼。你根本不需要第3和第4行。 –

回答

1

似乎UDF必須返回MyClass類型。

val myudf= sqlContext.udf 
     .register("myudf", (name : String, thing: Array[String]) => new MyClass(name , thing))