[英]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,並使用ogr2ogr之類的工具將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.