如何在Pig Latin输出中添加HDFS文件夹名称(日期)?
从HDFS文件夹名称提取日期并添加到Pig日志输出
你已经找对了方向,-tagPath参数确实能帮我们把每条日志的来源文件路径附加到记录中,接下来只需要从完整路径里提取出日期文件夹的名称即可。下面提供两种实用的解决方案:
方法1:使用正则表达式提取日期(适合固定日期格式的场景)
如果你的日期文件夹都是YYYY-MM-DD这种标准格式,正则表达式是最直接的方式:
- 首先加载数据并保留文件路径标签:
-- 假设日志每行只有一个id字段,加载后每条记录为 (id: chararray, full_path: chararray) A = LOAD '/logs_folder/*' USING PigStorage(',', '-tagPath');
- 用
REGEX_EXTRACT从路径中提取日期:
-- 正则表达式匹配路径中的日期部分,提取第一个分组作为date字段 B = FOREACH A GENERATE REGEX_EXTRACT($1, '.*/(\\d{4}-\\d{2}-\\d{2})/.*', 1) AS date, $0 AS id;
这里的正则表达式.*/(\\d{4}-\\d{2}-\\d{2})/.*会精准匹配路径中被斜杠包裹的日期字符串,1表示提取第一个括号内的匹配内容(也就是日期)。
方法2:分割路径字符串提取(适合固定目录结构的场景)
如果你的目录结构固定(比如日期文件夹始终是日志文件的父目录),可以通过分割路径字符串来获取日期,不需要依赖正则:
- 同样先加载数据:
A = LOAD '/logs_folder/*' USING PigStorage(',', '-tagPath');
- 分割路径并提取倒数第二个元素(即日期文件夹):
B = FOREACH A { -- 按斜杠分割完整路径,得到路径各部分的数组 split_path = STRSPLIT($1, '/', 0); -- 数组的倒数第二个元素就是日期文件夹(比如路径`/logs_folder/2021-03-01/log1`分割后,索引为2的元素是日期) date = split_path.$(SIZE(split_path)-2); GENERATE date, $0 AS id; }
这种方法更灵活,哪怕日期格式有变化,只要目录结构不变就能正常工作。
验证输出
最后执行DUMP B;就能看到符合预期的输出:
2021-03-01 id1 2021-03-01 id2 2021-03-02 id234 ...
内容的提问来源于stack exchange,提问作者Mikhail_Sam
相关产品推荐
相关产品推荐

