我的作业执行过程中创建的结构非常大:
(Key, (Iterable[Object], Iterable[Object]))
对于每个键,我需要找到两个可迭代对象的叉积,以创建另一个对象,然后尝试尝试找到记录链接。有成千上万个键,并且两个对象可迭代项最多为1000个元素。两个对象对形成一行,然后将其输入到ml模型中,然后再提取信息并将其简化。
我遇到的问题是该模型需要一个数据框,并且由于叉积完成后所有行的大小较大,所以大小合理的群集无法无迭代地一次处理全部数量。
我估计每个对象的平均大小为2-3KB,因此由2个对象组成的行将为4-6KB。在减少之前,最终输出将约为200-300bytes。
当前代码类似于:
val a = rdd[object]
val b = rdd[object]
def f1 = for a; for b; yield c
ideal
def f2 = for a; for b; create c - then pass c into model and yield d
val c = a.cogroup(b)
.flatMap(f2)
.reducebykey
如果我使用f1
运行仅使用rdds和iterables的函数的代码,则作业将按预期完成。
目前,函数f2
的问题在于它仅适用于该行的1个实例,但是模型需要一个数据框,因此使用示例集并保存中间步骤,我做了a.cogroup(b).write.parquet
,然后重新读回并通过模型。对于完整的数据集,我无法执行a.cogroup(b).write.parquet
,因为数据太大。但是,最终结果应该是易于装入内存的内容,如在平面图中输入f1
所示。
我当时想在将行传递到模型之前,我可以尝试并行化行(行到dataframe [row]),然后将1个对象的数据帧传递到模型中,然后以这种方式提取数据,庞大的数据量,并希望按预期使用模型(一次传递许多行),我希望有一个更好的方法。
关于如何构造代码以使数据适合内存的任何想法(如果我将整个数据组作为一个整体在cogroup之后看待如何分解呢?)
在什么时候我要对数据框的一个或多个数据框进行材质化?
我应该重新考虑使用cogroup吗? (由于界面可迭代而使用)
再次感谢您的时间。