导入Blob数据到Hive

栏目: 数据库 · 发布时间: 5年前

内容简介:在使用Sqoop的导入RDBMS数据到Hive的过程中,常常会遇到1种情况,那就是某个字段的类型是Blob或Clob这样的大文本类型,如果直接使用Sqoop进行导入的话,会发现无法正常导入。这里,我们以PostgreSQL数据库作为例子,进行相关问题的说明:在这里,我们创建了1张test的表,其中字段ID为主键并自增,而content是字节数组,即所谓的Blob类型。

在使用Sqoop的导入RDBMS数据到Hive的过程中,常常会遇到1种情况,那就是某个字段的类型是Blob或Clob这样的大文本类型,如果直接使用Sqoop进行导入的话,会发现无法正常导入。

这里,我们以PostgreSQL数据库作为例子,进行相关问题的说明:

create table test (id serial primary key,content bytea);  
insert into test values (1,E'\\0344\\0270\\0255\\0345\\0233\\0275\\0344\\0272\\0272');  
insert into test values (2,E'\\0345\\0203\\0217\\0351\\0243\\0216\\0344\\0270\\0200\\0346\\0240\\0267\\0345\\0255\\0230\\0345\\0234\\0250');  
insert into test values (3,'世界你好');

在这里,我们创建了1张test的表,其中字段ID为主键并自增,而content是字节数组,即所谓的Blob类型。

而在插入记录的时候,我们可以使用E转义符号进行字节的转义,将对应的8进制数据插入到数据库中。当然也可以直接插入字符串,PostgreSQL会进行相关的转换操作。

其结果类似如下:

id |                                  content                                     
----+----------------------------------------------------------------------------  
  1 | \x1c34173015351c35133317351c3417321732  
  2 | \x1c35103311371d31143311361c34173010301c36143016371c35153513301c3513341530  
  3 | \xe4b896e7958ce4bda0e5a5bd  
(3 rows)

接着我们使用Sqoop工具进行调入,其操作类似如下:

sqoop import --connect jdbc:postgresql://localhost/dog --table test --hive-import --create-hive-table --username dog --delete-target-dir --hive-table test -P

这个操作与我们之前的操作一致,我们指定对应的表及要创建的表的。但是,在执行的过程中会出现这样的异常:

19/01/13 12:54:45 ERROR tool.ImportTool: Import failed: java.io.IOException: Hive does not support the SQL type for column content

从其异常可以看到,Hive不支持对应列的 SQL 类型。对于这样的情况,我们有2种方法:

  • 不导入对应的字段
  • 对对应的字段进行类型转换

对于不想导入的字段,可以通过选项 --columns 指定要导入的列。另外还可以通过配置文件中设置选项 oraoop.import.omit.lobs.and.long 的值为true来忽略对应列的导入。该插件可以通过 https://downloads.cloudera.com/connectors/oraoop-1.6.0-cdh4.tgz 进行下载,只对Oracle数据库有效。

对于指定字段类型的匹配,我们可以使用参数 --map-column-hiv 来指定,其参数为1个键值对。因此,我们可以将之前的操作修改为如下:

sqoop import --connect jdbc:postgresql://localhost/dog --table test --hive-import --create-hive-table --username dog --delete-target-dir --hive-table test --map-column-hive content=STRING -P

我们指定字段content的类型为STRING类型,这样在导入的时候就会将其转换为字符串。最后,导入成功后,我们可以查看到其对应的内容:

hive> select * from test;  
OK  
2   1c 35 10 33 11 37 1d 31 14 33 11 36 1c 34 17 30 10 30 1c 36 14 30 16 37 1c 35 15 35 13 30 1c 35 13 34 15 30  
3   e4 b8 96 e7 95 8c e4 bd a0 e5 a5 bd  
1   1c 34 17 30 15 35 1c 35 13 33 17 35 1c 34 17 32 17 32  
Time taken: 3.071 seconds, Fetched: 3 row(s)

另外,对应的,我们还可以使用参数 --map-column-java 指定对应列的 Java 类型。在Hive中,对于大文件的大小也是有限制的,如果对应的内容太大,可以通过参数 --inline-lob-limit 进行设置,将其设置为1个较大的数值即可实现导入。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Starfish and the Spider

The Starfish and the Spider

Ori Brafman、Rod A. Beckstrom / Portfolio Hardcover / 2006-10-05 / USD 24.95

Understanding the amazing force that links some of today's most successful companies If you cut off a spider's leg, it's crippled; if you cut off its head, it dies. But if you cut off a st......一起来看看 《The Starfish and the Spider》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具