参考2:https://www.cnblogs.com/Jaryer/p/13558701.html
在对spark sql 中的dataframe数据表去除重复数据的时候可以使用dropDuplicates()
方法
- 第一个
def dropDuplicates(): Dataset[T] = dropDuplicates(this.columns)
这个方法,不需要传入任何的参数,默认根据所有列进行去重,然后按数据行的顺序保留每行数据出现的第一条。- 第二个
def dropDuplicates(colNames: Seq[String])
传入的参数是一个序列。你可以在序列中指定你要根据哪些列的重复元素对数据表进行去重,然后也是返回每一行数据出现的第一条- 第三个
def dropDuplicates(colNames: Array[String])
传入的参数是一个数组,然后方法会把数组转换为序列然后再调用第二个方法- 第四个
def dropDuplicates(col1: String, cols: String*)
传入的参数为字符串,在方法体内会把你传入的字符串组合成一个序列再调用第二个方法。
dropDuplicates去重原则:按数据行的顺序保留每行数据出现的第一条
新建一个 dataframe :
val conf = new SparkConf().setAppName("TTyb").setMaster("local")
val sc = new SparkContext(conf)
val spark = new SQLContext(sc)
val dataFrame = spark.createDataFrame(Seq(
(1, 1, "2", "5"),
(2, 2, "3", "6"),
(2, 2, "35", "68"),
(2, 2, "34", "67"),
(2, 2, "38", "68"),
(3, 2, "36", "69"),
(1, 3, "4", null)
)).toDF("id", "label", "col1", "col2")
想根据 id 和 lable 来删除重复行,即删掉 id=2 且 lable=2 的重复行。利用 distinct 无法删
dataframe.distinct().show()
+---+-----+----+----+
| id|label|col1|col2|
+---+-----+----+----+
| 1| 1| 2| 5|
| 2| 2| 3| 6|
| 2| 2| 35| 68|
| 2| 2| 34| 67|
| 2| 2| 38| 68|
| 3| 2| 36| 69|
| 1| 3| 4|null|
+---+-----+----+----+
利用 dropDuplicates 可以根据 ID 来删除:
dataFrame.dropDuplicates("id","label").show()
+---+-----+----+----+
| id|label|col1|col2|
+---+-----+----+----+
| 2| 2| 3| 6|
| 1| 1| 2| 5|
| 1| 3| 4|null|
| 3| 2| 36| 69|
+---+-----+----+----+
demo2:
from pyspark.sql import Row
df = sc.parallelize([ \
Row(name='Alice', age=5, height=80), \
Row(name='Alice', age=5, height=80), \
Row(name='Alice', age=10, height=80)]).toDF()
df.dropDuplicates().show()
+-----+---+------+
| name|age|height|
+-----+---+------+
|Alice| 5| 80|
|Alice| 10| 80|
+-----+---+------+
df.dropDuplicates(['name', 'height']).show()
+-----+---+------+
| name|age|height|
+-----+---+------+
|Alice| 5| 80|
+-----+---+------+
demo3
按time取最新的日期一条数据
from pyspark.sql import Row
from pyspark.sql import function as F
def main(sparkSession):
df = sc.parallelize([ \
Row(name='Alice', age=5, time='20100312'), \
Row(name='Alice', age=5, time='20100312'), \
Row(name='Alice', age=5, time='20100313'), \
Row(name='Alice', age=8, time='20100313'), \
Row(name='Alice', age=10,time='20100314'), \
Row(name='Zmzzz', age=10,time='20100315')]).toDF()
df.dropDuplicates().show()
ddf = dropDuplicates(['name','time'])
ddf.show()
dddf = ddf.orderBy(F.col('time').desc())
ddddf = dddf.dropDuplicates(['name'])
ddddf.show()
原文:https://www.cnblogs.com/TTyb/p/8507237.html