目前,我有一个mysql表“email\u history”,如下所示。
email_address updated_date modification
janet.ford@mmch.org 2014-10-20 NEW:confidence::75|NEW:sources::cif
r.wagland@soton.ac.uk 2014-10-20 NEW:confidence::75|NEW:sources::cif|NEW:user::r.wagland
字段“email\u address”和“modification”是varchar,“updated\u date”是date。
导入到hbase时,行键需要是email\u address连接字节数组的日期。值需要修改,但“:”需要转换为字节0x1f,“|”需要转换为字节0x1e。以下是此格式的示例。
janet.ford@mmch.org\x00\x00\x01KS,\x7F\x00 column=c:v, timestamp=1423082506912, value=new\x1Fconfidence\x1F75\x1Enew\x1Fsources\x1Fcif
默认情况下,sqoop通过将每个字段转换为其字符串表示形式将所有值序列化为hbase,然后在目标单元格中插入该字符串的utf-8字节。
但是字符串无法表示0x1e这样的字符,因此默认的序列化不能满足我的要求。有谁能告诉我如何定制序列化并将mysql表中的内容转换为所需的字节格式,从而放入hbase?
1条答案
按热度按时间qybjjes11#
您可以用char(30)表示0x1e(向上箭头),用char(31)表示0x1f(向下箭头),因此,您可以提供一个自由查询并执行替换。这应该能实现你想要的目标:
只需相应地替换括号中的代码,然后离开
$CONDITIONS
原样(需要)关于将复合行键的日期部分存储为byte[]我支持将其存储为4 byte int(posix时间戳)之类的内容。。。遗憾的是,您不能这样做:所有内容都将作为字节编码的utf8字符串导入hbase,但除了行键稍长一点之外,这应该不是什么问题。如果必须使用这种精确的格式,那么就必须实现自己的作业,以便使用行键或列值的自定义序列化从mysql读取数据并写入hbase。