如何将scala中的十六进制十进制列转换为int

How to convert a hex decimal column in scala to int

我尝试使用我在某些示例中看到的 conv 函数,但对我不起作用。我不明白为什么这个函数 returns 在我的 DF 的列中具有相同的值。我在 scala 2.11.11 中使用 spark2.1,然后我也尝试使用 spark 2.2 和 scala 2.11.11。但是当我使用应用于我的 SHA2 的 conv 函数时,它没有按预期工作。我的代码是:

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

有什么建议吗?非常感谢!

不幸的是,使用 Spark 中的 conv 函数没有很好的解决方案。这是因为 SHA2 的 256 位散列太长,无法在 Java/Scala 中解析为整数。此外,IntegerType 与基础 Scala int 一样是 32 位。因此,即使 conv 函数在转换中做了一些聪明的事情,允许它处理更大的数字,生成的转换仍然会失败。

如果删除对 IntegerType 的强制转换,您将看到 conv 函数返回的结果是 18446744073709551615,而不管输入值如何。这是 2^64-1,最大无符号 8 字节整数值。此值无法成功转换为 IntegerTypeLongType,因此转换最终返回 null。

如果你想真正深入,你可以在 conv SQL 函数使用的 Spark 的 NumberConverter class 的实现中看到,它确实通过 64 位 unsigned int https://github.com/apache/spark/blob/f07c5064a3967cdddf57c2469635ee50a26d864c/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/NumberConverter.scala#L143.

进行转换

您可能做的最好的事情是编写一个 UDF 并做一些巧妙的数学运算,将值分解为可以转换的低阶和高阶组件,然后如果您确实需要查看,则重新组合以处理转换作为整数的散列。