【发布时间】:2019-08-16 19:26:48
【问题描述】:
我有一个充满图像文件的 S3 存储桶 (com.example.myorg.images),它们都遵循相同的命名约定:
<PRODUCT_ID>_<NUMBER>.jpg
其中<PRODUCT_ID> 是一个长数字(RDS 表中的主键),<NUMBER> 始终是三个值之一:100、200 或 300。例如,存储桶可能包含:
- 1394203949_100.jpg
- 1394203949_200.jpg
- 1394203949_300.jpg
- 1394203950_100.jpg
- 1394203950_200.jpg
- 1394203950_300.jpg
- ...等
我想编写一个 Athena 或 Glue ETL 进程来查询 S3 存储桶以获取其中的所有图像,并以某种方式将 UNIQUE <PRODUCT_ID> 值提取到表或列表中.
据我了解,Athena 会将该表格/列表备份到可下载的 CSV 文件中;如果为真,那么我将按照我在命令行上需要的方式单独处理该无标题 CSV。
例如,如果上面的 6 张图片是桶中的唯一张图片,那么这个过程将:
- 查询S3,获取由
1394203949和1394203950组成的表/列表 - 创建一个如下所示的可下载 CSV:
可以是 S3 甚至内存中的文件:
1394203949,1394203950
之前没有使用 Athena 或 Glue 的经验,我正在尝试使用 Athena 查询来完成此操作,但我很难通过树木看到森林。
我在第一部分(S3 查询)的最佳尝试:
CREATE EXTERNAL TABLE IF NOT EXISTS products_with_thumbnails (
product_id string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
LOCATION 's3://com.example.myorg.images/';
这将使用 S3 存储桶中所有内容的文件名设置我的内存表我相信,但是:
- 如何使此表仅包含唯一的产品 ID(无重复)?
- 如何仅提取文件名的
<PRODUCT_ID>段(1394203949而不是1394203949_100.jpg)?
我不偏爱 Athena 或 Glue,并且会很高兴 任何 解决方案能够满足我的需求。 最坏的情况我可以编写一个 Lambda 来在应用程序层完成所有这些 ETL,但如果有一个类似 Hive 或面向 ETL 的 AWS 服务存在用于执行这类事情,我'宁愿利用它!
提前致谢!
【问题讨论】:
标签: amazon-web-services amazon-s3 etl amazon-athena aws-glue