使用PySpark读取CSV文件异常:大量字段显示为Null
解决PySpark读取CSV字段显示Null的问题
1. 修正分隔符与引号解析逻辑
这类数据集常因包含推文内的逗号、引号等特殊字符,导致默认解析规则失效,出现字段错位、Null值。
- 显式指定分隔符、引号规则,同时开启多行解析(处理带换行的推文内容):
from pyspark.sql import SparkSession spark = SparkSession.builder.appName("ReadChatGPTDataset").getOrCreate() df = spark.read.csv( "你的数据集文件路径", header=True, sep=",", # 确认实际分隔符,若为制表符则改为"\t" quote='"', escape='"', # 处理字段内的转义引号 multiLine=True ) df.show(5)
2. 关闭自动类型推断,手动指定Schema
PySpark自动推断Schema时,易因字段内的混合类型、异常值导致整列解析为Null。
- 先以全字符串类型读取,验证字段内容:
custom_schema = """ tweet_id STRING, user_id STRING, tweet_text STRING, created_at STRING, # 按实际表头补充所有字段,统一用STRING类型 """ df = spark.read.csv( "你的数据集文件路径", header=True, sep=",", quote='"', escape='"', multiLine=True, schema=custom_schema ) # 检查核心字段内容 df.select("tweet_text", "user_id").show(10, truncate=False)
- 确认内容正常后,再将Schema中的字段改为对应类型(如
timestamp、integer)。
3. 指定正确的文件编码
若数据集采用非UTF-8编码(如ISO-8859-1),会导致解析乱码或Null值:
df = spark.read.csv( "你的数据集文件路径", header=True, sep=",", quote='"', escape='"', multiLine=True, encoding="ISO-8859-1" # 根据实际编码调整,如utf-16 )
4. 排查表头与数据列数不匹配问题
表头列数和实际数据列数不一致会直接导致解析错位:
# 读取不带表头的数据,查看总列数 df_no_header = spark.read.csv("你的数据集文件路径", header=False) print(f"数据实际列数:{len(df_no_header.columns)}") # 读取带表头的数据,查看表头列数 df_with_header = spark.read.csv("你的数据集文件路径", header=True) print(f"表头列数:{len(df_with_header.columns)}")
若列数不一致,需清理数据中的换行、非法分隔符,或手动指定列名。
5. 清理字段内的特殊字符
部分数据包含不可见的换行、回车符,干扰解析逻辑:
from pyspark.sql.functions import regexp_replace # 清理字段内的换行、回车符 df_clean = df.withColumn("tweet_text", regexp_replace("tweet_text", r"[\r\n]+", " ")) df_clean.show()
内容的提问来源于stack exchange,提问作者Mitch Souza
相关产品推荐
相关产品推荐

