2016-04-04 15 views
2

スパークとスカラを使用してこの問題の簡単な解決法を知っている人がいるかもしれません。スパーク/スカラで重複した値の一意の識別子を与える

Iは、(現在スパークにおけるデータフレームで)次の形式で動物の動きのいくつかのネットワークデータを有する:

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であり、開始と終了は、動きの位置です(第2の行は、位置id10から位置id20への移動である)。開始または終了が0であることは、動物が生まれたか、または死亡したことを意味する(すなわち、第1列の動物12が生まれ、第3の列が動物が死亡した)。

問題は、データが収集され、動物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 

ようなデータベースの何かを得るでしょう。データベースは非常に大きく(数ギガバイト)、非常に効率的に動作するものが必要です。

ご迷惑をおかけして申し訳ありません。

答えて

3

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]| 
// +---+-----+---+--------+---------+