分割列和编写镶木地板文件时,大量时间增加

时间:2019-08-20 16:17:13

标签: pyspark

我处理临床数据,所以我很抱歉,由于HIPAA的规定,我无法显示任何输出,但是我会尽力填补任何空白。

我是数据科学专业的应届毕业生,我从未真正花费很多时间在任何火花系统上工作,但是我现在担任新职务。我们正在从一个我将称为udf_function的函数中收集输出,该函数会从医师那里获得临床记录(report),并从python函数call_function返回该函数定义的输出。这是我用来完成此任务的代码

def call_function(report):

    //python code that generates a list of a,b,c, which I 
      join together to return a string of the combined list items

    a=  ",".join(a)
    b= ",".join(b)
    c= ",".join(c)
    return [a,b,c]


udf_function= udf(lambda y: call_function(y), ArrayType(StringType()))

mid_frame = df.select('report',
                       udf_function('report').alias('udf_output')
                     )

这将返回一个长度为3的数组,其中包含有关从函数返回的信息的字符串。在选择了25,000条记录后,我能够在几天之内仅花了3个小时多的时间就在GCP上的30个节点集群(20个工作人员,10个抢占式)上完成了运行。

我做了一些更改,以从数组中解析出三个对象,因为这三个对象包含我们要进一步分析的不同类型的信息,我将其称为a,{{1} },b(再次,抱歉,如果含糊不清;我正尝试将实际数据尽可能地保持在表面水平)。前3个小时的运行没有写任何文件,因为我正在测试系统需要多长时间。

c

此解析输出和写入文件的任务花费了额外的48小时。我想如果我处理大量文件,这回我可以忍受这次丢失了,但是输出的是4个实木复合地板文件,总计24.06 MB。查看作业日志,编写过程本身仅花费了大约20个小时。

很明显,我引入了一些效率低下的问题,但是由于我是这种系统和工作风格的新手,所以我不确定我哪里出错了。

谢谢所有能提供一些建议或指导的人!

编辑

以下是output = mid_frame.select('report', mid_frame['udf_output'].getItem(0).alias('a'), mid_frame['udf_output'].getItem(1).alias('b'), mid_frame['udf_output'].getItem(2).alias('c') ) output_frame.show() output_frame.write.parquet(data_bucket) 可能是什么以及函数返回的结果的示例

这是我自己写的一句话,因此没有从任何真实记录中提取

report

其中第一项是用代码标记的句子中的任何实际字符串,第二项是专业医疗等效项,第三项只是一个代码,可以帮助我们在其他代码之间查找诊断层次结构

1 个答案:

答案 0 :(得分:0)

如果只有4个Parquet File输出,则表明分区太小,请在写入前尝试重新分区。例如:

output_frame= output_frame.repartition(500)
output_frame.write.parquet(data_bucket)