我有以下结构的json文件:
{"names":[{"name":"John","lastName":"Doe"}, {"name":"John","lastName":"Marcus"}, {"name":"David","lastName":"Luis"} ]}
我想读取几个这样的json文件,并根据名称中的“名称”列区分它们
df.dropDuplicates(Array("names.name"))
但并没有起到作用
k10s72fa1#
这似乎是在spark 2.0中添加的回归。如果你将嵌套的列带到最高级别,你可以删除重复项。如果我们根据你想要删除的列创建一个新列。然后我们删除列,最后删除列。下面的函数也适用于复合键。
val columns = Seq("names.name") df.withColumn("DEDUP_KEY", concat_ws(",", columns:_*)) .dropDuplicates("DEDUP_KEY") .drop("DEDUP_KEY")
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")
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")
3条答案
按热度按时间k10s72fa1#
这似乎是在spark 2.0中添加的回归。如果你将嵌套的列带到最高级别,你可以删除重复项。如果我们根据你想要删除的列创建一个新列。然后我们删除列,最后删除列。下面的函数也适用于复合键。
jm81lzqq2#
仅供将来参考,解决方案如下所示
brccelvz3#
作为对现有答案的更新,类似的事情可以在不爆炸的情况下实现。我们可以简单地获得每列的值,然后进行串联以生成DEDUPE_KEY