apache-spark - 如何在 Amazon EMR 集群上使用 Spark 连接到 redshift 数据

标签 apache-spark amazon-redshift

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

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

它给了我
RedshiftJDBC41-1.2.7.1003.jar
RedshiftJDBC42-1.2.7.1003.jar

现在,我想用这个 jar连接到我的 Redshift database在我的 spark-shell .这是我所做的 -
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可用但我不想运行 spark-submitextra JARS .

如何从 Spark-shell 连接到 redshift 数据?这是在 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 的 Databricks Redshift 数据源 - https://github.com/databricks/spark-redshift .

关于apache-spark - 如何在 Amazon EMR 集群上使用 Spark 连接到 redshift 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52284110/

相关文章:

java.lang.ClassNotFoundException : org. openx.data.jsonserde.JsonSerDe 错误

sql - Postgres 中的时间序列

amazon-web-services - 为什么我无法从笔记本电脑连接到 AWS Redshift Serverless 集群?

java - 如何对 Spark 数据集进行嵌套迭代并删除元素

hadoop - Spark 单个记录查找的性能

hadoop - 如何将数据和元数据从 Hive 传输到 RDBMS

apache-spark - 用 pyspark 用以前已知的好值填充 null

GoLang 复制命令准备好的语句不工作

sql - 仅过滤 varchar 字段中的整数/数字值

json - 如何使用 Redshift 从 JSON 数组列获取值?