Apache spark Spark结构化流媒体&构造窗口间隔

Apache spark Spark结构化流媒体&构造窗口间隔,apache-spark,pyspark,apache-spark-sql,spark-structured-streaming,Apache Spark,Pyspark,Apache Spark Sql,Spark Structured Streaming,我将一个流数据帧(由下面的前四列组成)与一个静态数据帧(提供最后两列)连接起来,以生成一个新的流数据帧(称为first_agg_sdf),其结构如下: +---------+--------+-----+-------------------+-----+------------+ |elementid|metricid|value| epoch|sigma|windowlength| +---------+--------+-----+----------------

我将一个流数据帧(由下面的前四列组成)与一个静态数据帧(提供最后两列)连接起来,以生成一个新的流数据帧(称为first_agg_sdf),其结构如下:

+---------+--------+-----+-------------------+-----+------------+
|elementid|metricid|value|              epoch|sigma|windowlength|
+---------+--------+-----+-------------------+-----+------------+
|        2|       6|41.01|2018-02-28 16:56:10|  3.3|   5 minutes|
|        2|       6|61.45|2018-02-28 16:56:24|  3.3|   5 minutes|
|        2|       6| 9.13|2018-02-28 16:56:51|  3.3|   5 minutes|
|        2|       6|34.21|2018-02-28 16:57:19|  3.3|   5 minutes|
|        2|       5|43.25|2018-02-28 16:56:10|  3.2|   3 minutes|
|        2|       5| 4.96|2018-02-28 16:56:24|  3.2|   3 minutes|
|        2|       5|22.81|2018-02-28 16:56:51|  3.2|   3 minutes|
|        2|       5| 0.04|2018-02-28 16:57:19|  3.2|   3 minutes|
这有一个模式:

root
 |-- elementid: integer (nullable = true)
 |-- metricid: integer (nullable = true)
 |-- value: float (nullable = true)
 |-- epoch: timestamp (nullable = true)
 |-- sigma: double (nullable = true)
 |-- windowlength: string (nullable = true)
然后,我想生成一个滑动窗口,该窗口在该行的windowlength列中的值给定的窗口持续时间内聚集在elementid、metricid上

我生成了以下代码:

first_agg_window = first_agg_sdf \
    .withWatermark("epoch", "30 seconds") \
    .groupBy(
         window(timeColumn="epoch", windowDuration="windowlength", slideDuration="30 seconds"),
        "elementid",
        "metricid")
    .agg(stddev_pop("value").alias("movingstd"), avg("value").alias("movingavg"), last("value").alias("value"))
如果我向windowDuration属性提供如下字符串,则上述窗口聚合可以正常工作:

windowDuration=“5分钟”

但是,如果我像这样使用dataframe列值:

windowDuration=“windowlength”

我得到以下错误:

回溯(最近一次呼叫最后一次):
文件“/home/ec2 user/spark/spark-2.2.0-bin-
hadoop2.7/python/lib/pyspark.zip/pyspark/sql/utils.py”,第63行,deco格式
文件“/home/ec2 user/spark/spark-2.2.0-bin-hadoop2.7/python/lib/py4j-
0.10.4-src.zip/py4j/protocol.py”,第319行,在get_return_值中
py4j.protocol.Py4JJavaError:调用时出错
z:org.apache.spark.sql.functions.window。
:java.lang.IllegalArgumentException:提供的间隔
(windowlength)与org.apache.spark.sql.catalyst.expressions.TimeWindow.getIntervalInMicroSeconds(TimeWindow.scala:120)org.apache.spark.sql.catalyst.expressions.TimeWindow$.apply(TimeWindow.scala:148)的有效间隔字符串不对应
位于org.apache.spark.sql.functions$.window(functions.scala:2805)
位于org.apache.spark.sql.functions$.window(functions.scala:2852)
位于org.apache.spark.sql.functions.window(functions.scala)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
位于py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
在py4j.Gateway.invoke处(Gateway.java:280)
位于py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
在py4j.commands.CallCommand.execute(CallCommand.java:79)
在py4j.GatewayConnection.run处(GatewayConnection.java:214)
在java.lang.Thread.run(未知源代码)


如何将每行中的列值windowlength传递到属性windowDuration中,而不生成上述错误

不幸的是,它不是那样工作的。窗口持续时间是流式查询生命周期的固定值。只能在流式查询开始时设置

您很可能需要使用两个流式查询,每个窗口持续时间一个

尝试编写两个流式查询: 1.阅读来源 2.按窗口持续时间筛选行 3.总数的
4.可选稍后连接回数据

不幸的是,这种方式不起作用。窗口持续时间是流式查询生命周期的固定值。只能在流式查询开始时设置

您很可能需要使用两个流式查询,每个窗口持续时间一个

尝试编写两个流式查询: 1.阅读来源 2.按窗口持续时间筛选行 3.总数的 4.可选的稍后连接回数据