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

Apache spark Spark drop复制并选择具有最大值的行,apache-spark,apache-spark-sql,apache-spark-dataset,Apache Spark,Apache Spark Sql,Apache Spark Dataset,我试图删除基于column1的重复项,并选择column2中具有最大值的行。第2列的值为“年”(20192020等),类型为“字符串”。我的解决方案是,将第2列转换为整数并选择最大值 Dataset<Row> ds ; //The dataset with column1,column2(year), column3 etc. Dataset<Row> newDs = ds.withColumn("column2Int", col("colu

我试图删除基于column1的重复项,并选择column2中具有最大值的行。第2列的值为“年”(20192020等),类型为“字符串”。我的解决方案是,将第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//具有第1列、第2列(年份)、第3列等的数据集。
数据集newDs=ds.withColumn(“column2Int”,coln(“column2”).cast(DataTypes.IntegerType));
newDs=newDs.groupBy(“column1”).max(“column2Int”);//删除所有其他列
当我执行“分组方式”时,这种方法会删除原始数据集“ds”中的所有其他列。因此,我必须在“ds”和“newDS”之间进行连接,以恢复所有原始列。将字符串列强制转换为整数看起来也是一种无效的解决方法


是否可以删除重复项并从原始数据集本身获取字符串值较大的行?

这是一个典型的重复数据消除问题,您需要使用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);
import org.apache.spark.sql.expressions.Window;
导入org.apache.spark.sql.expressions.WindowSpec;
导入org.apache.spark.sql.functions;
导入org.apache.spark.sql.types.DataTypes;
数据集df=???;
WindowSpec WindowSpec=Window.partitionBy(“column1”).orderBy(functions.desc(“column2Int”);
数据集结果=
df.withColumn(“column2Int”,functions.col(“column2”).cast(数据类型.整型))
.withColumn(“rank”,functions.rank().over(windowSpec))
。其中(“排名==1”)
.降职(“职级”);
结果显示(假);
概述发生的情况

  • 将强制转换的整数列添加到df中,以便将来进行排序
  • 根据column1的值在数据集(分区)中形成子部分/窗口
  • 对于这些子部分/窗口/分区中的每一个,行都按照您希望的最大值按int.Desc顺序按列进行排序
  • 在创建的每个分区/窗口中,都会为行分配类似于行号的列
  • 对秩为1的所有行进行筛选(最大值为顺序描述时的值。)

  • 感谢您提供详细的解决方案。只有当column2对特定column1值具有多个相同的值时,它才会失败。但我能应付。我还认为orderby也可以应用于字符串column2,它给出了max year值。您认为您的解决方案会比所讨论的解决方案提供更好的性能吗?或者,您可以只做
    max(“column2”)。而不是在(windowSpec)
    上对整个分区进行排序,不是吗?