Spark - 在json数组字段中删除重复项[重复]
Posted
技术标签:
【中文标题】Spark - 在json数组字段中删除重复项[重复]【英文标题】:Spark - drop duplicates inside a json array field [duplicate] 【发布时间】:2018-08-29 17:30:29 【问题描述】:我分享我拥有的代码:
// define a case class
case class Zone(id: Int, team: String, members: Int ,name: String, lastname: String)
val df = Seq (
(1,"team1", 3, "Jonh", "Doe"),
(1,"team2", 4, "Jonh", "Doe"),
(1,"team3", 5, "David", "Luis"),
(2,"team4", 6, "Michael", "Larson"))
.toDF("id", "team", "members", "name", "lastname").as[Zone]
val df_grouped = df
.withColumn("team_info", to_json(struct(col("team"), col("members"))))
.withColumn("users", to_json(struct(col("name"), col("lastname"))))
.groupBy("id")
.agg(collect_list($"team_info").alias("team_info"), collect_list($"users").alias("users"))
df_grouped.show
+---+--------------------+--------------------+
| id| team_info| users|
+---+--------------------+--------------------+
| 1|["team":"team1",...|["name":"Jonh","...|
| 2|["team":"team4",...|["name":"Michael...|
+---+--------------------+--------------------+
我需要删除“用户”列中的重复项,因为在我的情况下,如果数组中的 json 完全相同,则表示重复项。有没有办法用 df.withColumn 或任何其他方法改变该列的值?
【问题讨论】:
提供您尝试过的代码 对不起,我会添加代码。 我已经想出了解决办法。使用 collect_set 而不是 collect_list 【参考方案1】:这可能不是最优雅的解决方案,但应该可以:
import org.apache.spark.sql.types._
import org.apache.spark.sql.Encoders
val df = sc.parallelize(
Array("[\"name\":\"John\",\"lastName\":\"Doe\",\"name\":\"John\",\"lastName\":\"Doe\",\"name\":\"David\",\"lastName\":\"Luis\"]")
).toDF("users")
case class Users(name: String, lastName: String)
val schema = ArrayType(Encoders.product[Users].schema)
df.withColumn("u", from_json($"users", schema))
.select("u")
.as[Array[Users]]
.map(_.distinct)
.toDF("u")
.withColumn("users", to_json($"u"))
.select("users")
假设您的用户将拥有比您的示例更多的属性,只需将这些属性添加到案例类即可。只要类型简单,Encoder
就应该自动推断模式。
【讨论】:
【参考方案2】:您可以使用 explode 和 dropDuplicates 内置函数
spark dropDuplicates based on json array field
【讨论】:
以上是关于Spark - 在json数组字段中删除重复项[重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 MySQL JSON 字段中的数组中搜索值(Laravel/Lumen)[重复]