spark流不能不groupby就直接count

做个试验
首先打开一个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|
+-----+-----+

人已赞赏
折腾笔录

PHP类库PHPqrCode下载

2021-1-17 18:36:34

折腾笔录

这样的网友大家怎么看?玻璃心?伸手党?希望大家不要遇到类似的人

2021-3-2 10:09:40

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索