如何解决Athena 中的按日期列分区
我正在使用 AWS Athena 查询 S3 存储桶,该存储桶仅按天对数据进行分区,分区看起来像 day=yyyy/mm/dd。 当我尝试让我们每天使用 glue 运行更新分区时,它每天都会创建新表(2017 年同步,大约 1500 个表)。
我尝试像这样使用分区投影:
PARTITIONED BY (
day string)
TBLPROPERTIES (
'has_encrypted_data'='false','projection.day.format'='yyyy/mm/dd','projection.day.interval'='1','projection.day.interval.unit'='DAYS','projection.day.range'='2017/01/01,Now','projection.day.type'='date','projection.enables'='true'
但是没有 MSCK 修复,分区没有更新。 有任何想法吗?我是否错过了分区投影的某些内容?
解决方法
如果您使用分区投影加载分区,则不需要使用 Glue 或 MSCK REPAIR TABLE
。只需从查询编辑器中运行一次 CREATE TABLE
脚本,就可以了。如果您使用分区投影加载分区,您将无法在 Glue 数据目录中看到分区。
或者下面的脚本可以帮助你
#Import libraries
import boto3
import datetime
#Connection for S3 and Athena
s3 = boto3.client('s3')
athena = boto3.client('athena')
#Get Year,Month,Day for partition (this will get tomorrow date's value)
date = datetime.datetime.now()
athena_year = str(date.year)
athena_month = str(date.month).rjust(2,'0')
athena_day = str(date.day + 1).rjust(2,'0')
#Parameters for S3 log location and Athena table
#Fill this carefully (Read the commented section on top to help)
s3_buckcet = 'sqladmin-cloudtrail'
s3_prefix = 'AWSLogs/XXXXXXXXXXXX/CloudTrail/'
s3_input = 's3://' + s3_buckcet + '/' + s3_prefix
s3_ouput = 's3://aws-athena-query-results-XXXXXXXXXXXXXX-us-east-1'
database = 'athena_log_database'
table_name = 'cloudtrail_logs_table'
#Executing the athena query:
def run_query(query,database,s3_output):
query_response = athena.start_query_execution(
QueryString=query,QueryExecutionContext={
'Database': database
},ResultConfiguration={
'OutputLocation': s3_output,}
)
print('Execution ID: ' + query_response['QueryExecutionId'])
return query_response
#Main function for get regions and run the query on the captured regions
def lambda_handler(event,context):
result = s3.list_objects(Bucket=s3_buckcet,Prefix=s3_prefix,Delimiter='/')
for regions in result.get('CommonPrefixes'):
get_region=(regions.get('Prefix','').replace(s3_prefix,'').replace('/',''))
query = str("ALTER TABLE "+ table_name +" ADD PARTITION (region='"
+ get_region + "',year="
+ athena_year + ",month="
+ athena_month + ",day="
+ athena_day
+ ") location '"+s3_input
+ get_region
+ "/" + athena_year + "/" + athena_month + "/"
+ athena_day + "';")
#print(get_region) -- for debug
#print(query) -- for debug
run_query(query,s3_ouput)
您可以使用类似的脚本运行粘合作业来每天创建分区。只需相应地更改 ALTER TABLE
部分就可以了。
问题在于日期格式中不能包含 /
。您需要将 /
替换为其他内容(例如 -
)或切换为年、月和日的整数格式,并具有三个分区。
三个分区看起来像:
projection.year.type=integer,projection.year.range='2017,2025',projection.year.format='day=${year}',projection.month.type=integer,projection.month.range='01,12',projection.day.type=integer,projection.day.range='01,31'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。