我有一个数据集,其中包含保存时间段的记录列表(用纳秒表示:两个Long,一个用于开始,一个用于结束)和测量值。我需要创建一个新的汇总数据集,该数据集仅包含更改值的时间段。例如:

    input dataset:
    +-----+-----+-----+
    |start|end  |value|
    +-----+-----+-----+
    |123  |124  |1    |
    |124  |128  |1    |
    |128  |300  |2    |
    |300  |400  |2    |
    |400  |500  |3    |

    result dataset:
    +-----+-----+-----+
    |start|end  |value|
    +-----+-----+-----+
    |123  |128  |1    |
    |128  |400  |2    |
    |400  |500  |3    |


我知道如何在小型数据集上执行此操作,但不知道如何使用mapreduce范例和Apache Spark。

您能给我一个提示如何在Apache Spark,Java中实现这一点吗?

最佳答案

这样看来很简单。如果找到带有groupBy的最小值和最大值,然后合并数据集。

// df is original dataset
Dataset<Row> df_start = df.groupBy("value").min("start").withColumnRenamed("min(start)", "start").withColumnRenamed("value", "value_start");
Dataset<Row> df_end = df.groupBy("value").max("end").withColumnRenamed("max(end)", "end").withColumnRenamed("value", "value_end");

Dataset<Row> df_combined = df_start.join(df_end, df_start.col("value_start").equalTo(df_end.col("value_end"))).drop("value_end").withColumnRenamed("value_start", "value").orderBy("value");

df_combined.show(false);
+-----+-----+---+
|value|start|end|
+-----+-----+---+
|1    |123  |128|
|2    |128  |400|
|3    |400  |700|
+-----+-----+---+

07-24 13:22