如何在Spark中创建必须应用于数据集的函数管道?

时间:2018-06-22 13:19:48

标签: java apache-spark cassandra bigdata

我从Cassandra Table加载了一个spark数据集Dataset<T>,并且我想在该数据集上应用操作列表(链或管道)。

例如:

Dataset<T> dataset= sparkSession.createDataset(javaFunctions(spark.sparkContext())
                    .cassandraTable(...));

Dataset<Row> result = dataset.apply(func1()).apply(func2()).apply(func3());

func1()会将空值替换为最常用的空值。

func2()将添加具有新值的新列。

func3().... etc。

应用此功能管道的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

如果需要将功能应用于每一行,则可以使用“映射”操作。

答案 1 :(得分:0)

如果函数接受数据集并返回数据集,即。签名:

public Dataset[U] myMethod(Dataset[T] ds) {
  ...
}

然后,您可以使用数据集上定义的transform方法来巧妙地应用您的函数。

ds.tranform(myMethod)
  .transform(myMethod1)
  .transform(myMethod2)

如果函数在标准Java对象上,例如

public U myMethod(T row) {
  ...
}

然后,您要在数据集上定义map方法。

ds.map(myMethod)
  .map(myMethod1)
  .map(myMethod2)

完整的API文档: https://spark.apache.org/docs/2.3.0/api/java/index.html?org/apache/spark/sql/Dataset.html

答案 2 :(得分:0)

感谢@ wade-jensen的回答!

这是完整的解决方案:

Dataset<myClass> dataset = ....
Dataset<myClass> new_dataset = dataset.transform(method1(someParamters));

private static Function1<Dataset<myClass>, Dataset<myClass>> method1(someParamters) {
    return new AbstractFunction1<Dataset<myClass>, Dataset<myClass>>() {
        @Override
        public Dataset<myClass> apply(Dataset<myClass> dataset) {

           ...... some work here .... 

            return dataset;
        }
    };
}