You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:47:37