如何将scala中的十六进制十进制列转换为int
How to convert a hex decimal column in scala to int
我尝试使用我在某些示例中看到的 conv 函数,但对我不起作用。我不明白为什么这个函数 returns 在我的 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。
如果你想真正深入,你可以在 conv
SQL 函数使用的 Spark 的 NumberConverter
class 的实现中看到,它确实通过 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 并做一些巧妙的数学运算,将值分解为可以转换的低阶和高阶组件,然后如果您确实需要查看,则重新组合以处理转换作为整数的散列。
我尝试使用我在某些示例中看到的 conv 函数,但对我不起作用。我不明白为什么这个函数 returns 在我的 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。
如果你想真正深入,你可以在 conv
SQL 函数使用的 Spark 的 NumberConverter
class 的实现中看到,它确实通过 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 并做一些巧妙的数学运算,将值分解为可以转换的低阶和高阶组件,然后如果您确实需要查看,则重新组合以处理转换作为整数的散列。