Apache spark 如何使用PySpark结构化流计算时间戳之间的差异
PySpark结构化流媒体有以下问题 流数据中的每一行都有一个用户ID和一个时间戳。现在,对于每一行和每一个用户,我想添加一个时间戳不同的列 例如,假设我收到的第一行是:“用户A,08:00:00”。如果第二行是“User A,08:00:10”,那么我想在第二行中添加一个名为“Interval”的列,表示“10秒” 有没有人知道如何做到这一点?我尝试使用结构化流媒体文档的窗口函数示例,但没有用Apache spark 如何使用PySpark结构化流计算时间戳之间的差异,apache-spark,pyspark,spark-structured-streaming,Apache Spark,Pyspark,Spark Structured Streaming,PySpark结构化流媒体有以下问题 流数据中的每一行都有一个用户ID和一个时间戳。现在,对于每一行和每一个用户,我想添加一个时间戳不同的列 例如,假设我收到的第一行是:“用户A,08:00:00”。如果第二行是“User A,08:00:10”,那么我想在第二行中添加一个名为“Interval”的列,表示“10秒” 有没有人知道如何做到这一点?我尝试使用结构化流媒体文档的窗口函数示例,但没有用 非常感谢,因为我们谈论的是结构化流媒体和“每一行和每一个用户”,这告诉我您应该使用流媒体查询和某种流
非常感谢,因为我们谈论的是结构化流媒体和“每一行和每一个用户”,这告诉我您应该使用流媒体查询和某种流媒体聚合(
groupBy
和groupByKey
)
对于流聚合,您只能依赖结构化流中的微批处理流执行。这使得单个用户的记录可能是两个不同微批次的一部分。这让你需要一个状态
这一切都让您需要一个有状态的流聚合
因此,我认为您需要一个,即KeyValueGroupedDataset.mapGroupsWithState
或KeyValueGroupedDataset.flatmagroupswithstate
(请参阅):
许多用例需要比聚合更高级的有状态操作。例如,在许多用例中,您必须从事件的数据流跟踪会话。要进行这种会话,您必须将任意类型的数据保存为状态,并使用每个触发器中的数据流事件对状态执行任意操作
自Spark 2.2以来,可以使用操作mapGroupsWithState
和更强大的操作flatMapGroupsWithState
完成此操作。这两种操作都允许在分组的数据集上应用用户定义的代码来更新用户定义的状态
状态将为每个用户找到的最后一条记录。这看起来是可行的
我关注的是:
你说无用是什么意思?就我所知,结构化流媒体不支持像lag这样的传统窗口函数。我的意思是,我没有找到一种方法来用“流媒体”窗口模拟lag函数。对我来说,Spark并没有提供一个表现为滞后的函数,这似乎令人难以置信。+1非常感谢。这似乎只在Scala语言中可用。你能给出一个代码示例吗?啊,对。它意味着在Pypark。对不起,没问题。无论如何,您能提供一个代码示例来计算Scala中时间戳的差异吗?