使用 PIG 从 mysqldump 加载
Posted
技术标签:
【中文标题】使用 PIG 从 mysqldump 加载【英文标题】:Loading from mysqldump with PIG 【发布时间】:2011-07-14 12:20:29 【问题描述】:我有一个 mysqldump 的格式:
INSERT INTO `MY_TABLE` VALUES (893024968,'342903068923468','o03gj8ip234qgj9u23q59u','testing123','HTTP','1','4213883b49b74d3eb9bd57b7','blahblash','2011-04-19 00:00:00','448','206',NULL,'GG');
如何使用 pig 加载这些数据?我试过了;
A = LOAD 'pig-test/test.log' USING PigStorage(',') AS (ID: chararray, USER_ID: chararray, TOKEN: chararray, NODE: chararray, CHANNEL: chararray, CODE: float, KEY: chararray, AGENT: chararray, TIME: chararray, DURATION: float, RESPONSE: chararray, MESSAGE: chararray, TARGET: chararray);
使用 , 作为分隔符可以正常工作,但我希望 ID 为 int,但我无法弄清楚如何切断前导“INSERT INTO MY_TABLE
VALUES (”和尾随“);”加载时。
另外,我应该如何加载日期时间信息以便查询?
您能提供的任何帮助都会很棒。
【问题讨论】:
【参考方案1】:您可以将每条记录加载为一行文本,然后尝试使用MyRegExLoader 或REGEX_EXTRACT_ALL 正则表达式/提取字段:
A = LOAD 'data' AS (record: CHARARRAY);
B = FOREACH A GENERATE REGEX_EXTRACT_ALL(record, 'INSERT INTO...., \'(\d+)\', ...');
这是一种 hack,但您也可以使用 REPLACE 来删除多余的文本:
B = FOREACH A
GENERATE
(INT) REPLACE(ID, 'INSERT INTO MY_TABLE VALUES (', ''),
...
REPLACE(TARGET, ');', '');
目前分号存在问题,因此您可能需要自己处理REPLACE。
Pig 中没有原生的 date type,但您可以使用 PiggyBank 中的日期工具或构建自己的 UDF 以将其转换为 Unix long。
另一种方法是编写一个简单脚本(Python...)来准备加载数据。
【讨论】:
以上是关于使用 PIG 从 mysqldump 加载的主要内容,如果未能解决你的问题,请参考以下文章
Pig:使用 AvroStorage 加载会引发“无法从 loadFunc 获取架构”异常