在 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) 中给出不正确的中位数?