将googlecloud存储中的JSON上传到bigquery

时间:2017-07-03 01:38:12

标签: json google-bigquery google-cloud-storage uploading

您好这是一个2部分问题

1)目前我正在尝试通过python脚本将文件从谷歌云存储上传到bigquery。我正在尝试按照Google帮助网站提供的步骤进行操作。

https://cloud.google.com/bigquery/docs/loading-data-cloud-storage#bigquery-import-gcs-file-python

def load_data_from_gcs(dataset_name, table_name, source):
    bigquery_client = bigquery.Client()
    dataset = bigquery_client.dataset(dataset_name)
    table = dataset.table(table_name)
    job_name = str(uuid.uuid4())

    job = bigquery_client.load_table_from_storage(
        job_name, table, source)

    job.begin()

    wait_for_job(job)

    print('Loaded {} rows into {}:{}.'.format(
        job.output_rows, dataset_name, table_name))

我不确定要为#34; load_data_from_gcs"的第一行输入什么内容。因为在谷歌云中没有表格是我试图上传的JSON文件。是"表" part是我想要创建的表的名称,还是它正在讨论存储桶,因为没有任何部分可以指定我想要从哪个存储桶中提取。

这是我到目前为止的代码。

import json
import argparse
import time
import uuid

from google.cloud import bigquery
# from google.cloud import storage

def load_data_from_gcs('dataworks-356fa', table_name, 'pullnupload.json'):
    bigquery_client = bigquery.Client('dataworks-356fa')
    dataset = bigquery_client.dataset('FirebaseArchive')
    table = dataset.table(table_name)
    job_name = str(uuid.uuid4())

    job = bigquery_client.load_table_from_storage(
        job_name, table, source)

    job.begin()

    wait_for_job(job)

    print('Loaded {} rows into {}:{}.'.format(
        job.output_rows, dataset_name, table_name))

第2部分) 我希望这个脚本每周运行一次,并且能够删除旧表并创建一个新表,或者只筛选非重复数据。哪个更容易。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

不确定您遇到了什么问题,但是将数据从GCS加载到BigQuery正是您已经在做的事情。

如果您有一个包含此架构的表:

[{"name": "id", "type": "INT64"}, {"name": "name", "type": "STRING"}]

如果您在GCS中有此文件(例如位于“gs://bucket/json_data.json”):

{"id": 1, "name": "test1"}
{"id": 2, "name": "test2"}

您现在只需要设置job对象来处理JSON文件作为输入,如下所示:

def load_data_from_gcs('dataworks-356fa', table_name, 'pullnupload.json'):
    bigquery_client = bigquery.Client('dataworks-356fa')
    dataset = bigquery_client.dataset('FirebaseArchive')
    table = dataset.table(table_name)
    job_name = str(uuid.uuid4())

    job = bigquery_client.load_table_from_storage(
        job_name, table, "gs://bucket/json_data.json")

    job.source_format = 'NEWLINE_DELIMITED_JSON'
    job.begin()

就是这样。

(如果您有CSV文件,则必须相应地设置job对象。

至于第二个问题,这真的是尝试不同的方法,看看哪种方法最适合你。

要删除表格,您只需要运行:

table.delete()

要从表中删除重复数据,一种可能性是编写一个删除重复的查询并将结果保存到同一个表中。类似的东西:

query_job = bigquery_client.run_async_query(query=your_query, job_name=job_name)
query_job.destination = Table object
query_job.write_disposition = 'WRITE_TRUNCATE'
query_job.begin()