【问题标题】:Insert Into Hive Using Pyhive invoke an error使用 Pyhive 插入 Hive 调用错误
【发布时间】:2018-05-15 17:56:37
【问题描述】:

我正在使用 pyhive 与 hive 交互。

SELECT 语句使用下面的代码运行良好。

# 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;

我试过了:

cur.execute('INSERT INTO table2 SELECT Col1, Col2 FROM table1')

我收到此错误

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)

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

注意:我所有的表都是外部的

CREATE EXTERNAL TABLE IF NOT EXISTS table ( col1 String, col2 String) stored as orc LOCATION 's3://somewhere' tblproperties ("orc.compress"="SNAPPY");

【问题讨论】:

  • 首先尝试创建一个字符串:query = "insert into dbname.table2 select Col1 as Col1, Col2 as Col2 from dbname.table1"。然后 cur.execute(query)

标签: python hive pyhive


【解决方案1】:

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

据我了解,蜂巢查询分为多种类型的操作(作业)。当您执行简单查询时 (ie. SELECT * FROM table) 这会从 hive 元存储中读取数据,不需要执行查询的 mapReduce 作业或 tmp 表。但是,一旦您切换到更复杂的查询(即使用 JOIN),您最终会遇到同样的错误。

文件代码如下:

# 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)

所以也许它需要许可或其他什么。我将搜索更多关于这种行为并更新答案。

【讨论】:

    【解决方案2】:

    我不确定如何使用 pyhive 插入 pandas df,但如果您安装了 pyspark,一种选择是您可以转换为 spark df 并使用 pyspark 来执行此操作。

    from pyspark.sql import sqlContext
    spark_df = sqlContext.createDataFrame(pandas_df)
    spark_df.write.mode('append').saveAsTable('database_name.table_name')
    

    【讨论】:

    • 感谢您的快速回答,但我的问题不在于插入数据框的内容。我想执行一个 INSERT 语句。
    • 对不起,我误会了。所以你试图将数据从一个配置单元表插入另一个配置单元表?
    • 是的,我可以找到解决方案但无法解释,我发布了答案。
    【解决方案3】:

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

    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 表中。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 2019-03-09
      相关资源
      最近更新 更多