Amazon Redshift: copia de datos entre bases de datos
Estoy buscando copiar datos dentro de bases de datos en Amazon Redshift. Antes de esto, estaba copiando datos de una base de datos Redshift a un PostgreSQL alojado en una instancia EC2 con fines analíticos. Tenía un script Ruby que lo haría usando dblink EXTENSION.
Pero ahora, dado que los datos no se pueden administrar en la instancia de PostgreSQL, hemos decidido copiar los datos a una base de datos separada, en el mismo clúster de Redshift.
¡Bulto! Lo que encontré fue que dblink no está disponible para Postgre 8.0 (versión Redshift). ¿Hay alguna manera de que esto funcione en Redshift?
No quiero usar el comando Copiar y agregar una capa de S3 en el medio o incluso una canalización de datos. Verá, es el mismo clúster, solo que bases de datos diferentes.
En caso de que no haya otra manera, debo usar la canalización de datos o Copiar a S3 y luego volver a Redshift. ¿O al final es esencialmente lo mismo?
PD: Cualquier ayuda/pista sería apreciada. Haría mi trabajo duro. Sólo necesito un aviso.
Esto ahora parece posible (desde el 3 de junio de 2016)
Consulte: https://blogs.aws.amazon.com/bigdata/post/Tx1GQ6WLEWVJ1OX/JOIN-Amazon-Redshift-AND-Amazon-RDS-PostgreSQL-WITH-dblink
En el artículo anterior, dan un ejemplo para copiar desde el corrimiento al rojo a otra base de datos:
Anotaré con (grupo de postgres) y (grupo de desplazamiento al rojo) para mayor claridad.
Copiar datos de Amazon Redshift a RDS PostgreSQL
El SQL para crear la tabla: (clúster de postgres)
CREATE TABLE sales_summary (
saletime timestamp,
sellerid int,
sales decimal
);
[...]
La siguiente consulta muestra cómo insertar datos en las tablas usando la función dblink:
la copia es de (clúster de desplazamiento al rojo) a (clúster de postgres)
INSERT INTO sales_summary
SELECT *
FROM dblink('foreign_server',$REDSHIFT$
SELECT date_trunc('hours', saletime) AS ts, sellerid, sum(pricepaid) sales
FROM sales
WHERE saletime >= '2008-01-01'
AND saletime < '2008-02-01'
GROUP BY ts, sellerid
ORDER BY sales
$REDSHIFT$) AS t1 (saletime timestamp, sellerid int, sales decimal);
Editar: he usado esto en producción para cargar tablas con muchos millones de filas diariamente y no he tenido ningún problema relacionado con esto. Por lo tanto, lo recomendaría como el método preferido para cargar desde Redshift a RDS-postgres (a diferencia de COPIAR, o peor aún, cargar los datos en la memoria con un ORM)
No hay forma de acceder a la tabla desde dos bases de datos diferentes al mismo tiempo durante la consulta.
Debe descargar datos de una base de datos usando el comando de descarga en s3 y luego cargar la nueva tabla de la base de datos usando comandos de copia.