サイトアイコン たーちゃんの「ゼロよりはいくらかましな」

【Apache spark】UUIDを使い回す

一意のIDを付与するためにUUIDを使用することはよくあると思います。

 

ところが、このUUID、

sparkでDataFrameを扱う中で

使用するには少し注意が必要です。

以下サンプル言語はscalaです。

 

 

DataFrameにUUIDを付与する

例えば、csvファイルを読み込んだときに、

一緒にUUID付与しようとすれば、

 

import java.util.UUID

val df: DataFrame = spark.read.textFile(inputTxtPath).map(row => {
        val ss: Array[String] = row.split(",")
        (UUID.randomUUID().toString(), ss(0), ss(1), ss(2))
      }) toDF("id", "col1", "col2", "col3")

 

 

注意すべき点

このとき注意すべきなのは、

このDFに対して直接アクションせず、

結合したりすると、

始めに付与されたIDとは値が変わってしまいます。

なぜなのかということですが、

僕の推測として、

randomUUIDメソッドが返すものは値ではなく、

staticなUUIDオブジェクトです。

 

sparkによるDF処理の計算の段階で、

結合などのたびにこのrandomUUIDメソッドが実行されているのではないか?

と考えています。

 

 

解決策

僕が行った解決策としては、

javaのライブラリを使用せず、

sparkSQLにて付与してしまうという方法です。

以下のような感じです。

 

val dfTemp: DataFrame = spark.read.textFile(inputTxtPath).map(row => {
        val ss: Array[String] = row.split(",")
        (ss(0), ss(1), ss(2))
      }) toDF("col1", "col2", "col3")

dfTemp.createTempView("dfTemp")
val df = spark.sqlContext.sql("select uuid() as id, a.* from dfTemp as a")

 

これであれば結合などしても、

値に変更なく使い回せることが確認できました。

それでは!

 


にほんブログ村


人気ブログランキング

モバイルバージョンを終了