Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.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
Scala Spark Bucketizer-即使没有任何元素,也显示所有铲斗_Scala_Apache Spark_Spark Dataframe_Buckets - Fatal编程技术网

Scala Spark Bucketizer-即使没有任何元素,也显示所有铲斗

Scala Spark Bucketizer-即使没有任何元素,也显示所有铲斗,scala,apache-spark,spark-dataframe,buckets,Scala,Apache Spark,Spark Dataframe,Buckets,我有一个如下所示的事件列表 从spark数据帧生成。我将Spark 2.2.0与Scala一起使用 val events = df.select($"event", hour($"time") as "hour", to_date($"time", "yyyy-MM-dd") as "day") +-----+-----+----------+ |事件|小时|天| +-----+-----+----------+ |事件1 | 18 | 2015-02-05| |事件1 | 17 | 201

我有一个如下所示的事件列表 从spark数据帧生成。我将Spark 2.2.0与Scala一起使用

val events = df.select($"event", hour($"time") as "hour", to_date($"time", "yyyy-MM-dd") as "day")

+-----+-----+----------+
|事件|小时|天|
+-----+-----+----------+
|事件1 | 18 | 2015-02-05|
|事件1 | 17 | 2015-02-19|
|事件5 | 18 | 2015-02-02|
|事件5 | 19 | 2015-02-02|
|事件1 | 1 | 2015-03-17|
|事件1 | 0 | 2015-02-03|
|事件1 | 20 | 2015-02-02|
|事件1 | 22 | 2015-02-02|
|事件1 | 23 | 2015-02-02|
|事件1 | 18 | 2015-02-09|
|事件1 | 19 | 2015-02-09|
|事件1 | 21 | 2015-02-09|
|事件1 | 21 | 2015-04-06|
|事件1 | 23 | 2015-02-09|
|事件1 | 20 | 2015-02-16|
|事件2 | 19 | 2015-02-12|
|事件3 | 18 | 2015-02-18|
|事件1 | 22 | 2015-02-16|
|事件2 | 17 | 2015-02-04|
|事件1 | 23 | 2015-02-16|
+-----+----+----------+
仅显示前20行

我需要创建每小时的存储桶,并计算每小时发生的事件数。因此,我的方法是创建bucket(其中24个)并计算特定时段内的事件,如下所示

val splits = (0 to 24).map(_ * 1.0).toArray
val bucketizer = new Bucketizer()
    .setInputCol("hour")
    .setOutputCol("bucket")
    .setSplits(splits)

val bucket = bucketizer.transform(events)

val result = bucket.groupBy($"day", $"bucket").agg(count($"event").as("count")).orderBy(asc("bucket"))

result.filter($"day" === "2015-05-21").orderBy(asc("bucket")).show()
上面代码的结果是


+----------+------+-----+
|日|桶|计数|
+----------+------+-----+
|2015-05-21|   0.0|    1|
|2015-05-21|   2.0|    1|
|2015-05-21|  11.0|    1|
|2015-05-21|  17.0|    1|
|2015-05-21|  18.0|    4|
|2015-05-21|  19.0|    4|
|2015-05-21|  21.0|    1|
|2015-05-21|  22.0|    3|
|2015-05-21|  23.0|    1|
+----------+------+-----+

这是正确的。然而,我所期望的输出是这样的:


+----------+------+-----+
|日|桶|计数|
+----------+------+-----+
|2015-05-21|   0.0|    1|
|2015-05-21|   1.0|    0|
|2015-05-21|   2.0|    1|
|2015-05-21|   3.0|    0|
|2015-05-21|   4.0|    0|
|2015-05-21|   5.0|    0|
:
:
|2015-05-21|  11.0|    1|
|2015-05-21|  12.0|    0|
|2015-05-21|  13.0|    0|
:
:
|2015-05-21|  17.0|    1|
|2015-05-21|  18.0|    4|
|2015-05-21|  19.0|    4|
|2015-05-21|  20.0|    0|
|2015-05-21|  21.0|    1|
|2015-05-21|  22.0|    3|
|2015-05-21|  23.0|    1|
+----------+------+-----+

基本上,没有事件的容器(bucket)应该填充0。你知道怎么做到吗


谢谢大家!

这是我目前没有使用Bucketizer的解决方案(我承认不是很漂亮)

此代码返回如下所示的内容:


+----+-----+
|小时数|
+----+-----+
|   0|    1|
|   1|    0|
|   2|    1|
|   3|    0|
|   4|    0|
|   5|    0|
|   6|    0|
|   7|    0|
|   8|    0|
|   9|    0|
|  10|    0|
|  11|    1|
|  12|    0|
|  13|    0|
|  14|    0|
|  15|    0|
|  16|    0|
|  17|    1|
|  18|    4|
|  19|    4|
|  20|    0|
|  21|    1|
|  22|    3|
|  23|    1|
|  24|    0|
+----+-----+
这是我预期的结果。 如果有人能想出更好的解决办法,我会接受这个答案


谢谢大家!

到目前为止,hour列和bucket列应该包含相同的值,即bucketing步骤是不必要的。@Shaido我在请求中可能不够清楚。因为事件可能不会在某个小时内发生(例如:在1到2之间没有事件),所以我的数据帧将不包含标记为1的小时。这就是为什么我想强制创建所有的24小时和按桶分组
val events = df.select($"event", hour($"time") as "hour", to_date($"time", "yyyy-MM-dd") as "day")

val left = (0 to 24).toDF.withColumnRenamed("value", "hour")
val right = or_counts.filter($"day" === "2015-05-21").groupBy($"hour").agg(count("event").as("count")).orderBy(asc("hour"))

left.join(right, Seq("hour"), "left_outer").na.fill(0, Seq("count")).show()