如何使用panda_udf

时间:2019-06-25 15:07:15

标签: python apache-spark pyspark

我有大量从二进制文件编码的图像文件。我正在尝试解码它们,然后将它们保存到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输出一个系列,但是我很茫然地想出如何对代码进行更改以使其起作用。

1 个答案:

答案 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)