Soy nuevo en AWS Athena y estoy tratando de consultar varios depósitos S3 que contienen archivos JSON. Encontré una serie de problemas que no tienen ninguna respuesta en la documentación (lamentablemente, su registro de errores no es lo suficientemente informativo como para tratar de resolverlo yo mismo):
CREATE EXTERNAL TABLE IF NOT EXISTS test-scema.test_table ( `device`: string, `Capacity(GB)`: string)Su consulta tiene los siguientes errores:
FALLIDO: Error de ejecución, código de retorno 1 de org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.IllegalArgumentException: Error: se esperaba en la posición de 'Capacidad (GB): cadena>' pero se encuentra '('.
Mis archivos están ubicados en subcarpetas en S3 en la siguiente estructura:
'nombre_ubicación/AAAA/MM/DD/cadenaaplicación/'
y quiero consultar todas las fechas de una cadena de aplicación específica (de muchas). ¿Hay algún 'comodín' que pueda usar para reemplazar la ruta de las fechas? Algo como esto:
LOCATION 's3://location_name/%/%/%/appstring/'
CREATE EXTERNAL TABLE IF NOT EXISTS test_schema.test_table ( field1:string, field2:string ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1' ) LOCATION 's3://folder/YYYY/MM/DD/appstring' WHERE field2='value'
¿Cuáles serían los resultados en términos de facturación? Porque en este momento estoy creando esta declaración CREATE solo para reutilizar los datos en una consulta SQL una vez más.
¡Gracias!
1. Campo JSON nombrado con paréntesis
No es necesario crear un campo llamado Capacity(GB) . En su lugar, cree el campo con un nombre diferente:
CREATE EXTERNAL TABLE test_table ( device string, capacity string ) ROW FORMAT serde 'org.apache.hive.hcatalog.data.JsonSerDe' with serdeproperties ( 'paths'='device,Capacity(GB)') LOCATION 's3://xxx'; Si está utilizando JSON anidado , puede usar la propiedad de mapping de Serde (que vi en un problema con Hive Serde que trata estructuras anidadas ):
CREATE external TABLE test_table ( top string, inner struct<device:INT, capacity:INT> ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' with serdeproperties ( "mapping.capacity" = "Capacity(GB)" ) LOCATION 's3://xxx';Esto funciona muy bien con una entrada de:
{ "top" : "123", "inner": { "Capacity(GB)": 12, "device":2}}2. Subcarpetas
No puede utilizar comodines en la mitad de la ruta ( s3://location_name/*/*/*/appstring/ ). La opción más cercana es usar datos particionados, pero eso requeriría un formato de nombre diferente para sus directorios.
3. Creación de tablas
No puede especificar sentencias WHERE como parte de la CREATE TABLE .
Si su objetivo es reducir los costos de datos, utilice datos particionados para reducir la cantidad de archivos escaneados o almacene en un formato basado en columnas como Parquet.
Para ver ejemplos, consulte: Análisis de datos en S3 con Amazon Athena