Scala 基于json数组字段的spark dropDuplicates

Scala 基于json数组字段的spark dropDuplicates,scala,apache-spark,databricks,Scala,Apache Spark,Databricks,我有以下结构的json文件: {"names":[{"name":"John","lastName":"Doe"}, {"name":"John","lastName":"Marcus"}, {"name":"David","lastName":"Luis"} ]} 我想阅读几个这样的json文件,并根据名称中的“name”列将它们区分开来。 我试过了 但它没有发挥神奇的作用。这似乎是spark 2.0中添加的一种回归。如果将嵌套列提升到最高级别,则可以删除重复项。如果我们基于要对其进行重复数

我有以下结构的json文件:

{"names":[{"name":"John","lastName":"Doe"},
{"name":"John","lastName":"Marcus"},
{"name":"David","lastName":"Luis"}
]}
我想阅读几个这样的json文件,并根据名称中的“name”列将它们区分开来。 我试过了


但它没有发挥神奇的作用。

这似乎是spark 2.0中添加的一种回归。如果将嵌套列提升到最高级别,则可以删除重复项。如果我们基于要对其进行重复数据消除的列创建新列。然后我们删除列,最后删除列。以下功能也适用于复合关键点

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

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

      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")

从json文件创建数据帧后,您的问题变成了重复问题:不确定为什么会这样做,因为重复数据消除键列似乎将包含用逗号分隔的名称,因此。dropDuplicates(“重复数据消除键”)无法正常工作,不是吗?不,逗号分隔是指您要对多个键执行重复数据消除(复合键)。在您的情况下,它将是一个具有名称的附加高级键,以便您可以进行重复数据消除。您尝试过吗?是的,我尝试过。我使用.show()查看了结果而且它似乎创建了一个名称用逗号分隔的重复数据消除键列。然后dropDuplicates无法按预期工作。是的,我很抱歉。您必须先对名称进行分解,然后再进行重复数据消除。我很抱歉。谢谢。我回复了使用explode的解决方案。
      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")