【问题标题】:spark dropDuplicates based on json array fieldspark dropDuplicates 基于 json 数组字段
【发布时间】:2017-11-14 07:17:25
【问题描述】:

我有以下结构的 json 文件:

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

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

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

但它并没有发挥作用。

【问题讨论】:

标签: scala apache-spark databricks


【解决方案1】:

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

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

【讨论】:

  • 不确定为什么会这样,因为 DEDUP_KEY 列似乎包含用逗号分隔的名称,所以 .dropDuplicates("DEDUP_KEY) 无法正常工作,不是吗?跨度>
  • 不,逗号分隔是当您有多个要对其进行重复数据删除的键(复合键)时。在您的情况下,它将是带有名称的附加高级键,因此您可以进行重复数据删除。你试过了吗?
  • 是的,我有。我使用 .show() 查看了结果,它似乎创建了一个名称由逗号分隔的 DEDUP_KEY 列。然后 dropDuplicates 无法按预期工作。
  • 是的,对不起。您首先必须对名称进行分解,然后进行重复数据删除。我很抱歉。
  • 谢谢。我回答了似乎是使用爆炸的解决方案。
【解决方案2】:

仅供参考,解决方案如下

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

【讨论】:

    猜你喜欢
    • 2017-12-30
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    相关资源
    最近更新 更多