簡體   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