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|
+-----+-----+

给TA买糖
共{{data.count}}人
人已赞赏
java

elasticsearch字段类型参数doc_values设置为false后不能用于聚合

2021-1-1 19:21:55

java

Spring Cloud微服务架构实战

2021-4-20 13:27:26

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