在 spark/scala 中给出重复值唯一标识符

Posted

技术标签:

【中文标题】在 spark/scala 中给出重复值唯一标识符【英文标题】:giving duplicate values unique identifiers in spark/scala 【发布时间】:2016-04-04 15:50:39 【问题描述】:

我希望有人可能知道使用 spark 和 scala 解决此问题的简单方法。

我有一些动物运动的网络数据,格式如下(目前在 spark 的数据框中):

id  start end   date
12  0     10    20091017
12  10    20    20091201
12  20    0     20091215
12  0     15    20100220
12  15    0     20100320

id 是动物的 id,start 和 end 是移动的位置(即第二行是从位置 id 10 到位置 id 20 的移动)。如果 start 或 end 为 0,则表示动物出生或死亡(即第一排动物 12 出生,第三排动物死亡)。

我遇到的问题是收集的数据是为了在数据库中重复使用动物 ID,因此在动物死后它的 ID 可能会重新出现。

我想做的是为所有重复使用的动作应用一个独特的标签。所以你会得到一个类似于

的数据库
id  start end   date
12a 0     10    20091017
12a 10    20    20091201
12a 20    0     20091215
12b 0     15    20100220
12b 15    0     20100320

我一直在尝试几种不同的方法,但似乎无法获得任何有效的方法。数据库非常大(几千兆字节),因此需要一些可以非常有效地工作的东西。

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

可能直接在DataFrames 上相对较好的唯一解决方案是使用窗口函数,但我仍然不希望这里有特别高的性能:

import org.apache.spark.sql.expressions.Window

val df = Seq(
  (12,  0, 10, 20091017), (12,  10, 20, 20091201),
  (12,  20, 0, 20091215), (12,  0, 15, 20100220),
  (12,  15, 0, 20100320)
).toDF("id", "start", "end", "date")

val w = Window.partitionBy($"id").orderBy($"date")
val uniqueId = struct(
  $"id", sum(when($"start" === 0, 1).otherwise(0)).over(w))

df.withColumn("unique_id", uniqueId).show

// +---+-----+---+--------+---------+
// | id|start|end|    date|unique_id|
// +---+-----+---+--------+---------+
// | 12|    0| 10|20091017|   [12,1]|
// | 12|   10| 20|20091201|   [12,1]|
// | 12|   20|  0|20091215|   [12,1]|
// | 12|    0| 15|20100220|   [12,2]|
// | 12|   15|  0|20100320|   [12,2]|
// +---+-----+---+--------+---------+

【讨论】:

以上是关于在 spark/scala 中给出重复值唯一标识符的主要内容,如果未能解决你的问题,请参考以下文章

Spark(scala):groupby和聚合值列表到一个基于索引的列表[重复]

在 Spark Scala 中转置 DataFrame 列 [重复]

将行值转换为列,其值来自 spark scala 中的另一列 [重复]

approxQuantile 在 Spark (Scala) 中给出不正确的中位数?

如何在 Spark Scala SQL 查询中包含 0 值?

在 Spark scala 程序中解析日期时出错 [重复]