如何在Apache Spark中连接到Amazon Redshift或其他数据库?

Eva*_*mir 3 amazon-s3 amazon-web-services amazon-redshift apache-spark

我正在尝试通过Spark连接到Amazon Redshift,因此我可以将S3上的数据与RS集群上的数据连接起来。我在这里找到了一些非常简明的文档来说明与JDBC的连接能力:

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

load命令似乎非常简单(尽管我不知道如何在此处输入AWS凭证,也许在选项中?)。

df = sqlContext.load(source="jdbc", url="jdbc:postgresql:dbserver", dbtable="schema.tablename")
Run Code Online (Sandbox Code Playgroud)

而且我不完全确定如何处理SPARK_CLASSPATH变量。我现在正在通过iPython笔记本在本地运行Spark(作为Spark发行版的一部分)。我在哪里定义以便Spark加载它?

无论如何,就目前而言,当我尝试运行这些命令时,我遇到了一堆无法辨认的错误,所以现在我有点卡住了。任何帮助或指向详细教程的指针,均表示赞赏。

Eva*_*mir 6

事实证明,您只需要一个用户名/密码即可访问 Spark 中的 Redshift,具体操作如下(使用 Python API):

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

希望这对某人有帮助!


Sum*_*mit 5

尽管这似乎是一个很老的帖子,但是仍然需要答案的任何人都可以按照以下步骤为我工作!

启动外壳,包括罐子。

bin/pyspark --driver-class-path /path_to_postgresql-42.1.4.jar --jars /path_to_postgresql-42.1.4.jar
Run Code Online (Sandbox Code Playgroud)

通过提供适当的详细信息来创建df:

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()
Run Code Online (Sandbox Code Playgroud)

Spark版本:2.2

  • 我已经尝试过上述解决方案,但由于找不到驱动程序而失败。有特殊的 postgresql 驱动程序吗?我正在使用42.2.5。 (2认同)

Mak*_*sud 2

您首先需要下载 Postgres JDBC 驱动程序。您可以在这里找到它: https: //jdbc.postgresql.org/

您可以在.bashrc、conf/spark-env.sh 或类似文件中定义环境变量 SPARK_CLASSPATH,或者在运行 IPython 笔记本之前在脚本中指定它。

您还可以通过以下方式在conf/spark-defaults.conf中定义它:

spark.driver.extraClassPath  /path/to/file/postgresql-9.4-1201.jdbc41.jar
Run Code Online (Sandbox Code Playgroud)

确保它反映在 Spark WebUI 的“环境”选项卡中。

您还需要通过以下方式设置适当的 AWS 凭证:

sparkContext.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", "***")
sparkContext.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", "***")
Run Code Online (Sandbox Code Playgroud)

  • 保持 SparkContext 不可变通常是个好主意,因此在创建 SparkContext 时传递所有配置。然而,在 Ipython 笔记本中,您可能想要更改它,因为 sc 已经为您创建了。在这种情况下,您可以通过`sc._jsc`访问sc的java方法。华泰 (2认同)