spark-dropDuplicates按某几列删除dataframe重复行

参考1:http://spark.apache.org/docs/latest/api/python/reference/api/pyspark.sql.DataFrame.dropDuplicates.html

参考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

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值