分享

sqoop导入orc格式到hive无法查询

ohano_javaee 发表于 2017-9-15 17:13:26 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 8 23507
本帖最后由 ohano_javaee 于 2017-9-15 17:15 编辑

create table my.test
(                                                               
  id            INT,                                       
  from          STRING,                                    
  no            STRING
) partitioned by (  country STRING,area STRING)                  
row format delimited fields terminated by '\t'
STORED AS orc
location '/my/test'
TBLPROPERTIES ("orc.compress"="SNAPPY")
-------------
alter table test add partition (country='China',area='Beijing') location '/my/test/country=China/area=Beijing';
------------------
sqoop import --connect 'jdbc:oracle:thin:@localhost:1521:orcl' \
--username "scott" \
--password "tiger" \
--query "select t.* from test where \$CONDITIONS" \
--target-dir /my/test/country=China/area=Beijing -m 1 \
--compression-codec org.apache.hadoop.io.compress.SnappyCodec \
--hive-import -m 1 \
--hive-table my.test\
--delete-target-dir \
--null-string '\\N' \
--null-non-string '\\N' \
--hive-drop-import-delims \
--fields-terminated-by '\t';

select * from test;

-------------------------------
报错
Error: java.io.IOException: java.lang.reflect.InvocationTargetException        at org.apache.hadoop.hive.io.HiveIOExceptionHandlerChain.handleRecordReaderCreationException(HiveIOExceptionHandlerChain.java:97)        at org.apache.hadoop.hive.io.HiveIOExceptionHandlerUtil.handleRecordReaderCreationException(HiveIOExceptionHandlerUtil.java:57)        at org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileRecordReader.initNextRecordReader(HadoopShimsSecure.java:294)        at org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileRecordReader.<init>(HadoopShimsSecure.java:241)        at org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileInputFormatShim.getRecordReader(HadoopShimsSecure.java:365)        at org.apache.hadoop.hive.ql.io.CombineHiveInputFormat.getRecordReader(CombineHiveInputFormat.java:592)        at org.apache.hadoop.mapred.MapTask$TrackedRecordReader.<init>(MapTask.java:169)        at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:429)        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)        at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)        at java.security.AccessController.doPrivileged(Native Method)        at javax.security.auth.Subject.doAs(Subject.java:415)        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1642)        at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163)Caused by: java.lang.reflect.InvocationTargetException        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)        at org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileRecordReader.initNextRecordReader(HadoopShimsSecure.java:280)        ... 11 moreCaused by: java.io.IOException: Malformed ORC file hdfs://my.cloudera.com:8020/my/test/country=China/area=Beijing/part-m-00000.snappy. Invalid postscript length 1        at org.apache.hadoop.hive.ql.io.orc.ReaderImpl.ensureOrcFooter(ReaderImpl.java:211)        at org.apache.hadoop.hive.ql.io.orc.ReaderImpl.extractMetaInfoFromFooter(ReaderImpl.java:336)        at org.apache.hadoop.hive.ql.io.orc.ReaderImpl.<init>(ReaderImpl.java:292)        at org.apache.hadoop.hive.ql.io.orc.OrcFile.createReader(OrcFile.java:197)        at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat.getRecordReader(OrcInputFormat.java:997)        at org.apache.hadoop.hive.ql.io.CombineHiveRecordReader.<init>(CombineHiveRecordReader.java:65)        ... 16 moreFAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTaskMapReduce Jobs Launched: Stage-Stage-1: Map: 1  Reduce: 1   HDFS Read: 0 HDFS Write: 0 FAILTotal MapReduce CPU Time Spent: 0 msec



已有(8)人评论

跳转到指定楼层
ohano_javaee 发表于 2017-9-15 17:28:54
坐等!是不是环境导致的?还是不支持这样用?
回复

使用道具 举报

starrycheng 发表于 2017-9-15 18:55:48
本帖最后由 starrycheng 于 2017-9-15 18:56 编辑
ohano_javaee 发表于 2017-9-15 17:28
坐等!是不是环境导致的?还是不支持这样用?

ORC格式是列式存储的表,不能直接从本地文件导入数据,只有当数据源表也是ORC格式存储时,才可以直接加载
尝试新建一个以textfile格式的临时表先将源文件数据加载到该表,然后在从textfile表中insert数据到ORC目标表中。或则直接创建外表试试


回复

使用道具 举报

ohano_javaee 发表于 2017-9-15 20:56:45
starrycheng 发表于 2017-9-15 18:55
ORC格式是列式存储的表,不能直接从本地文件导入数据,只有当数据源表也是ORC格式存储时,才可以直接加载 ...

我试着用你说的两种办法都试了,不知道为什么,还是不能查询
回复

使用道具 举报

ohano_javaee 发表于 2017-9-15 22:20:34
ohano_javaee 发表于 2017-9-15 20:56
我试着用你说的两种办法都试了,不知道为什么,还是不能查询

我又重新按照你的办法做了一遍,先建立textfile的中间表,然后insert overwrite搞定了!多谢!
回复

使用道具 举报

ohano_javaee 发表于 2017-9-15 22:21:23
starrycheng 发表于 2017-9-15 18:55
ORC格式是列式存储的表,不能直接从本地文件导入数据,只有当数据源表也是ORC格式存储时,才可以直接加载 ...

我又重新按照你的办法做了一遍,先建立textfile的中间表,然后insert overwrite搞定了!多谢!
回复

使用道具 举报

xzc0202 发表于 2017-9-16 10:44:55
恩,我也是用textfile,不过如果文件很大,,可以加一个 --compress 进行压缩,,可以不指定压缩编码,默认为gzip
回复

使用道具 举报

xiaobaiyang 发表于 2017-9-17 10:49:03
starrycheng 发表于 2017-9-15 18:55
ORC格式是列式存储的表,不能直接从本地文件导入数据,只有当数据源表也是ORC格式存储时,才可以直接加载 ...

ORC格式不是列式存储的表,而是行列式
回复

使用道具 举报

ohano_javaee 发表于 2017-9-17 14:33:14
xzc0202 发表于 2017-9-16 10:44
恩,我也是用textfile,不过如果文件很大,,可以加一个 --compress 进行压缩,,可以不指定压缩编码,默认 ...

你是说在sqoop里加--compress?我sqoop里没有加任何压缩,导出测试数据约196W,大概1.1G,然后导入hive最终表后,变成200M左右,缩小到1/5左右。如果加--compress会更小吗?查询性能上会不会有更多损耗?一会我也试一下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条