簡體   English   中英

如何獲取 ValueProvider 的值並將其寫入 BigQuery 表?

[英]How to get the value of a ValueProvider and write it in a BigQuery table?

早上好,

我創建了一個 DataFlow 模板,用於讀取 BigQuery 中的一些信息、應用一些轉換並將結果寫入一個新的 BigQuery 表中。

該模板采用 2 個參數:

  • 輸入查詢
  • 項目名稱

我想通過“WriteToBigquery”轉換將項目名稱寫入 bigquery 表中,但不是寫入用戶填寫的項目名稱,而是返回錯誤..

你知道我怎樣才能得到這個值並寫下來嗎?

謝謝你的幫助!

代碼:

    @classmethod
    def _add_argparse_args(cls, parser):
        parser.add_value_provider_argument(
            '--query',
            default='',
            help='q')
        parser.add_value_provider_argument(
            '--projet',
            default='',
            help='d')

[...]

  my_options = pipeline_options.view_as(BqReaderOptions).query
  myProjet = pipeline_options.view_as(BqReaderOptions).projet
        
                nb_val = (
                    p
                    | 'Readl' >> beam.io.ReadFromBigQuery(query=my_options, use_standard_sql = True) 
                    |beam.Map(lambda elem :elem== ' 0' )       
                    | 'countVal' >>  beam.combiners.Count.PerElement()  
                    |beam.Map(lambda elem : { "Nb" : int(elem), 'projet': myProjet })) 
                    



 ERROR : 

    default_encoder "Object of type '%s' is not JSON serializable" % type(obj).__name__) TypeError: Object of type 'RuntimeValueProvider' is not JSON serializable [while running 'writeToBigQuery1/BigQueryBatchFileLoads/ParDo(WriteRecordsToFile)/ParDo(WriteRecordsToFile)/ParDo(WriteRecordsToFile)']

您收到該錯誤是因為您正在輸出ValueProvider作為轉換的結果,並且它嘗試對 JSON 進行默認編碼,但失敗了。 但是,看起來您的意圖是將 output 項目作為字符串而不是原始ValueProvider 您可以閱讀有關如何在自己的函數中使用ValueProvider的詳細信息,但基本上您只需要制作一個包含ValueProvider的 DoFn object ,並在其上使用get方法,如下所示:

class MyFn(beam.DoFn):
    def __init__(self, project): # Pass in project as a ValueProvider
      self.project = project

    def process(self, elem):
      yield { "Nb" : int(elem), "project": self.project.get() }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM