2

我在 Python Notebook 中有一个项目代码,当 Spark 托管在 Bluemix 中时,它运行良好。

我们正在运行以下代码来连接到在 Bluemix 中运行良好的 Netezza(本地)。

VT =  sqlContext.read.format('jdbc').options(url='jdbc:netezza://169.54.xxx.x:xxxx/BACC_PRD_ISCNZ_GAPNZ',user='XXXXXX', password='XXXXXXX', dbtable='GRACE.CDVT_LIVE_SPARK', driver='org.netezza.Driver').load()' 

但是,在迁移到 DatascienceExperience 后,我们收到以下错误。我已经建立了安全网关并且一切正常,但是这段代码没有运行。我认为问题出在 Netezza 驱动程序上。如果是这种情况,有没有一种方法可以显式导入类/驱动程序,以便执行上述代码。请帮助我们如何解决这个问题。

Error Message:


/usr/local/src/spark20master/spark/python/pyspark/sql/utils.py in  deco(*a, **kw)
61     def deco(*a, **kw):
62         try:
---> 63             return f(*a, **kw)
64         except py4j.protocol.Py4JJavaError as e:
65             s = e.java_exception.toString()

/usr/local/src/spark20master/spark/python/lib/py4j-0.10.3-src.zip /py4j/protocol.py in get_return_value(answer, gateway_client, target_id, name)
317                 raise Py4JJavaError(
318                     "An error occurred while calling {0}{1} {2}.\n".
--> 319                     format(target_id, ".", name), value)
320             else:
321                 raise Py4JError(

Py4JJavaError: An error occurred while calling o212.load.
: java.lang.ClassNotFoundException: org.netezza.driver
at java.net.URLClassLoader.findClass(URLClassLoader.java:607)
at java.lang.ClassLoader.loadClassHelper(ClassLoader.java:844)
at java.lang.ClassLoader.loadClass(ClassLoader.java:823)
at java.lang.ClassLoader.loadClass(ClassLoader.java:803)
at  org.apache.spark.sql.execution.datasources.jdbc.DriverRegistry$.register(DriverRegistry.scala:38)
at    org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$createC    onnectionFactory$1.apply(JdbcUtils.scala:49)
at  org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$createC    onnectionFactory$1.apply(JdbcUtils.scala:49)
at scala.Option.foreach(Option.scala:257)
4

3 回答 3

1

您可以通过添加带有感叹号的单元格来安装 jar 文件,该单元格运行 unix 工具来下载文件,在此示例中为 wget:

!wget https://some.public.host/yourfile.jar -P  ${HOME}/data/libs

下载文件后,您需要重新启动内核。

请注意,此方法假定您的 jar 文件在 Internet 上公开可用。

于 2017-01-21T00:05:32.327 回答
0

还有另一种使用摄取连接器连接到 Netezza 的方法,该连接器在 DSX 中默认启用。

http://datascience.ibm.com/docs/content/analyze-data/python_load.html

from ingest import Connectors

from pyspark.sql import SQLContext

sqlContext = SQLContext(sc)

NetezzaloadOptions = { 
                 Connectors.Netezza.HOST              : 'hostorip',
                 Connectors.Netezza.PORT              : 'port',
                 Connectors.Netezza.DATABASE          : 'databasename',
                 Connectors.Netezza.USERNAME          : 'xxxxx',
                 Connectors.Netezza.PASSWORD          : 'xxxx',
                 Connectors.Netezza.SOURCE_TABLE_NAME         : 'tablename'}

NetezzaDF = sqlContext.read.format("com.ibm.spark.discover").options(**NetezzaloadOptions).load()

NetezzaDF.printSchema()

NetezzaDF.show()

谢谢,

查尔斯。

于 2017-04-18T21:00:25.013 回答
0

Bluemix 中的笔记本和 DSX(数据科学体验)中的笔记本目前使用相同的后端,因此它们可以访问相同的预安装驱动程序。Netezza 不在其中。正如 Chris Snow 所指出的,用户可以将额外的 JAR 和 Python 包安装到他们的服务实例中。

您可能为 DSX 创建了一个新服务实例,但尚未安装旧的用户 JAR 和包。这是一次性设置,因此当您使用同一个实例一段时间后很容易忘记。在 Bluemix 上旧实例的 Python 笔记本中执行以下命令,以检查用户安装的内容:

!ls -lF ~/data/libs
!pip freeze

然后将缺少的东西安装到 DSX 上的新实例中。

于 2017-01-23T08:16:58.473 回答