PySpark创建DataFrame时出现NameError(row未定义)的问题排查与修复
问题原因
你报错的核心是**row变量未定义**:在创建df2的列表推导式里,你直接用了row[name]来取各列的最大长度,但这个row根本没被初始化过。因为你第一步生成的df是聚合后的单行DataFrame,存储了各列的最大长度,但你没有把这行数据从DataFrame里提取出来就直接想用,自然会触发NameError。
修复方案
先从聚合后的单行DataFrame里提取出实际的行数据,再用它来构建df2:
from pyspark.sql.functions import col, length, max from pyspark.sql import Row # 计算各列的最大长度,避免覆盖原df,改用新变量名 max_length_df = df.select([max(length(col(name))).alias(name) for name in df.schema.names]) # 提取单行数据到row变量中 row = max_length_df.first() # 用提取到的row构建df2的Row列表 df2 = spark.createDataFrame( [Row(col=name, length=row[name]) for name in df.schema.names], ['col', 'length'] )
额外优化提示
- 不要用
df = df.select(...)这种覆盖原变量的写法,容易丢失原始数据,改用新变量名更安全。 - 如果处理的是超大数据量,优先用
first()提取单行数据,比转成Pandas DataFrame更高效,不会占用过多内存。
内容的提问来源于stack exchange,提问作者nam
相关产品推荐
相关产品推荐

