首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Pyhive调用错误插入蜂巢

使用Pyhive调用错误插入蜂巢
EN

Stack Overflow用户
提问于 2018-05-15 17:56:37
回答 3查看 9.3K关注 0票数 1

我在用吡格夫和蜂箱互动。

SELECT语句很好地使用了下面的代码。

代码语言:javascript
复制
# Import hive module and connect
from pyhive import hive
conn = hive.Connection(host="HOST")
cur = conn.cursor()

# Import pandas
import pandas as pd

# Store select query in dataframe 
all_tables = pd.read_sql("SELECT * FROM table LIMIT 5", conn)
print all_tables

# Using curssor 
cur = conn.cursor()
cur.execute('SELECT * FROM table LIMIT 5')
print cursor.fetchall()

在此之前没有问题。当我想INSERT进入蜂巢的时候。

假设我想执行这个查询:INSERT INTO table2 SELECT Col1, Col2 FROM table1;

我试过:

代码语言:javascript
复制
cur.execute('INSERT INTO table2 SELECT Col1, Col2 FROM table1')

我收到这个错误

代码语言:javascript
复制
pyhive.exc.OperationalError: TExecuteStatementResp(status=TStatus(errorCode=1, errorMessage=u'Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.tez.TezTask', sqlState=u'08S01', infoMessages=[u'*org.apache.hive.service.cli.HiveSQLException:Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.tez.TezTask:28:27', u'org.apache.hive.service.cli.operation.Operation:toSQLException:Operation.java:388', u'org.apache.hive.service.cli.operation.SQLOperation:runQuery:SQLOperation.java:244', u'org.apache.hive.service.cli.operation.SQLOperation:runInternal:SQLOperation.java:279', u'org.apache.hive.service.cli.operation.Operation:run:Operation.java:324', u'org.apache.hive.service.cli.session.HiveSessionImpl:executeStatementInternal:HiveSessionImpl.java:499', u'org.apache.hive.service.cli.session.HiveSessionImpl:executeStatement:HiveSessionImpl.java:475', u'sun.reflect.GeneratedMethodAccessor81:invoke::-1', u'sun.reflect.DelegatingMethodAccessorImpl:invoke:DelegatingMethodAccessorImpl.java:43', u'java.lang.reflect.Method:invoke:Method.java:498', u'org.apache.hive.service.cli.session.HiveSessionProxy:invoke:HiveSessionProxy.java:78', u'org.apache.hive.service.cli.session.HiveSessionProxy:access$000:HiveSessionProxy.java:36', u'org.apache.hive.service.cli.session.HiveSessionProxy$1:run:HiveSessionProxy.java:63', u'java.security.AccessController:doPrivileged:AccessController.java:-2', u'javax.security.auth.Subject:doAs:Subject.java:422', u'org.apache.hadoop.security.UserGroupInformation:doAs:UserGroupInformation.java:1698', u'org.apache.hive.service.cli.session.HiveSessionProxy:invoke:HiveSessionProxy.java:59', u'com.sun.proxy.$Proxy33:executeStatement::-1', u'org.apache.hive.service.cli.CLIService:executeStatement:CLIService.java:270', u'org.apache.hive.service.cli.thrift.ThriftCLIService:ExecuteStatement:ThriftCLIService.java:507', u'org.apache.hive.service.rpc.thrift.TCLIService$Processor$ExecuteStatement:getResult:TCLIService.java:1437', u'org.apache.hive.service.rpc.thrift.TCLIService$Processor$ExecuteStatement:getResult:TCLIService.java:1422', u'org.apache.thrift.ProcessFunction:process:ProcessFunction.java:39', u'org.apache.thrift.TBaseProcessor:process:TBaseProcessor.java:39', u'org.apache.hive.service.auth.TSetIpAddressProcessor:process:TSetIpAddressProcessor.java:56', u'org.apache.thrift.server.TThreadPoolServer$WorkerProcess:run:TThreadPoolServer.java:286', u'java.util.concurrent.ThreadPoolExecutor:runWorker:ThreadPoolExecutor.java:1149', u'java.util.concurrent.ThreadPoolExecutor$Worker:run:ThreadPoolExecutor.java:624', u'java.lang.Thread:run:Thread.java:748'], statusCode=3), operationHandle=None)

如果我在蜂箱中直接执行相同的查询,一切都运行良好。有什么想法吗?

注:我所有的桌子都是外部的。

代码语言:javascript
复制
CREATE EXTERNAL TABLE IF NOT EXISTS table ( col1 String, col2 String) stored as orc LOCATION 's3://somewhere' tblproperties ("orc.compress"="SNAPPY");
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-16 16:09:56

解决方案是在连接线中添加用户名;conn = hive.Connection(host="HOST", username="USER")

根据我所理解的,在许多类型的操作(作业)上划分了蜂巢查询。在执行简单查询(ie. SELECT * FROM table)时,这将从单元转移中读取数据,而不需要执行查询所需的mapReduce作业或tmp表。但一旦您切换到更复杂的查询(即。(使用联接)您最终会出现相同的错误。

文件代码如下所示:

代码语言:javascript
复制
# Import hive module and connect
from pyhive import hive
conn = hive.Connection(host="HOST", username="USER")
cur = conn.cursor()
query = "INSERT INTO table2 SELECT Col1, Col2 FROM table1"
cur.execute(query)

所以也许它需要许可什么的..。我将搜索更多关于这种行为和更新答案。

票数 1
EN

Stack Overflow用户

发布于 2018-05-15 18:07:18

我不知道如何使用pyhive插入一个熊猫df,但是如果您安装了pyhive,一个选项是您可以转换为一个火花df,并使用火花放电来完成它。

代码语言:javascript
复制
from pyspark.sql import sqlContext
spark_df = sqlContext.createDataFrame(pandas_df)
spark_df.write.mode('append').saveAsTable('database_name.table_name')
票数 0
EN

Stack Overflow用户

发布于 2018-05-15 18:17:15

您可以使用spark执行以下操作。

代码语言:javascript
复制
from pyspark.sql import sqlContext

# convert the pandas data frame to spark data frame
spark_df = sqlContext.createDataFrame(pandas_df)

# register the spark data frame as temp table
spark_df.registerTempTable("my_temp_table")

# execute insert statement using spark sql
sqlContext,sql("insert into hive_table select * from my_temp_table")

这将将data frame中的数据插入到hive表中。

希望这对你有帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50356542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档