【问题标题】:What is the equivalent of Spark Dataframe's dropDuplicates in Spark SQL?Spark SQL 中 Spark Dataframe 的 dropDuplicates 的等价物是什么?
【发布时间】:2021-08-19 10:33:38
【问题描述】:

我在 Spark (3.0/3.1) 中有一些代码是这样写的:

foo.join(bar, Seq("col1","col2","col3"),"inner").dropDuplicates("col1","col2")

其中foobar 是两个通用数据帧。

它如何转换为 Spark SQL?我找不到与dropDuplicates 等效的定义:

select distinct(col1, col2), * ....

似乎有些不同。有什么想法吗?

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

    你可以使用ranking function-row_number()。

    val spark = SparkSession.builder().master("local[*]").getOrCreate()
    spark.sparkContext.setLogLevel("ERROR")
    import spark.implicits._
    
    val df = List((1, 2, 3), (1, 2, 4), (1, 4, 6)).toDF("col1", "col2", "col3")
    
    df.dropDuplicates("col1", "col2").show()
    /*
    +----+----+----+
    |col1|col2|col3|
    +----+----+----+
    |   1|   2|   3|
    |   1|   4|   6|
    +----+----+----+*/
    
    df.createOrReplaceTempView("table")
    spark.sql(
        """
          |select col1, col2, col3 from (
          |   select *, row_number() over (partition by col1, col2 order by col1, col2) as rn from table)
          |   where rn = 1
          |""".stripMargin).show()
    /*
    +----+----+----+
    |col1|col2|col3|
    +----+----+----+
    |   1|   2|   3|
    |   1|   4|   6|
    +----+----+----+*/
    

    【讨论】:

    • 我得到了相同的解决方案,但我唯一的疑问是order byASC 是否与 partition by 中使用的列相同?
    • 是的,默认顺序是 ASC。
    猜你喜欢
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    相关资源
    最近更新 更多