Spark Streaming 2.11-java.util.NoSuchElementException:执行SQL函数时出现None.get错误

时间:2018-07-16 18:39:38

标签: java apache-spark exception spark-structured-streaming nosuchelementexception

问题

我正在使用Spark合并CSV文件的内容。

使用流式CSV文件进行第一次连接后,我可以无错误地写入流,并且可以看到输出了很多行,但是一旦尝试写入第二个流,我就会收到一条错误消息。

代码

trackBy

错误消息

SparkSession spark = SparkSession
            .builder()
            .appName("MySparkApp")
            .config("spark.master", "local")
            .getOrCreate();
Dataset<Row> dfOne= spark.read().schema(stForOne).csv(pathToOne);
Dataset<Row> dfTwo = spark.read().schema(stForTwo).csv(pathToTwo).dropDuplicates("num1");
Dataset<Row> dfThree= spark.read().option("header","true").csv(pathToThree);
Dataset<Row> dfStreamed = spark.readStream().option("comment", "!").schema(stForStreamed).csv(pathToStreamed);

dfOne.createOrReplaceTempView("viewOne");
dfTwo.createOrReplaceTempView("viewTwo");
dfThree.createOrReplaceTempView("viewThree");
dfStreamed.createOrReplaceTempView("viewStreamed");


Dataset<Row> changedOnce = spark.sql("SELECT * FROM viewStreamed LEFT JOIN viewOne ON viewStreamed.name = viewOne.Name");
changedOnce.createOrReplaceTempView("viewStreamed")

Dataset<Row> changedTwice = spark.sql("SELECT * FROM viewStreamed LEFT JOIN viewTwo ON viewStreamed.NUM1 = viewTwo.num1"); 

StreamingQuery query = changedTwice.writeStream()
            .outputMode("append")
            .format("console")
            .start(); 

    try {
        query.awaitTermination();
    } catch (StreamingQueryException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    query.stop();

更多详细信息

如果我消除流式传输并且仅使用read(),则相同的代码可以正常工作。如果我将viewTwo切换为viewThree,就可以在viewThree上进行第二次联接。我不明白为什么会出现此错误,因为在我看来一切正常。任何帮助表示赞赏。我正在使用eclipse和Spark 2.11。

编辑

我发现它给出错误的原因是因为删除重复行。一旦我删除了它,它就可以与流媒体一起工作。谁能解释为什么这会导致我得到异常和解决方法,以便我可以删除重复项并仍然能够加入流表。

1 个答案:

答案 0 :(得分:0)

我的理论是,惰性评估机制不会与StreamView一起使用(也许sql调用不会触发评估)。

您可以尝试通过在dfTwo上调用“计数”或其他操作来强制对dropDuplicates进行求值(在拖放之后就可以了)。