FAILED: SemanticException [Error 10101]: A non-native table cannot be used as target for LOAD

问题描述

HBase 的表和 Hive 做关联表时,然后使用 load data local inpath '***' into table hive_hbase_table; 出现了 FAILED: SemanticException [Error 10101]: A non-native table cannot be used as target for LOAD 这个问题。

FAILED: SemanticException [Error 10101]: A non-native table cannot be used as target for LOAD
2023-07-21 18:04:40,403 ERROR [f6ba05ec-2c42-48c1-acdc-83761ffd8f35 main] ql.Driver: 68)
	at org.apache.hadoop.hive.ql.reexec.ReExecDriver.compileAndRespond(ReExecDriver.java:126)
	at org.apache.hadoop.hive.ql.reexec.ReExecDriver.run(ReExecDriver.java:214)
	at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:239)
	at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:188)
	at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:402)
	at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:821)
	at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:759)
	at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:683)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.util.RunJar.run(RunJar.java:318)
	at org.apache.hadoop.util.RunJar.main(RunJar.java:232)

原因分析:

出现这种问题的原因是由于我们使用的命令是向 Hive 表中导入数据的命令,而Hive表是有分隔符或者有一定规则的,但是HBase的表是以列族多个HFile进行存储,而且内部很多数据都进行编码,显然直接使用Hive的导入数据命令将数据导入Hive和HBase的关联表是行不通的,因为格式问题。

解决方案:

解决办法也很容易,显然出现上述问题是因为两种表的格式问题,只要解决格式问题就解决了,我们可以使用临时表,然后使用 insert into 这条命令,使其走MapReduce程序,这样就会底层帮我们进行数据格式层面的转化。

首先创建一个Hive的临时表,然后使用 load data into 这条指令将数据导入到临时表中,然后使用:

 insert into table hive_hbase_table select * from tmp_table;

这样就会触发MR任务,帮我们把临时表中的数据导入到HBase的表中。

猜你喜欢

转载自blog.csdn.net/m0_47256162/article/details/131857706