如何仅从文件处理新记录?

时间:2017-07-13 16:36:07

标签: apache-spark apache-spark-sql spark-structured-streaming

我有一个处理文件记录的方案。定期添加文件中的数据(每毫秒)。所以我需要读取文件并处理它,同时只处理新添加的记录。

我遇到了基于Spark SQL构建的Spark Structured流的概念。我在做什么 -

  1. 每1秒触发一次文件流处理
  2. 在文件
  3. 上运行Spark SQL查询
  4. 以追加模式在控制台上写下查询的输出。
  5. 以下是相同的代码 -

    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();
            }
        }
    

    通过上述实现,查询执行一次,但如果我在文件中添加新记录,则不会触发第二批执行。

    其他观察:

    • 输出模式为完整&amp;更新没有输出。只有附加模式,我输出1次。

    有人可以帮忙解决这个问题吗? Spark Structured Streaming是否支持从文件处理数据,因为普通的Spark Streaming不支持。

1 个答案:

答案 0 :(得分:3)

  

Spark Structured Streaming是否支持处理文件

中的数据

  

查询执行一次,但如果我在文件中添加新记录,则不会触发第二批执行。

在文件被标记为已显示并且从未再次处理后,文件处理后无法正常工作(查看FileStreamSource负责查找文件的工作原理)。

推荐的解决方案是将新内容写入新文件。