PySpark Sql 列名中包含破折号/连字符
Posted
技术标签:
【中文标题】PySpark Sql 列名中包含破折号/连字符【英文标题】:PySpark Sql with column name containing dash/hyphen in it 【发布时间】:2020-09-15 09:47:30 【问题描述】:我有 PySpark 数据框 df
data = 'Passenger-Id': 0: 1, 1: 2, 2: 3, 3: 4, 4: 5,'Age': 0: 22, 1: 38, 2: 26, 3: 35, 4: 35
df_pd = pd.DataFrame(data, columns=data.keys())
df = spark.createDataFrame(df_pd)
+------------+---+
|Passenger-Id|Age|
+------------+---+
| 1| 22|
| 2| 38|
| 3| 26|
| 4| 35|
| 5| 35|
+------------+---+
这行得通
df.filter(df.Age == 22).show()
但下面不起作用,因为 - 在列名中
df.filter(df.Passenger-Id == 2).show()
AttributeError: 'DataFrame' 对象没有属性 'Passenger'
我在 spark sql 中也面临同样的问题,
spark.sql("SELECT Passenger-Id FROM AutoMobile").show()
spark.sql("SELECT automobile.Passenger-Id FROM AutoMobile").show()
遇到错误
AnalysisException:无法解析“Passenger
”给定的输入列:[automobile.Age,automobile.Passenger-Id]
按照某些来源的建议,尝试用单引号给出列名,现在它只打印查询中提到的列
spark.sql("SELECT 'Passenger-Id' FROM AutoMobile").show()
+------------+
|Passenger-Id|
+------------+
|Passenger-Id|
|Passenger-Id|
|Passenger-Id|
|Passenger-Id|
|Passenger-Id|
+------------+
【问题讨论】:
【参考方案1】:由于列名中有 hiphen,我建议你使用来自sql.functions
的col()
函数
import pyspark.sql.functions as F
df.filter(F.col('Passenger-Id')== 2).show()
这是结果
+------------+---+
|Passenger-Id|Age|
+------------+---+
| 2| 38|
+------------+---+
sql语法不行,你需要使用特殊字符“`”而不是单引号,如下所示
df.createOrReplaceTempView("AutoMobile")
spark.sql("SELECT * FROM AutoMobile where `Passenger-Id`=2").show()
【讨论】:
以上是关于PySpark Sql 列名中包含破折号/连字符的主要内容,如果未能解决你的问题,请参考以下文章