PySpark 会话中缺少 java.util.HashMap

Posted

技术标签:

【中文标题】PySpark 会话中缺少 java.util.HashMap【英文标题】:java.util.HashMap missing in PySpark session 【发布时间】:2015-10-03 17:47:18 【问题描述】:

我在 Windows 7 x64 上使用 Apache Spark 1.4.0,在 IPython 3.2.0 中使用 Java 1.8.0_45 x64 和 Python 2.7.10 x86

我正在尝试在 IPython 笔记本中编写一个基于 DataFrame 的程序,该程序从 SQL Server 数据库读取和写入数据。

到目前为止我可以从数据库中读取数据

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df = sqlContext.load(source="jdbc",url="jdbc:sqlserver://serverURL", dbtable="dbName.tableName", driver="com.microsoft.sqlserver.jdbc.SQLServerDriver", user="userName", password="password")

并将数据转换为 Panda 并做任何我想做的事情。 (这有点麻烦,但是在 spark-defaults.conf 中将微软的 sqljdbc42.jar 添加到 spark.driver.extraClassPath 之后就可以了)

当我用DataFrameWriter API将数据写回SQL Server时出现了当前问题:

df.write.jdbc("jdbc:sqlserver://serverURL", "dbName.SparkTestTable1", dict(driver="com.microsoft.sqlserver.jdbc.SQLServerDriver", user="userName", password="password"))

---------------------------------------------------------------------------
Py4JError                                 Traceback (most recent call last)
<ipython-input-19-8502a3e85b1e> in <module>()
----> 1 df.write.jdbc("jdbc:sqlserver://jdbc:sqlserver", "dbName.SparkTestTable1", dict(driver="com.microsoft.sqlserver.jdbc.SQLServerDriver", user="userName", password="password"))

C:\Users\User\Downloads\spark-1.4.0-bin-hadoop2.6\python\pyspark\sql\readwriter.pyc in jdbc(self, url, table, mode, properties)
    394         for k in properties:
    395             jprop.setProperty(k, properties[k])
--> 396         self._jwrite.mode(mode).jdbc(url, table, jprop)
    397 
    398 

C:\Python27\lib\site-packages\py4j\java_gateway.pyc in __call__(self, *args)
    536         answer = self.gateway_client.send_command(command)
    537         return_value = get_return_value(answer, self.gateway_client,
--> 538                 self.target_id, self.name)
    539 
    540         for temp_arg in temp_args:

C:\Python27\lib\site-packages\py4j\protocol.pyc in get_return_value(answer, gateway_client, target_id, name)
    302                 raise Py4JError(
    303                     'An error occurred while calling 012. Trace:\n3\n'.
--> 304                     format(target_id, '.', name, value))
    305         else:
    306             raise Py4JError(

Py4JError: An error occurred while calling o49.mode. Trace:
py4j.Py4JException: Method mode([class java.util.HashMap]) does not exist
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:333)
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:342)
    at py4j.Gateway.invoke(Gateway.java:252)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:207)
    at java.lang.Thread.run(Unknown Source)

问题似乎是 py4j 在将我的 connectionProperties 字典转换为 JVM 对象时找不到 Java java.util.HashMap 类。将我的 rt.jar(带路径)添加到 spark.driver.extraClassPath 并不能解决问题。从写入命令中删除字典可以避免此错误,但写入失败当然是由于缺少驱动程序和身份验证。

编辑:错误的o49.mode 部分会随着运行而变化。

【问题讨论】:

看这个问题似乎 Py4J 并不总是给出准确的错误:) mail-archives.apache.org/mod_mbox/spark-user/201507.mbox/… dbName.SparkTestTable1 是否已经存在?如果 PySpark 存在,默认情况下会引发错误。 spark.apache.org/docs/latest/…你能不能尝试改变模式mode="overwrite" @jay 表不存在;该程序的目的是从一个表中读取数据并将其写入新表,只是为了证明我可以在继续执行更复杂的程序之前执行 SQL Server DataFrame IO。将行的开头更改为 df.write.mode("overwrite").jdbc("jdbc:sqlserver:// 不会更改错误。 【参考方案1】:

Spark 用户邮件列表found the problem 上的 Davies Liu。我错过的Scala 和Python API 之间存在细微差别。您必须传入模式字符串(例如“overwrite”)作为 Python API 中的第三个参数,而不是 Scala API。如下更改语句可解决此问题:

df.write.jdbc("jdbc:sqlserver://serverURL", "dbName.SparkTestTable1", "overwrite", dict(driver="com.microsoft.sqlserver.jdbc.SQLServerDriver", user="userName", password="password"))

【讨论】:

以上是关于PySpark 会话中缺少 java.util.HashMap的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:first()缺少1个必需的位置参数:Pyspark中DecisionTree.trainClassifier中的'offset'

PySpark 缺少列名错误,Azure Synapse 分析笔记本中的数字列名

pyspark - kafka整合:缺少lib

即使在使用 PySpark 读取 .ORC 文件时明确指定,也缺少标题

Pyspark 自联接错误“缺少已解决的属性”

在 pySpark 上执行连接时“缺少已解决的属性”