Pyspark中的int

PySpark 中,整数类型(int)与 Python 或 Pandas 中的 int 有所不同,因为它基于 Spark SQL 的数据类型系统。以下是 PySpark 中整数类型的详细说明:


1. PySpark 的整数类型

PySpark 主要使用 IntegerType (32位)和 LongType (64位)表示整数,对应 SQL 中的 INTBIGINT

PySpark 类型 SQL 类型 位数 取值范围 占用存储
IntegerType INT 32位 -2,147,483,6482,147,483,647 4 字节
LongType BIGINT 64位 -9,223,372,036,854,775,8089,223,372,036,854,775,807 8 字节

2. 如何指定整数类型?

在 PySpark 中,可以通过 StructTypewithColumn 显式指定整数类型:

(1) 创建 DataFrame 时指定

python 复制代码
from pyspark.sql.types import IntegerType, LongType
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("int_example").getOrCreate()

data = [("Alice", 25), ("Bob", 30), ("Charlie", 35)]

# 方式1:使用 StructType 定义 Schema
from pyspark.sql.types import StructType, StructField, StringType

schema = StructType([
    StructField("name", StringType(), True),
    StructField("age", IntegerType(), True)  # 使用 IntegerType(32位)
])

df = spark.createDataFrame(data, schema)
df.printSchema()

输出:

python 复制代码
root
 |-- name: string (nullable = true)
 |-- age: integer (nullable = true)  # 32位整数

(2) 转换列类型

python 复制代码
from pyspark.sql.functions import col

# 将 age 列从 IntegerType 转为 LongType(64位)
df = df.withColumn("age", col("age").cast("long"))  # 或 LongType()
df.printSchema()

输出:

python 复制代码
root
 |-- name: string (nullable = true)
 |-- age: long (nullable = true)  # 64位整数

3. 默认整数类型

  • PySpark 默认推断整数为 IntegerType(32位)

    • 如果数值在 -2,147,483,6482,147,483,647 之间,PySpark 会使用 IntegerType

    • 如果超出范围,会自动转为 LongType(64位)。

示例:

python 复制代码
data = [("A", 100), ("B", 3000000000)]  # 3000000000 超出 32位范围
df = spark.createDataFrame(data, ["name", "value"])
df.printSchema()

输出:

python 复制代码
root
 |-- name: string (nullable = true)
 |-- value: long (nullable = true)  # 自动转为 LongType

4. 如何选择 IntegerType 还是 LongType

场景 推荐类型 原因
内存优化 IntegerType 32位比 64位节省 50% 存储空间
大数值需求 LongType 避免溢出(如 ID、时间戳、大金额)
兼容性 LongType 某些数据库(如 MySQL 的 BIGINT)需要 64位

5. 常见问题

(1) PySpark 的 int 和 Python 的 int 有什么区别?

  • Python int :在 64 位系统上是 int64(无限制大小)。

  • PySpark IntegerType :固定 32 位,类似 C/Java 的 int

(2) 如何检查列的类型?

python 复制代码
df.schema["age"].dataType  # 返回 IntegerType 或 LongType

(3) 为什么有时 PySpark 会自动转 LongType

如果数值超出 IntegerType 范围(±21亿),PySpark 会自动升级为 LongType


6. 总结

特性 IntegerType (32位) LongType (64位)
存储 4 字节 8 字节
范围 ±21亿 ±922亿亿
默认行为 小整数默认使用 大整数自动升级
适用场景 内存优化、中小数值 大数值、ID、时间戳

推荐做法:

  • 如果数据范围明确且较小,优先用 IntegerType 节省内存。

  • 如果处理 ID、时间戳或不确定范围,用 LongType 避免溢出。

相关推荐
酷飞飞2 小时前
Python网络与多任务编程:TCP/UDP实战指南
网络·python·tcp/ip
大数据CLUB3 小时前
基于spark的澳洲光伏发电站选址预测
大数据·hadoop·分布式·数据分析·spark·数据开发
ratbag6720133 小时前
当环保遇上大数据:生态环境大数据技术专业的课程侧重哪些领域?
大数据
数字化顾问3 小时前
Python:OpenCV 教程——从传统视觉到深度学习:YOLOv8 与 OpenCV DNN 模块协同实现工业缺陷检测
python
学生信的大叔4 小时前
【Python自动化】Ubuntu24.04配置Selenium并测试
python·selenium·自动化
计算机编程小央姐4 小时前
跟上大数据时代步伐:食物营养数据可视化分析系统技术前沿解析
大数据·hadoop·信息可视化·spark·django·课程设计·食物
诗句藏于尽头5 小时前
Django模型与数据库表映射的两种方式
数据库·python·django
智数研析社5 小时前
9120 部 TMDb 高分电影数据集 | 7 列全维度指标 (评分 / 热度 / 剧情)+API 权威源 | 电影趋势分析 / 推荐系统 / NLP 建模用
大数据·人工智能·python·深度学习·数据分析·数据集·数据清洗
扯淡的闲人5 小时前
多语言编码Agent解决方案(5)-IntelliJ插件实现
开发语言·python
潘达斯奈基~6 小时前
《大数据之路1》笔记2:数据模型
大数据·笔记