Spark SQL:未解析的属性

Posted

技术标签:

【中文标题】Spark SQL:未解析的属性【英文标题】:Spark SQL: unresolved attributes 【发布时间】:2014-11-24 20:07:18 【问题描述】:

当我尝试读取 sql 结果计数时收到以下错误:

错误:

Exception in thread "main" org.apache.spark.sql.catalyst.errors.package$TreeNodeException: Unresolved attributes

这是我正在使用的代码:

val results= sqlContext.sql("select * from  tablename")
results.collect().foreach(println)

我正在使用 Spark 1.1.0 并在本地运行程序。

【问题讨论】:

【参考方案1】:

您收到异常的可能原因:

    如果您尝试在不将 RDD 注册为表的情况下查询 sqlContext。

    sqlContext.registerTempTable("testQuery")

    SparkSQL 区分大小写。确保 tablename 与您在 Cassandra 中定义的大小写匹配。

    确保表名存在。

【讨论】:

【参考方案2】:

如果您正在查询已使用 alter table 命令添加了列的分区 hive 表,则 Spark 1.1 中可能会出现此问题。即使表架构知道新列,在添加新列之前创建的任何数据分区都不会在其分区架构中包含该表。

Select * 将从表模式中提取列列表,但是当它处理较旧的数据分区时,由于分区模式中不存在该列,因此 Spark 将找不到该列,因此会抛出此未解决的属性错误。

如果这是您面临的问题,那么不要使用 select *,而是指定一个明确的列名列表。不过,这只是部分解决方案,因为如果您明确列出旧分区中不存在的列名,那么您仍然会收到错误消息。

【讨论】:

以上是关于Spark SQL:未解析的属性的主要内容,如果未能解决你的问题,请参考以下文章

测试 Spark SQL 语句的解析

3. Spark SQL解析

Spark之SQL解析(源码阅读十)

org.apache.spark.sql.SchemaRDD 类型无法解析

Spark SQL应用解析

org.apache.spark.sql.AnalysisException:无法解析给定的输入列