我正在用Java编写UDF。
我想对DateSet<Row>
执行更复杂的操作。为了那个原因
我想我需要将DataSet<Row>
作为输入传递给UDF并返回输出。这是我的代码:
UDF1<Dataset<Row>,String> myUDF = new UDF1<Dataset<Row>,String>() {
public String call(Dataset<Row> input) throws Exception {
System.out.println(input);
return "test";
}
};
// Register the UDF with our SQLContext
spark.udf().register("myUDF", myUDF, DataTypes.StringType); {
但是当我去尝试使用myUDF时,似乎callUDF函数仅接受Column
而不是DataSet<Row>
。
谁能帮助我将DataSet<Row>
作为输入参数传递给UDF?我还有其他方法可以在Spark SQL中调用UDF吗?
答案 0 :(得分:0)
但是当我去尝试使用myUDF时,似乎callUDF函数仅接受该列而不是Dataset,有人可以帮助我如何将数据集作为UDF中的输入参数进行传递。还有什么其他方法可以在Spark SQL中调用UDF
这里有几个问题。
首先,UDF是使用Columns
(其中的值)的函数。从某种意义上说,您可以使用struct
函数来组合所需的列以假装您使用整个数据集。
但是,如果您要使用整个数据集,则确实需要一个纯Java / Scala方法,该方法只接受该数据集。 Spark对此无能为力。它只是Java / Scala编程。
但是有一种非常不错的方法,我认为它并没有太多用处,即Dataset.transform:
transform [U](t:(Dataset [T])⇒Dataset [U]):Dataset [U] :用于链接自定义转换的简洁语法。
这允许链接方法接受一个数据集,该数据集使代码非常可读(并且似乎正是您想要的)。