解决sqoop1.4.4无法导入oracle的blob字段到hbase的问题
来源:互联网 发布:zabbix监控nginx 编辑:程序博客网 时间:2024/05/18 03:40
最近在做oracle到hbase的数据迁移,有一张表有blob字段,在导入时发现没有导入成功,在网上找了好久,都没有搞定,最后没办法只能研究一下sqoop的源码,自己解决了。
在研究源码后,发现sqoop中已经有了关于blob字段的处理方法了,但不知道什么原因,对hbase没有正确处理,存在bug。主要做如下修改:
在org.apache.sqoop.mapreduce.HBaseImportMapper类中,增加大字段的处理。
首先增加如下代码:
这是在初始化时,初始化大对象读取器,构造函数中最后一个是null,如果单个文件大于设定的最大值(--inline-lob-limit属性,默认是16M),会报错,这块需要先写在hdfs上,也可以自己写一个hdfs的路径。
private LargeObjectLoader lobLoader;
protected void setup(Context context)
throws IOException, InterruptedException {
this.lobLoader = new LargeObjectLoader(context.getConfiguration(),
null);
}
public void map(LongWritable key, SqoopRecord val, Context context)
throws IOException, InterruptedException {
/**原来的hbase map中是没有调用大对象的方法,在此处增加**/
try {
// Loading of LOBs was delayed until we have a Context.
val.loadLargeObjects(lobLoader);
} catch (SQLException sqlE) {
throw new IOException(sqlE);
}
context.write(val, NullWritable.get());
}
增加完以后代码后,会发现导入到hbase的图片,比实际的大好多,我的大了一倍左右,且图片无法正常显示,这是因为sqoop在将程序入库时,字符转换有问题,可以做如下操作:
在org.apache.sqoop.hbase.ToStringPutTransformer方法中,增加如下方法:
/**
* 如果是blob类型,转成string在转成byte后,结果会发生变化,有时候数据量会增大一倍,会出错。
* @author sking modify 2014-12-25
* @param val
* @return
*/
private byte[] toHBaseBytes(Object val) {
if (val instanceof BlobRef){
return ((BlobRef)val).getData();
}else{
return Bytes.toBytes(toHBaseString(val));
}
}
并将 private List<Put> putRecordInHBase(Map<String, Object> record,String colFamily, String rowKey)方法中
if (null != val) {
put.add(colFamilyBytes, getFieldNameBytes(colName),
Bytes.toBytes(toHBaseString(val)));
}
改成
if (null != val) {
put.add(colFamilyBytes, getFieldNameBytes(colName),
- 解决sqoop1.4.4无法导入oracle的blob字段到hbase的问题
- Oracle中得blob字段导入到DB2的Blob字段
- Oracle中得blob字段导入到DB2的Blob字段
- 解决mapreduce无法将数据批量导入hbase的问题
- oracle中读写blob字段的问题
- 操作Oracle数据库实现上传图片到Blob类型的字段出现的问题
- 操作Oracle数据库实现上传图片到Blob类型的字段出现的问题
- 操作Oracle数据库实现上传图片到Blob类型的字段出现的问题
- oracle clob 和blob问题的解决
- 解决oracle中存在blob大字段时的导入导出的问题
- 用vba插入字符串到Oracle的BLOB字段
- C#将文件保存到Oracle的BLOB字段
- struts+hibernate上传图片保存到oracle的blob字段
- 【甘道夫】Sqoop1.99.3基础操作--导入Oracle的数据到HDFS
- 关于oracle中blob字段的录入问题
- oracle更换表空间 blob字段带来的问题
- oracle中读写blob字段的问题解析
- 关于oracle中blob字段查询的问题
- Facebook Login for iOS
- jquery限制文本框输入字符长度
- tcp 的ack, seq
- rhel5.x 光盘yum源配置
- Android 不能静态注册的广播
- 解决sqoop1.4.4无法导入oracle的blob字段到hbase的问题
- 学习苏坤winform开发第14讲笔记
- C# combobox 如何赋值
- 记录一个问题,Expected a type
- 【胖鱼头】HBase处理逻辑
- Android Studio 版本控制 - svn使用
- C#面向对象的笔记
- 苏坤winform开发第15讲笔记
- web.xml中配置spring的几种方式 以及 Spring获取Bean的几种方式