2017-01-09 110 views
0

我需要一个UDF2,它接受两个参数作为对应于String和mllib.linalg.Vector类型的两个Dataframe列的输入,并返回一个Tuple2。这是可行的吗?如果是的话,我该如何注册这个udf()?我可以从apache spark UDF(java中)返回一个Tuple2吗?

hiveContext.udf().register("getItemData", get_item_data, WHAT GOES HERE FOR RETURN TYPE?); 

UDF的定义如下:

UDF2<String, org.apache.spark.mllib.linalg.Vector, Tuple2<String, org.apache.spark.mllib.linalg.Vector>> get_item_data = 
      (String id, org.apache.spark.mllib.linalg.Vector features) -> { 
     return new Tuple2<>(id, features); 
    }; 

回答

1

那还有哪些可以如下定义一个schema

import org.apache.spark.sql.types.DataType; 
import org.apache.spark.sql.types.DataTypes; 
import org.apache.spark.mllib.linalg.VectorUDT; 

List<StructField> fields = new ArrayList<>(); 
fields.add(DataTypes.createStructField("id", DataTypes.StringType, false)); 
fields.add(DataTypes.createStructField("features", new VectorUDT(), false)); 
DataType schema = DataTypes.createStructType(fields); 

,但如果你需要的仅仅是一个struct没有任何额外加工org.apache.spark.sql.functions.struct应该诀窍:

df.select(struct(col("id"), col("features")); 
相关问题