Yan*_*ick 5 amazon-s3 amazon-web-services avro amazon-athena aws-glue
我们有一个胶水爬虫,它读取 S3 中的 avro 文件并相应地在胶水目录中创建一个表。问题是我们有一个名为 'foo' 的列,它来自 avro 模式,我们在 s3 存储桶路径中也有类似 'foo=XXXX' 的内容,以具有 Hive 分区。
我们不知道的是,爬虫将创建一个现在有两列同名的表,因此我们在查询表时会出现问题:
HIVE_INVALID_METADATA: Hive metadata for table mytable is invalid: Table descriptor contains duplicate columns
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉胶水将分区 'foo' 映射到另一个列名,如 'bar' ?这样我们就可以通过在 s3 存储桶路径中指定一个新的分区名称来避免重新处理我们的数据。
或任何其他建议?
Glue Crawler 非常糟糕,这只是它创建不可用表的众多方式之一。我认为你最好只用一个简单的脚本创建表和分区。创建没有foo列的表,然后编写一个脚本,列出您在 S3 上的文件,执行 Glue API 调用 ( BatchCreatePartition ),或ALTER TABLE … ADD PARTITION …在 Athena 中执行调用。
每当在 S3 上添加新数据时,只需使用 API 调用或 Athena 查询添加新分区。如果您知道何时以及如何添加数据,则无需执行 Glue Crawler 所做的所有工作。如果不这样做,您可以使用 S3 通知来运行执行 Glue API 调用的 Lambda 函数。几乎所有的解决方案都比 Glue Crawler 更好。
Athena 和 Glue Catalog 的美妙之处在于它们都只是元数据,将其全部丢弃并重新创建它的成本非常低。您还可以根据需要创建使用相同位置的任意数量的表,以尝试不同的模式。在你的情况下,不需要在 S3 上移动任何对象,你只需要一个不同的表和不同的机制来向它添加分区。
| 归档时间: |
|
| 查看次数: |
3426 次 |
| 最近记录: |