我正在尝试删除基于column1的重复项,并选择column2中具有最大值的行。列2的值为“year”(20192020等),类型为“string”。我的解决方案是,将列2转换为整数,然后选择最大值。
Dataset<Row> ds ; //The dataset with column1,column2(year), column3 etc.
Dataset<Row> newDs = ds.withColumn("column2Int", col("column2").cast(DataTypes.IntegerType));
newDs = newDs.groupBy("column1").max("column2Int"); // drops all other columns
当我执行“分组依据”时,这种方法会删除原始数据集“ds”中的所有其他列。所以我必须在'ds'和'newds'之间做一个连接,以恢复所有原始列。将字符串列强制转换为整数看起来也是一种无效的解决方法。
是否可以删除重复项并从原始数据集本身获取字符串值更大的行?
1条答案
按热度按时间ohfgkhjo1#
这是一个典型的重复数据消除问题,您需要使用window+rank+filter组合来解决这个问题。
我不太熟悉java语法,但是示例代码应该如下所示,
对所发生事情的概述,
将casted integer列添加到df以供将来排序。
子部分/窗口是基于column1的值在数据集(分区)中形成的
对于这些子部分/窗口/分区中的每一个,行都按您希望的最大值按int.desc顺序按列进行排序。
在创建的每个分区/窗口中,都会为行分配类似列的行号。
对秩为1的所有行进行过滤(最大值为顺序描述的值)