首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用爬虫更新手工创建的aws胶水数据目录表

用爬虫更新手工创建的aws胶水数据目录表
EN

Stack Overflow用户
提问于 2020-03-27 17:27:59
回答 2查看 8.9K关注 0票数 1

我正在使用AWS胶水和s3上的许多文件,每天都会追加新的文件。我尝试创建并运行一个爬虫来推断出那些csv文件的模式。爬虫不只是一个带有模式的数据目录表,而是创建许多表(即使为所选的每个S3 path选项创建一个模式),这意味着爬虫识别不同的模式,不能将它们组合成一个。但是,我只需要一个表在数据目录中的所有这些文件!

因此,我手动创建了单独的数据目录表,当我将这个表与胶水作业一起使用时,没有一个s3 csv文件被处理。我猜这是因为每次爬虫运行时,它都会检查新的文件和分区(如果是单个模式表,我们可以通过单击表中的视图分区按钮来查看这些文件和分区)。

因此,在这里中,可以使用爬虫更新手动创建的表,我希望爬虫不会更改我选择的列的数据类型,而是更新用于胶水作业的文件和分区列表,以便稍后处理:

您可能希望手动创建AWS Glue数据目录表,然后使用AWS Glue爬虫更新它们。按计划运行的爬虫可以添加新的分区,并使用任何模式更改更新表。这也适用于从Apache转移区迁移的表。 为此,在定义爬虫时,指定一个或多个现有的数据目录表,而不是指定一个或多个数据存储作为爬行的源。然后,爬虫会抓取由目录表指定的数据存储。在这种情况下,不创建新表;而是更新手动创建的表。

这并不是因为某种原因,我在爬虫日志中看到了这样的情况:

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的新文件更新手动创建的表吗?

EN

回答 2

Stack Overflow用户

发布于 2020-03-28 19:21:39

考虑到您的爬虫正在检测不同的模式,无论我选择什么选项,它都将继续执行相同的操作。您可以让它对所有分区使用表定义,然后只记录更改,以避免更新表架构。但是,如果文件的模式存在差异,我不确定您的查询是否有效。

另一个选项是使用boto3为您的s3路径添加分区。我可以使用get table函数获得表模式,然后用该表模式在glue中创建一个分区。

票数 1
EN

Stack Overflow用户

发布于 2020-03-31 20:24:33

我不知道为什么,但我创建的爬虫不能更新文件和分区列表,以便稍后处理胶水作业,它跳过我手工创建的数据目录表,我在cloudwatch日志中看到了它。为了解决这个问题,我需要在我的胶水脚本中添加repair table查询,这样它就可以完成爬虫应该做的事情(而且我禁用了爬虫本身,所以它不会更改手动创建的表,也不会为各个csv文件和分区创建多个表),在实际的ETL过程之前:

代码语言:javascript
复制
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修复表客户“后,它会将以下内容写入S3://bucket_ to _store_ query _this/results/一个xxx-xxx.txt文件:

代码语言:javascript
复制
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-> table ->选择customer表,然后单击页面右端的“查看分区”按钮,我将看到s3桶中的所有分区。在那部分之后,胶水的工作和以前一样继续。我知道“修复表”查询黑客并不是最优的,而且可能会将其更改为更复杂的东西,如这里中所描述的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60891134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档