问题描述:
使用Spark Structured Streaming把多个流union all一起处理,发现处理后的结果远远小于4个流数据的总和.
解决方法:
通过查看Spark UI发现运行时只有一个流并没有多个流Union。排查代码发现是将4个流注册为临时表,然后获取4个流的公共字段的dataset对象后再调用dataset.union方法将4个dataset union到一起:
dataset1.createOrReplaceTempView('t_a');
dataset2.createOrReplaceTempView('t_b');
dataset3.createOrReplaceTempView('t_c');
dataset4.createOrReplaceTempView('t_d');
datasetUnion1 = spark.sql("select id,name from t_a");
datasetUnion2 = spark.sql("select id,name from t_b");
datasetUnion3 = spark.sql("select id,name from t_c");
datasetUnion4 = spark.sql("select id,name from t_d");
datasetUnion1.unionAll(datasetUnion2).unionAll(datasetUnion3).unionAll(datasetUnion4)
伪代码只为描述代码逻辑与实际代码不同
改成将4个流注册为临时表后使用sql union而不是用dataset:
dataset1.createOrReplaceTempView('t_a');
dataset2.createOrReplaceTempView('t_b');
dataset3.createOrReplaceTempView('t_c');
dataset4.createOrReplaceTempView('t_d');
spark.sql("select id,name from t_a union all select id,name from t_b union all select id,name from t_c union all select id, name t_d");
....
问题解决.