摸鱼大数据——Spark Structured Steaming——结构化流的编程综合案例

7、综合案例

需求: 已知文件中存储了多个单词,要求计算统计出现的次数

7.1 词频统计_读取文件方式
 # 导包
 import os
 from pyspark.sql import SparkSession,functions as F
 ​
 # 绑定指定的python解释器
 os.environ['SPARK_HOME'] = '/export/server/spark'
 os.environ['PYSPARK_PYTHON'] = '/root/anaconda3/bin/python3'
 os.environ['PYSPARK_DRIVER_PYTHON'] = '/root/anaconda3/bin/python3'
 ​
 # 创建main函数
 if __name__ == '__main__':
     # 1.创建SparkContext对象
     spark = SparkSession.builder\
         .config('spark.sql.shuffle.partitions',1)\
         .appName('pyspark_demo')\
         .master('local[*]')\
         .getOrCreate()
 ​
     # 2.数据输入
     # 注意: 路径必须是目录路径,因为readStream会自动读取此目录下的所有文件,有新增会触发接着读
     df = spark.readStream\
         .format('text')\
         .load('file:///export/data/spark_project/structured_Streaming/data/')
 ​
     # 查看数据类型
     print(type(df))
     # 3.数据处理(切分,转换,分组聚合)
     # 和SparkSQL操作一模一样,支持sql和dsl两种风格
     # SQL方式
     df.createTempView('tb')
     sql_df = spark.sql("""
         select words,count(1) as cnt
         from (
           select explode(split(value,' ')) as words from tb
         ) t group by words
     """)
     # DSL方式
     dsl_df = df.select(
         F.explode(F.split('value',' ')).alias('words')
     ).groupBy('words').agg(
         F.count('words').alias('cnt')
     )
 ​
     # 4.数据输出
     # 注意: 输出不能使用原来sparksql的show()
     # 注意: 如果需要多开启多个输出,.awaitTermination()只需要在最后一个出现即可
     sql_df.writeStream.format('console').outputMode('complete').start()
     dsl_df.writeStream.format('console').outputMode('complete').start().awaitTermination()
     # 5.关闭资源
     spark.stop()

7.2 词频统计_Socket方式
 # 导包
 import os
 from pyspark.sql import SparkSession,functions as F
 ​
 # 绑定指定的python解释器
 os.environ['SPARK_HOME'] = '/export/server/spark'
 os.environ['PYSPARK_PYTHON'] = '/root/anaconda3/bin/python3'
 os.environ['PYSPARK_DRIVER_PYTHON'] = '/root/anaconda3/bin/python3'
 ​
 # 创建main函数
 if __name__ == '__main__':
     # 1.创建SparkContext对象
     spark = SparkSession.builder\
         .config('spark.sql.shuffle.partitions',1)\
         .appName('pyspark_demo')\
         .master('local[*]')\
         .getOrCreate()
 ​
     # 2.数据输入
     # 注意: 路径必须是目录路径,因为readStream会自动读取此目录下的所有文件,有新增会触发接着读
     df = spark.readStream\
         .format('socket')\
         .option('host',"192.168.88.161")\
         .option('port',"55555")\
         .load()
 ​
     # 查看数据类型
     print(type(df))
     # 3.数据处理(切分,转换,分组聚合)
     # 和SparkSQL操作一模一样,支持sql和dsl两种风格
     # SQL方式
     df.createTempView('tb')
     sql_df = spark.sql("""
         select words,count(1) as cnt
         from (
           select explode(split(value,' ')) as words from tb
         ) t group by words
     """)
     # DSL方式
     dsl_df = df.select(
         F.explode(F.split('value',' ')).alias('words')
     ).groupBy('words').agg(
         F.count('words').alias('cnt')
     )
 ​
     # 4.数据输出
     # 注意: 输出不能使用原来sparksql的show()
     # 注意: 如果需要多开启多个输出,.awaitTermination()只需要在最后一个出现即可
     sql_df.writeStream.format('console').outputMode('complete').start()
     dsl_df.writeStream.format('console').outputMode('complete').start().awaitTermination()
     # 5.关闭资源
     spark.stop()
 ​

7.3 自动生成数据_Rate方式
 from pyspark.sql import SparkSession
 import os
 ​
 os.environ["SPARK_HOME"] = "/export/server/spark"
 os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/bin/python"
 os.environ["PYSPARK_DRIVER_PYTHON"] = "/root/anaconda3/bin/python"
 ​
 if __name__ == '__main__':
     # 1.创建SparkSession对象
     spark = SparkSession.builder \
         .appName("StructuredStream_rate") \
         .master('local[*]') \
         .getOrCreate()
         
     # 2。读取数据
     df = spark.readStream \
         .format('rate') \
         .option("rowsPerSecond", "5") \
         .option('numPartitions', 1) \
         .load()
 ​
     # 3.数据处理
     # 略
 ​
     # 4.数据输出:
     df.writeStream \
         .format('console') \
         .outputMode('update') \
         .option('truncate', 'false') \
         .start() \
         .awaitTermination()
 ​
     # 5.关闭资源
     spark.stop()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

困了就倒头睡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值