Ошибка сохранения искры Dataframe, который является атрибутом класса - PullRequest
0 голосов
/ 10 января 2019

У меня есть класс, у которого в качестве атрибута есть искровой Dataframe. Я написал метод для класса, который будет сохранять Dataframe в виде файла CSV.

import pickle
import pyspark
import inspect

def write_file(save_object, filepath):
    save_object.write.csv(filepath + "/csv_name.csv")


class BasicTypes:
    def __init__(self):
        self.name = "bts"
        self.spark_df = spark.createDataFrame([[1,2], [3,4]], ['a', 'b'])
    def save_df(self, filepath):
        attributes = inspect.getmembers(self, lambda a: not (inspect.isroutine(a)))
        attributes =  [a[0] for a in attributes if not(a[0].startswith('__') and a[0].endswith('__'))]
        for each_attribute in attributes:
            if isinstance(getattr(self, each_attribute), pyspark.sql.dataframe.DataFrame):
                x = getattr(self, each_attribute)
                x.show(4)
                write_file(x, filepath + '/' + self.name + '/')

В методе save_df я собираю все имена атрибутов в списке attributes, а затем перебираю их, чтобы проверить, является ли какой-либо из них искровым фреймом данных. В случае, если это фрейм данных spark, я вызываю метод write_file, который является функцией-оберткой для сохранения фрейма данных spark в виде csv-файла. Если он не запускается, он напечатает failed for ...

Я попытался сохранить фрейм данных с помощью метода save_df

bt = BasicTypes()
file_str = "path/to/location"
save_df(file_str)

Проблема в том, что иногда код выполняется без проблем, но иногда я получаю следующую ошибку

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 33, in save
  File "/Users/timetravellingcocoon/Downloads/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__
  File "/Users/timetravellingcocoon/Downloads/spark/python/pyspark/sql/utils.py", line 63, in deco
    return f(*a, **kw)
  File "/Users/timetravellingcocoon/Downloads/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py", line 332, in get_return_value
py4j.protocol.Py4JError: An error occurred while calling o270.__getstate__. Trace:
py4j.Py4JException: Method __getstate__([]) does not exist
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:318)
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:326)
    at py4j.Gateway.invoke(Gateway.java:274)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:238)
    at java.lang.Thread.run(Thread.java:748)

Что может быть причиной этой проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...