如何自定义从mysql到hbase的sqoop导入序列化?

vwkv1x7d  于 2021-06-09  发布在  Hbase
关注(0)|答案(1)|浏览(402)

目前,我有一个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?

qybjjes1

qybjjes11#

您可以用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 byte int(posix时间戳)之类的内容。。。遗憾的是,您不能这样做:所有内容都将作为字节编码的utf8字符串导入hbase,但除了行键稍长一点之外,这应该不是什么问题。如果必须使用这种精确的格式,那么就必须实现自己的作业,以便使用行键或列值的自定义序列化从mysql读取数据并写入hbase。

相关问题