如何在 GBQ 中创建具有特定模式的空表?
Posted
技术标签:
【中文标题】如何在 GBQ 中创建具有特定模式的空表?【英文标题】:How to create an empty table with specific schema in 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
再次尝试,我得到了同样的错误。所以我还在想办法。
【参考方案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)
【讨论】:
以上是关于如何在 GBQ 中创建具有特定模式的空表?的主要内容,如果未能解决你的问题,请参考以下文章