如何自定义从 Mysql 到 HBase 的 Sqoop 导入序列化?

How can I customize Sqoop Import serialization from Mysql to HBase?

目前,我有一个 MySql table "email_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_address" 和 "modification" 是 VARCHAR,"updated_date" 是 DATE。

导入到 HBase 时,行键需要 email_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 字节插入目标单元格。

但是string无法表示0x1E这样的字符,所以默认的序列化不能满足我的要求。谁能告诉我如何自定义序列化并将 mysql table 中的内容转换为所需的字节格式,然后放入 HBase?

您可以用 CHAR(30) 表示 0x1E(向上箭头),用 CHAR(31) 表示 0x1F(向下箭头),因此,您可以提供免费查询并执行替换。这应该完全符合您的要求:

sqoop import --connect jdbc:mysql://localhost:3306/[db] \
--username [user] --password [pwd] \
--query 'SELECT CONCAT(email_address,updated_date) as id, REPLACE(REPLACE(modification,":",CHAR(31),uri),"|",CHAR(30),uri) as value FROM email_history WHERE $CONDITIONS' \
--split-by id \
--hbase-create-table --hbase-table [your_hbase_table] \
--hbase-row-key id --column-family [your_hbase_column_family]

只需相应地替换括号中的代码并保留 $CONDITIONS 原样(必需)

关于将复合行键的日期部分存储为字节[] 我想你想将它存储为 4 字节 int(posix 时间戳)o 类似的东西......可悲的是,你不能:所有内容都将作为字节编码的 UTF8 字符串导入到 HBase 中,但除了行键稍微长一点之外,这应该不是什么大问题。如果必须具有那种确切的格式,则您必须实现自己的工作以从 MySQL 中读取并使用您的行键或列值的自定义序列化写入 HBase。