unload redshift maxfilesize mysql amazon-web-services amazon-redshift

mysql - maxfilesize - ¿Cómo descargar una tabla en RedShift a un único archivo CSV?



unload redshift (5)

Es un poco una solución alternativa, pero debe hacer que su consulta sea una subconsulta e incluir un límite. Entonces saldrá a un archivo. P.ej

select * from (select * from bizdata LIMIT 2147483647);

Así que básicamente estás seleccionando todo de un conjunto limitado. Esa es la única forma en que funciona. 2147483647 es su límite máximo, ya que una cláusula de límite toma un argumento entero sin signo.

Así que lo siguiente se descargará a un archivo:

unload('' select * from ( select bizid, data from biztable limit 2147483647); '') to ''s3://.......'' CREDENTIALS ''aws_access_key_id=<<aws_access_key_id>>;aws_secret_access_key=<<aws_secret_access_key>>'' csv ;

Quiero migrar una tabla de Amazon RedShift a MySQL, pero usar "descargar" generará múltiples archivos de datos que son difíciles de importar directamente a MySQL.

¿Hay algún método para descargar la tabla en un solo archivo CSV para que pueda importarla directamente a MySQL?


Esta es una pregunta antigua en este momento, pero creo que todas las respuestas existentes son un poco engañosas. Si su pregunta es, "¿Puedo garantizar al 100% que Redshift SIEMPRE se descargará en un archivo SINGLE en S3?", La respuesta es simplemente NO .

Dicho esto, en la mayoría de los casos, generalmente puede limitar su consulta de tal manera que terminará con un solo archivo. Según la documentación ( docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html ), el factor principal para limitar la cantidad de archivos que genera es el tamaño real sin procesar en bytes de su exportación ( NO el número de filas). El límite en el tamaño de un archivo de salida generado por el comando UNOAD de Redshift es de 6.2GB.

Entonces, si desea intentar garantizar que obtiene un solo archivo de salida de UNLOAD , esto es lo que debe intentar:

  • Especifique PARALLEL OFF . Paralelo está "ENCENDIDO" de manera predeterminada y generalmente escribirá en varios archivos a menos que tenga un grupo pequeño (el número de archivos de salida con el conjunto "PARALELO ENCENDIDO" es proporcional al número de segmentos en su grupo). PARALLEL OFF escribirá los archivos en serie en S3 en lugar de en paralelo y solo se extenderá al uso de múltiples archivos si excede el límite de tamaño.
  • Limita el tamaño de tu salida. El tamaño sin procesar de los datos debe ser inferior a 6,2 GB si desea un solo archivo. Por lo tanto, debe hacer que su consulta tenga una cláusula WHERE más restrictiva o usar una cláusula LIMIT para mantener el número de registros bajo. Desafortunadamente, ninguna de estas técnicas es perfecta, ya que las filas pueden ser de tamaño variable. Tampoco me queda claro si la opción GZIP afecta o no al límite de desbordamiento del tamaño del archivo de salida (no está claro si 6.2GB es el límite de tamaño pre-GZIP o el límite de tamaño post-GZIP).

Para mí, el comando UNLOAD que terminó generando un solo archivo CSV en la mayoría de los casos fue:

UNLOAD (''SELECT <fields> FROM <table> WHERE <restrict_query>'') TO ''s3://<bucket_name>/<filename_prefix>'' CREDENTIALS ''aws_access_key_id=<access_key>;aws_secret_access_key=<secret_key>'' DELIMITER AS '','' ADDQUOTES NULL AS '''' PARALLEL OFF;

El otro efecto secundario agradable de PARALLEL OFF es que respetará su cláusula ORDER BY si tiene una y genera los archivos en un orden que mantiene todos los registros ordenados, incluso a través de múltiples archivos de salida.

Addendum: Parece que hay un cierto conocimiento folclórico sobre el uso de LIMIT 2147483647 para forzar al nodo líder a realizar todo el procesamiento y generar un solo archivo de salida, pero esto no parece estar documentado en ningún lugar en la documentación de Redshift y, como tal, depende Parece una mala idea ya que podría cambiar en cualquier momento.


No {Puede usar un manifiesto y decirle a Redshift que dirija todos los resultados a un solo archivo. } La respuesta anterior fue incorrecta, había usado manifiestos para cargar pero no para descargar.

Parece que hay 2 formas posibles de obtener un solo archivo:

  1. Más fácil: Envuelva una consulta SELECT ... LIMIT alrededor de su consulta de salida real, según esta respuesta SO, pero esto está limitado a ~ 2 mil millones de filas.
  2. Más difícil: use la utilidad cat Unix para unir los archivos cat File1.txt File2.txt > union.txt . Esto requerirá que descargues los archivos de S3 primero.

No hay manera de obligar a Redshift a generar solo un único archivo de salida, seguro.

Bajo una DESCARGA estándar, tendrá archivos de salida creados equivalentes a la cantidad de segmentos del sistema, es decir, un sistema con 8 segmentos creará 8 archivos para un solo comando de descarga (este es el método más rápido para descargar).

Si agrega una cláusula PARALELO APAGADO en el comando de descarga, su salida se creará como un solo archivo, hasta el momento en que la extracción de datos no supere los 6.25 GB, luego Redshift dividirá automáticamente el archivo en una nueva porción .

Lo mismo es válido si también produce archivos de salida comprimidos (por supuesto, tendrá más posibilidades de producir un solo archivo de salida, teniendo en cuenta que su archivo puede alojar más registros).


Para enviar a un solo archivo usar el paralelo apagado

unload (''select * from venue'') to ''s3://mybucket/tickit/unload/venue_'' credentials ''aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>'' parallel off;

También recomiendo usar Gzip, para hacer ese archivo aún más pequeño para descargar.

unload (''select * from venue'') to ''s3://mybucket/tickit/unload/venue_'' credentials ''aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>'' parallel off gzip;