我到处都在搜索这个问题,甚至遇到了这样的帖子 没有提供解决方案here
但是我发现,希望有人能有所启发。使用数据块,我从文件夹位置读取了一些图像数据
df = spark.read.format("image").load("/FileStore/tables/*")
当然,这将返回带有ImageSchema.ColumnSchema结构的DF。如引用的SO文章中所述,当我尝试使用map将图像从bytearray转换为numpy array
df.rdd.map(lambda x: ImageSchema.toNDArray(x[0])).take(1)
它引发错误
AttributeError: 'NoneType' object has no attribute '_jvm'
但是,当我收集图像时
x = df.rdd.take(1)[0]
然后将toNDArray()方法应用于收集的有效图像
ImageSchema.toNDArray(x)
然后,然后在收集的图像上调用.toNDArray() AND IT WORKS 后,我再次返回并运行map函数。这也是可重现的。我将重新启动集群,尝试在rdd上映射toNDArray()方法,但它失败。收集一个图像,对收集的图像执行该方法,然后返回并重新运行代码以在rdd上执行地图,它就可以工作。
什么可能导致此行为?我知道在Scala中,当我定义UDF时,如果未在函数中传递sparksession,则必须首先从传递的RDD中获取sparkContex
def(x: RDD[type]):
sc = x.sparkContext
.
.
.
这可能是问题吗?第一次调用该方法时,spark上下文不存在吗?