Flink:如何将DataSet写入变量而不是文件

时间:2017-10-27 09:10:40

标签: scala apache-flink

我有一个使用DataSet API用scala编写的flink批处理程序,这导致了我感兴趣的最终数据集。我希望将该数据集作为变量或值(例如,String的列表或序列)程序,无需将其写入任何文件。有可能吗?

我已经看到flink允许收集数据接收器以便进行调试(他们的doc中唯一的例子是Java)。但是,这只能在本地执行中使用,无论如何我不知道它在Scala中的等价物。我想要的是在整个flink并行执行到程序值或变量之后编写最终结果数据集。

2 个答案:

答案 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开发项目需要更多的文档和教程,尤其是对于像我这样的初学者。

无论如何,如果我错了,请纠正我。谢谢!