Pyspark_结构化流1

Pyspark

注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hbase Hive Flume等等~写的都是纯干货,各种顶会的论文解读,一起进步。
今天继续和大家分享一下Pyspark_结构化流1
#博学谷IT学习技术支持


文章目录

  • Pyspark
  • 前言
  • 一、结构化流的入门案例
  • 二、 结构化流的编程模型
  • 三、 数据源部分(Source)
    • 1.File Source
    • 2.Rate Source
  • 四、 处理数据(operations)
  • 总结


前言

结构化流是构建在Spark SQL处理引擎之上的一个流式的处理引擎, 主要是针对无界数据的处理操作. 对于结构化流同样也支持多种语言的操作API: Java Python Scala R …

​ Spark的核心是RDD, RDD出现主要目的就是为了提供更加高效的离线迭代计算操作, RDD是针对的有界的数据集,但是为了能够兼容实时计算的处理场景, 提供微批处理模式. 本质上依然还是批处理, 只不过批与批之间的处理间隔时间变短了, 让我们感觉是在进行流式的计算操作. 目前默认的微批可以达到100毫米一次


一、结构化流的入门案例

需求: 实时的WordCount案例
Pyspark_结构化流1_第1张图片

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()

二、 结构化流的编程模型

Pyspark_结构化流1_第2张图片
在结构化流中, 我们可以将DF称为无界的DF 或者 无界的表
可以将程序分为三大部分: 输入源 处理数据 输出源

三、 数据源部分(Source)

结构化流默认提供多种数据源, 从而支持不同的数据源的处理工作, 目前默认提供以下四种数据源:

  • 1- File Source: 文件源 一般主要在测试中
    • 作用: 对接文件数据, 监听某个目录下所有的文件, 一旦有了新的文件, 就会立即进行处理操作
  • 2- Kafka Source: kakfa的数据源
    • 作用: 对接Kafka 相当于是Kafka的消费者, 从Kafka中获取数据
  • 3- Socket Source: 对接网络的数据源 测试
    • 作用: 可以用于监听某个节点上某个端口号的相关数据内容
  • 4- Rate Source: 速率源 测试
    • 作用: 可以实现自动生成数据, 主要适用于做一些基准测试工作

1.File Source

文件数据源, 主要是用于监控某一个目录下的所有的文件, 支持读取方案: 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()

2.Rate Source

速率源, 此数据源主要是用于进行基准测试使用, 配置此数据源后, 会自动的生成数据, 同时也可以设置生成的速率, 结果会产生两列数据: 一列为时间戳 另一列为自增的数字
读取代码格式:

spark.readStream.format('rate')\
	.option('参数名','参数值')\
	.option('参数名','参数值')\
	.option('参数名','参数值')\
	.schema(schema=xxx)\
	.load()

代码案例
Pyspark_结构化流1_第3张图片

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()

四、 处理数据(operations)

此操作指的就是数据处理的内容, 此查找与Spark SQL是完全一致的, 可以使用DSL方案, 也可以使用SQL方案
可以查看网盘前面的文章。


总结

今天和大家分享了Pyspark_结构化流入门案例和数据源部分。

你可能感兴趣的:(Pyspark系列,大数据,spark,分布式)