【问题标题】:Spark Structured Streaming groupby window - I want first interval start on the first time stampSpark Structured Streaming groupby 窗口 - 我希望第一个间隔从第一个时间戳开始
【发布时间】:2019-04-10 18:01:05
【问题描述】:

通过在 Spark 2.31 (HDP 3.0) 上使用窗口聚合的简单完整示例,我可以看到 Spark 创建的间隔与某个整数对齐。比如这里我指定了 60 秒的 windowDuration,Spark 在最近的一分钟开始第一个时间间隔:

>>> from pyspark.sql import functions as F
>>> df = spark.createDataFrame([("2016-03-11 09:00:07", 1),("2016-03-11 09:00:08", 1)]).toDF("date", "val")
>>> w = df.groupBy(F.window("date", "60 seconds")).agg(F.sum("val").alias("sum"))
>>> w.select(w.window.start.cast("string").alias("start"),w.window.end.cast("string").alias("end"), "sum").collect()
[Row(start='2016-03-11 09:00:00', end='2016-03-11 09:01:00', sum=2)]

有没有办法从第一条消息开始间隔,即在我的情况下,我想要:

[Row(start='2016-03-11 09:00:07', end='2016-03-11 09:01:07', sum=2)]

【问题讨论】:

    标签: apache-spark pyspark spark-structured-streaming


    【解决方案1】:

    给你=>

    from pyspark.sql import functions as F
    from datetime import datetime
    
    df = spark.createDataFrame([("2016-03-11 09:00:07", 1),("2016-03-11 09:00:08", 1)]).toDF("date", "val")
    
    startSecond = datetime.strptime(df.head()[0], '%Y-%m-%d %H:%M:%S').second
    
    w = df.groupBy(F.window("date", "60 seconds", "60 seconds", str(startSecond) + " seconds")).agg(F.sum("val").alias("sum"))
    
    w.select(w.window.start.cast("string").alias("start"),w.window.end.cast("string").alias("end"), "sum").collect()
    

    【讨论】:

    • 谢谢!阅读文档时,我认为它可能会以这种方式工作,但尝试了错误的事情
    • 这里唯一的事情是如何在Streaming模式下获得startSecond:startSecond = datetime.strptime(st.head()[0], '%Y-%m-%d %H:%M:%S').second ... pyspark.sql.utils.AnalysisException: 'Queries with streaming sources must be executed with writeStream.start();;\nkafka'
    猜你喜欢
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    相关资源
    最近更新 更多