Python 数据流GCS到BQ问题
情况如下:我在GCS中有一组文件被压缩,并且有一个.gz文件扩展名(即000000\u[0-5].gz),我正试图将其导入到一个BQ表中。到目前为止,我一直在从命令行执行命令,但希望通过数据流来实现这一点,将来可能会添加一些转换 压缩的GCS文件中的数据是一个复杂的JSON结构,经常更改模式,因此最简单的方法是将整个文件作为一个TSV放入BigQuery,只包含一列,称为Python 数据流GCS到BQ问题,python,google-bigquery,google-cloud-storage,google-cloud-dataflow,Python,Google Bigquery,Google Cloud Storage,Google Cloud Dataflow,情况如下:我在GCS中有一组文件被压缩,并且有一个.gz文件扩展名(即000000\u[0-5].gz),我正试图将其导入到一个BQ表中。到目前为止,我一直在从命令行执行命令,但希望通过数据流来实现这一点,将来可能会添加一些转换 压缩的GCS文件中的数据是一个复杂的JSON结构,经常更改模式,因此最简单的方法是将整个文件作为一个TSV放入BigQuery,只包含一列,称为record,然后在BQ中使用JSON_EXTRACT函数解析出所需的值 问题:我已经编写了一个数据流管道,它将在这个场景中执
record
,然后在BQ中使用JSON_EXTRACT函数解析出所需的值
问题:我已经编写了一个数据流管道,它将在这个场景中执行最低限度的操作;从GCS读取并写入BigQuery表。然而,当我执行这个管道时,我得到一个JSON解析错误,如下所示:
Error while reading data, error message: JSON table encountered too
many errors, giving up. Rows: 1; errors: 1., error: Error while reading
data, error message: JSON table encountered too many errors, giving up.
Rows: 1; errors: 1., error: Error while reading data, error message:
JSON parsing error in row starting at position 2630029539: Value
encountered without start of object.
下面是一些匿名变量的数据流脚本
from __future__ import absolute_import
import argparse
import logging
import re
import json
import apache_beam as beam
from apache_beam.io import ReadFromText
from apache_beam.io import WriteToText
from apache_beam.io import Read
from apache_beam.io import WriteToText
from apache_beam.io import WriteToBigQuery
from apache_beam.options.pipeline_options import PipelineOptions
from apache_beam.options.pipeline_options import SetupOptions
def run(argv=None):
parser = argparse.ArgumentParser()
parser.add_argument('--input',
dest='input',
default='gs://BUCKET_NAME/input-data/000000_0.gz',
help='Input file to process.')
known_args, pipeline_args = parser.parse_known_args(argv)
pipeline_args.extend([
'--runner=DataflowRunner',
'--project=GCP_PROJECT_NAME',
'--staging_location=gs://BUCKET_NAME/dataflow-staging',
'--temp_location=gs://BUCKET_NAME/dataflow-temp',
'--job_name=gcs-gzcomp-to-bq1',
])
pipeline_options = PipelineOptions(pipeline_args)
pipeline_options.view_as(SetupOptions).save_main_session = True
with beam.Pipeline(options=pipeline_options) as p:
(p | "ReadFromGCS" >> ReadFromText(known_args.input)
| WriteToBigQuery('TABLE_NAME', dataset='DATASET_NAME',
project='GCP_PROJECT_NAME', schema='record:string'))
if __name__ == '__main__':
logging.getLogger().setLevel(logging.INFO)
run()
如您所见,我尝试执行与传统加载作业相同的操作,通过指定仅包含一个字符串类型的列的模式,但仍然失败
是否有一种方法可以明确地告诉Dataflow有关我希望如何导入GCS文件的更多详细信息?i、 e.指定TSV,即使它在每行上都是有效的JSON对象
另外,如果这个错误与我可能搞砸的其他事情有关,请也把它说出来;我对Dataflow非常陌生,但对BQ和其他一些GCP工具非常有经验,所以希望将其添加到我的工具带中。我认为
WriteToBigQuery
的输入集合应该是一个字典集合(每个键映射到一个BigQuery列),而不是一个字符串集合。试着通过类似于| beam.Map(lambda行:dict(record=line))
的代码,这样我们就可以看到它的工作原理,以及您拥有的任何云函数了?