当流数据处理完成后,有若干个模式将结果导出
1.kafka,
我不用kafka 贴一个指导链接把https://spark.apache.org/docs/latest/structured-streaming-kafka-integration.html
2.file(文件导出):
可以将流处理的结果导出到文件结果
query = wordCounts \
.writeStream \
.outputMode("append") \
.format("json") \
.option('checkpointLocation','file:/home/hadoop/Downloads/SQL_streaming/checkpoint')\
.option('path','file:/home/hadoop/Downloads/SQL_streaming/output')\
.start()
需要有checkpoint,和存储路径(这两个默认都是hdfs,如果需要本地要用file:/)
输出的文件格式可以是 csv,parquet,json等:
1. json导入mongoDB方便一些
2. parquet则可以直接重建Spark Dataframe
3. csv则不推荐,因为csv不可以储存timestamp格式数据
其次,每一个文件的生成与window的sliding相关,每一次sliding就生成一个文件。
3.foreach:
在structured streaming中,处理完成的仍然还是dataframe,foreach可以对处理完成的dataframe再次进行操作,foreach的操作是按行操作的,也就是Row by Row的方法(pyspark在2.4 之后支持foreach)
def process(dataframe):
#打印结果
print('high' if dataframe.average>95 else 'low')
#也可以导出Row里的值
name = dataframe.name
average = dataframe.average #然后存到pandas,或者其他操作等等
query = wordCounts\
.writeStream\
.foreach(process)\
.start()
query.awaitTermination(timeout=50)
query.stop()
ps: Row是一个只读的格式, 不能修改
4,console,memory
将结果打印到控制台,将结果dataframe储存到内存中
query = wordCounts \
.writeStream \
.outputMode("append") \
.queryName('wordCounts1')\
.format("console") \
.start()
try:
query.awaitTermination(timeout=50)
query.stop()
except:
print('problem')
query.stop()
如果使用memory,那么会在内存中生成保存一个dataframe,dataframe的名字和query的名字一样
console和memory要注意:当每一个trigge发生时,console和memory都会直接保存处理流的完整结果到内存中(等价于collect),可能会内存爆炸。所以这两个一般用在测试当中。