如何在 Amazon EMR 集群上使用 Spark 连接到红移数据



我正在运行一个 Amazon EMR 集群。如果我这样做

ls -l /usr/share/aws/redshift/jdbc/

它给了我

RedshiftJDBC41-1.2.7.1003.jar
RedshiftJDBC42-1.2.7.1003.jar

现在,我想使用此jar连接到我的spark-shell中的Redshift database。这是我所做的——

import org.apache.spark.sql._
val sqlContext = new SQLContext(sc)

val df : DataFrame = sqlContext.read
.option("url","jdbc:redshift://host:PORT/DB-name?user=user&password=password")
.option("dbtable","tablename")
.load()

我收到此错误 -

org.apache.spark.sql.AnalysisException: Unable to infer schema for Parquet. It must be specified manually.;

我不确定在读取数据时是否指定了正确的format。我也读过spark-redshift driver可用,但我不想用extra JARS运行spark-submit.

如何从 Spark-shell 连接到红移数据?这是在 Spark 中配置连接的正确 JAR 吗?

生成的错误是因为您在读取中缺少.format("jdbc")。它应该是:

val df : DataFrame = sqlContext.read
.format("jdbc")
.option("url","jdbc:redshift://host:PORT/DB-name?user=user&password=password")
.option("dbtable","tablename")
.load()

默认情况下,Spark假定源是Parquet文件,因此在错误中提到了Parquet。

您可能仍会遇到类路径/查找驱动程序的问题,但此更改应为您提供更有用的错误输出。我假设您列出的文件夹位置位于 EMR 上 Spark 的类路径中,并且这些驱动程序版本看起来相当最新。这些驱动程序应该可以工作。

请注意,这仅适用于从 Redshift 读取。如果您需要写入 Redshift,最好的选择是使用 Spark - https://github.com/databricks/spark-redshift 的 Databricks Redshift 数据源。

最新更新