一意の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")
これであれば結合などしても、
値に変更なく使い回せることが確認できました。
それでは!
20代前半までは東京で音楽をやりながら両手の指以上の業種でアルバイト生活をしていましたが、某大手プロバイダのテレアポのバイトでPCの知識の無さに愕然とし、コンピュータをもっと知りたい!と思ったことをきっかけに25歳の時にITの世界に未経験で飛び込みました。
紆余曲折を経て、現在は個人事業主としてお仕事させていただいており、10年ほどになります。
web制作から企業システム構築、ツール開発など、フロントエンドもバックエンドもサーバーもDBAも依頼があれば何でもやってきた雑食系エンジニアです。
今風にいうとフルスタックエンジニアということになるのでしょうか??
→ 詳細プロフィールというか、生い立ちはこちら
→スキルシートをご覧になる場合はこちら
→お仕事のご依頼やお見積りなどお問い合わせはこちらから!