【发布时间】:2020-06-04 05:29:18
【问题描述】:
我是 Spark 的新手,目前正在解决与在 Context 时间之后将 Spark Stream 的结果保存到文件相关的问题。所以问题是:我希望一个查询运行 60 秒,并将它在这段时间内读取的所有输入保存到一个文件中,并且还能够定义文件名以供将来处理。
最初我认为下面的代码是可行的方法:
sc.socketTextStream("localhost", 12345)
.foreachRDD(rdd -> {
rdd.saveAsTextFile("./test");
});
但是,在运行之后,我意识到它不仅为每个输入读取保存了一个不同的文件 - (想象我在该端口上以随机速度生成随机数),所以如果在一秒钟内它读取 1 文件会包含 1 个数字,但如果它读取更多文件将包含它们,而不是仅写入一个包含 60 年代时间范围内所有值的文件 - 而且我无法命名文件,因为 saveAsTextFile 中的参数 是所需的目录。
所以想问一下有没有spark原生的解决方案这样我就不用“java技巧”来解决了,像这样:
sc.socketTextStream("localhost", 12345)
.foreachRDD(rdd -> {
PrintWriter out = new PrintWriter("./logs/votes["+dtf.format(LocalDateTime.now().minusMinutes(2))+","+dtf.format(LocalDateTime.now())+"].txt");
List<String> l = rdd.collect();
for(String voto: l)
out.println(voto + " "+dtf.format(LocalDateTime.now()));
out.close();
});
我搜索了类似问题的 spark 文档,但找不到解决方案:/ 谢谢你的时间:)
【问题讨论】:
-
收集绝不是把戏
-
我的意思是使用 java 默认 PrintWriter 将字符串保存到文件,而不是使用(我认为必须存在的)火花解决方案。 TBH 我在理解 foreachRDD 的工作原理时遇到了一些麻烦,因为在上面使用 saveAsTextFile 显示的案例中,它只保存一个值,但在其他情况下它适用于所有数据
-
Spark 就是这样
标签: apache-spark apache-spark-sql spark-streaming