[英]PySpark: An error occurred while calling o51.showString. No module named XXX
我的pyspark版本是2.2.0。 我遇到了一個奇怪的問題。 我嘗試將其簡化為以下內容。 文件結構:
|root
|-- cast_to_float.py
|-- tests
|-- test.py
在cast_to_float.py
,我的代碼:
from pyspark.sql.types import FloatType
from pyspark.sql.functions import udf
def cast_to_float(y, column_name):
return y.withColumn(column_name, y[column_name].cast(FloatType()))
def cast_to_float_1(y, column_name):
to_float = udf(cast2float1, FloatType())
return y.withColumn(column_name, to_float(column_name))
def cast2float1(a):
return 1.0
在test.py
:
from pyspark.sql import SparkSession
import os
import sys
parentPath = os.path.abspath('..')
if parentPath not in sys.path:
sys.path.insert(0, parentPath)
from cast_to_float import *
spark = SparkSession.builder.appName("tests").getOrCreate()
df = spark.createDataFrame([
(1, 1),
(2, 2),
(3, 3),
], ["ID", "VALUE"])
df1 = cast_to_float(df, 'ID')
df2 = cast_to_float_1(df, 'ID')
df1.show()
df1.printSchema()
df2.printSchema()
df2.show()
然后我在tests文件夾中運行測試,我收到錯誤消息,這是來自最后一行,說:
+---+-----+
| ID|VALUE|
+---+-----+
|1.0| 1|
|2.0| 2|
|3.0| 3|
+---+-----+
root
|-- ID: float (nullable = true)
|-- VALUE: long (nullable = true)
root
|-- ID: float (nullable = true)
|-- VALUE: long (nullable = true)
Py4JJavaError Traceback (most recent call last)
<ipython-input-4-86eb5df2f917> in <module>()
19 df1.printSchema()
20 df2.printSchema()
---> 21 df2.show()
...
Py4JJavaError: An error occurred while calling o257.showString.
...
ModuleNotFoundError: No module named 'cast_to_float'
...
似乎導入了cast_to_float
,否則,我甚至無法獲得df1
。
如果我將test.py
放在cast_to_float.py
的同一目錄中,並在該目錄中運行它,那cast_to_float.py
。 有任何想法嗎? 謝謝!
我使用@ user8371915 __file__
方法,發現如果我在root
文件夾中運行它就沒問題。
就像現在一樣,結果將取決於您調用腳本的工作目錄。
如果你是root用戶,這將添加其父級。 你應該使用相對於__file__
路徑(看__file__變量是什么意思/做什么? ):
parentPath = os.path.join(
os.path.abspath(os.path.dirname(__file__)),
os.path.pardir
)
但我會建議使用適當的包結構。
注意 :
這僅涵蓋本地模式和驅動程序路徑,甚至在本地模式下,工作路徑也不受驅動程序路徑的影響。
要處理執行程序路徑(在更改后獲得執行程序異常),您仍應將模塊分發給worker 如何在Apache Spark(pyspark)中使用自定義類? 。
spark = SparkSession.builder.appName("tests").getOrCreate()
spark.sparkContext.addPyFile("/path/to/cast_to_float.py")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.