注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hbase Hive Flume等等~写的都是纯干货,各种顶会的论文解读,一起进步。
今天继续和大家分享一下Pyspark_结构化流1
#博学谷IT学习技术支持
结构化流是构建在Spark SQL处理引擎之上的一个流式的处理引擎, 主要是针对无界数据的处理操作. 对于结构化流同样也支持多种语言的操作API: Java Python Scala R …
Spark的核心是RDD, RDD出现主要目的就是为了提供更加高效的离线迭代计算操作, RDD是针对的有界的数据集,但是为了能够兼容实时计算的处理场景, 提供微批处理模式. 本质上依然还是批处理, 只不过批与批之间的处理间隔时间变短了, 让我们感觉是在进行流式的计算操作. 目前默认的微批可以达到100毫米一次
from pyspark.sql import SparkSession
import pyspark.sql.functions as F
if __name__ == '__main__':
print("spark streaming init")
# 1- 创建SparkSession对象
spark = SparkSession.builder.appName("spark streaming").master("local[*]") \
.config('spark.sql.shuffle.partitions', 4) \
.getOrCreate()
# 2- 对接数据源: 从端口号中获取消息数据(node1的端口号: 44444): df 为无界df
df = spark.readStream.format("socket").option("host", "node1").option("port", "44444").load()
# 3- 处理数据
df_res = df.withColumn("words", F.explode(F.split("value", " "))).groupBy("words").agg(
F.count("words").alias("word_count")
)
# 4- 输出结果
df_res.writeStream.format("console").outputMode("complete").start().awaitTermination()
在结构化流中, 我们可以将DF称为无界的DF 或者 无界的表
可以将程序分为三大部分: 输入源 处理数据 输出源
结构化流默认提供多种数据源, 从而支持不同的数据源的处理工作, 目前默认提供以下四种数据源:
文件数据源, 主要是用于监控某一个目录下的所有的文件, 支持读取方案: CSV JSON PARQUET TEXT ORC …
读取代码格式:
spark.readStream
.format('CSV|JSON|PARQUET|ORC....')\
.option('参数名','参数值')\
.option('参数名','参数值')\
.schema(schema=xxxx)\
.load('监控的目录地址')
代码案例
from pyspark.sql import SparkSession
from pyspark.sql.types import *
if __name__ == '__main__':
print("spark streaming init")
# 1- 创建SparkSession
spark = SparkSession.builder.appName("spark streaming").master("local[*]") \
.config('spark.sql.shuffle.partitions', 4) \
.getOrCreate()
schema = StructType().add("id", IntegerType()).add("name", StringType()).add("sex", StringType()).add("address", StringType())
# 2- 读取外部数据源:
# 注意: 不允许直接写文件名, 必须为一个目录
df = spark.readStream.format("csv") \
.option("header", True) \
.option("sep", " ") \
.schema(schema=schema)
.load(path="file:///export/data/workspace/ky06_pyspark/_04_structure_streaming/data/*.csv")
df.writeStream.format("console").outputMode("append").start().awaitTermination()
速率源, 此数据源主要是用于进行基准测试使用, 配置此数据源后, 会自动的生成数据, 同时也可以设置生成的速率, 结果会产生两列数据: 一列为时间戳 另一列为自增的数字
读取代码格式:
spark.readStream.format('rate')\
.option('参数名','参数值')\
.option('参数名','参数值')\
.option('参数名','参数值')\
.schema(schema=xxx)\
.load()
from pyspark.sql import SparkSession
if __name__ == '__main__':
print("spark streaming init")
# 1- 创建SparkSession
spark = SparkSession.builder.appName("spark streaming").master("local[*]") \
.config('spark.sql.shuffle.partitions', 4) \
.getOrCreate()
# 2- 设置速率源
df = spark.readStream.format("rate") \
.option("rowsPerSecond", 10) \
.option("rampUpTime", 5) \
.option('numPartitions', 3) \
.load()
df.writeStream.format("console").outputMode("append").start().awaitTermination()
此操作指的就是数据处理的内容, 此查找与Spark SQL是完全一致的, 可以使用DSL方案, 也可以使用SQL方案
可以查看网盘前面的文章。
今天和大家分享了Pyspark_结构化流入门案例和数据源部分。