繁体   English   中英

如何将包含字典的Pandas Dataframe写入Bigquery?

[英]How to write Pandas Dataframe containing dictionary to Bigquery?

我有来自 API 的 json 数据,其中包含名为“offset”的页码和“items”,这是一个嵌套的 json,如下所示:

{
    "data": {
        "offset": 0,
        "pageSize": 20,

        "items": [
            {
                "id": "6biewd5a",
                "title": "AAAAAAAAAAAAAA"
             },
                {
                "id": "er45ggg",
                "title": "BBBBBBBBBBBBBBBB"
             }    
                 ]
             }
  }

我正在创建一个 dataframe 来写入 bigquery。 这是我的代码。

import requests
from requests.auth import HTTPBasicAuth
import json
from google.cloud import bigquery


import pandas
import pandas_gbq

URL='xxxxxxxxxxxxxxxxxxxx'


auth = HTTPBasicAuth('name', 'password')

r = requests.get(url=URL ,auth=auth)
  
# extracting data in json format
data = json.loads(json.dumps(r.json()))
# data = r.json()
print(type(data))
offset=str(data['data']['offset'])
json_data=data['data']['items']


type(json_data)

df = pandas.DataFrame(
    {
'offset':offset,     
'json_data':json_data

)
# df['json_data']=df['json_data'].astype('string') 


client = bigquery.Client(project='ncau-data-newsquery-sit')
table_id = 'sdm_adpoint.testfapi1'


job_config = bigquery.LoadJobConfig(
        schema=[
    bigquery.SchemaField("offset", "STRING"),
    bigquery.SchemaField("json_data", "STRING","REPEATED")
    # ,index=[0]

        ],
        autodetect=False

)

df.head()


pandas_gbq.to_gbq(df, table_id, project_id='ncau-data-newsquery-sit',if_exists='append')

我已经像下面这样制作了 dataframe: Dataframe

但是当我使用

pandas_gbq.to_gbq(df, table_id, project_id='ncau-data-newsquery-sit',if_exists='append')

它抛出以下错误:ArrowTypeError: Could not convert {'id': '6biewd5a',......

为了克服这个问题,我尝试了这个:

df['json_data']=df['json_data'].astype('string')

它的工作原理,但它将所有行合并为一个,并将每个字母写在单独的行中

我想把数据写成一行,同样的方式显示在 Pandas dataframe 中。

尝试使用写入 Bigquery

pandas_gbq.to_gbq(df, table_id, project_id='ncau-data-newsquery-sit',if_exists='append')

抛出错误

ArrowTypeError: Could not convert {'id': '6biewd5a',......

然后我试了

df['json_data']=df['json_data'].astype('string')

但是它将所有行合并为一个,并将每个字母写在单独的行中

我想把数据写成一行,同样的方式显示在 Pandas dataframe 中。

您的 json 架构与此处在谷歌云示例https://cloud.google.com/bigquery/docs/nested-repeated#example_schema中给出的架构非常相似

因此您必须对代码中的架构定义进行以下更改。

对于项目架构,您必须如下定义架构

bigquery.SchemaField(
        "items",
        "RECORD",
        mode="REPEATED",
        fields=[
                bigquery.SchemaField("id", "STRING", mode="NULLABLE"),
                bigquery.SchemaField("title", "STRING", mode="NULLABLE"),
             ],
        )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM