python - 使用 boto3 从 AWS Glue 获取表
问题描述
我需要从 AWS Glue 爬虫元数据目录中获取表和列名。我使用boto3
但不断获得 100 张桌子,即使还有更多。设置NextToken
没有帮助。如果可能,请提供帮助。
期望的结果如下:
lst = [table_one.col_one,table_one.col_two,table_two.col_one....table_n.col_n]
def harvest_aws_crawler():
glue = boto3.client('glue', region_name='')
response = glue.get_tables(DatabaseName='', NextToken = '')
#response syntax:
#https://boto3.amazonaws.com/v1/documentation/api/1.9.42/reference/services/glue.html#Glue.Client.get_tables
crawler_list_tables = []
for tables in response['TableList']:
while (response.get('NextToken') is not None):
crawler_list_tables.append(tables['Name'])
break
print(len(crawler_list_tables))
harvest_aws_crawler()
更新的代码,仍然需要有表名+列名:
def harvest_aws_crawler():
glue = boto3.client('glue', region_name='')
next_token = ""
#response syntax:
#https://boto3.amazonaws.com/v1/documentation/api/1.9.42/reference/services/glue.html#Glue.Client.get_tables
response = glue.get_tables(DatabaseName='', NextToken = next_token)
tables_from_crawler = []
while True:
table_list = response['TableList']
for table_dict in table_list:
table_name = table_dict['Name']
#append table_name+column_name
for columns in table_name['StorageDescriptor']['Columns']:
tables_from_crawler.append(table_name + '.' + columns['Name'])
#tables_from_crawler.append(table_name)
next_token = response.get('NextToken')
if next_token is None:
break
print(tables_from_crawler)
harvest_aws_crawler()
解决方案
您可以使用以下paginator
选项尝试以下方法:
def get_tables_for_database(database):
starting_token = None
next_page = True
tables = []
while next_page:
paginator = glue_client.get_paginator(operation_name="get_tables")
response_iterator = paginator.paginate(
DatabaseName=database,
PaginationConfig={"PageSize": 100, "StartingToken": starting_token},
)
for elem in response_iterator:
tables += [
{
"name": table["Name"],
}
for table in elem["TableList"]
]
try:
starting_token = elem["NextToken"]
except:
next_page = False
return tables
然后调用该方法列出给定数据库的表:
for table in get_tables_for_database(database):
print(f"Table: {table['name']}")
如果您想在 Glue 中列出每个数据库的表,您可能必须执行一个额外的 for 循环才能首先检索数据库,然后使用上面的代码片段提取表作为每个数据库的内部循环。
推荐阅读
- flutter - 这个 Overlay 小部件不能被标记为需要构建,因为框架已经在构建小部件的过程中
- sql - 从 SQL 列返回 XML 中的特定嵌套节点
- reactjs - react native什么时候调用构造函数方法?
- ace-editor - 如何从语言工具之外的反应王牌编辑器中添加自定义完成器
- c# - 反应式服务。分组和缓存流
- c - 当我将图中的节点数从 4 个增加到大于 5 个时,malloc 会导致内存损坏
- django - 带有开发服务器的 Django https
- google-cloud-platform - 如何在 BigQuery 中创建嵌套字段和数组的数组
- java - 正则表达式从预定义的字符串格式中提取值
- html - 嵌入式引导 div 在非引导站点中没有响应