我有一个处理文件记录的方案。定期添加文件中的数据(每毫秒)。所以我需要读取文件并处理它,同时只处理新添加的记录。
我遇到了基于Spark SQL构建的Spark Structured流的概念。我在做什么 -
以下是相同的代码 -
public static class SparkStreamer implements Runnable,Serializable {
@Override
public void run() {
processDataStream();
}
private void processDataStream() {
Dataset<Row> rowData = spark.readStream().format("Text").load("C:\\Test\\App\\");
Dataset<String> data = rowData.as(Encoders.STRING()).flatMap(new FlatMapFunction<String, String>() {
@Override
public Iterator<String> call(String row) throws Exception {
return Arrays.asList(row.split("\\|")).iterator();
}
},Encoders.STRING());
Dataset<Row> dataCount = data.select(new Column("value"));
StreamingQuery query = dataCount.writeStream()
.outputMode("append")
.format("console")
.start();
try {
query.awaitTermination();
} catch (StreamingQueryException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
通过上述实现,查询执行一次,但如果我在文件中添加新记录,则不会触发第二批执行。
其他观察:
有人可以帮忙解决这个问题吗? Spark Structured Streaming是否支持从文件处理数据,因为普通的Spark Streaming不支持。
答案 0 :(得分:3)
Spark Structured Streaming是否支持处理文件
中的数据
是
查询执行一次,但如果我在文件中添加新记录,则不会触发第二批执行。
在文件被标记为已显示并且从未再次处理后,文件处理后无法正常工作(查看FileStreamSource负责查找文件的工作原理)。
推荐的解决方案是将新内容写入新文件。