pyspark之Structured Streaming window函数-滚动模式

#file文件使用pyspark之Structured Streaming file文件案例1生成文件,以下代码主要探讨window函数使用  window三种方式:滚动、滑动、会话,只有windowDuration滚动

from pyspark.sql import SparkSession,DataFrame
from pyspark.sql.functions import split,window,from_unixtime,lit


PATH = '/opt/software/tmp/data/'

if __name__ == '__main__':
    spark = SparkSession.builder.getOrCreate()

    lines = spark.readStream.format("text").option("seq","\n").load(PATH)

    userinfo = lines.select(split(lines.value," ").alias("info"))

    user = userinfo.select(from_unixtime(userinfo['info'][0]).alias('eventtime'),
        userinfo['info'][1].alias('name'),userinfo['info'][2].alias('province'),
        userinfo['info'][3].alias('action'))
    """
    每1分钟统计一次各个省份登录情况,不配置slideDuration和startTime
    window函数参数:timeColumn:时间戳列    windowDuration:时间间隔   slideDuration:平移时间
                   startTime:开始时间   
    """
    windowDuration = "1 minutes"
    userCounts = user.groupBy("province",window("eventtime",windowDuration)).count()
    #此时返回三个字段:province  window   count   其中window为struct结构,包括start和end两个 
     字段,可以通过userCounts['window']['start']方式获得  具体可以通过printSchema()方法查看
    #输出方式可以选择complete或者update,如果为complete会每个batch会输出每个时间段结果,batch1会 
     包含batch0结果  如果为update,则batch1只会输出该时间段内变化数据,不会输出batch0数据
     userCounts = userCounts.select(userCounts['province'],userCounts['window']['start'].alias("start"),userCounts['window']['end'].alias("end"),userCounts['count'].alias('sl'))
    userCounts.writeStream.outputMode("complete").format("console").trigger(processingTime="20 seconds").start().awaitTermination()

    """
    结果输出到mysql数据库
    def insert_into_mysql_batch(df: DataFrame, batch):
        print("{} is start".format(batch))
        if df.count() > 0:
            # 此处将batch添加到df中,采用lit函数
            data = df.withColumn("batch", lit(batch))
            data.write.format("jdbc"). \
                option("driver", "com.mysql.jdbc.Driver"). \
                option("url", "jdbc:mysql://localhost:3306/spark").option("user", "root"). \
                option("password", "root").option("dbtable", "dm_user_province").option("batchsize", 1000).mode("append").save()
        else:
            pass
userCounts.writeStream.outputMode("complete").foreachBatch(insert_into_mysql_batch).trigger(processingTime="20 seconds").start().awaitTermination()
    """

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值