3

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

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

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

4

1 回答 1

3

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

如果您删除强制转换为IntegerType,您将看到conv函数返回的结果18446744073709551615与输入值无关。这是 2^64-1,最大无符号 8 字节整数值。此值无法成功转换为IntegerTypeor 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 并做一些巧妙的数学运算,将值分解为可以转换的低阶和高阶组件,然后如果您确实需要将哈希视为整数,则重新构建以处理转换.

于 2018-06-10T15:14:28.083 回答