我尝试使用新的firehose功能“记录格式转换”将我的事件保存为athena或hive聚合的镶木地板文件。您必须从胶水目录中选择表格,但是firehose会忽略已定义的分区,而是将文件保存在结构YYYY / MM / DD / HH /中。数据也缺少定义的分区列。如果它已用于分区,那就没问题。
是否有强制使用表分区的API配置或其他内容?
答案 0 :(得分:0)
即使分区相同,我也有同样的问题
因此,您必须使用AWS lambda来实现所需的目标
对于第一个,我选择NodeJ,因为这非常简单而且非常快。 在最少AWS允许的情况下,移动120MB文件需要大约3秒的时间才能分配128MB RAM内存(Firehose生成的文件最大约为64MB)
Node js项目结构 package.json
{
"name": "your.project",
"version": "1.0.0",
"description": "Copy generated partitioned files by Firehose to valid partitioned files for Athena",
"main": "index.js",
"dependencies": {
"async": "^2.6.1"
}
}
还有index.js
const aws = require('aws-sdk');
const async = require('async');
const s3 = new aws.S3();
const dstBucket = 'PUT_YOUR_BUCKET_NAME_HERE';
var util = require('util');
exports.handler = (event, context, callback) => {
const srcBucket = event.Records[0].s3.bucket.name;
const srcKey = event.Records[0].s3.object.key;
const split = srcKey.split('/');
const dstKey = `event_year=${split[0]}/event_month=${split[1]}/event_day=${split[2]}/event_hour=${split[3]}/${split[4]}`;
console.log("Reading options from event:\n", util.inspect(event, {depth: 10}));
async.waterfall([
function copy(next) {
s3.copyObject({
Bucket: dstBucket,
CopySource: `${srcBucket}/${srcKey}`,
Key: dstKey
}, next);
},
function deleteOriginal(copyResult, next) {
s3.deleteObject({
Bucket: srcBucket,
Key: srcKey
}, next);
}
], function (err) {
if (err) {
console.error(`Failed: ${srcBucket}/${srcKey} => ${dstBucket}/${dstKey} to move FireHose partitioned object to Athena partitioned object. Error: ${err}`);
} else {
console.log(`Success: ${srcBucket}/${srcKey} => ${dstBucket}/${dstKey} moved FireHose partitioned object to Athena partitioned object`);
}
callback(null, 'move success');
}
);
};
仅更新一些数据以适合您的情况。 而且我遇到的另一个问题是,在使用
构建项目时npm install
然后将其压缩,这在AWS解压缩中是不正确的,因此我必须更新index.js的路径。
这可行。
您也可以找到此行
console.log("Reading options from event:\n", util.inspect(event, {depth: 10}));
可以将其删除,但是极大地有助于了解处理对象的详细信息