spark glue aws amazon-web-services amazon-s3 apache-spark amazon-redshift

amazon web services - glue - ¿Cómo conectarse a Amazon Redshift u otras bases de datos en Apache Spark?



aws glue rds (4)

Estoy intentando conectarme a Amazon Redshift a través de Spark, así puedo unir los datos que tenemos en S3 con los datos en nuestro clúster de RS. Encontré aquí una documentación muy espartana para la capacidad de conectarse a JDBC:

https://spark.apache.org/docs/1.3.1/sql-programming-guide.html#jdbc-to-other-databases

El comando de carga parece bastante sencillo (aunque no sé cómo ingresaría las credenciales de AWS aquí, ¿tal vez en las opciones?).

df = sqlContext.load(source="jdbc", url="jdbc:postgresql:dbserver", dbtable="schema.tablename")

Y no estoy del todo seguro de cómo lidiar con la variable SPARK_CLASSPATH. Estoy ejecutando Spark localmente por ahora a través de un portátil iPython (como parte de la distribución Spark). ¿Dónde lo defino para que Spark lo cargue?

De todos modos, por ahora, cuando intento ejecutar estos comandos, recibo un montón de errores indescifrables, así que estoy algo atrapado por ahora. Cualquier ayuda o consejos para tutoriales detallados son apreciados.


Primero necesita descargar el controlador JDBC de Postgres. Puede encontrarlo aquí: https://jdbc.postgresql.org/

Puede definir su variable de entorno SPARK_CLASSPATH en .bashrc , conf / spark-env.sh o un archivo similar o especificarlo en el script antes de ejecutar su cuaderno IPython.

También puede definirlo en su conf / spark-defaults.conf de la siguiente manera:

spark.driver.extraClassPath /path/to/file/postgresql-9.4-1201.jdbc41.jar

Asegúrese de que se refleje en la pestaña Entorno de su Spark WebUI.

También deberá configurar las credenciales de AWS adecuadas de la siguiente manera:

sparkContext.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", "***") sparkContext.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", "***")


Resulta que solo necesitas un nombre de usuario / pwd para acceder a Redshift en Spark, y se hace de la siguiente manera (usando la API de Python):

from pyspark.sql import SQLContext sqlContext = SQLContext(sc) df = sqlContext.load(source="jdbc", url="jdbc:postgresql://host:port/dbserver?user=yourusername&password=secret", dbtable="schema.table")

¡Espero que esto ayude a alguien!


Si está utilizando Spark 1.4.0 o una versión más nueva, consulte spark-redshift , una biblioteca que permite cargar datos de Redshift en Spark SQL DataFrames y guardar DataFrames en Redshift. Si está consultando grandes volúmenes de datos, este enfoque debería funcionar mejor que JDBC porque podrá descargar y consultar los datos en paralelo.

Si aún desea utilizar JDBC, consulte la nueva fuente de datos JDBC incorporada en Spark 1.4+.

Divulgación: soy uno de los autores de spark-redshift .


Aunque esta parece ser una publicación muy antigua, cualquiera que esté buscando respuesta, los siguientes pasos me funcionaron.

Inicie el shell incluyendo el jar.

bin/pyspark --driver-class-path /path_to_postgresql-42.1.4.jar --jars /path_to_postgresql-42.1.4.jar

Crea un df dando detalles apropiados:

myDF = spark.read / .format("jdbc") / .option("url", "jdbc:redshift://host:port/db_name") / .option("dbtable", "table_name") / .option("user", "user_name") / .option("password", "password") / .load()

Versión de Spark: 2.2