如何在Python 3.12中使用pyspark的Spark Connect?
我正在尝试使用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
。