【问题标题】:How to create an empty table with specific schema in GBQ?如何在 GBQ 中创建具有特定模式的空表?
【发布时间】:2019-12-04 15:17:04
【问题描述】:

我在 .json 文件中有一个架构,我想在 Google Big Query 中用它创建一个空表。

我正在使用 pandas_gbq.to_gbq(dataframe=None, destination_table="{}.{}".format(dataset, table), project_id=project_id, if_exists="fail", table_schema=schema, credentials=credentials_obj)

但我收到错误 AttributeError: 'NoneType' object has no attribute 'dtypes'

如何使用 pandas_gbq 创建一个具有我自己的架构的空表?

编辑以添加 cmets 中请求的架构。

    [
  {
    "name": "my_first_col",
    "type": "INTEGER"
  },
  {
    "name": "my_2nd_col",
    "type": "INTEGER"
  }
    ]

【问题讨论】:

  • 您能否向我们提供您尝试使用的架构示例?
  • 嘿@S.Tyr 我添加了一个关于我的架构外观的示例,架构有更多字段。但我真的认为问题在于 Dataframe 是空的,因此没有列可以充当表中的字段。我希望架构承担该部分并填写字段。
  • 我想知道根本原因是否真的是“空的”。如何创建一个包含一行的表以确保代码真正适用于“非空”表?
  • @YunZhang 我创建了一个pandas.DataFrame({"my_first_co;": [1,2,3], "my_2nd_col": [3, 4, 5]}) 来替换函数中的None 数据框并且它起作用了。然后我用pandas.DataFrame.empty 再次尝试,我得到了同样的错误。所以我还在想办法。

标签: python pandas google-bigquery


【解决方案1】:

正如您所说,“AttributeError”消息是因为您没有将有效对象传递给 pandas_gbq.to_gbq() 方法。所以我建议你传递一个新的 pandas.DataFrame 对象,不带参数。

我做了下一个来复制你所要求的,它奏效了:

import pandas
import pandas_gbq

schema = [
        {"name": "my_first_col", "type": "INTEGER"},
        {"name": "my_2nd_col", "type": "INTEGER"}
    ]

df = pandas.DataFrame()
dataset = "my_dataset"
table = "my_table"
project_id = "my_project_id"

pandas_gbq.to_gbq(dataframe=df, destination_table="{}.{}".format(dataset, table), project_id=project_id, if_exists="fail", table_schema=schema)

该方法期望接收一个可以使用的 pandas.DataFrame 对象,这就是为什么使用 python 中的 None 对象会中断您对 pandas_gbq.to_gbq() 方法的调用。我希望这能解决你的问题。

【讨论】:

    【解决方案2】:

    S。 Tyr 的回答主要对我有用,但我发现架构与 BigQuery 中的新表没有关联。为了解决这个问题,我制作了一个包含列名的列表,并将其作为参数传递给 pandas.DataFrame,如下所示:

    schema = [
            {"name": "my_first_col", "type": "INTEGER"},
            {"name": "my_2nd_col", "type": "INTEGER"}
        ]
    column_names = list()
    for record in schema:
        column_names.append(record['name'])
    df = pandas.DataFrame(columns = column_names)
    

    S. Tyr 的其余代码对我有用。 (为了完整起见,我在下面重新说明,但归功于 S. Tyr)

    dataset = "my_dataset"
    table = "my_table"
    project_id = "my_project_id"
    
    pandas_gbq.to_gbq(dataframe=df, destination_table="{}.{}".format(dataset, table), project_id=project_id, if_exists="fail", table_schema=schema)
    

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 2022-11-03
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多