如何明确选择DataFrame中名称大小写存在歧义的列?
解决Spark SQL中大小写相近列名的歧义问题
这个问题在Spark开发里挺常见的——Spark SQL默认对列名、表名这类标识符是大小写不敏感的,所以当你的表中存在companyid和companyId这种仅大小写不同的列时,直接用列名查询就会触发歧义错误。下面给你几个实用的解决办法:
方法1:用反引号强制区分列名大小写
这是最直接的解决方案,在列名前后加上反引号(`),让Spark严格按照你指定的大小写来识别列:
# 选择驼峰式的companyId列 spark.sql("SELECT `companyId` FROM my_df").show() # 选择全小写的companyid列 spark.sql("SELECT `companyid` FROM my_df").show()
顺带提一句,你示例里写的查询表是mcl_df,但实际创建的视图名是my_df,这个笔误也要修正,不然会报表不存在的错误哦。
方法2:提前定义Schema确保列名大小写被保留
如果在创建DataFrame时就明确指定Schema,能从根源上避免列名大小写被模糊处理:
from pyspark.sql.types import StructType, StructField, IntegerType, StringType from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() # 明确定义每个列的名称和类型,大小写严格保留 schema = StructType([ StructField("companyId", IntegerType(), nullable=True), StructField("companyid", IntegerType(), nullable=True), StructField("company", StringType(), nullable=True) ]) data = [(1, 2, "Hello world industries")] df = spark.createDataFrame(data, schema=schema) df.createOrReplaceTempView('my_df') # 此时再用反引号查询就不会有歧义了 spark.sql("SELECT `companyId` FROM my_df").show()
方法3:使用DataFrame API替代SQL查询
DataFrame API默认会严格区分列名的大小写(只要创建DF时列名是正确的),用这种方式查询更直观,也能避开SQL的大小写歧义问题:
# 直接选择指定列 df.select("companyId").show() # 或者用col函数更清晰 from pyspark.sql.functions import col df.select(col("companyId")).show()
内容的提问来源于stack exchange,提问作者chris.mclennon
相关产品推荐
相关产品推荐

