Hive INSERT OVERWRITE 显示错误
Posted
技术标签:
【中文标题】Hive INSERT OVERWRITE 显示错误【英文标题】:Hive INSERT OVERWRITE showing error 【发布时间】:2016-06-13 09:50:10 【问题描述】:我正在研究将 hbase-0.98.19 与 hive-1.2.1 集成的示例。我已经使用命令在 hbase 中创建了一个表
CREATE TABLE hbase_table_emp(id int, name string, role string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:name,cf1:role")
TBLPROPERTIES ("hbase.table.name" = "emp");
然后我创建了“testtemp”,用于将数据导入“hbase_table_emp”。下面的代码显示了创建“testtemp”表的方法
create table testemp(id int, name string, role string) row format delimited fields terminated by '\t';
load data local inpath '/home/hduser/sample.txt' into table testemp;
select * from testemp;
到目前为止,一切正常。但是当我运行命令insert overwrite table hbase_table_emp select * from testemp;
我收到以下错误:-
hive> 插入覆盖表 hbase_table_emp select * from testemp; 查询 ID = hduser_20160613131557_ddef0b47-a773-477b-94d2-5cc070eb0de6 Total jobs = 1 Launching Job 1 out of 1 设置了reduce任务数 为 0,因为没有 reduce 运算符 java.io.IOException: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.IllegalArgumentException:必须指定表名 org.apache.hadoop.hive.ql.exec.FileSinkOperator.checkOutputSpecs(FileSinkOperator.java:1117) 在 org.apache.hadoop.hive.ql.io.HiveOutputFormatImpl.checkOutputSpecs(HiveOutputFormatImpl.java:67) 在 org.apache.hadoop.mapreduce.JobSubmitter.checkSpecs(JobSubmitter.java:564) 在 org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:432) 在 org.apache.hadoop.mapreduce.Job$10.run(Job.java:1296) 在 org.apache.hadoop.mapreduce.Job$10.run(Job.java:1293) 在 java.security.AccessController.doPrivileged(Native Method) 在 javax.security.auth.Subject.doAs(Subject.java:415) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628) 在 org.apache.hadoop.mapreduce.Job.submit(Job.java:1293) 在 org.apache.hadoop.mapred.JobClient$1.run(JobClient.java:562) 在 org.apache.hadoop.mapred.JobClient$1.run(JobClient.java:557) 在 java.security.AccessController.doPrivileged(Native Method) 在 javax.security.auth.Subject.doAs(Subject.java:415) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628) 在 org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:557) 在 org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:548) 在 org.apache.hadoop.hive.ql.exec.mr.ExecDriver.execute(ExecDriver.java:431) 在 org.apache.hadoop.hive.ql.exec.mr.MapRedTask.execute(MapRedTask.java:137) 在 org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java:160) 在 org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java:88) 在 org.apache.hadoop.hive.ql.Driver.launchTask(Driver.java:1653) 在 org.apache.hadoop.hive.ql.Driver.execute(Driver.java:1412) 在 org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1195) 在 org.apache.hadoop.hive.ql.Driver.run(Driver.java:1059) 在 org.apache.hadoop.hive.ql.Driver.run(Driver.java:1049) 在 org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:213) 在 org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:165) 在 org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:376) 在 org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:736) 在 org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:681) 在 org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:621) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.apache.hadoop.util.RunJar.run(RunJar.java:221) 在 org.apache.hadoop.util.RunJar.main(RunJar.java:136) 原因: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.IllegalArgumentException:必须指定表名 org.apache.hadoop.hive.ql.exec.FileSinkOperator.createHiveOutputFormat(FileSinkOperator.java:1139) 在 org.apache.hadoop.hive.ql.exec.FileSinkOperator.checkOutputSpecs(FileSinkOperator.java:1114) ... 37 更多原因:java.lang.IllegalArgumentException:必须 指定表名 org.apache.hadoop.hbase.mapreduce.TableOutputFormat.setConf(TableOutputFormat.java:193) 在 org.apache.hive.common.util.ReflectionUtil.setConf(ReflectionUtil.java:101) 在 org.apache.hive.common.util.ReflectionUtil.newInstance(ReflectionUtil.java:87) 在 org.apache.hadoop.hive.ql.io.HiveFileFormatUtils.getHiveOutputFormat(HiveFileFormatUtils.java:277) 在 org.apache.hadoop.hive.ql.io.HiveFileFormatUtils.getHiveOutputFormat(HiveFileFormatUtils.java:267) 在 org.apache.hadoop.hive.ql.exec.FileSinkOperator.createHiveOutputFormat(FileSinkOperator.java:1137) ... 还有 38 个作业提交失败,但有异常 'java.io.IOException(org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.IllegalArgumentException:必须指定表名)'失败: 执行错误,返回代码 1 从 org.apache.hadoop.hive.ql.exec.mr.MapRedTask `
PS:我有 hbase.jar , zookeeper.jar 和 guava.jar 包含在 CLASSPATH 中。
提前致谢。
【问题讨论】:
我也面临同样的问题。你能解决这个问题吗? 【参考方案1】:对于 Hive HBase 集成,为了将数据插入到 hbase 表中,您还需要在 TBLPROPERTIES 中指定 hbase.mapred.output.outputtable。
Hive HBase Integration
hbase.mapred.output.outputtable 属性是可选的;这是需要的 如果您打算向表中插入数据(该属性由 hbase.mapreduce.TableOutputFormat)
因此,对于您的表,您需要运行以下命令:
ALTER TABLE table_name SET TBLPROPERTIES ("hbase.mapred.output.outputtable" = "emp");
【讨论】:
以上是关于Hive INSERT OVERWRITE 显示错误的主要内容,如果未能解决你的问题,请参考以下文章
Spark SQL写入Hive,同分区overwrite,不同分区insert
✨[面试进阶]INSERT INTO 和 INSERT OVERWRITE 的区别?(Hive篇)✨
✨[面试进阶]INSERT INTO 和 INSERT OVERWRITE 的区别?(Hive篇)✨
Hive-insert into table 与 insert overwrite table 区别