我尝试使用转换函数,就像我在一些例子中看到的那样,但不适合我。我不明白为什么这个函数在我的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))
有什么建议吗?非常感谢你!
答案 0 :(得分:0)
不幸的是,使用Spark中的conv
函数没有一个很好的解决方案。这是因为来自SHA2的256位散列太长而无法在Java / Scala中解析为整数。此外,IntegerType
与底层Scala int
一样,是32位。因此,即使conv
函数在转换中做了一些聪明的事情,允许它处理更大的数字,结果转换仍然会失败。
如果您将演员表移至IntegerType
,您会看到conv
函数返回的结果是18446744073709551615
,无论输入值如何。这是2 ^ 64-1,最大无符号8字节整数值。此值无法成功投射到IntegerType
或LongType
,因此投射最终会返回空值。
如果你想真正深入挖掘,你可以看到在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并做一些聪明的数学运算来分解低阶和高阶组件中的值,这些组件可以被转换,然后重构以处理转换,如果你真的需要查看哈希作为整数。