我有一个数据集,其中包含保存时间段的记录列表(用纳秒表示:两个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|
+-----+-----+---+