我有大量从二进制文件编码的图像文件。我正在尝试解码它们,然后将它们保存到hdfs。我有代码可以在python中成功做到这一点,但是由于需要完成大量文件,因此必须导入所有内容,转换为熊猫然后运行我的代码,即使它们都适合单节点作为熊猫,但不会。我一直在尝试将我的代码从panda函数转换为pyspark panda_udf,但是没有成功。下面是我的代码。如果有人有任何想法,我将不胜感激!
def image_save(bin,file):
start = datetime.now()
b64_encoded_img_binary = bin
img_binary = np.fromstring(b64_encoded_img_binary.decode('base64'), np.uint8)
img = cv2.imdecode(img_binary, cv2.IMREAD_COLOR)
cv2.imwrite('/dsaa/ml_shared/image_output/'+ str(file).replace(' ','').replace('JPEG','jpg'), img)
end = datetime.now()
time = (end - start).total_seconds()
return time
df['seconds'] = df.apply(lambda x:
image_save(x['b64_encoded_image_binary'],x['file_name']), axis=1)
该代码可与熊猫配合使用,并正确保存文件。但是,当我尝试使用@pandas_udf包装代码时,出现一个错误,它期望返回一个序列而不是一个浮点数。我知道标量熊猫udf输出一个系列,但是我很茫然地想出如何对代码进行更改以使其起作用。
答案 0 :(得分:0)
我想得太多了。我不认为下一步是将熊猫由系列组成。因此,它可以正常工作,我可以采用系列输入并将它们设为函数内的数据框。
def FPD(a, b):
def F2(a, b):
c = cv2.imdecode(np.fromstring(a.decode('base64'), np.uint8), cv2.IMREAD_COLOR)
cv2.imwrite('/dsaa/ml_shared/image_output/' + b, c)
return(b)
pdf = pd.DataFrame({'a': a, 'b' : b })
pdf.loc[:, 'c'] = pdf.apply(lambda x: F2(x['a'], x['b']), axis = 1)
return(b)