过滤apache梁中的Pcollections

时间:2018-05-25 11:15:27

标签: java google-cloud-platform google-cloud-dataflow apache-beam

我有两个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的负数?

1 个答案:

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

侧输入的大小决定了正确的方法,即: -

  
      
  • 如果您的旁边输入符合memory
  • ,请使用View.asList   
  • 使用View.asIterator,如果您的旁边输入不适合memory,则会有性能下降
  •   
  • 仅当您确定它适合内存时才使用View.asMap。
  •