Apache Spark SQL是否支持UNSIGNED无符号数值类型?
Apache Spark SQL UNSIGNED类型相关问题解答
结论
Apache Spark SQL 原生不支持 UNSIGNED 无符号数值类型,所有内置整型均为有符号类型。
报错原因说明
你遇到的语法报错是因为 Spark SQL 的内置语法规范中没有 UNSIGNED 关键字,解析器无法识别 UNSIGNED INTEGER 这个类型定义,才会抛出如下异常:
pyspark.sql.utils.ParseException: extraneous input 'INTEGER' expecting ')'
UNSIGNED 是 MySQL 等个别数据库独有的类型扩展,不属于 Spark SQL 默认支持的标准语法。Spark 内置的整型取值范围如下:
- Integer(INT):取值区间为
-2^31到2^31 - 1 - Long(BIGINT):取值区间为
-2^63到2^63 - 1
替代解决方案
你要将超长整数字符串转成数值的需求,可以用以下两种方式实现:
- 如果数值范围不超过
2^63 -1(即覆盖 MySQL UNSIGNED INTEGER 全部取值范围),直接转成 BIGINT 即可:
SELECT cast(myVeryLongIntAsString as BIGINT)
- 如果数值大于
2^63 -1(比如对应 MySQL UNSIGNED BIGINT 类型的最大值2^64 -1),可以转成精度足够的 DECIMAL 类型:
SELECT cast(myVeryLongIntAsString as DECIMAL(20,0))
如果是通过 JDBC 读取 MySQL 数据源的 UNSIGNED 类型字段,Spark 会自动做类型映射:UNSIGNED INT 映射为 BIGINT,UNSIGNED BIGINT 映射为 DECIMAL(20,0),无需额外手动转换。
内容的提问来源于stack exchange,提问作者Jérémy
相关产品推荐
相关产品推荐

