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去重后的数量。