Sql 识别数据帧中的重复记录

Sql 识别数据帧中的重复记录,sql,dataframe,apache-spark,Sql,Dataframe,Apache Spark,我有一个数据框,如下所示,用于识别任何人的全名: ------------------- | f_name | l_name | ------------------- | abc | xyz | | xyz | abc | | pqr | lmn | ------------------- 这里的第二行与第一行基本相同 考虑这样一种情况,即数据中出现了一个条目,其中姓氏错误地放在了名下(f_name),而姓氏错误地放在了姓氏下(l_name) 如何在spa

我有一个数据框,如下所示,用于识别任何人的全名:

-------------------
| f_name | l_name |
-------------------
| abc    | xyz    |
| xyz    | abc    |
| pqr    | lmn    |
-------------------
这里的第二行与第一行基本相同

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

如何在spark dataframe中识别和删除/解决此类重复/错误记录

预期结果:

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

解决方案可以是使用
udf
SQL
或两者。Thnx

使用
dropDuplicates
功能,该功能可用于
数据集
,并使用正确的键:

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]|
+------+------+----------+

使用
dropDuplicates
功能,该功能可用于
Dataset
,并使用正确的键:

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中的列吗?表示为列(全名)值(abc_xyz)。我尝试转换为rdd,然后拆分每一行(0),但是我得到了WrappedArray(abc_xyz)@Harshv:查看查找
数组\u连接
函数。请尝试:
。withColumn(“全名”,array\u join('key,”)
@Kombajin回答得很好。您还可以帮助将该“key”列数组转换为最终df中的一列吗?例如作为列(全名)值(abc\u xyz)。我尝试转换为rdd,然后拆分每行(0),但我得到了WrappedArray(abc\u xyz)@Harshv:查看查找数组连接的功能。请尝试:
。使用列(“全名”,数组连接('key')