PySpark DataFrame十进制转十六进制报错求助
问题分析
你遇到的错误是因为输入的整数远大于Spark LongType的最大值(9223372036854775807),Spark自动将decimalValue列推断为DecimalType。当UDF处理该列时,Spark的类型传递机制导致hex()函数无法直接处理Decimal对象,进而触发类型错误。
解决方案
方案1:修复UDF(兼容Decimal类型)
修改UDF,先将Decimal对象转换为Python整数再处理:
from pyspark.sql import SparkSession from pyspark.sql.functions import col, udf from pyspark.sql.types import StringType spark = SparkSession.builder.getOrCreate() # 创建DataFrame,Spark会自动推断为DecimalType data = [(300561573968470656578455687175275050015353,)] df = spark.createDataFrame(data, ["decimalValue"]) # 修改后的UDF:先将Decimal转为int def decimal_to_hex(decimal_value): if decimal_value is None: return None int_value = int(decimal_value) hex_value = hex(int_value)[2:].upper() return hex_value decimal_to_hex_udf = udf(decimal_to_hex, StringType()) df = df.withColumn("hexValue", decimal_to_hex_udf(col("decimalValue"))) df.show(truncate=False)
方案2:使用Spark内置函数(推荐,性能更优)
Spark内置的conv函数可以直接实现进制转换,无需自定义UDF,且原生支持Decimal类型:
from pyspark.sql import SparkSession from pyspark.sql.functions import col, conv, StringType spark = SparkSession.builder.getOrCreate() data = [(300561573968470656578455687175275050015353,)] df = spark.createDataFrame(data, ["decimalValue"]) # 使用conv函数:参数为(列名, 原进制, 目标进制),转换后转为字符串类型 df = df.withColumn("hexValue", conv(col("decimalValue"), 10, 16).cast(StringType())) df.show(truncate=False)
输出结果
两种方案都会得到如下输出:
+-----------------------------+--------------------------+ |decimalValue |hexValue | +-----------------------------+--------------------------+ |300561573968470656578455687175275050015353|400000000000000000000000000000001| +-----------------------------+--------------------------+
内容的提问来源于stack exchange,提问作者Viraj Rathod
相关产品推荐
相关产品推荐

