distinct与dropDuplicates的区别以及$为什么需要导入隐式转换

1.今天工作的时候刚知道dropduplicates对这个函数。

首先distinct和dropDuplicates都是用来进行去重的。
区别在于distinct是根据每一条数据进行完整内容的比对和去重,dropDuplicates可以根据指定的字段进行去重。

下面讲一下dropDuplicates的用法:

1 第一个def dropDuplicates(): Dataset[T] = dropDuplicates(this.columns) 这个方法,不需要传入任何的参数,默认根据所有列进行去重,然后按数据行的顺序保留每行数据出现的第一条。
2 第二个def dropDuplicates(colNames: Seq[String]) 传入的参数是一个序列。你可以在序列中指定你要根据哪些列的重复元素对数据表进行去重,然后也是返回每一行数据出现的第一条
3 第三个def dropDuplicates(colNames: Array[String]) 传入的参数是一个数组,然后方法会把数组转换为序列然后再调用第二个方法
4 第四个def dropDuplicates(col1: String, cols: String*) 传入的参数为字符串,在方法体内会把你传入的字符串组合成一个序列再调用第二个方法。

2.$符号需要import spark.implicits._,源码如下

1 implicit class StringToColumn(val sc: StringContext) {
2 def $(args: Any*): ColumnName = {
3 new ColumnName(sc.s(args: _*))
4 }
5 }

$与Column是一样的都是对列进行操作

3selectExpr方法本质与select方法中使用expr函数是一样的,都是用来构建复杂的表达式,下面我们可以看几个例子。

 1 df.selectExpr("appid as newappid").show() 
上面这行代码,就是选择appid列并将appid重命名为newappid。

df.selectExpr("count(distinct(appid)) as count1", "count(distinct(brand)) as count2").show()

上面这行代码,就是计算appid去重后的数量,还有brand去重后的数量。

posted @ 2021-11-09 20:00  小阿政  阅读(264)  评论(0编辑  收藏  举报