Hive 在pyspark中查询配置单元表

Hive 在pyspark中查询配置单元表,hive,pyspark,Hive,Pyspark,我正在使用CDH5.5 我在配置单元默认数据库中创建了一个表,可以从配置单元命令查询它 输出 hive> use default; OK Time taken: 0.582 seconds hive> show tables; OK bank Time taken: 0.341 seconds, Fetched: 1 row(s) hive> select count(*) from bank; OK 542 Time taken: 64.961 secon

我正在使用CDH5.5

我在配置单元默认数据库中创建了一个表,可以从配置单元命令查询它

输出

hive> use default;

OK

Time taken: 0.582 seconds


hive> show tables;

OK

bank
Time taken: 0.341 seconds, Fetched: 1 row(s)

hive> select count(*) from bank;

OK

542

Time taken: 64.961 seconds, Fetched: 1 row(s)
但是,我无法从pyspark查询该表,因为它无法识别该表

from pyspark.context import SparkContext

from pyspark.sql import HiveContext

sqlContext = HiveContext(sc)


sqlContext.sql("use default")

DataFrame[result: string]

sqlContext.sql("show tables").show()

+---------+-----------+

|tableName|isTemporary|

+---------+-----------+

+---------+-----------+


sqlContext.sql("FROM bank SELECT count(*)")

16/03/16 20:12:13 INFO parse.ParseDriver: Parsing command: FROM bank SELECT count(*)
16/03/16 20:12:13 INFO parse.ParseDriver: Parse Completed
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "/usr/lib/spark/python/pyspark/sql/context.py", line 552, in sql
      return DataFrame(self._ssql_ctx.sql(sqlQuery), self)
    File "/usr/lib/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py",   line 538, in __call__
    File "/usr/lib/spark/python/pyspark/sql/utils.py", line 40, in deco
      raise AnalysisException(s.split(': ', 1)[1])
  **pyspark.sql.utils.AnalysisException: no such table bank; line 1 pos 5**
从pyspark.context导入SparkContext
从pyspark.sql导入HiveContext
sqlContext=HiveContext(sc)
sql(“使用默认值”)
数据帧[结果:字符串]
sqlContext.sql(“show tables”).show()
+---------+-----------+
|表名| i临时|
+---------+-----------+
+---------+-----------+
sqlContext.sql(“从银行选择计数(*))
16/03/16 20:12:13信息解析。解析驱动程序:解析命令:从银行选择计数(*)
16/03/16 20:12:13信息解析。解析驱动程序:解析完成
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
sql中的文件“/usr/lib/spark/python/pyspark/sql/context.py”,第552行
返回数据帧(self.\u ssql\u ctx.sql(sqlQuery),self)
文件“/usr/lib/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py”,第538行,在调用中__
文件“/usr/lib/spark/python/pyspark/sql/utils.py”,第40行,deco格式
引发分析异常(s.split(“:”,1)[1])
**pyspark.sql.utils.AnalysisException:没有这样的表库;第1行位置5**
新错误

