Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在数据流管道中写入BigQuery时捕获失败_Python_Google Bigquery_Google Cloud Dataflow_Google Cloud Pubsub - Fatal编程技术网

Python 在数据流管道中写入BigQuery时捕获失败

Python 在数据流管道中写入BigQuery时捕获失败,python,google-bigquery,google-cloud-dataflow,google-cloud-pubsub,Python,Google Bigquery,Google Cloud Dataflow,Google Cloud Pubsub,我有一个从PubSub主题读取事件数据的数据流管道。当接收到消息时,我会执行一个转换步骤,以使事件数据适合所需的BigQuery模式。但是,如果创建的输入不符合模式,则会遇到问题。显然,写入BigQuery是无限次的: Count: 76 RuntimeError: Could not successfully insert rows to BigQuery table 目前我正在做大量的手动检查,输入确实符合模式,但是,在我没有考虑的情况下,我积累了运行时错误。是否有一种方法可以尝试写入

我有一个从PubSub主题读取事件数据的数据流管道。当接收到消息时,我会执行一个转换步骤,以使事件数据适合所需的BigQuery模式。但是,如果创建的输入不符合模式,则会遇到问题。显然,写入BigQuery是无限次的:

Count: 76   RuntimeError: Could not successfully insert rows to BigQuery table

目前我正在做大量的手动检查,输入确实符合模式,但是,在我没有考虑的情况下,我积累了运行时错误。是否有一种方法可以尝试写入BigQuery,以防无法使用原始输入执行其他操作?或者,是否有一种方法可以尝试多次写入,或者在不添加新的运行时错误的情况下以静默方式失败

编辑:我正在使用python SDK。以下是我的简化管道,以进一步澄清:

with beam.Pipeline(options=options) as pipeline:
    # Read messages from PubSub
    event = (pipeline
             | 'Read from PubSub' >> beam.io.gcp.pubsub.ReadStringsFromPubSub(topic))

    output = (event
              | 'Create output' >> beam.transforms.core.FlatMap(lambda event: [{'input': event}]))

    # Write to Big Query
    _ = (output
         | 'Write log to BigQuery' >> beam.io.gcp.bigquery.WriteToBigQuery(
             table=table,
             dataset=dataset,
             project=project,
             schema=schema,
             create_disposition=beam.io.gcp.bigquery.BigQueryDisposition.CREATE_NEVER,
             write_disposition=beam.io.gcp.bigquery.BigQueryDisposition.WRITE_APPEND))

如果我的表中没有“input”列,则作业将终止。经过仔细观察,似乎这就是这种行为的原因。通过定制而不是引发运行时错误,我可以克服我的问题,但是,这感觉相当麻烦。有人对更简单的方法有什么建议吗?

如果您自己编写了管道,那么您应该能够在BigQueryIO上使用它来实现流媒体的Beam-Python SDK是非常有限的

从Beam SDK版本2.5.0开始,Python流式管道执行在实验上是可用的(有一些限制)

Python流执行当前不支持以下功能

一般光束功能: 这些不受支持的梁特征适用于所有流道

  • 状态和计时器API
  • 自定义源API
  • 可拆分DoFn API
  • 处理迟交的数据
  • 用户定义的自定义窗口fn
DataflowRunner特定功能: 此外,DataflowRunner目前不支持Python流执行的以下特定于云数据流的功能

  • 流式自动缩放
  • 更新现有管道
  • 云数据流模板
  • 一些监视功能,例如毫秒计数器、显示数据、度量和转换的元素计数。但是,支持源的日志记录、水印和元素计数
更多信息请点击此处:

还请检查数据流文档中的以下发行说明:
在使用direct runner时,从插入中获取['FailedRows']可能会对您有所帮助

 final_to_bq = (data
                   | 'Write to BQ' >> beam.io.WriteToBigQuery( ... )
)
然后:


这对使用DirectRunner很有帮助。。。但是还没有使用DatflowRunner…

您是否运行了一个模板数据流管道来执行此操作?还有关于这个错误的更多信息吗?我用python创建了一个自定义数据流管道。对于符合模式的有效负载,作业运行良好。自定义验证过滤问题列表,并将其写入单独的调试表中,这样也可以正常工作。然而,在我没有考虑的情况下,这项工作就会死亡。我用一个简化的管道编辑了这个问题,以提供更多细节。与您的情况相关的公共功能请求已打开。你可以在这里看-哦,太好了,我真的很感激!嘿,谢谢你的回答。但是,我使用的是python,找不到类似的东西。我编辑了这个问题以提供更多的细节。唉,python还没有一个同等的特性。但我理解你希望你的管道继续运行的需要,即使一个元素失败。谢谢你,但是,我看不到与我的问题相关的东西。此外,还有一点让我感到困惑:它说“Python流媒体管道执行从Beam SDK版本2.5.0开始就在实验中可用[…]”(当前最新版本为2.4.0),这与Python数据流SDK的发行说明一致。然而,像我上面发布的管道一样,它在流模式下为我工作,但有一些(出于我的目的)限制。我遗漏了什么吗?用于流媒体的Dataflow python SDK是可用的,但是有些功能可能会改变,有些功能还不能工作。因此,一些简单的流媒体示例可能会工作,因为该功能可能已经开发出来了。我想关键是他们将拥有2.5.0发布的大部分功能。
print_failed_rows = (final_to_bq['FailedRows']
                         | 'print failed' >> beam.ParDo(Printer())
                         )