从 Redshift 读取到 Spark Dataframe(Spark-Redshift 模块)

Posted

技术标签:

【中文标题】从 Redshift 读取到 Spark Dataframe(Spark-Redshift 模块)【英文标题】:Reading from Redshift into Spark Dataframe (Spark-Redshift Module) 【发布时间】:2018-11-20 19:47:48 【问题描述】:

我正在按照 spark-redshift 教程从 redshift 读取到 spark(databricks)。我有以下代码:

val tempDir = "s3n://my-s3-bucket-here"



val jdbcUsername = "usernameExample"
val jdbcPassword = "samplePassword"
val jdbcHostname = "redshift.companyname.xyz"
val jdbcPort = 9293
val jdbcDatabase = "database"
val jdbcUrl = "sampleURL"


sc.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", "SAMPLEAWSKEY")
sc.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", "SECRETKEYHERE")

val subs_dim = sqlContext.read.format("com.databricks.spark.redshift").option("url", jdbcUrl).option("tempdir", tempDir).option("dbtable", "example.exampledb").load()

现在,当我尝试运行它时,我得到:

java.lang.IllegalArgumentException: requirement failed: You must specify a method for authenticating Redshift's connection to S3 (aws_iam_role, forward_spark_s3_credentials, or temporary_aws_*. For a discussion of the differences between these options, please see the README.

我有点困惑,因为我使用 sc.hadoopConfiguration.set 定义了 awsAccesskeyID。我是公司的新人,所以我想知道 AWS 密钥是否错误,或者我是否遗漏了其他内容?

谢谢!

【问题讨论】:

您阅读自述文件了吗?它有什么亮点吗? 是的,我检查过了,它说要设置 AWS 凭证...我做了吗? 【参考方案1】:

我认为我看到的唯一原因是,它没有将 S3 凭据传递给 Redshift 连接,因为您尚未设置 forward_spark_s3_credentials

在您的通话中添加以下选项。

option("forward_spark_s3_credentials", "true");

参考下面documentationsn-p。

将 Spark 的 S3 凭据转发到 Redshift:如果 forward_spark_s3_credentials 选项设置为 true,则此库将自动发现 Spark 用于连接到 S3 的凭据,并将这些凭据通过 JDBC 转发到 Redshift。

希望对你有帮助!

【讨论】:

以上是关于从 Redshift 读取到 Spark Dataframe(Spark-Redshift 模块)的主要内容,如果未能解决你的问题,请参考以下文章

使用 spark(py)从 amazon redshift 读取数据时出错请求存储桶位置时必须指定存储桶名称参数

由于 Databricks 不公开支持 spark-redshift lib,使用 Scala spark 从 Redshift 读取/写入 Redshift 的最佳方法是啥

将数据从我的 spark 代码发送到 redshift

Spark Redshift:使用火花读取红移表时出错

无法从火花连接到红移

从 Spark 连接到 Redshift 时无法推断架构