Spark 无法查询它可以看到的 Hive 表?

Posted

技术标签:

【中文标题】Spark 无法查询它可以看到的 Hive 表?【英文标题】:Spark cannot query Hive tables it can see? 【发布时间】:2014-12-26 18:33:26 【问题描述】:

我正在 CentOS 上运行用于 CDH 4 的 Spark 1.2 的预构建版本。我已将 hive-site.xml 文件复制到 Spark 的 conf 目录中,因此它应该可以看到 Hive 元存储。

我在 Hive 中有三个表(facility、newpercentile、percentile),我可以从 Hive CLI 查询所有这些表。在我登录到 Spark 并像这样创建 Hive 上下文后: val hiveC = new org.apache.spark.sql.hive.HiveContext(sc) 我在查询这些表时遇到了问题。

如果我运行以下命令:val tableList = hiveC.hql("show tables") 并在 tableList 上执行 collect(),我会得到以下结果:res0: Array[org.apache.spark.sql.Row] = Array([设施], [newpercentile], [percentile])

如果我然后运行此命令来获取设施表的计数:val facTable = hiveC.hql("select count(*) from facility"),我会得到以下输出,我认为这意味着它不能找到设施表进行查询:

scala> val facTable = hiveC.hql("select count(*) from facility")
warning: there were 1 deprecation warning(s); re-run with -deprecation for details
14/12/26 10:27:26 WARN HiveConf: DEPRECATED: Configuration property hive.metastore.local no longer has any effect. Make sure to provide a valid value for hive.metastore.uris if you are connecting to a remote metastore.

14/12/26 10:27:26 INFO ParseDriver: Parsing command: select count(*) from facility
14/12/26 10:27:26 INFO ParseDriver: Parse Completed
14/12/26 10:27:26 INFO MemoryStore: ensureFreeSpace(355177) called with curMem=0, maxMem=277842493
14/12/26 10:27:26 INFO MemoryStore: Block broadcast_0 stored as values in memory (estimated size 346.9 KB, free 264.6 MB)
14/12/26 10:27:26 INFO MemoryStore: ensureFreeSpace(50689) called with curMem=355177, maxMem=277842493
14/12/26 10:27:26 INFO MemoryStore: Block broadcast_0_piece0 stored as bytes in memory (estimated size 49.5 KB, free 264.6 MB)
14/12/26 10:27:26 INFO BlockManagerInfo: Added broadcast_0_piece0 in memory on 10.0.2.15:45305 (size: 49.5 KB, free: 264.9 MB)
14/12/26 10:27:26 INFO BlockManagerMaster: Updated info of block broadcast_0_piece0
14/12/26 10:27:26 INFO SparkContext: Created broadcast 0 from broadcast at TableReader.scala:68

facTable: org.apache.spark.sql.SchemaRDD = 
SchemaRDD[2] at RDD at SchemaRDD.scala:108
== Query Plan ==
== Physical Plan ==

Aggregate false, [], [Coalesce(SUM(PartialCount#38L),0) AS _c0#5L]
 Exchange SinglePartition
  Aggregate true, [], [COUNT(1) AS PartialCount#38L]
   HiveTableScan [], (MetastoreRelation default, facility, None), None

我们将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:
scala> val facTable = hiveC.hql("select count(*) from facility")

太棒了!你有一个 RDD,现在你想用它做什么?

scala> facTable.collect()

请记住,RDD 是数据之上的抽象,并且在您对其调用诸如collect()count() 之类的操作之前不会具体化。

如果您尝试使用不存在的表名,则会收到非常明显的错误。

【讨论】:

没错!现在情况看起来不错。感谢攀登。至少可以说,最后一行中的 None 列表让我感到困惑。感谢您的及时回复。

以上是关于Spark 无法查询它可以看到的 Hive 表?的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL - Hive“无法覆盖表”解决方法

在 Spark SQL 中找不到 Hive 表 - Cloudera VM 中的 spark.sql.AnalysisException

使用 spark-submit 无法从 hive 中找到表

使用 Spark 查询 hive 表

无法使用 Apache spark 2.1.0 连接到 hive 数据库

pyspark读取textfile形成DataFrame以及查询表的属性信息