使用搜寻器更新手动创建的AWS胶水数据目录表

时间:2020-03-27 17:27:59

标签: amazon-web-services aws-glue aws-glue-data-catalog

我正在使用AWS胶水和s3上的许多文件,每天都会附加新文件。我尝试创建并运行搜寻器以推断出这些csv文件的架构。搜寻器不仅会创建一个具有模式的数据目录表,而且还会创建许多表(即使使用为所选的每个S3路径创建一个模式选项),这也意味着搜寻器可以识别不同的模式,并且无法将它们组合为一。但是对于所有这些文件,我只需要数据目录中的一张表即可!

因此,我手动创建了单独的数据目录表,当我将此表与胶粘作业一起使用时,不会处理任何s3 csv文件。我猜这是因为爬网程序每次运行时都会检查新文件和分区(在单个模式表的情况下,我们可以通过单击表中的查看分区按钮来查看这些文件和分区)。

因此,在here中,有一种方法可以使用搜寻器更新手动创建的表,因此我希望它不会更改我选择的列的数据类型,而是更新文件和分区列表以进行粘合待稍后处理的工作:

您可能想要手动创建AWS Glue数据目录表,然后使用AWS Glue搜寻器对其进行更新。按计划运行的爬网程序可以添加新分区并使用任何架构更改来更新表。这也适用于从Apache Hive Metastore迁移的表。

为此,在定义搜寻器时,您无需指定一个或多个现有数据目录表,而不是指定一个或多个数据存储作为搜寻的源头。然后,搜寻器搜寻目录表指定的数据存储。在这种情况下,不会创建新表。相反,您手动创建的表将更新。

由于某种原因,它没有发生,在搜寻器日志中,我看到了:

INFO : Some files do not match the schema detected. Remove or exclude the following files from the crawler (truncated to first 200 files): bucket1/customer/dt=2020-02-26/delta_20200226_080101.csv INFO : Multiple tables are found under location bucket1/customer/. Table customer is skipped.

但是,当搜寻器使用现有的数据目录表时,没有“排除模式”选项可排除该文件,文档说明在这种情况下“搜寻器随后将搜寻目录表指定的数据存储”。

而且搜寻器不会向我的表添加任何分区或文件。

是否可以使用s3中的新文件更新手动创建的表?

2 个答案:

答案 0 :(得分:1)

考虑到您的搜寻器正在检测不同的架构,无论我选择什么选项,它都会继续执行相同的操作。您可以获取它以对所有分区使用表中的表定义,然后仅记录更改以避免更新表架构。但是,如果文件的架构有所不同,则不确定您的查询是否可以使用。

另一种选择是使用boto3为您的s3路径添加分区。我可以使用get table函数获取表架构,然后使用该表架构胶水创建分区

答案 1 :(得分:0)

我不知道为什么,但是我创建的搜寻器无法更新文件列表和分区列表以供胶水作业以后处理,它会跳过我手动创建的数据目录表,我在cloudwatch日志中看到了它。为了解决此问题,我需要在我的粘合脚本中添加repair table查询,以便它执行搜寻器应该执行的操作(并且我禁用了该搜寻器本身,因此它不会更改我的手动创建的表,并且在实际的ETL处理之前不会为单个的csv文件和分区创建很多表):

import boto3
...
# Athena query part
client = boto3.client('athena', region_name='us-east-2')
data_catalog_table = "customer"
db = "inner_customer"  # glue data_catalog db, not Postgres DB
# this supposed to update all partitions for data_catalog_table, so glue job can upload new file data into DB
q = "MSCK REPAIR TABLE "+data_catalog_table
# output of the query goes to s3 file normally
output = "s3://bucket_to_store_query_results/results/"
response = client.start_query_execution(
    QueryString=q,
    QueryExecutionContext={
        'Database': db
    },
    ResultConfiguration={
        'OutputLocation': output,
    }
)`

执行“ MSCK REPAIR TABLE客户”查询后,它将写入s3:// bucket_to_store_query_results / results / xxx-xxx-xxx.txt文件,其内容如下:

Partitions not in metastore:    customer:dt=2020-03-28  customer:dt=2020-03-29  customer:dt=2020-03-30
Repair: Added partition to metastore customer:dt=2020-03-28
Repair: Added partition to metastore customer:dt=2020-03-29
Repair: Added partition to metastore customer:dt=2020-03-30

如果我打开Glue-> Tables->选择客户表,然后单击页面右上方的“查看分区”按钮,我将看到s3存储桶中的所有分区。在那部分之后,胶水作业将像以前一样继续。我了解“修复表格”查询黑客并不是真正的最佳选择,可能会将其更改为更复杂的内容,如here中所述。

相关问题