如何计算Spark结构化流中的滞后差异?

时间:2018-11-23 16:58:53

标签: apache-spark pyspark apache-spark-sql spark-structured-streaming

我正在编写一个Spark结构化流程序。我需要创建一个带有滞后差的附加列。

为重现我的问题,我提供了代码段。此代码使用了data.json文件夹中存储的data文件:

[
  {"id": 77,"type": "person","timestamp": 1532609003},
  {"id": 77,"type": "person","timestamp": 1532609005},
  {"id": 78,"type": "crane","timestamp": 1532609005}
]

代码:

from pyspark.sql import SparkSession
import pyspark.sql.functions as func
from pyspark.sql.window import Window
from pyspark.sql.types import *

spark = SparkSession \
    .builder \
    .appName("Test") \
    .master("local[2]") \
    .getOrCreate()

schema = StructType([
    StructField("id", IntegerType()),
    StructField("type", StringType()),
    StructField("timestamp", LongType())
])

ds = spark \
    .readStream \
    .format("json") \
    .schema(schema) \
    .load("data/")

diff_window = Window.partitionBy("id").orderBy("timestamp")
ds = ds.withColumn("prev_timestamp", func.lag(ds.timestamp).over(diff_window))

query = ds \
    .writeStream \
    .format('console') \
    .start()

query.awaitTermination()

我收到此错误:

  

pyspark.sql.utils.AnalysisException:非基于时间的窗口不是   在流式数据帧/数据集上受支持;; \ nWindow   [lag(timestamp#71L,1,null)windowspecdefinition(host_id#68,   timestamp#71L ASC首先为空,行在1个前置字符和1个之间   PRECEDING)为prev_timestamp#129L]

1 个答案:

答案 0 :(得分:1)

  

pyspark.sql.utils.AnalysisException:流数据帧/数据集不支持基于非时间的窗口

这意味着您的窗口应基于timestamp列。因此,您每个秒都有一个数据点,并创建一个30sstride的{​​{1}}窗口,结果窗口将创建一个新的10s列, windowstart列将包含相差end的时间戳。

您应该以这种方式使用窗口:

30s