TypeError: 'PCollection' object does not support indexing
尝试将Pcollection转换为列表会导致上述错误:
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])
如何解决此问题?任何帮助表示赞赏。
答案 0 :(得分:3)
通常,您无法将PCollection
转换为列表。
PCollection
是可能无界且无序的项目的集合。 Beam允许您将转换应用于PCollection
。将PTransform
应用于PCollection
会产生另一个PCollection
。转换的应用过程可能会分布在一组机器上。因此,一般情况下不可能将此类事物转换为本地内存中的元素集合。
Combiners只是PTransforms
的特殊类别。他们要做的是累积所有看到的元素,对元素应用一些合并逻辑,然后输出合并结果。例如,组合器可以查看传入的元素,将它们求和,然后输出总和作为结果。这种组合器将PCollection
个元素转换为这些元素之和的PCollection
。
beam.combiners.ToList
只是应用于PCollection
的另一种转换,可能会通过一组工作机进行转换,并产生另一个PCollection
。但是在产生输出元素之前,它实际上并没有进行任何复杂的组合,它只将所有可见元素累积到一个列表中,然后输出可见元素的列表。因此,它将键值对(在多台机器上)的元素放入列表中,然后输出这些列表。
缺少的逻辑是从潜在的多台计算机中获取这些列表,并在需要时将其加载到本地程序中。用通用的方法(在所有运行程序,所有可能的IO和管道结构之间)不能轻易(如果有的话)解决该问题。
一种解决方法是在流水线中添加另一步,以将合并的输出(例如,总和或列表)写入公用存储,例如数据库中的表或文件。然后,当管道完成时,您的程序可以从该位置加载管道执行的结果。
有关详细信息,请参阅文档:
答案 1 :(得分:0)
另一个选择是使用GCE VM,并使用诸如ogr2ogr之类的工具将shapefile转换为GeoJSON。然后可以将GeoJSON加载到BigQuery中,并可以使用BigQuery GIS进行查询。
这是一个具有更多详细信息的博客文章
https://medium.com/google-cloud/how-to-load-geographic-data-like-zipcode-boundaries-into-bigquery-25e4be4391c8