spark drop复制并选择具有最大值的行

vaj7vani  于 2021-05-17  发布在  Spark
关注(0)|答案(1)|浏览(376)

我正在尝试删除基于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'之间做一个连接,以恢复所有原始列。将字符串列强制转换为整数看起来也是一种无效的解决方法。
是否可以删除重复项并从原始数据集本身获取字符串值更大的行?

ohfgkhjo

ohfgkhjo1#

这是一个典型的重复数据消除问题,您需要使用window+rank+filter组合来解决这个问题。
我不太熟悉java语法,但是示例代码应该如下所示,

import org.apache.spark.sql.expressions.Window;
    import org.apache.spark.sql.expressions.WindowSpec;
    import org.apache.spark.sql.functions;
    import org.apache.spark.sql.types.DataTypes;

    Dataset<Row> df = ???;

    WindowSpec windowSpec = Window.partitionBy("column1").orderBy(functions.desc("column2Int"));

    Dataset<Row> result =
        df.withColumn("column2Int", functions.col("column2").cast(DataTypes.IntegerType))
            .withColumn("rank", functions.rank().over(windowSpec))
            .where("rank == 1")
            .drop("rank");

    result.show(false);

对所发生事情的概述,
将casted integer列添加到df以供将来排序。
子部分/窗口是基于column1的值在数据集(分区)中形成的
对于这些子部分/窗口/分区中的每一个,行都按您希望的最大值按int.desc顺序按列进行排序。
在创建的每个分区/窗口中,都会为行分配类似列的行号。
对秩为1的所有行进行过滤(最大值为顺序描述的值)

相关问题