Spark:16進文字列を10進数に変換します

見て

Sparkでmd5ハッシュ列を数値列に変換する方法はありますか?

直接Decimalに変換してみました。また、convを使用してみました。しかし、隣人の仕事(以下を参照してください)。奇妙なことに、convは異なるハッシュを同じ値に変換します。

(1 to 5).toDF("id")
.withColumn("md5_id", md5($"id".cast("string")))
.withColumn("conv_id", conv($"md5_id", 16, 10))
.withColumn("num_id", $"md5_id".cast(DecimalType(38,0)))
.show(false)

+---+--------------------------------+--------------------+-------+
|id |md5_id                          |conv_id             |num_id|
+---+--------------------------------+--------------------+-------+
|1  |c4ca4238a0b923820dcc509a6f75849b|18446744073709551615|null   |
|2  |c81e728d9d4c2f636f067f89cc14862c|18446744073709551615|null   |
|3  |eccbc87e4b5ce2fe28308fd9f2a7baf3|18446744073709551615|null   |
|4  |a87ff679a2f3e71d9181a67b7542122c|18446744073709551615|null   |
|5  |e4da3b7fbbce2345d7772b0674a318d5|18446744073709551615|null   |
+---+--------------------------------+--------------------+-------+

更新

他の誰かが同じ問題にぶつかった場合、これは私のニーズに合っていました:

    def toNum = udf((hex: String) =>
      new java.math.BigInteger(hex.toUpperCase, 16)
    )

    (1 to 5).toDF("id")
      .withColumn("hashed_id", toNum(substring(md5($"id".cast("string")), 0, 31)))
      .show(false)

+---+--------------------------------------+
|id |hashed_id                             |
+---+--------------------------------------+
|1  |16348679641551244288068877217848318025|
|2  |16625230717330387431313232838613092450|
|3  |19672244359719724500030062827806555055|
|4  |13998420256418836516930895031794147618|
|5  |19012319408524223020738990858985681293|
+---+--------------------------------------+

root
 |-- id: integer (nullable = false)
 |-- hashed_id: decimal(38,0) (nullable = true)
チアゴ・バルディム

さて、このケースは複雑で、その理由を説明します。MD5を数値に変換すると、通常はが作成されますBigIntegerSparkなしでそれを行う方法を示しましょう。

scala> val hex = "eccbc87e4b5ce2fe28308fd9f2a7baf3"
scala> new java.math.BigInteger(hex.toUpperCase, 16)
res28: java.math.BigInteger = 314755909755515592000481005244904880883

ご覧のとおり、数値は巨大で、実際には変換する10進数の38よりも大きく、この数値は39桁です。また、これはデフォルトのデータ型変換を使用するSparkではサポートされていません。したがって、これを解決する方法は、udfを使用してDecimal Libraryを使用することですが、データの精度がいくらか失われます。したがって、これを行う方法は次のとおりです。

def md5toIntString = udf((hex: String) =>
    Decimal(new java.math.BigInteger(hex.toUpperCase, 16)).toString
)
(1 to 5).toDF("id")
.withColumn("md5_id", md5($"id".cast("string")))
.withColumn("conv_id", conv($"md5_id", 16, 10))
.withColumn("num_id", md5toIntString($"md5_id"))
.show(false)

そして、次のように結果を確認できます。

+---+--------------------------------+--------------------+---------------------------------------+
|id |md5_id                          |conv_id             |num_id                                 |
+---+--------------------------------+--------------------+---------------------------------------+
|1  |c4ca4238a0b923820dcc509a6f75849b|18446744073709551615|261578874264819908609102035485573088411|
|2  |c81e728d9d4c2f636f067f89cc14862c|18446744073709551615|266003691477286198901011725417809479212|
|3  |eccbc87e4b5ce2fe28308fd9f2a7baf3|18446744073709551615|314755909755515592000481005244904880883|
|4  |a87ff679a2f3e71d9181a67b7542122c|18446744073709551615|223974724102701384270894320508706361900|
|5  |e4da3b7fbbce2345d7772b0674a318d5|18446744073709551615|304197110536387568331823853743770900693|
+---+--------------------------------+--------------------+---------------------------------------+

そのため、この問題に直面しています。md5データのサイズ1 and len(2^128-1)は約39桁です。

したがって、文字列として使用するか、別のタイプに変換することをお勧めします。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

10進数のNSStringを16進文字列に変換します

C ++で16進文字列を10進数に変換します

16進文字列値を16進数値に変換します

cで16進数の文字列を10進数に変換します

Pythonで16進数を10進数/文字列に変換する

10進数を16進数に変換する方法と16進文字列のXOR

文字列を16進数、10進数、8進数に変換する

長い 16 進数文字列を列値に分割し、10 進数に変換します

文字列変数を16進数に変換します

16進文字列を16進整数に変換します

16進文字列を使用可能な16進に変換します

16進文字列を符号なし10進値に変換します

Pythonは10進数を16進数に変換します

phpは10進数を16進数に変換します

DataGridセル-10進数と2進数を16進数に変換します

16進数を文字列に変換します

Cで16進数を文字列に変換しますか?

TCL-16進数をASCII文字列に変換します

PHPは文字列を「\ xnn」16進数に変換します

Cは文字列を16進数に変換しています

16進数を文字列に変換します。

1と0の文字列を16進数に変換します

16進数の文字列を16進数に変換する方法

ASCII文字列を10進数に変換します-java / android

Unicode文字列を10進数に変換します-Python2.7

文字列を10進数に変換します( "3942.000000000000")

文字列値を10進数の2桁に変換します

10進数(19,4)を文字列形式に変換します

uint16_tの16進数をCで10進数に変換します

TOP 一覧

  1. 1

    グラフからテーブルに条件付き書式を適用するにはどうすればよいですか?

  2. 2

    ソートされた検索、ターゲット値未満の数をカウント

  3. 3

    Unity:未知のスクリプトをGameObject(カスタムエディター)に動的にアタッチする方法

  4. 4

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  5. 5

    Ansibleで複数行のシェルスクリプトを実行する方法

  6. 6

    Reactでclsxを使用する方法

  7. 7

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  8. 8

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  9. 9

    Pythonを使用して同じ列の同じ値の間の時差を取得する方法

  10. 10

    PowerShellの分割ファイルへのヘッダーの追加

  11. 11

    Chromeウェブアプリのウェブビューの高さの問題

  12. 12

    BLOBストレージからデータを読み取り、Azure関数アプリを使用してデータにアクセスする方法

  13. 13

    Crashlytics:コンパイラー生成とはどういう意味ですか?

  14. 14

    GoDaddyでのCKEditorとKCfinderの画像プレビュー

  15. 15

    Windows 10の起動時間:以前は20秒でしたが、現在は6〜8倍になっています

  16. 16

    MLでのデータ前処理の背後にある直感

  17. 17

    モーダルダイアログを自動的に閉じる-サーバーコードが完了したら、Googleスプレッドシートのダイアログを閉じます

  18. 18

    reCAPTCHA-エラーコード:ユーザーの応答を検証するときの「missing-input-response」、「missing-input-secret」(POSTの詳細がない)

  19. 19

    STSでループプロセス「クラスパス通知の送信」のループを停止する方法

  20. 20

    ファイル内の2つのマーカー間のテキストを、別のファイルのテキストのセクションに置き換えるにはどうすればよいですか?

  21. 21

    ネットワークグラフで、ネットワークコンポーネントにカーソルを合わせたときに、それらを強調表示するにはどうすればよいですか?

ホットタグ

アーカイブ