Искры DropDuplicates на основе поля массива JSON
У меня есть файлы JSON следующей структуры:
{"names":[{"name":"John","lastName":"Doe"},
{"name":"John","lastName":"Marcus"},
{"name":"David","lastName":"Luis"}
]}
Я хочу прочитать несколько таких json-файлов и различать их по столбцу "name" внутри имен. Я старался
df.dropDuplicates(Array("names.name"))
но это не сработало.
3 ответа
Кажется, это регрессия, добавленная в 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")
В качестве обновления существующего ответа аналогичного результата можно добиться без взрыва. Мы можем просто получить значение каждого столбца, а затем выполнить объединение для генерации DEDUPE_KEY.
val columns = Seq("names.name")
df.withColumn("DEDUPE_KEY", concat_ws("_", columns.map(att => col(att)):_*))
.dropDuplicates("DEDUPE_KEY")
.drop("DEDUPE_KEY")