5

我正在尝试 https://medium.com/spark-nlp/applying-context-aware-spell-checking-in-spark-nlp-3c29c46963bc 中提供的ContenxtAwareSpellChecker

管道中的第一个组件是DocumentAssembler

from sparknlp.annotator import *
from sparknlp.base import *
import sparknlp


spark = sparknlp.start()
documentAssembler = DocumentAssembler()\
    .setInputCol("text")\
    .setOutputCol("document")

上面的代码运行失败时如下

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\pab\AppData\Local\Continuum\anaconda3.7\envs\MailChecker\lib\site-packages\pyspark\__init__.py", line 110, in wrapper
    return func(self, **kwargs)
  File "C:\Users\pab\AppData\Local\Continuum\anaconda3.7\envs\MailChecker\lib\site-packages\sparknlp\base.py", line 148, in __init__
    super(DocumentAssembler, self).__init__(classname="com.johnsnowlabs.nlp.DocumentAssembler")
  File "C:\Users\pab\AppData\Local\Continuum\anaconda3.7\envs\MailChecker\lib\site-packages\pyspark\__init__.py", line 110, in wrapper
    return func(self, **kwargs)
  File "C:\Users\pab\AppData\Local\Continuum\anaconda3.7\envs\MailChecker\lib\site-packages\sparknlp\internal.py", line 72, in __init__
    self._java_obj = self._new_java_obj(classname, self.uid)
  File "C:\Users\pab\AppData\Local\Continuum\anaconda3.7\envs\MailChecker\lib\site-packages\pyspark\ml\wrapper.py", line 69, in _new_java_obj
    return java_obj(*java_args)
  File "C:\Users\pab\AppData\Local\Continuum\anaconda3.7\envs\MailChecker\lib\site-packages\pyspark\python\lib\py4j-0.10.9-src.zip\py4j\java_gateway.py", line 1569, in __call__
  File "C:\Users\pab\AppData\Local\Continuum\anaconda3.7\envs\MailChecker\lib\site-packages\pyspark\sql\utils.py", line 131, in deco
    return f(*a, **kw)
  File "C:\Users\pab\AppData\Local\Continuum\anaconda3.7\envs\MailChecker\lib\site-packages\pyspark\python\lib\py4j-0.10.9-src.zip\py4j\protocol.py", line 328, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling None.com.johnsnowlabs.nlp.DocumentAssembler.
: java.lang.NoClassDefFoundError: org/apache/spark/ml/util/MLWritable$class
        at com.johnsnowlabs.nlp.DocumentAssembler.<init>(DocumentAssembler.scala:16)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:247)
        at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
        at py4j.Gateway.invoke(Gateway.java:238)
        at py4j.commands.ConstructorCommand.invokeConstructor(ConstructorCommand.java:80)
        at py4j.commands.ConstructorCommand.execute(ConstructorCommand.java:69)
        at py4j.GatewayConnection.run(GatewayConnection.java:238)
        at java.lang.Thread.run(Thread.java:748)

编辑:Apache Spark 版本是 2.4.6

4

2 回答 2

2

从 spark 2.45 升级到 spark 3+ 时,我遇到了这个问题(尽管在 Databricks 上使用 Scala)。尝试降级您的 spark 版本。

于 2020-08-14T22:15:43.680 回答
2

MLReadableMLWritableApache Spark 中的错误总是与 Spark 主要版本的不匹配有关。(更准确地说,有些东西是用 2.11.x 之类的 Scala 版本编译/交付的,现在正在用于 2.12.x 之类的另一个版本中 - 就像您使用本应在 PySpark 3.x 中使用的 Spark NLP 人工制品时一样,但它是在 PySpark 2.4.x 中,反之亦然)

Spark NLP 支持 Apache Spark 的所有主要版本(取决于spark-nlp您使用的版本)。但截至今天,兼容性矩阵如下:

火花自然语言处理 Apache Spark 2.3.x Apache Spark 2.4.x Apache Spark 3.0.x Apache Spark 3.1.x
3.3.x 是的 是的 是的 是的
3.2.x 是的 是的 是的 是的
3.1.x 是的 是的 是的 是的
3.0.x 是的 是的 是的 是的
2.7.x 是的 是的
2.6.x 是的 是的
2.5.x 是的 是的
2.4.x 部分 是的
1.8.x 部分 是的
1.7.x 是的
1.6.x 是的
1.5.x 是的

正如您所见,自 Spark NLP 3.0.x 以来,所有主要的 Apache Spark 版本都受支持。主要版本,例如2.3.x(对于那些被困在旧 Hortonworks 中的人)、2.4.x(对于那些被困在 Cloudera 5.x/6.x 中的人)3.0.x、和3.1.x(在 Databricks、EMR 和任何其他提供新 Spark/ 的地方) PySpark 版本)。

因此,您无需降级/升级(如果可以的话,这很酷!)您的 Apache Spark/PySpark 即可使用任何高于 3.0.x 的 Spark NLP 版本。这里的关键是找到正确的 Maven 包以包含在您的 SparkSession 中。

手动创建 SparkSession

例如,如果你想使用 Spark NLP3.3.4版本:

  • 在 Spark/PySpark 3.0.x/3.1.x 中:com.johnsnowlabs.nlp:spark-nlp_2.12:3.3.4
  • 在 Spark/PySpark 2.4.x 中:com.johnsnowlabs.nlp:spark-nlp-spark24_2.11:3.3.4
  • 在 Spark/PySpark 2.3.x 中:com.johnsnowlabs.nlp:spark-nlp-spark23_2.11:3.3.4

实际名称发生了变化,默认是spark-nlp_2.12PySpark 3.0.x 和 3.1.x,但对于 PySpark 2.4.x 来说,spark-nlp-spark24_2.11它是基于 Scala 2.11 的。

自动创建 SparkSession

如果您想使用sparknlp.start()函数,您可以添加以下标志以使用正确的 Maven 包自动启动 SparkSession:

import sparknlp

# for PySpark 3.0.x and 3.1.x
spark = sparknlp.start()

# for PySpark 2.4.x
spark = sparknlp.start(spark24=True)

# or for PySpark 2.3.x
spark = sparknlp.start(spark23=True)

我还想指出这个讨论MLReadableMLWritable错误的讨论:

为什么我会看到 serialVersionUID 或 MLReadable 或 MLWritable 错误

完全披露:我是 Spark NLP 的维护者之一。

于 2021-12-14T20:53:21.263 回答