如何在Python 3.12中使用pyspark的Spark Connect?

-1 投票
1 回答
52 浏览
提问于 2025-04-13 01:16

我正在尝试使用Spark Connect在远程Spark集群上创建一个Spark会话,使用的是Python 3.12中的pyspark:

ingress_ep = "..."
access_token = "..."
conn_string = f"sc://{ingress_ep}/;token={access_token}"
spark = SparkSession.builder.remote(conn_string).getOrCreate()

运行这个的时候,我收到了一个ModuleNotFoundError的错误信息:

---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[13], line 11
      9 conn_string = f"sc://{ingress_ep}/;token={access_token}"
     10 print(conn_string)
---> 11 spark = SparkSession.builder.remote(conn_string).getOrCreate()

File c:\Users\...\venv2\Lib\site-packages\pyspark\sql\session.py:464, in SparkSession.Builder.getOrCreate(self)
    458 if (
    459     "SPARK_CONNECT_MODE_ENABLED" in os.environ
    460     or "SPARK_REMOTE" in os.environ
    461     or "spark.remote" in opts
    462 ):
    463     with SparkContext._lock:
--> 464         from pyspark.sql.connect.session import SparkSession as RemoteSparkSession
    466         if (
    467             SparkContext._active_spark_context is None
    468             and SparkSession._instantiatedSession is None
    469         ):
    470             url = opts.get("spark.remote", os.environ.get("SPARK_REMOTE"))

File c:\Users\...\venv2\Lib\site-packages\pyspark\sql\connect\session.py:19
      1 #
      2 # Licensed to the Apache Software Foundation (ASF) under one or more
      3 # contributor license agreements.  See the NOTICE file distributed with
...
---> 24 from distutils.version import LooseVersion
     26 try:
     27     import pandas

ModuleNotFoundError: No module named 'distutils'

我知道distutils这个模块在Python 3.12中被移除了。所以我按照建议安装了setuptools,并设置了SETUPTOOLS_USE_DISTUTILS='local',这个建议来自于为什么我会收到ModuleNotFoundError: No module named 'distutils'?尽管安装了setuptools,但仍然没有找到distutils模块,但我还是遇到了这个错误。

我不想退回到旧版本的Python。请问我是不是漏掉了什么?我该怎么才能让这个正常工作呢?

1 个回答

1

在你尝试导入 distutils 之前,可能需要先 import setuptools

简单来说,setuptools 使用了一种叫 MetaPathFinder 的东西来告诉 Python 怎么找到 distutils。这个 MetaPathFinder 只有在你导入 setuptools 后,才会被加入到 sys.meta_path 里。

这可能是个需要反馈给库开发者的问题。

如果上面提到的解决办法还是不管用,可能还有其他依赖项在试图明确禁用这个 MetaPathFinder

撰写回答