我正在使用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。
我发现它给出错误的原因是因为删除重复行。一旦我删除了它,它就可以与流媒体一起工作。谁能解释为什么这会导致我得到异常和解决方法,以便我可以删除重复项并仍然能够加入流表。
答案 0 :(得分:0)
我的理论是,惰性评估机制不会与StreamView一起使用(也许sql调用不会触发评估)。
您可以尝试通过在dfTwo上调用“计数”或其他操作来强制对dropDuplicates进行求值(在拖放之后就可以了)。