导入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个较大的数值即可实现导入。


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

查看所有标签

猜你喜欢:

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

Writing Apache Modules with Perl and C

Writing Apache Modules with Perl and C

Lincoln Stein、Doug MacEachern / O'Reilly Media, Inc. / 1999-03 / USD 39.95

Apache is the most popular Web server on the Internet because it is free, reliable, and extensible. The availability of the source code and the modular design of Apache makes it possible to extend Web......一起来看看 《Writing Apache Modules with Perl and C》 这本书的介绍吧!

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

HTML 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具