12

テーブルの各行(3000万行以上)に一意のIDを生成しようとしています。

  • Hadoop の並列性により、連番の使用は明らかに機能しません。
  • 組み込み UDF の rand() と hash(rand(),unixtime()) は衝突を生成するようです。

行IDを生成する簡単な方法が必要であり、誰かが解決策を持っているのではないかと思っていました.

  • 私の次のステップは、安全なランダム + ホスト IP + 現在時刻をシードとして使用して実際のハッシュ文字列を生成する Java マップ削減ジョブを作成することです。しかし、私はそれを行う前にここで尋ねると思います ;)
4

8 に答える 8

7

これがすべて役立つかどうかはわかりませんが、ここに行きます...

ネイティブの MapReduce 類似物を考えてみましょう。入力データ セットがテキスト ベースであると仮定すると、入力 Mapper のキー (したがって一意の ID) は、各行のファイル名にそのバイト オフセットを加えたものになります。

データを Hive にロードするときに、この情報を含む追加の「列」を作成できれば、rowID を無料で取得できます。意味的には無意味ですが、上記のアプローチも同様です。

于 2013-08-15T18:04:47.053 に答える
2

Reflect("java.util.UUID", "randomUUID")

もう一方に投票できませんでした。純粋なバイナリ バージョンが必要だったので、これを使用しました。

unhex(regexp_replace(reflect('java.util.UUID','randomUUID'), '-', ''))

于 2014-03-15T22:02:51.760 に答える
1

すべての Map タスクのカウンターを保持し、JobID() (MR API から取得) + カウンターの現在の値の連結を行の行 ID として作成するカスタム Mapper を記述します。次の行を調べる前に、カウンターをインクリメントします。

于 2014-11-24T09:11:52.173 に答える