scala spark dropDuplicates基于json数组字段

o2gm4chl  于 2023-04-06  发布在  Scala
关注(0)|答案(3)|浏览(135)

我有以下结构的json文件:

{"names":[{"name":"John","lastName":"Doe"},
{"name":"John","lastName":"Marcus"},
{"name":"David","lastName":"Luis"}
]}

我想读取几个这样的json文件,并根据名称中的“名称”列区分它们

df.dropDuplicates(Array("names.name"))

但并没有起到作用

k10s72fa

k10s72fa1#

这似乎是在spark 2.0中添加的回归。如果你将嵌套的列带到最高级别,你可以删除重复项。如果我们根据你想要删除的列创建一个新列。然后我们删除列,最后删除列。下面的函数也适用于复合键。

val columns = Seq("names.name")
df.withColumn("DEDUP_KEY", concat_ws(",", columns:_*))
  .dropDuplicates("DEDUP_KEY")
  .drop("DEDUP_KEY")
jm81lzqq

jm81lzqq2#

仅供将来参考,解决方案如下所示

val uniqueNams = allNames.withColumn("DEDUP_NAME_KEY", 
org.apache.spark.sql.functions.explode(new Column("names.name")))
.cache()
.dropDuplicates(Array("DEDUP_NAME_KEY"))
.drop("DEDUP_NAME_KEY")
brccelvz

brccelvz3#

作为对现有答案的更新,类似的事情可以在不爆炸的情况下实现。我们可以简单地获得每列的值,然后进行串联以生成DEDUPE_KEY

val columns = Seq("names.name")
df.withColumn("DEDUPE_KEY", concat_ws("_", columns.map(att => col(att)):_*))
  .dropDuplicates("DEDUPE_KEY")
  .drop("DEDUPE_KEY")

相关问题