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

如何将scala中的十六进制十进制列转换为int,scala,apache-spark,dataframe,sha2,Scala,Apache Spark,Dataframe,Sha2,正如我在一些例子中看到的那样,我尝试使用conv函数,但不适用于我。我不明白为什么这个函数在我的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)) 有什么建议吗?多谢

正如我在一些例子中看到的那样,我尝试使用conv函数,但不适用于我。我不明白为什么这个函数在我的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字节整数值。此值无法成功转换为
IntegerType
LongType
,因此转换结果返回null

如果你想深入研究,你可以在Spark的
NumberConverter
类的实现中看到,
conv
SQL函数使用该类,它通过一个64位无符号整数进行转换


如果您真的需要将哈希值视为一个整数,您最好编写一个UDF,并做一些巧妙的数学运算,将值分解为低阶和高阶分量,然后进行转换,然后重新组合以处理转换。

请发布您正在尝试的示例数据帧?