微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否有任何类型安全的 API 用于结构化流窗口操作

如何解决是否有任何类型安全的 API 用于结构化流窗口操作

TL;DR:是否有与以下示例等效的类型安全

import spark.implicits._

val words = ... // streaming DataSet of schema: case class Record(timestamp: Timestamp,word: String)

// Group the data by window and word and compute the count of each group
val windowedCounts = words
    .withWatermark("timestamp","10 minutes")
    .groupBy(
        window($"timestamp","10 minutes","5 minutes"),$"word")
    .count()

我真的很喜欢 Spark 的类型安全 API,避免列名中的任何拼写错误。 我了解 Aggregator 类以及如何构建自己的聚合器。

但是我不知道如何应用 withWatermark 并以类型安全的方式构建 window 列?

您是否知道是否已经存在任何 API 或库?如果没有,您有什么好的解决方案吗?

目前,我最好的解决方案是调用 WindowOperatorDataset[REC] 转换为 Dataset[TimeWindowed[REC]],如下所示:

 case class TimeWindowed[REC](data: REC,timeWindow: TimeWindow)
 case class TimeWindow(start: java.sql.Timestamp,end: java.sql.Timestamp)

我正在考虑将其更改为 Dataset[(TimeWindow,REC)] 之类的内容,与 ...byKey 函数系列 (Dataset[(K,REC)]) 的返回类型相比,它可能更惯用。但我没有设法找到一个令人满意的解决方案。

解决方法

如果您使用的是 Spark 3,有一个实用方法可以让您安全地构造间隔字符串(例如,避免任何拼写错误):

import org.apache.spark.sql.catalyst.util.IntervalUtils
import org.apache.spark.sql.types.Decimal
val zeroSec = Decimal(0,Decimal.MAX_LONG_DIGITS,6)
IntervalUtils.makeInterval(years = 0,months = 0,weeks = 0,days = 0,hours = 0,mins = 10,secs = zeroSec).toString

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。