gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 23:01:25 24 4
gpt4 key购买 nike

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

但是字符串无法表示0x1E这样的字符,因此默认的序列化无法满足我的愿望。谁能告诉我如何自定义序列化并将mysql表中的内容转换为所需的字节格式并放入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 不变(这是必需的)

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

关于mysql - 如何自定义从 Mysql 到 HBase 的 Sqoop 导入序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28467111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com