Я искал повсюду по этой проблеме, и даже наткнулся на этот пост ТАК без предоставленного решения здесь
Но я сделал открытие, что, надеюсь, кто-то может пролить светна. Используя блоки данных, я считываю некоторые данные изображения из папки
df = spark.read.format("image").load("/FileStore/tables/*")
Конечно, это возвращает DF со структурой ImageSchema.ColumnSchema. Как упоминалось в цитируемом сообщении SO, когда я пытаюсь преобразовать изображения из bytearray в массив numpy, используя map
df.rdd.map(lambda x: ImageSchema.toNDArray(x[0])).take(1)
, выдается ошибка
AttributeError: 'NoneType' object has no attribute '_jvm'
Однако, когда я собираюimage
x = df.rdd.take(1)[0]
Затем примените метод toNDArray () к собранному изображению, которое он работает
ImageSchema.toNDArray(x)
И ТО Я возвращаюсь и снова запускаю функцию карты послевызов .toNDArray () для собранного изображения И ЭТО РАБОТАЕТ . Это также воспроизводимо. Я перезапущу кластер, попробую отобразить метод toNDArray () на rdd, и он не будет работать. Соберите изображение, выполните метод на собранном изображении, затем вернитесь назад и повторно запустите код, чтобы выполнить карту на rdd, и это работает.
Что может быть причиной такого поведения? Я знаю в scala, когда я определил UDF, мне нужно было бы сначала получить sparkContex из переданного RDD, если бы сама спарк-сессия не была передана в функции
def(x: RDD[type]):
sc = x.sparkContext
.
.
.
Может ли это быть проблемой? Контекст искры отсутствует при первом вызове метода?