【问题标题】:filtering Pcollections in apache beam过滤 apache 光束中的 Pcollections
【发布时间】:2026-01-16 15:25:01
【问题描述】:

我有两个 Pcollections

P1  as Pcollection KV<String,Object>
P2 as Pcollection  KV<String,Long>

两个 Pcollections 中的 Key 相同,但值不同。

P1 大约有 7000 万个条目,P2 是 P1 的子集,有 3000 万个条目。

现在我需要将 P1 拆分为两个集合,这样 P1.A 将仅包含 P2 中的键,而 P1.B 将包含 P2 中不存在的键。

我不想使用 co-groupbykey 或任何连接,因为它会导致数据混洗。

可以将 20M 个条目(所有字符串)用作侧面输入,可能用作 HashMap 吗?这是一个好方法吗?

是否建议任何其他最佳方法将 P1 分成两个集合,一个是 P2 中键的交集,而另一个是 P2 的负数?

【问题讨论】:

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


    【解决方案1】:

    在进行基于侧输入的过滤之前,您需要考虑侧输入视图的大小。

    例如,假设您的 String 键的 长度为 10,因此可以粗略估计总大小如下:-

    // 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() 都可用于实现基于查找的 “加入”与主输入,当侧输入足够小到 适合记忆。

    在使用侧面输入之前,这里的关键是:-

    • 侧输入与主输入的大小比
    • 它是否适合您的员工的记忆

    我不确定 worker 可用的默认内存,但您可以通过 WorkerCacheMb 属性增加它。

    关于您的问题,可以将 20M 条目(所有字符串)用作边 输入可能是一个 HashMap ?

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

    • 使用 View.asList,如果您的侧面输入适合 memory
    • 使用 View.asIterator,如果您的侧输入不适合 memory,则会有性能损失
    • 仅当您确定它适合内存时才使用 View.asMap。

    【讨论】: