微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Athena 中的按日期列分区

如何解决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 举报,一经查实,本站将立刻删除。