我处理临床数据,所以我很抱歉,由于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
其中第一项是用代码标记的句子中的任何实际字符串,第二项是专业医疗等效项,第三项只是一个代码,可以帮助我们在其他代码之间查找诊断层次结构
答案 0 :(得分:0)
如果只有4个Parquet File输出,则表明分区太小,请在写入前尝试重新分区。例如:
output_frame= output_frame.repartition(500)
output_frame.write.parquet(data_bucket)