>>从pyspark.sql导入HiveContext
>>>配置单元上下文=配置单元上下文(sc)
>>>bank=hive\u context.table(“default.bank”)
16/03/22 18:33:30信息DataNucleus.Persistence:属性DataNucleus.cache.level2未知-将被忽略
16/03/22 18:33:30信息DataNucleus.持久性:属性hive.metastore.integral.jdo.pushdown未知-将被忽略
16/03/22 18:33:44信息DataNucleus.Datastore:类“org.apache.hadoop.hive.metastore.model.MFieldSchema”标记为“embedded only”,因此没有自己的数据存储表。
16/03/22 18:33:44信息DataNucleus.Datastore:类“org.apache.hadoop.hive.metastore.model.MOrder”标记为“embedded only”,因此没有自己的数据存储表。
16/03/22 18:33:48信息DataNucleus.Datastore:类“org.apache.hadoop.hive.metastore.model.MFieldSchema”标记为“embedded only”,因此没有自己的数据存储表。
16/03/22 18:33:48信息DataNucleus.Datastore:类“org.apache.hadoop.hive.metastore.model.MOrder”标记为“embedded only”,因此没有自己的数据存储表。
16/03/22 18:33:50信息DataNucleus.Datastore:类“org.apache.hadoop.hive.metastore.model.MResourceUri”标记为“embedded only”,因此没有自己的数据存储表。
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/spark/python/pyspark/sql/context.py”,第565行,在表中
返回数据帧(self.\u ssql\u ctx.table(tableName),self)
文件“/usr/lib/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py”,第538行,在调用中__
文件“/usr/lib/spark/python/pyspark/sql/utils.py”,第36行,deco格式
返回f(*a,**kw)
文件“/usr/lib/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/protocol.py”,第300行,在get_return_值中
py4j.protocol.Py4JJavaError:调用o22.table时出错。
:org.apache.spark.sql.catalyst.analysis.NoSuchTableException
位于org.apache.spark.sql.hive.client.ClientInterface$$anonfun$getTable$1.apply(ClientInterface.scala:123)
位于org.apache.spark.sql.hive.client.ClientInterface$$anonfun$getTable$1.apply(ClientInterface.scala:123)
在scala.Option.getOrElse(Option.scala:120)
位于org.apache.spark.sql.hive.client.ClientInterface$class.getTable(ClientInterface.scala:123)
位于org.apache.spark.sql.hive.client.ClientWrapper.getTable(ClientWrapper.scala:60)
位于org.apache.spark.sql.hive.HiveMetastoreCatalog.lookupRelation(HiveMetastoreCatalog.scala:406)
位于org.apache.spark.sql.hive.HiveContext$$anon$1.org$apache$spark$sql$catalyst$analysis$OverrideCatalog$$super$lookupRelation(HiveContext.scala:422)
在org.apache.spark.sql.catalyst.analysis.OverrideCatalog$$anonfun$lookupRelation$3.apply上(Catalog.scala:203)
在org.apache.spark.sql.catalyst.analysis.OverrideCatalog$$anonfun$lookupRelation$3.apply上(Catalog.scala:203)
在scala.Option.getOrElse(Option.scala:120)
位于org.apache.spark.sql.catalyst.analysis.OverrideCatalog$class.lookupRelation(Catalog.scala:203)
位于org.apache.spark.sql.hive.HiveContext$$anon$1.lookupRelation(HiveContext.scala:422)
位于org.apache.spark.sql.SQLContext.table(SQLContext.scala:739)
位于org.apache.spark.sql.SQLContext.table(SQLContext.scala:735)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
位于py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231)
位于py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:379)
在py4j.Gateway.invoke处(Gateway.java:259)
位于py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133)
在py4j.commands.CallCommand.execute(CallCommand.java:79)
在py4j.GatewayConnection.run处(GatewayConnection.java:207)
运行(Thread.java:745)

谢谢

我们无法将配置单元表名直接传递给配置单元上下文sql方法,因为它不理解配置单元表名。在pyspark shell中读取配置单元表的一种方法是:

from pyspark.sql import HiveContext
hive_context = HiveContext(sc)
bank = hive_context.table("default.bank")
bank.show()
要在配置单元表上运行SQL,请执行以下操作: 首先,我们需要注册从读取配置单元表中获得的数据帧。 然后我们可以运行SQL查询

bank.registerTempTable("bank_temp")
hive_context.sql("select * from bank_temp").show()

您可以使用
sqlCtx.sql
。应将
hive site.xml
复制到spark conf路径

my_dataframe = sqlCtx.sql("Select * from categories")
my_dataframe.show()

SparkSQL自带了自己的元存储(derby),因此即使系统上没有安装配置单元,它也可以工作。这是默认模式

在上面的问题中,您在配置单元中创建了一个表。由于SparkSQL正在使用其默认的元存储,而该元存储没有配置单元tabl的元数据,因此出现了“未找到表”错误
my_dataframe = sqlCtx.sql("Select * from categories")
my_dataframe.show()