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

Posted

技术标签:

【中文标题】从 Spark 连接到 Redshift 时无法推断架构【英文标题】:Unable to infer schema when connecting to Redshift from Spark 【发布时间】:2017-09-08 10:55:54 【问题描述】:

我已将 sparc 安装到 /opt/spark-2.2.0-bin-hadoop2.7/ 并使用运行 python shell

pyspark --jars spark-redshift_2.10-3.0.0-preview1.jar,RedshiftJDBC42-1.2.7.1003.jar,hadoop-aws-2.7.1.jar,aws-java-sdk-1.7.4.jar

从它的文件夹中。

然后我尝试在 shell 中使用以下命令从那里读取:

JDBC='jdbc:redshift://blablabla.regionblabla.redshift.amazonaws.com:5439/blabla?user=username&password=password'

from pyspark.sql import SQLContext
sql_context = SQLContext(sc)

df = sql_context.read \
    .option("url", JDBC) \
    .option("dbtable", "table_name") \
    .option("tempdir", "bucket") \
    .load()

我得到以下回溯:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
  File "/opt/spark-2.2.0-bin-hadoop2.7/python/pyspark/sql/readwriter.py", line 165, in load
    return self._df(self._jreader.load())
  File "/opt/spark-2.2.0-bin-hadoop2.7/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py", line 1133, in __call__
  File "/opt/spark-2.2.0-bin-hadoop2.7/python/pyspark/sql/utils.py", line 69, in deco
    raise AnalysisException(s.split(': ', 1)[1], stackTrace)
pyspark.sql.utils.AnalysisException: u'Unable to infer schema for Parquet. It must be specified manually.;'

经过一番搜索,我发现了一些问题和答案,表明这可能是因为那里没有数据。但是请求告诉我该表不是空的。所以,我想我的连接有一些问题。如何解决这个问题?也许我有错误版本的火花或罐子,或者缺少一些罐子?

【问题讨论】:

【参考方案1】:

原来我需要使用添加 AWS 凭证

sc._jsc.hadoopConfiguration().set("fs.s3.awsAccessKeyId", KEYS[0])
sc._jsc.hadoopConfiguration().set("fs.s3.awsSecretAccessKey", KEYS[1])

并添加选项以向 redshift 提供相同的凭据:

.option('forward_spark_s3_credentials', 'true')

【讨论】:

以上是关于从 Spark 连接到 Redshift 时无法推断架构的主要内容,如果未能解决你的问题,请参考以下文章

如何从本地安装的 spark 连接到 aws-redshift?

无法从 lambda 中的 python 连接到 aws redshift

Lambda 函数无法连接到 Redshift:名称解析暂时失败

尝试使用 node-redshift 从节点连接到 redshift 时超时

使用 Psycopg2 将 Spark DataFrame 写入 Redshift 时出错:无法腌制 psycopg2.extensions.cursor 对象

从 Rackspace 连接到 Redshift