PySpark中列名以数字开头生成map列输出异常,无需重命名的解决方法
解决PySpark数字开头列名生成map列的取值错误问题
问题根源在于Spark SQL的语法规则:以数字开头的列名属于非标准标识符,直接在表达式中引用会被解析成数字字面量(比如1Y会被当成1),导致取值错误。
无需重命名列名的解决方法很简单——在生成map表达式时,给所有列名加上**反引号(`)**包裹,让Spark SQL能正确识别每一列:
修改后的代码:
import pyspark.sql.functions as F # 给列名添加反引号包裹 df = df.withColumn("map", F.expr("map(" + ",".join([f"'{c}', `{c}`" for c in df.columns]) + ")"))
验证示例
from pyspark.sql import SparkSession import pyspark.sql.functions as F spark = SparkSession.builder.appName("demo").getOrCreate() # 创建包含数字开头列的DataFrame data = [(1, 100, 200), (2, 150, 250)] df = spark.createDataFrame(data, ["id", "1Y", "2Y"]) # 生成正确的map列 df = df.withColumn("map", F.expr("map(" + ",".join([f"'{c}', `{c}`" for c in df.columns]) + ")")) df.show(truncate=False)
输出结果:
+---+---+---+---------------------------------------+ |id |1Y |2Y |map | +---+---+---+---------------------------------------+ |1 |100|200|{id -> 1, 1Y -> 100, 2Y -> 200} | |2 |150|250|{id -> 2, 1Y -> 150, 2Y -> 250} | +---+---+---+---------------------------------------+
这样就能保证所有列(包括数字开头的)都能正确映射到对应的值,不需要批量重命名列名。
内容的提问来源于stack exchange,提问作者ASD
相关产品推荐
相关产品推荐

