繁体   English   中英

无法将Beam Python PCollection转换为列表

[英]Can't convert beam python pcollection into list

TypeError: 'PCollection' object does not support indexing

上面的错误是由于尝试将Pcollection转换为list而导致的:

filesList = (files | beam.combiners.ToList())

lines = (p | 'read' >> beam.Create(ReadSHP().ReadSHP(filesList))
            | 'map' >> beam.Map(_to_dictionary))

和:

def ReadSHP(self, filesList):
    """
    """
    sf = shp.Reader(shp=filesList[1], dbf=filesList[2])  

如何解决这个问题? 任何帮助表示赞赏。

通常,您不能将PCollection转换为列表。

PCollection是可能无界且无序的项目的集合。 Beam允许您将转换应用于PCollection PTransform应用于PCollection产生另一个PCollection 转换的应用过程可能会分布在一组机器上。 因此,一般情况下不可能将此类事物转换为本地内存中的元素集合。

组合器只是PTransforms的特殊类。 他们要做的是累积所有看到的元素,对元素应用一些合并逻辑,然后输出合并结果。 例如,组合器可以查看传入的元素,将它们求和,然后输出总和作为结果。 这种组合变换一个PCollection元件成PCollection这些元素的总和的。

beam.combiners.ToList仅仅是被施加到另一个变换PCollection ,潜在地在工人机的车队,并产生另一个PCollection 但是在产生输出元素之前,它实际上并没有进行任何复杂的组合,它只将所有可见元素累积到一个列表中,然后输出可见元素的列表。 因此,它将作为键值对的元素(在多台计算机上)放入列表中,然后输出这些列表。

缺少从潜在多台计算机中获取这些列表并将它们加载到本地程序(如果需要)的逻辑。 以通用方式(在所有运行程序,所有可能的IO和管道结构之间)无法轻松解决该问题(如果有的话)。

解决方法之一是在管道中添加另一步,将合并的输出(例如,总和或列表)写入公用存储(例如某个数据库中的表或文件)。 然后,当管道完成时,您的程序可以从该位置加载管道执行的结果。

有关详细信息,请参见文档:

另一种选择是使用GCE VM,并使用ogr2​​ogr之类的工具将shapefile转换为GeoJSON。 然后可以将GeoJSON加载到BigQuery中,并可以使用BigQuery GIS进行查询。

这是一个具有更多详细信息的博客文章
https://medium.com/google-cloud/how-to-load-geographic-data-like-zipcode-boundaries-into-bigquery-25e4be4391c8

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM