我们有一项工作可以在时间范围内汇总数据。我们是新兴的, 而且我们观察到运行时的性能特征明显不同 逻辑上与流与批处理作业相同的查询。我们想了解 发生了什么,并找到提高结构化速度的可能方法 基于流的方法。
就本文而言,假设架构为
root
|-- objectId: long (nullable = true)
|-- eventTime: long (nullable = true)
|-- date: date (nullable = true)
|-- hour: integer (nullable = true)
其中
date
和hour
是(派生的)分区键,即实木复合地板文件存储在
像date=2020-07-26/hour=4
这样的文件夹。objectId
广泛流传(一个小时内观察到1000万个不同的值,
分布非常不均匀)objectId
的事件数我们正在运行结构化的流媒体作业,主要是在做:
df.read.format("delta")
.withWatermark("7 minutes") // watermark only applied to streaming query
.groupBy($"date", $"hour", $"objectId", window($"eventTime", "5 minutes"))
.coalesce(1) // debatable; we like limited number of files
.partitionBy("date", "hour")
.writeStream
.format("delta")
.option("checkpointLocation", <...>)
.partitionBy("date", "hour")
.start(<destination url>)
.awaitTermination
关联的批处理作业基本上执行相同的操作,除了
withWatermark
以及writeStream
等的类似替代品。它的内容如下:
完全相同的源,因此它将读取完全相同的文件,具有相同的
大小等。
我们将这些运行在:
观察:
addBatch
中)我的理解是,给定水印的流查询(7分钟) 窗口大小(5分钟)只需回看不到15分钟, 直到可以写出5分钟的窗口并丢弃所有关联状态为止。
问题:
答案 0 :(得分:1)
df.read.format(“ delta”)
您似乎正在创建一个静态数据帧,然后将该静态数据帧转换为流式数据帧。聚合被应用于静态数据框,因此,窗口化可能不起作用。 尝试创建流数据帧:
val DF = spark
.readStream
.format("delta")...
此处有一些示例https://docs.databricks.com/delta/delta-streaming.html#delta-table-as-a-stream-source