Как преобразовать шестнадцатеричный десятичный столбец в scala в int - PullRequest
0 голосов
/ 10 июня 2018

Я пытался использовать функцию conv, как я видел в некоторых примерах, но у меня не работает.Я не понимаю, почему эта функция возвращает то же значение в столбце моего DF.Я использовал spark2.1 с scala 2.11.11, а затем попробовал с spark 2.2 и scala 2.11.11 тоже.Но когда я использовал функцию conv, примененную к моему SHA2, она не работает должным образом.Мой код:

val newDf = Df.withColumn("id",conv(sha2(col("id"),256),16,10).cast(IntegerType))

Есть совет?Большое спасибо!

1 Ответ

0 голосов
/ 10 июня 2018

К сожалению, нет хорошего решения для этого, используя функцию conv в Spark.Это связано с тем, что 256-битный хэш из SHA2 слишком длинный, чтобы его можно было проанализировать как целое число в Java / Scala.Кроме того, IntegerType, как и базовый Scala int, составляет 32 бита.Таким образом, даже если функция conv выполняла что-то умное в преобразовании, которое позволяло ей обрабатывать большие числа, результирующее приведение все равно было бы неудачным.

Если вы удалите приведение к IntegerType, вы увидите, чточто результат, возвращаемый функцией conv, равен 18446744073709551615 независимо от входного значения.Это 2 ^ 64-1, максимальное 8-байтовое целое значение без знака.Это значение не может быть успешно приведено к IntegerType или LongType, поэтому приведение завершается возвратом нулевого значения.

Если вы действительно хотите копать, вы можете увидеть в реализации Spark's NumberConverter класс, который используется функцией SQL conv, она выполняет преобразование через 64-битное целое число без знака https://github.com/apache/spark/blob/f07c5064a3967cdddf57c2469635ee50a26d864c/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/NumberConverter.scala#L143.

Лучшее, что вы можете сделать, это написать UDF и сделать некоторую умную математикуразбить значение на компоненты более низкого порядка и более высокого порядка, которые можно преобразовать и затем восстановить для обработки преобразования, если вам действительно нужно рассматривать хэш как целое число.

...