开发者社区> 问答> 正文

如何在Apache Beam中实现类似Spark的zipWithIndex?

Pcollection p1 = {"a","b","c"}

PCollection< KV > p2 = p1.apply("some operation ")
//{(1,"a"),(2,"b"),(3,"c")}
我需要使其像Apache Spark这样的大型文件可扩展,以便它的工作方式如下:

sc.textFile("./filename").zipWithIndex
我的目标是通过以可伸缩的方式分配行号来保留大文件中行之间的顺序。

如何通过Apache Beam获得结果?

展开
收起
社区小助手 2018-12-21 14:00:23 2034 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    如果我理解你的算法,应该就像(伪代码):

    A = ReadWithShardedLineNumbers(myFile) : output K, V
    B = A.ExtractShardOffsetKeys() : output K, V
    C = B.PerKeySum() : output K, V
    D = C.GlobalSortAndPrefixSum() : output K V
    E = [A,D].JoinAndCalculateGlobalLineNumbers() : output V
    这有几个假设:

    ReadWithShardedLineNumbers:源可以输出其分片偏移量,并且偏移量是全局排序的
    GlobalSortAndPrefixSum:所有读取分片的总数可以适合内存以执行总排序
    假设#2不适用于所有的数据大小,并且根据读取碎片的粒度不同而不同。但是对于一些实际的文件大小子集来说,这似乎是可行的。

    另外,我认为上面的伪代码在Beam中可行,不需要SplittableDoFn。


    没有内置的方法来做到这一点。PCollections在Beam中是无序的,可能是无界的,并且在多个工人上并行处理。PCollection直接在Beam模型中无法观察到来自具有已知顺序的源的事实。我认为更简单的方法是在Beam管道中使用之前对文件进行预处理。

    2019-07-17 23:23:26
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Apache Flink技术进阶 立即下载
Apache Spark: Cloud and On-Prem 立即下载
Hybrid Cloud and Apache Spark 立即下载

相关镜像