python - PySpark Sql 列名中包含破折号/连字符
问题描述
我有 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|
+------------+
解决方案
由于您在列名中有 hiphen,我建议您使用col()
函数 fromsql.functions
import pyspark.sql.functions as F
df.filter(F.col('Passenger-Id')== 2).show()
这是结果
+------------+---+
|Passenger-Id|Age|
+------------+---+
| 2| 38|
+------------+---+
Noe for sql 语法,你需要使用特殊字符“`”而不是单引号,如下所示
df.createOrReplaceTempView("AutoMobile")
spark.sql("SELECT * FROM AutoMobile where `Passenger-Id`=2").show()
推荐阅读
- c++ - 如何限制没有可用空间的 SQLite 数据库的文件大小以使用 VACUUM
- javascript - Image pointStyle 不会在初始图表渲染时加载?
- sql - SQL-根据分组获取下一行
- c++ - 将 DLL 导入 C++/CLI
- types - f# 先前模式匹配保护中的窄区分联合(基于控制流的类型分析)
- lxc - lxc 命令 lxc start 和 lxc-start 等有什么区别?
- r - 图形对象被识别为“环境”类型而不是“列表”,因此与 ggplot 不兼容,尽管它应该是
- sql - 无法解决更新查询中的排序规则冲突
- sql-server - 我们可以同时将多个数据源加载到单个表结构中吗?
- python - Paraview PVpython 从主脚本运行下标 - 相对路径