К сожалению, нет хорошего решения для этого, используя функцию 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 и сделать некоторую умную математикуразбить значение на компоненты более низкого порядка и более высокого порядка, которые можно преобразовать и затем восстановить для обработки преобразования, если вам действительно нужно рассматривать хэш как целое число.