我正在运行一个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-submit上运行extra 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

10-01 04:46
查看更多