我有下面的数据集
Date | status |
20230101| C |
20230101| C |
20230101| R |
20230101| C |
20230101| C |
20230101| R |
我需要以这样一种方式执行分组,即每个状态记录都与以前的状态记录进行比较,如果值不同,则它们是同一组,否则它们属于不同的组。
输出应
Date | status | id
20230101| C |1
20230101| C |2
20230101| R |2
20230101| C |2
20230101| C |3
20230101| R |3
Dataset<Row> ds = dataset
.withColumn("newVal", when(col("status").equalTo("C"), 1).otherwise(0))
.withColumn("id", expr("row_number() over (order by Date)"))
.persist(StorageLevel.MEMORY_ONLY());
我觉得这不管用,有人能帮帮我吗?
分组总是从R开始
2条答案
按热度按时间bwitn5fc1#
这里的答案实际上是一个反答案。如果数据是大规模的,这不是Spark应该做的事情。为什么?为什么?
Exchange SinglePartition
,ENSURE_REQUIREMENTS,[plan_id=xxxx]这意味着OOM可能,即使分区大小更大。在Spark总是一件坏事。所以,如果数据很小,这是对Spark的使用,你可以在Spark中做到这一点。否则,实际上总是在传统的DB中执行此操作。
ioekq8ef2#
通过比较当前和以前的状态,以及由范围内的创建组start分配的组id,可以找到组start:
输出量: