如何在UDF中传递Row?

时间:2018-12-16 19:20:25

标签: java apache-spark apache-spark-sql

我正在用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吗?

1 个答案:

答案 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] :用于链接自定义转换的简洁语法。

这允许链接方法接受一个数据集,该数据集使代码非常可读(并且似乎正是您想要的)。