Spark DataFrame检查列是否为整数类型的代码问题排查
解决Spark DataFrame列类型判断不生效的问题
嘿,我一眼就看出问题出在哪了——你现在的代码是在判断列名字符串的类型,而不是列本身的数据类型,所以永远不会触发那个print语句。让我给你详细说明并修复:
问题根源
你循环的df.columns是一个由列名组成的字符串列表,比如['id', 'name', 'age'],所以变量x是列名的字符串,type(x)返回的是<class 'str'>,和字符串'integer'比较自然永远不相等,这就是print没执行的原因。
要判断列的数据类型,你需要从DataFrame的schema元数据里获取,而不是列名的类型。
修复方案:两种正确的判断方式
方式1:使用df.dtypes(简单直观)
df.dtypes会返回一个列表,每个元素是(列名, 类型字符串)的元组,PySpark里整数类型的字符串标识是'int'(不是你写的'integer'),代码如下:
import pyspark from pyspark.sql import SparkSession spark = SparkSession.builder.appName('MyApp').getOrCreate() df = spark.read.csv('Path To csv File', inferSchema=True, header=True) # 遍历列名和对应的类型字符串 for col_name, col_type in df.dtypes: if col_type == 'int': print(f"{col_name}: inside if loop")
方式2:使用Schema的类型类判断(更严谨)
如果你想更精准地匹配类型,避免字符串拼写错误的问题,可以直接和PySpark的类型类比较,比如IntegerType:
import pyspark from pyspark.sql import SparkSession from pyspark.sql.types import IntegerType spark = SparkSession.builder.appName('MyApp').getOrCreate() df = spark.read.csv('Path To csv File', inferSchema=True, header=True) for col_name in df.columns: # 检查列的数据类型是否为IntegerType if isinstance(df.schema[col_name].dataType, IntegerType): print(f"{col_name}: inside if loop")
额外提示
在运行代码前,你可以先打印df.dtypes看看所有列的实际类型,确认inferSchema=True确实生效了——如果CSV里的整数列包含非数字值,Spark可能会把它推断成字符串类型,这时候也不会触发判断哦。
内容的提问来源于stack exchange,提问作者ozzboy
相关产品推荐
相关产品推荐

