我从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。
应用此功能管道的最佳方法是什么?
答案 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;
}
};
}