如某些示例所示,我尝试使用conv函数,但对我不起作用。我不明白为什么该函数在DF列中返回相同的值。我在scala 2.11.11上使用spark2.1,然后又在spark 2.2和scala 2.11.11上尝试过。但是,当我将转换函数应用到SHA2时,它无法按预期运行。我的代码是:
val newDf = Df.withColumn("id",conv(sha2(col("id"),256),16,10).cast(IntegerType))
有什么建议吗?非常感谢你!
不幸的是,使用conv
Spark中的函数没有一个好的解决方案。这是因为来自SHA2的256位哈希太长,无法在Java / Scala中解析为整数。此外,IntegerType
像基础Scala一样int
是32位。因此,即使conv
函数在转换中做得很巧妙,可以处理更大的数字,结果转换仍然会失败。
如果删除对的强制转换IntegerType
,则将看到该conv
函数返回的结果18446744073709551615
与输入值无关。这是2 ^ 64-1,即最大无符号8字节整数值。此值无法成功转换为IntegerType
或LongType
,因此转换最终返回null。
如果您真的想深入挖掘,可以在SQL函数NumberConverter
使用的Spark类的实现中看到conv
,它通过64位无符号整数https://github.com/apache/spark/blob进行转换/f07c5064a3967cdddf57c2469635ee50a26d864c/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/NumberConverter.scala#L143。
您可能要做的最好的事情是编写一个UDF并做一些聪明的数学运算,以分解可以转换为低阶和高阶分量的值,如果您确实需要将哈希视为整数,则可以重构该分量以处理转换。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句