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

时间:2018-06-10 09:51:24

标签: scala apache-spark dataframe sha2

我尝试使用转换函数,就像我在一些例子中看到的那样,但不适合我。我不明白为什么这个函数在我的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))

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

1 个答案:

答案 0 :(得分:0)

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

如果您将演员表移至IntegerType,您会看到conv函数返回的结果是18446744073709551615,无论输入值如何。这是2 ^ 64-1,最大无符号8字节整数值。此值无法成功投射到IntegerTypeLongType,因此投射最终会返回空值。

如果你想真正深入挖掘,你可以看到在NumberConverter SQL函数使用的Spark的conv类的实现中,它通过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并做一些聪明的数学运算来分解低阶和高阶组件中的值,这些组件可以被转换,然后重构以处理转换,如果你真的需要查看哈希作为整数。