Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 仅根据groupby键追加新聚合_Apache Spark_Pyspark_Spark Structured Streaming_Azure Databricks_Delta Lake - Fatal编程技术网

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
进行bucketing
windowDuration
告诉您窗口的长度,
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中指定您的
日期
列是
时间戳
类型不是,日期是日期类型。如果不起作用,请尝试
窗口
操作,将列转换为
时间戳
,然后尝试使用差异
窗口持续时间
滑动时间
,如果有任何问题,请告诉我