Python int()函数的Scala与Spark等价实现方法问询
Scala与Spark中类似Python int()的进制转换函数
Python里的int()函数支持指定基数将字符串转为任意精度整数,比如处理超长十六进制字符串:
int("443205090D01DFF9000000", 16) # 输出: 82443166943838217193914368
但Scala的Integer.parseInt()会抛出NumberFormatException,原因是目标数值远超出了32位Int的范围:
Integer.parseInt("443205090D01DFF9000000", 16); // 抛出异常: NumberFormatException: For input string: "443205090D01DFF9000000"
Scala中的等价实现
Scala里可以用BigInt类处理任意大整数的进制转换,它和Python 3的int()功能完全等价:
BigInt("443205090D01DFF9000000", 16) // 结果: 82443166943838217193914368
如果数值在64位Long的范围内,也可以用java.lang.Long.parseLong(),但对于超出Long范围的大数值,BigInt是唯一可行的选择。
Spark中的实现方式
Spark SQL提供了conv函数用于进制转换,支持将任意进制的字符串转为十进制字符串(避免数值范围限制):
SELECT conv("443205090D01DFF9000000", 16, 10) AS decimal_num; -- 输出字符串形式的结果: "82443166943838217193914368"
在Scala编写Spark DataFrame代码时,也可以结合conv和BigIntType直接转为大整数类型:
import org.apache.spark.sql.types.BigIntType import org.apache.spark.sql.functions.expr df.withColumn("decimal_num", expr("conv(hex_str, 16, 10)").cast(BigIntType))
内容的提问来源于stack exchange,提问作者Sandie
相关产品推荐
相关产品推荐

