Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark ApacheSpark-如何在事件时间使用窗口操作设计自己的聚合_Apache Spark_Spark Structured Streaming - Fatal编程技术网

Apache spark ApacheSpark-如何在事件时间使用窗口操作设计自己的聚合

Apache spark ApacheSpark-如何在事件时间使用窗口操作设计自己的聚合,apache-spark,spark-structured-streaming,Apache Spark,Spark Structured Streaming,我想计算一下供求比。使用“时间到提取”、“时间到提取”、“提取位置”、“提取位置”字段重新编码数据 2019-01-01 00:22:212019-01-01 00:43:43,苏豪区联合广场 我将把记录拆分为两个记录,以便数据如下所示: 2019-01-01 00:22:21,联合广场,皮克 2019-01-01 00:43:43,索霍区,降落区 2019-01-01 00:22:23,联合广场,落差 比率=(拾取+放下)/拾取=2/1=2 (因为下降意味着汽车可用,所以供应数量增加了一。

我想计算一下供求比。使用“时间到提取”、“时间到提取”、“提取位置”、“提取位置”字段重新编码数据

2019-01-01 00:22:212019-01-01 00:43:43,苏豪区联合广场

我将把记录拆分为两个记录,以便数据如下所示:

2019-01-01 00:22:21,联合广场,皮克

2019-01-01 00:43:43,索霍区,降落区

2019-01-01 00:22:23,联合广场,落差

比率=(拾取+放下)/拾取=2/1=2 (因为下降意味着汽车可用,所以供应数量增加了一。 ;拾取的记录将同时影响需求和供应 )我想在每5分钟一小时内报告比率

 val perMinCount = ds.filter(col("zone")== "Union Sq").withWatermark("datetime", "10 minutes")
    .groupBy($"zone",window($"datetime", "1 hours","5 minutes")).agg(?)

这就是我目前所做的。如何实现它?

您也可以在不编写自定义聚合的情况下解决此问题。 您可以使用when或groupBy、agg来实现这一点。 e、 g

在本例中,我将窗口的总持续时间设为“10分钟”,您可以在案例中使用“1小时”

//streaming df
+-------------------+--------+-----+
|datetime           |zone    |event|
+-------------------+--------+-----+
|2019-11-06 11:32:21|Union Sq|PICK |
|2019-11-06 11:32:22|SoHo    |DROP |
|2019-11-06 11:32:23|Union Sq|DROP |
+-------------------+--------+-----+

val enrichedStreamingDf = streamingDf
  .withColumn("demand",
    when(col("event") === "PICK", lit(1))
      .when(col("event") === "DROP", lit(0))
      .otherwise(lit(0)))
  .withColumn("supply",
    when(col("event") === "PICK", lit(1))
      .when(col("event") === "DROP", lit(1))
      .otherwise(lit(0)))
  .filter(col("zone") === "Union Sq")

//enriched streaming df
+-------------------+--------+-----+------+------+
|datetime           |zone    |event|demand|supply|
+-------------------+--------+-----+------+------+
|2019-11-06 11:32:21|Union Sq|PICK |1     |1     |
|2019-11-06 11:32:23|Union Sq|DROP |0     |1     |
+-------------------+--------+-----+------+------+

val ratioDf = enrichedStreamingDf
  .withWatermark("datetime", "10 minutes")
  .groupBy(
    window($"datetime", "10 minutes", "5 minutes"),
    $"zone"
  )
  .agg((sum($"supply") / sum($"demand")).as("sup_dem_ratio"))

//supply to demand ratio streaming df
+------------------------------------------+--------+-------------+
|window                                    |zone    |sup_dem_ratio|
+------------------------------------------+--------+-------------+
|[2019-11-06 11:25:00, 2019-11-06 11:35:00]|Union Sq|2.0          |
|[2019-11-06 11:30:00, 2019-11-06 11:40:00]|Union Sq|2.0          |
+------------------------------------------+--------+-------------+