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

时间:2015-02-12 00:14:39

标签: mysql serialization import hbase sqoop

目前,我有一个MySql表“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”和“修改”为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字节插入目标单元格中​​。

但是字符串无法表示像0x1E这样的字符,因此默认序列化无法满足我的需求。谁能告诉我如何自定义序列化并将mysql表中的内容转换为所需的字节格式,从而放入HBase?

1 个答案:

答案 0 :(得分:0)

您可以使用CHAR(31)表示带有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(这是必需的)

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