PySpark中没有名为“spacy”的模块

bttbmeg0  于 2022-11-01  发布在  Spark
关注(0)|答案(2)|浏览(170)

我正在尝试使用自定义的NER空间模型来执行一些实体提取。提取将在Spark Dataframe上完成,所有的工作都在Dataproc集群中进行(使用Jupyter Notebook,可在 “Workbench” 中获得)。我正在使用的代码如下所示:


# IMPORTANT: NOTICE THIS CODE WAS RUN FROM A JUPYTER NOTEBOOK (!)

import pandas as pd
import numpy as np
import time

from pyspark.sql import SparkSession
from pyspark.sql.functions import udf, pandas_udf
from pyspark.sql.types import ArrayType, StringType

spark = SparkSession.builder.appName('SpacyOverPySpark') \
                    .getOrCreate()

# FUNCTIONS DEFINITION

def load_spacy_model():
    import spacy
    print("Loading spacy model...")
    return spacy.load("./spacy_model")  # This model exists locally

@pandas_udf(ArrayType(StringType()))
def entities(list_of_text: pd.Series) -> pd.Series:
    # retrieving the shared nlp object
    nlp = broadcasted_nlp.value
    # batch processing our list of text
    docs = nlp.pipe(list_of_text)
    # entity extraction (`ents` is a list[list[str]])
    ents=[
        [ent.text for ent in doc.ents]
        for doc in docs
    ]
    return pd.Series(ents)

# DUMMY DATA FOR THIS TEST

pdf = pd.DataFrame(
    [
        "Pyhton and Pandas are very important for Automation",
        "Tony Stark is a Electrical Engineer",
        "Pipe welding is a very dangerous task in Oil mining",
        "Nursing is often underwhelmed, but it's very interesting",
        "Software Engineering now opens a lot of doors for you",
        "Civil Engineering can get exiting, as you travel very often",
        "I am a Java Programmer, and I think I'm quite good at what I do",
        "Diane is never bored of doing the same thing all day",
        "My father is a Doctor, and he supports people in condition of poverty",
        "A janitor is required as soon as possible"
    ],
    columns=['postings']
)
sdf=spark.createDataFrame(pdf)

# MAIN CODE

# loading spaCy model and broadcasting it

broadcasted_nlp = spark.sparkContext.broadcast(load_spacy_model())

# Extracting entities

df_new = sdf.withColumn('skills',entities('postings'))

# Displaying results

df_new.show(10, truncate=20)

我得到的错误代码看起来与此类似,但answer不适用于我的情况,因为它处理的是 “在Yarn中执行Pyspark作业”,这是不同的(或者我是这么认为的,请随时纠正我)。另外,我也找到了this,但答案相当模糊(我必须在这里诚实地说:我所做的唯一一件“重新启动spark会话”的事情是在我的Jupyter Notebook的最后一个单元格中运行spark.stop(),然后再次运行上面的单元格,也可以在这里纠正我)。
所使用的代码深受"Answer 2 of 2" in this forum的启发,这让我怀疑是否还有一些缺失的设置仍然困扰着我(顺便说一句,“答案1/2”已经测试过了,但没有工作)。

  • 谢谢-谢谢

澄清事项:

因为在注解部分生成的一些查询或提示可能很长,所以我决定在这里包含它们:

    • 问题1:“您使用哪个命令创建了群集?"*:我使用了这种方法,所以命令“在普通视线中“是不可见的;但是,我刚刚意识到,当您要创建集群时,您会看到一个 “EQUIVALENT COMMAND LINE” 按钮,该按钮可赠款对以下命令的访问权限:

在我的例子中,Dataproc集群创建代码(由GCP自动生成)为:

gcloud dataproc clusters create my-cluster \
--enable-component-gateway \
--region us-central1 \
--zone us-central1-c \
--master-machine-type n1-standard-4 \
--master-boot-disk-size 500 \
--num-workers 2 \
--worker-machine-type n1-standard-4 \
--worker-boot-disk-size 500 \
--image-version 2.0-debian10 \
--optional-components JUPYTER \
--metadata PIP_PACKAGES=spacy==3.2.1 \
--project hidden-project-name

请注意spaCy是如何安装在元数据中的(遵循these建议);但是,在创建Dataproc群集后立即运行pip freeze | grep spacy命令,不会显示任何结果(即,spaCy未成功安装)。要启用它,请在之后使用official method

  • No. 2:“可能的原因路径错误”:不是我的情况,它实际上看起来类似于this case(即使我不能说两者的根情况是相同的):
  • 运行which python将显示/opt/conda/miniconda3/bin/python作为结果。
  • 运行which spacy(读取“澄清编号1”)显示结果为/opt/conda/miniconda3/bin/spacy
nbewdwxp

nbewdwxp1#

在Jupyter Notebook中复制您的案例时,我遇到了同样的错误。

我使用了这个pip命令,它成功了:

pip install -U spacy

但是在安装之后,我得到了一个JAVA_HOME is not set错误,所以我使用了这些命令:

conda install openjdk conda install -c 
conda-forge findspark 
!python3 -m spacy download en_core_web_sm

我只是把它包括在内,以防你也可能遇到它。
以下是输出:

注意:我使用了spacy.load("en_core_web_sm")

i2loujxw

i2loujxw2#

我设法解决了这个问题,通过结合两条信息:

    • “配置Dataproc Python环境”“Dataproc映像版本2.0”*(因为这是我正在使用的版本):可在这里(特别感谢评论区的@大港)。
    • “创建 (数据过程) 群集”*:可在此处找到。

具体来说,在通过Google Console设置Dataproc群集期间,我通过执行以下操作“安装”了Spacy:

当集群创建完成后,我运行了我的原始帖子中提到的代码(没有修改),结果如下:

这解决了我最初的问题。我计划将我的解决方案应用于更大的数据集,但我认为那里发生的任何事情,都是不同线程的主题。

相关问题