Netezza与Spark / Scala JDBC的连接

时间:2017-07-27 20:38:11

标签: scala apache-spark jdbc netezza

我在IntelliJ IDE上使用Scala 2.11.8在我的Windows机器上设置了Spark 2.2.0。我试图使用JDBC驱动程序使Spark连接到Netezza。

我已阅读this link并通过Maven将com.ibm.spark.netezza罐子添加到我的项目中。我尝试运行下面的Scala脚本来测试连接:

package jdbc
object SimpleScalaSpark {
  def main(args: Array[String]) {
    import org.apache.spark.sql.{SparkSession, SQLContext}
    import com.ibm.spark.netezza

    val spark = SparkSession.builder
      .master("local")
      .appName("SimpleScalaSpark")
      .getOrCreate()

    val sqlContext = SparkSession.builder()
      .appName("SimpleScalaSpark")
      .master("local")
      .getOrCreate()

val nzoptions = Map("url" -> "jdbc:netezza://SERVER:5480/DATABASE",
  "user" -> "USER",
  "password" -> "PASSWORD",
  "dbtable" -> "ADMIN.TABLENAME")

val df = sqlContext.read.format("com.ibm.spark.netezza").options(nzoptions).load()
  }
}

但是我收到以下错误:

17/07/27 16:28:17 ERROR NetezzaJdbcUtils$: Couldn't find class org.netezza.Driver
java.lang.ClassNotFoundException: org.netezza.Driver
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.apache.spark.sql.execution.datasources.jdbc.DriverRegistry$.register(DriverRegistry.scala:38)
    at com.ibm.spark.netezza.NetezzaJdbcUtils$$anonfun$getConnector$1.apply(NetezzaJdbcUtils.scala:49)
    at com.ibm.spark.netezza.NetezzaJdbcUtils$$anonfun$getConnector$1.apply(NetezzaJdbcUtils.scala:46)
    at com.ibm.spark.netezza.DefaultSource.createRelation(DefaultSource.scala:50)
    at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:306)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:178)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:146)
    at jdbc.SimpleScalaSpark$.main(SimpleScalaSpark.scala:20)
    at jdbc.SimpleScalaSpark.main(SimpleScalaSpark.scala)
Exception in thread "main" java.sql.SQLException: No suitable driver found for jdbc:netezza://SERVER:5480/DATABASE
    at java.sql.DriverManager.getConnection(DriverManager.java:689)
    at java.sql.DriverManager.getConnection(DriverManager.java:208)
    at com.ibm.spark.netezza.NetezzaJdbcUtils$$anonfun$getConnector$1.apply(NetezzaJdbcUtils.scala:54)
    at com.ibm.spark.netezza.NetezzaJdbcUtils$$anonfun$getConnector$1.apply(NetezzaJdbcUtils.scala:46)
    at com.ibm.spark.netezza.DefaultSource.createRelation(DefaultSource.scala:50)
    at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:306)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:178)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:146)
    at jdbc.SimpleScalaSpark$.main(SimpleScalaSpark.scala:20)
    at jdbc.SimpleScalaSpark.main(SimpleScalaSpark.scala)

我有两个想法:

1)我不相信我实际上安装了任何Netezza JDBC驱动程序,尽管我认为从上面的链接进入我的项目的罐子就足够了。我只是错过了一个驱动程序,或者我在Scala脚本中遗漏了什么?

2)在同一个链接中,作者提到了启动Netezza Spark软件包:

  

例如,将Spark Netezza包与Spark的交互使用   shell,启动它如下所示:

     

$ SPARK_HOME / bin / spark-shell -packages   com.ibm.SparkTC:火花netezza_2.10:0.1.1   -driver级路径〜/ nzjdbc.jar

我不相信我会在我的脚本中调用jdbc以外的任何包。我是否必须将其添加到我的脚本中?

谢谢!

1 个答案:

答案 0 :(得分:1)

我认为你的第一个想法是正确的。如果你还没有这样做,你几乎肯定需要安装Netezza JDBC驱动程序。

从您发布的链接:

  

此软件包可以作为应用程序的一部分或从中部署   Spark工具,如spark-shell,spark-sql。要在包中使用   应用程序,您必须在应用程序的构建中指定它   依赖。使用Spark工具时,请使用添加包   -packages命令行选项。 Netezza JDBC驱动程序也应如此   添加到应用程序依赖项

Netezza驱动程序是您必须自己下载的,并且您需要支持权限才能访问它(通过IBM的Fix Central或Passport Advantage)。它包含在Windows驱动程序/客户端支持包或Linux驱动程序包中。