SparkSQL查询列返回字符串常量而非列内容问题求助
问题分析与解决:Spark SQL查询列返回字符串而非列值
嘿,这个问题我太熟悉了!你遇到的是SQL里一个很常见的小坑——单引号在SQL语法里是用来定义字符串常量的,不是列名标识符。
当你执行 SELECT 'NameDisplay' FROM mytable 时,Spark SQL会把单引号里的内容当成固定的字符串字面量,所以每一行都会返回NameDisplay这个字符串,而不是去查询表中名为NameDisplay的列内容。
解决方法很简单:
- 直接使用列名,不需要加单引号:
spark.sql("""SELECT NameDisplay FROM mytable """).show() - 如果你的列名包含空格、特殊字符或者和SQL关键字重名,可以用**反引号(`)**包裹列名(注意是键盘上ESC下面的那个反引号,不是单引号):
spark.sql("""SELECT `NameDisplay` FROM mytable """).show()
对比一下两种写法的区别:
错误写法(返回字符串常量):
SELECT 'NameDisplay' FROM mytable正确写法(返回列实际内容):
SELECT NameDisplay FROM mytable -- 列名特殊时用反引号 SELECT `NameDisplay` FROM mytable
至于为什么SELECT * FROM mytable能正常返回所有列内容,是因为*是SQL的通配符,会自动匹配表中的所有列名,不需要额外的引号修饰,所以Spark能正确识别并返回对应列的数据。
内容的提问来源于stack exchange,提问作者mdeonte001




