【问题标题】:Identify duplicate record in Dataframe识别 Dataframe 中的重复记录
【发布时间】:2020-11-10 02:04:39
【问题描述】:

我有一个如下的数据框,可以识别任何人的全名:

-------------------
| f_name | l_name |
-------------------
| abc    | xyz    |
| xyz    | abc    |
| pqr    | lmn    |
-------------------

这里第二行和第一行基本相同。

考虑这样一种情况:数据中出现了一个条目,错误地将姓放在名字下面(f_name),而把名字放在姓氏下面(l_name) >)

如何识别和删除/解决 spark 数据框中的此类重复/错误记录?

期望的结果:

-------------------
| f_name | l_name |
-------------------
| abc    | xyz    |
| pqr    | lmn    |
-------------------

解决方案可以是udfSQL 或两者兼有。谢谢!

【问题讨论】:

    标签: sql dataframe apache-spark


    【解决方案1】:

    使用可用于DatasetdropDuplicates 函数和正确的键:

    val df = Seq(
      ("abc", "xyz"),
      ("xyz", "abc"),
      ("pqr", "lmn")
    ).toDF("f_name", "l_name")
    
    df.withColumn("key", array_sort(array('f_name, 'l_name))).dropDuplicates("key")
    
    +------+------+----------+
    |f_name|l_name|       key|
    +------+------+----------+
    |   pqr|   lmn|[lmn, pqr]|
    |   abc|   xyz|[abc, xyz]|
    +------+------+----------+
    

    【讨论】:

    • @Kombajin 很好的答案!。您能否帮助将该“键”列数组转换为最终 df 中的列?说为列 (full_name) 值 (abc_xyz)。我尝试转换为 rdd 然后拆分每个 Row(0) 但我得到 WrappedArray(abc_xyz)
    • @Harshv:查看docs 以查找array_join 函数。试试:.withColumn("full_name", array_join('key, " ").
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2020-08-01
    • 1970-01-01
    • 2018-10-04
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多