我有一个要求,从S3桶读取图像,并将其转换为base64编码格式。
我能够从S3读取图像文件,但当我在base64方法中传递S3文件路径时,它无法识别该路径。
所以我想我会保存图像dataframe(相同的图像)在临时路径在集群,然后通过路径在base64方法。
但在保存图像 Dataframe 时,我得到以下错误:(* 最初我试图保存图像 Dataframe 与“图像”格式,但在谷歌我发现有一个错误,这种格式,有人建议使用下面的格式 *)
java.lang.ClassNotFoundException: Failed to find data source: org.apache.spark.ml.source.image.PatchedImageFileFormat.
请看我下面的示例代码,请告诉我在哪里可以找到依赖包
spark._jsc.hadoopConfiguration().set('fs.s3a.access.key', '************')
spark._jsc.hadoopConfiguration().set('fs.s3a.secret.key', '************')
spark._jsc.hadoopConfiguration().set('fs.s3a.endpoint', '************')
def getImageStr(img):
with open(img, "rb") as imageFile:
str1 = base64.b64encode(imageFile.read())
str2 = str(str1, 'utf-8')
return str2
img_df = spark.read\
.format("image")\
.load("s3a://xxx/yyy/zzz/hello.jpg")
img_df.printSchema()
img_df.write\
.format("org.apache.spark.ml.source.image.PatchedImageFileFormat")\
.save("/tmp/sample.jpg")
img_str = getImageStr("/tmp/sample.jpg")
print(img_str)
请告诉我,如果有任何其他方式可以从Spark中的S3下载图像文件(* 不使用boto3包 *)
1条答案
按热度按时间h5qlskok1#
当你使用
image
数据源时,你会得到一个带有image
列的 Dataframe ,里面有一个二进制的有效载荷-image.data
包含了实际的图像。然后你可以使用built-in functionbase64
对该列进行编码,你可以将编码后的表示形式写入文件。类似这样(未测试):