Solución:
Hay varias formas de programar esta tarea. ¿Cómo programa sus flujos de trabajo? ¿Utiliza un sistema como Airflow, Luigi, Azkaban, cron o utiliza una canalización de datos de AWS?
Desde cualquiera de estos, debería poder disparar el siguiente comando CLI.
$ aws athena start-query-execution --query-string "MSCK REPAIR TABLE some_database.some_table" --result-configuration "OutputLocation=s3://SOMEPLACE"
Otra opción sería AWS Lambda. Podrías tener una función que llame MSCK REPAIR TABLE some_database.some_table
en respuesta a una nueva carga en S3.
Un ejemplo de función Lambda podría escribirse como tal:
import boto3
def lambda_handler(event, context):
bucket_name="some_bucket"
client = boto3.client('athena')
config = {
'OutputLocation': 's3://' + bucket_name + "https://foroayuda.es/",
'EncryptionConfiguration': {'EncryptionOption': 'SSE_S3'}
}
# Query Execution Parameters
sql="MSCK REPAIR TABLE some_database.some_table"
context = {'Database': 'some_database'}
client.start_query_execution(QueryString = sql,
QueryExecutionContext = context,
ResultConfiguration = config)
Luego, configuraría un disparador para ejecutar su función Lambda cuando se agreguen nuevos datos en la DATA/
prefijo en su cubo.
En última instancia, reconstruir explícitamente las particiones después de ejecutar su trabajo de Spark con un programador de trabajos tiene la ventaja de ser autodocumentado. Por otro lado, AWS Lambda es conveniente para trabajos como este.
Deberías estar corriendo ADD PARTITION
en lugar de:
aws athena start-query-execution --query-string "ALTER TABLE ADD PARTITION..."
Lo que agrega una partición recién creada de su S3
location Athena aprovecha Hive para particionar datos. Para crear una tabla con particiones, debe definirla durante el CREATE TABLE
declaración. Usar PARTITIONED BY
para definir las claves mediante las cuales particionar los datos.