我有两个Pcollections
P1 as Pcollection KV<String,Object>
P2 as Pcollection KV<String,Long>
两个Pcollections中的键相同,但值不同。
P1约为7000万条目,P2是P1的子集,有3000万条目。
现在我需要将P1分成两个集合,这样P1.A只包含在P2中找到的键,而P1.B将包含P2中不存在的键。
我不想使用co-groupbykey或任何连接,因为它会导致数据混乱。
可以将20M条目(所有字符串)用作HashMap的侧输入吗?这是一个好方法吗?
建议任何其他最佳方法将P1分成两个集合,一个是P2中的键交叉,而另一个是P2的负数?
答案 0 :(得分:0)
在进行基于侧面输入的过滤之前,您需要考虑侧输入视图的大小。
例如,我们假设您的字符串键的长度为 ,因此可以按如下方式粗略估算总大小: -
// A sample Key of size 10, prints 20 bytes as the key size.
System.out.print("AB-2325-CD".getBytes(Charset.forName("UTF-16BE")).length);
侧输入大小可以计算为 20 * 20,000,000 = 400 MB
注意:此估算不包括与字符串关联的存储开销(和值对象的大小,前提是您将大小输入作为地图传递 )。有关尺寸计算的详细信息refer。
根据View类Java文档
... asMultimap()和asMap()对于实现基于查找都很有用 当侧输入足够小时,与主输入“连接” 适应记忆。
在使用侧输入之前,关键点是: -
我不确定工作人员可以使用的默认内存,但您可以通过WorkerCacheMb属性增加它。
关于您的问题,可以将20M条目(所有字符串)用作边 输入可能是一个HashMap?
侧输入的大小决定了正确的方法,即: -