Scala Spark SQL DataFrame中的两个常用操作:distinct()和dropDuplicates()
在本文中,我们将介绍Scala Spark SQL DataFrame中的两个常用操作:distinct()和dropDuplicates()。这两个操作都用于去除DataFrame中的重复记录,但它们在实现方式和适用场景上有所区别。
阅读更多:Scala 教程
distinct() – 去除所有重复记录
distinct()方法用于去除DataFrame中的所有重复记录。它返回一个新的DataFrame,其中包含了原始DataFrame中的所有非重复记录。distinct()方法基于所有列的值进行去重,默认保留第一个出现的记录,后续的重复记录都会被丢弃。distinct()方法可以接受一个或多个列名作为参数,表示只根据指定的列进行去重。如果不指定列名,则默认对所有列进行去重。
下面是一个使用distinct()方法的示例:
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder()
.appName("DistinctExample")
.getOrCreate()
import spark.implicits._
// 创建一个简单的DataFrame
val data = Seq(
("Alice", 25),
("Bob", 30),
("Alice", 25),
("Chris", 35),
("Bob", 30)
).toDF("name", "age")
// 使用distinct()方法对DataFrame进行去重
val distinctData = data.distinct()
distinctData.show()
运行以上代码,我们将得到以下输出:
+-----+---+
| name|age|
+-----+---+
|Alice| 25|
| Bob| 30|
|Chris| 35|
+-----+---+
可以看到,输出结果中只保留了一个Alice和一个Bob的记录,而重复出现的记录都被去除了。
dropDuplicates() – 根据指定列去除重复记录
dropDuplicates()方法与distinct()方法类似,都用于去除DataFrame中的重复记录。然而,dropDuplicates()方法更加灵活,可以根据指定的列名来去重。我们可以通过传递一个或多个列名作为参数,告诉dropDuplicates()方法只根据这些列进行去重。如果不指定列名,则默认对所有列进行去重。
下面是一个使用dropDuplicates()方法的示例:
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder()
.appName("DropDuplicatesExample")
.getOrCreate()
import spark.implicits._
// 创建一个简单的DataFrame
val data = Seq(
("Alice", 25),
("Bob", 30),
("Alice", 25),
("Chris", 35),
("Bob", 30)
).toDF("name", "age")
// 使用dropDuplicates()方法对DataFrame进行去重
val distinctData = data.dropDuplicates("name")
distinctData.show()
运行以上代码,我们将得到以下输出:
+-----+---+
| name|age|
+-----+---+
|Alice| 25|
| Bob| 30|
|Chris| 35|
+-----+---+
可以看到,输出结果中只保留了一个Alice和一个Bob的记录,而重复出现的记录都被去除了。这是因为在dropDuplicates()方法中,我们指定了根据”name”列进行去重。如果我们修改代码,指定根据”age”列进行去重,将得到不同的结果。
总结
在本文中,我们介绍了Scala Spark SQL DataFrame中的distinct()和dropDuplicates()方法。这两个方法都用于去除DataFrame中的重复记录,但distinct()方法会去除所有重复记录,而dropDuplicates()方法可以根据指定的列名进行去重。根据实际需求,我们可以选择合适的方法来去除DataFrame中的重复记录。无论是使用distinct()还是dropDuplicates(),都能帮助我们清洗数据,提高数据处理的准确性和效率。