Apache spark 仅根据groupby键追加新聚合
我必须处理每天收到的一些文件。信息具有主键Apache spark 仅根据groupby键追加新聚合,apache-spark,pyspark,spark-structured-streaming,azure-databricks,delta-lake,Apache Spark,Pyspark,Spark Structured Streaming,Azure Databricks,Delta Lake,我必须处理每天收到的一些文件。信息具有主键(日期、客户端id、操作id)。因此,我创建了一个只将新数据附加到增量表中的流: 操作\ .重新分区(“日期”)\ .writeStream\ .outputMode('append')\ .trigger(一次=真)\ .option(“checkpointLocation”,“/mnt/sandbox/operations/_chk”)\ .format('delta')\ .partitionBy('日期')\ .start(“/mnt/sandb
(日期、客户端id、操作id)
。因此,我创建了一个只将新数据附加到增量表中的流:
操作\
.重新分区(“日期”)\
.writeStream\
.outputMode('append')\
.trigger(一次=真)\
.option(“checkpointLocation”,“/mnt/sandbox/operations/_chk”)\
.format('delta')\
.partitionBy('日期')\
.start(“/mnt/sandbox/operations”)
这工作正常,但我需要按(日期,客户端id)
对这些信息进行汇总,因此我创建了另一个从该操作表到新表的流:
summated=spark.readStream.format('delta').load('/mnt/sandbox/operations'))
summated=summated.groupBy('client_id','date').agg()
汇总。重新分区(“日期”)\
.writeStream\
.outputMode(“完成”)\
.trigger(一次=真)\
.选项(“检查点位置”,“/mnt/sandbox/summated/_chk”)\
.format('delta')\
.partitionBy('日期')\
.start(“/mnt/sandbox/summated”)
这是可行的,但每次我将新数据放入操作
表时,spark都会重新计算摘要
。我尝试在第二个流上使用append模式,但它需要水印,并且日期是DateType
有一种方法可以仅基于组键计算新聚合,并将它们附加到需要使用的摘要?上
当您使用窗口操作时,它将根据windowDuration
和slideDuration
进行bucketingwindowDuration
告诉您窗口的长度,slideDuration
告诉您滑动窗口的时间
如果使用groupby,您将得到一个结果窗口
列,以及您使用类似客户端id
例如:
windowDuration = "10 minutes"
slideDuration = "5 minutes"
summarized = before_summary.groupBy(before_summary.client_id,
window(before_summary.date, windowDuration, slideDuration)
).agg(<a lot of aggs>).orderBy('window')
windowDuration=“10分钟”
slideDuration=“5分钟”
Summared=在\u summary.groupBy之前(在\u summary.client\u id之前,
窗口(在\u summary.date、windowDuration、slideDuration之前)
).agg().orderBy('window')
我可以使用日期来指定窗口吗?@LeandroHumb您必须在“天”或soI中指定您的日期
列是时间戳
类型不是,日期是日期类型。如果不起作用,请尝试窗口
操作,将列转换为时间戳
,然后尝试使用差异窗口持续时间
和滑动时间
,如果有任何问题,请告诉我