我有一个使用DataSet API用scala编写的flink批处理程序,这导致了我感兴趣的最终数据集。我希望将该数据集作为变量或值(例如,String的列表或序列)程序,无需将其写入任何文件。有可能吗?
我已经看到flink允许收集数据接收器以便进行调试(他们的doc中唯一的例子是Java)。但是,这只能在本地执行中使用,无论如何我不知道它在Scala中的等价物。我想要的是在整个flink并行执行到程序值或变量之后编写最终结果数据集。
答案 0 :(得分:2)
首先,尝试使用scala版本的集合数据接收器: import org.apache.flink.api.scala._ import org.apache.flink.api.java.io.LocalCollectionOutputFormat;
.
.
val env = ExecutionEnvironment.getExecutionEnvironment
// Create a DataSet from a list of elements
val words = env.fromElements("w1","w2", "w3")
var outData:java.util.List[String]= new java.util.ArrayList[String]()
words.output(new LocalCollectionOutputFormat(outData))
// execute program
env.execute("Flink Batch Scala")
println(outData)
其次,如果您的数据集适合单个机器的内存,为什么需要使用分布式处理框架?我想你应该多考虑一下你的用例!并尝试在数据集上使用正确的transformations。
答案 1 :(得分:0)
我将flink 1.72与scala 2.12一起使用。这是我在Model类中总结的使用SVM的流预测。我认为最正确的答案是使用collect()
。它将返回Seq。我搜索了几个小时后得到了这个答案。我是从Flink Git - Line 95
var temp_jaringan : DataSet[(Vector,Double)] = model.predict_jaringan(value)
temp_jaringan.print()
var temp_produk : DataSet[(Vector,Double)] = model.predict_produk(value)
temp_produk.print()
var result_jaringan : Seq[(Vector,Double)] = temp_jaringan.collect()
var result_produk : Seq[(Vector,Double)] = temp_produk.collect()
if(result_jaringan(0)._2 == 1.0 && result_produk(0)._2 == 1.0 ){
println("Keduanya")
}else if(result_jaringan(0)._2 == 1.0 && result_produk(0)._2 == -1.0){
println("Jaringan")
}else if(result_jaringan(0)._2 == -1.0 && result_produk(0)._2 == 1.0){
println("Produk")
}else{
println("Bukan Keduanya")
}
它可能因其他版本而异。在使用和搜索像疯狗这样的flink材料长达数周甚至数月才能完成我的最终项目作为毕业要求之后,我知道这个flink开发项目需要更多的文档和教程,尤其是对于像我这样的初学者。
无论如何,如果我错了,请纠正我。谢谢!