当前位置: 首页 > 知识库问答 >
问题:

JSON上载到BigQuery

古凌
2023-03-14

我试图使用两个成功部署的云函数和一个成功运行的云调度器来自动化向BigQuery上传JSON数据。运行云调度器后,数据会上传到云存储中,但不会上传到BigQuery。

下面是我的代码和JSON数据:

# function 1 triggered by http
def function(request):
    url = "https://api...."
    headers = {"Content-Type" : "application/json",
            "Authorization" : "..."}
        
    response = requests.get(url, headers=headers)

    json_data = response.json()
    pretty_json = json.dumps(json_data, indent=4, sort_keys=True)

    storage_client = storage.Client()
    bucket = storage_client.bucket("bucket_name")
    blob = bucket.blob("blob_name")

    blob.upload_from_string(pretty_json)
# function 2 triggered by cloud storage -> event type finalize/create
def function_2(data, context):
    client = bigquery.Client()

    table_id = "booming-post-322920:dataset_name.table_name"

    job_config = bigquery.LoadJobConfig()
    job_config.schema=[
        bigquery.SchemaField("order_items", "INTEGER"),
        bigquery.SchemaField("created_at", "TIMESTAMP"),
        .....,     
        bigquery.SchemaField("updated_at", "TIMESTAMP")
    ]

    job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON

    uri = 'gs://bucket_name/blob_name' 

    load_job = client.load_table_from_uri(
        uri,
        table_id,
        location="US",  
        job_config=job_config
    ) 

    load_job.result()  

这就是我的JSON数据pretty_json的样子:

{
    "records": [
        {
            "active": null,
            "approved": null,
            "buyer": [
                1
            ],
            "cancel_reason": null,
            "cancelled": null,
            "chef": [
                1
            ],
            "completed": null,
            "created_at": "2021-07-15T17:44:31.064Z",
            ...

请指教。

共有1个答案

柯冯浩
2023-03-14

我认为主要问题是JSON文件的格式:您按照BigQuery的要求指定了换行分隔的JSON格式(BigQuery.sourceformat.newline_delimited_json),但JSON不符合该格式。

请考虑对第一个函数进行以下修改:

def function(request):
    url = "https://api...."
    headers = {"Content-Type" : "application/json",
            "Authorization" : "..."}
        
    response = requests.get(url, headers=headers)

    json_data = response.json()
    
    records = [json.dumps(record) for record in json_data["records"]]
    records_data = "\n".join(records)

    storage_client = storage.Client()
    bucket = storage_client.bucket("bucket_name")
    blob = bucket.blob("blob_name")

    blob.upload_from_string(records_data)

您的JSON现在看起来如下所示:

{"active": null, "approved": null, "buyer": [1], "cancel_reason": null, "cancelled": null, "chef": [1], "completed": null, "created_at": "2021-07-15T17:44:31.064Z", "delivery": false, "delivery_address": null, "delivery_fee": null, "delivery_instructions": null, "discount": 0, "id": 1, "name": "Oak's Order", "notes": null, "order_delivery_time": null, "order_id": null, "order_ready_time": null, "order_submitted_time": null, "paid": null, "pickup_address": "", "promo_applied": null, "promo_code": null, "rated": null, "ratings": null, "review": null, "seller": [1], "status": "In Process", "tax": null, "tip": 0, "total": null, "type": "Pick Up", "updated_at": "2021-07-15T17:44:31.064Z"}
{"active": null, "approved": null, "buyer": [2], "cancel_reason": null, "cancelled": null, "chef": [1], "completed": null, "created_at": "2021-07-15T17:52:53.729Z", "delivery": false, "delivery_address": null, "delivery_fee": null, "delivery_instructions": null, "discount": 0, "id": 2, "name": "Shuu's Order", "notes": null, "order_delivery_time": null, "order_id": null, "order_ready_time": null, "order_submitted_time": null, "paid": null, "pickup_address": "", "promo_applied": null, "promo_code": null, "rated": null, "ratings": null, "review": null, "seller": [1], "status": "In Process", "tax": null, "tip": 0, "total": null, "type": "Pick Up", "updated_at": "2021-07-15T17:52:53.729Z"}

此外,在第二个函数中,正如@Caiot在他/她的评论中指出的那样,需要根据GCS存储触发器事件定义,更改函数签名以接受两个参数:eventcontext

此外,请考虑检查BigQuery模式定义中order_items字段的定义,根据您的JSON该字段不存在。

在导入JSON数据时也要注意BigQuery施加的限制,尤其是在处理时间戳时。

默认情况下,在运行时,您的函数将假设您的App Engine服务帐户,尽管您也可以提供特定的服务帐户。在任何情况下,都要确保服务帐户对BigQuery和您的BigQuery表具有必要的权限。基本上,您的服务帐户必须是bigquery.user,并且是数据集的writer(或者等效地,bigquery.dataeditor)。请参阅GCP文档中提供的示例。

 类似资料:
  • 问题内容: 我想将表单内的文件上传到Spring Boot API端点。 UI用React编写: 这是java边码: 但是我在Java方面遇到了这个异常: 我应该如何解决这个问题?类似的API端点和JavaScript辅助代码已在工作。 注意 我已经看到了一个解决方案,其中建议请求主体应具有2个属性:一个位于JSON部分之下,另一个用于图像。我想看看是否有可能将其自动转换为DTO。 更新1 客户端

  • 我见过一个解决方案,它建议请求体应该有两个属性:一个是JSON部分下的属性,另一个是图像的属性。我想看看是否有可能将它自动转换为DTO。 客户端发送的上载有效负载应转换为以下DTO: 所以可以说它是JSON和Multipart的混合体。 在前端,去掉,因为它应该由浏览器本身确定,而使用(标准JavaScript)。那应该能解决问题了。

  • 本文向大家介绍Python上载到PyPI,包括了Python上载到PyPI的使用技巧和注意事项,需要的朋友参考一下 示例 一旦您setup.py的功能完全正常(请参阅“简介”),就很容易将包上传到PyPI。 设置一个.pypirc文件 该文件存储登录名和密码以验证您的帐户。它通常存储在您的主目录中。 twine用于上传软件包更安全,因此请确保已安装。 注册并上传到testpypi(可选) 注意:P

  • 我从BQ下载了一个表格到PySpark RDD,如下所示。我如何再次上传它?

  • 问题内容: 在使用库在JavaScript中绘制图表时,我还是一个新手。我刚刚开始尝试使用Chartjs,但一直无法使用getJson或其他任何方式加载我的json对象并替换标签和数据。我以前使用过HighCharts,相比之下,它非常简单。另外,我将如何将其放入Angular的指令中并显示出来。 https://jsfiddle.net/0u9Lpttx​​/1/ index.html data

  • 努力将json从URL上的文件(myData.json)加载到对象中,以便访问属性值。 --数据立即加载,我在应用程序中非常需要它。 -我将访问整个应用程序中的数据,而不仅仅是数据加载后立即发生的一个函数的一部分。 --我已确保文件中的数据格式正确。 按照jQuery API上的示例,我不应该做一些简单的事情,比如: 警报(jqxhr.my财产); 得到价值吗?我错过了哪一步?我试过做评估和其他类