做个试验
首先打开一个linux控制台,输入:
nc -lk 9999
打开一个socket服务器,作为spark流的源
再打开spark-shell,输入
val lines=spark.readStream.format("socket").option("host","localhost").option("port","9999").load() val wc=lines.count()
执行到第二行就会报错了:
org.apache.spark.sql.AnalysisException: Queries with streaming sources must be executed with writeStream.start();
writeStream.start()什么意思呢,流开始不是立即开始,是有个触发的机制,比如每分钟执行一次。
而直接执行count方法的话,返回的是一个数字,程序就要立即执行action,返回wc中所有的行数,而流要求在调用start方法后才执行实际的查询操作。
而改成groupby的话就不会立即执行,估计是因为未来还有值要参与分组
val wc=lines.groupBy("value").count() wc: org.apache.spark.sql.DataFrame = [value: string, count: bigint]
就不会报错了。后面调用start方法每分钟写一次结果到控制台,并切换到nc的那个控制台,输入1回车,输入2回车,在输入1回车,可以看到一分钟后spark shell的窗口显示结果:
Batch: 1 ------------------------------------------- +-----+-----+ |value|count| +-----+-----+ | 1| 2| | 2| 1| +-----+-----+
加群入久伴博客官方微信群
加入久伴官方微信群有啥优势?
1.文章内部资源由于时间久远可能失效,加群,群内可以第一时间反馈
2.网站中教程不一定适用任何人,加群可以第一时间咨询并解决您得疑惑
3.你游荡于互联网,也需要群体,加群一起互动交流,畅所欲言
扫描下方二维码即可加入交流讨论
