【问题标题】:Iterative programming using PCollectionViews使用 PCollectionViews 进行迭代编程
【发布时间】:2017-04-25 01:38:03
【问题描述】:

我希望创建一个包含十万个对象(甚至可能是一百万个)的 PCollection,以便我在 for 循环中对相同数据应用一百万次操作,但计算出的 PCollectionView 的值不同在循环的每次迭代中。 这是一个 df 可以很好处理的用例吗?有没有更好的方法来实现这一点?我担心的是 PCollectionView 的开销太大,但这可能在一年前曾经是一个问题,但现在这是一个 DF 可以很好地支持的用例。就我而言,我可以硬编码 for 循环的迭代次数(因为我认为 DF 无法处理在运行时动态确定迭代次数的情况。)这是一些伪代码:

PCollection<KV<Integer,RowVector>> rowVectors = ...
PCollectionView<Map<Integer, Float>> vectorX;

for (int i=0; i < 1000000; i++) {
  PCollection<KV<Integer,Float>> dotProducts = 
     rowVectors.apply(ParDo.of(new DoDotProduct().withSideInputs(vectorX));
  vectorX = dotProducts.apply(View.asMap());
}

【问题讨论】:

    标签: google-cloud-dataflow


    【解决方案1】:

    很遗憾,我们最多只能支持 1000 个转换/阶段。这将需要 1000000 个(或任何你的 forloop 迭代的)阶段。

    另外,您是正确的,我们不允许在管道开始运行后更改图表。

    如果您希望执行少于 1000 次迭代,则使用地图侧输入可以工作,但您必须限制每个 RowVector 执行的地图查找次数。您可以通过确保每个查找具有整个列而不是遍历每个 RowVector 的地图来做到这一点。在这种情况下,您可以将矩阵表示为 Map&lt;ColumnIndex, Iterable&lt;RowIndex, RowValue&gt;&gt; 的 PCollectionView

    【讨论】:

      猜你喜欢
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 2014-09-25
      • 2020-08-08
      • 2013-07-30
      相关资源
      最近更新 更多