簡體   English   中英

PySpark:調用o51.showString時發生錯誤。 沒有名為XXX的模塊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM