问题描述
我在 Databricks/Spark 社区版中使用 sql 笔记本
%python
education_DF = sqlContext.sql('select * from global_temp.population_Globaltmp_view where `Education` = "2YD"')
display(education_DF)
上面的代码单元格工作正常并从视图中检索所需的行。 但是,以下代码单元格给出了错误。
我将 WHERE 子句中的硬编码值“2YD”替换为包含相同值的变量调用education_choice。
似乎我没有在 sql 中正确使用变量。我将如何进行这项工作?
%python
education_DF = sqlContext.sql('select * from global_temp.population_Globaltmp_view where `Education` = education_choice')
display(education_DF)
(这是错误)
org.apache.spark.sql.AnalysisException: cannot resolve '`education_choice`' given input columns: [global_temp.population_globaltmp_view.Salary,global_temp.population_globaltmp_view.Address,global_temp.population_globaltmp_view.Race,global_temp.population_globaltmp_view.MiddleI,global_temp.population_globaltmp_view.Education,global_temp.population_globaltmp_view.HairColor,global_temp.population_globaltmp_view.Age,global_temp.population_globaltmp_view.FullName,global_temp.population_globaltmp_view.City,global_temp.population_globaltmp_view.FirstName,global_temp.population_globaltmp_view.State,global_temp.population_globaltmp_view.LastName,global_temp.population_globaltmp_view.Height,global_temp.population_globaltmp_view.Fertility,global_temp.population_globaltmp_view.Employment,global_temp.population_globaltmp_view.Zip,global_temp.population_globaltmp_view.Weight,global_temp.population_globaltmp_view.Gender]; line 1 pos 72;
我尝试了建议的注入方法,但这次得到了一个稍微不同的错误。我包含了相关代码单元格的屏幕截图。似乎教育选择“2YD”没有被识别为文字,而是一个字段或类似的东西。
2YD 不应该像“2YD”那样用引号括起来
如果我像这样对 WHERE 子句进行硬编码:WHERE Education = "2YD" 查询工作正常。
下面的图片很小,但是如果您右键单击它并“在新的水龙头中打开,它的可读性很强。
解决方法
*编辑
您将变量 education_choice 用作硬编码字符串。相反,您应该像这样在 SQL 表达式字符串中注入 education_choice 的值。
*edit - 用引号包裹变量。
%python
education_DF = sqlContext.sql('select * from global_temp.population_Globaltmp_view where `Education` = "{}"'.format(education_choice))
display(education_DF)