如何在 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 中创建具有特定模式的空表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中创建具有特定间隔的向量?

如何在Java中创建具有特定结构的XML文件[重复]

如何在 C++ 中从现有 2D 向量中创建具有特定列的新向量

如何在 numpy 中创建一个“接受”附加的空列表网格?

如何在 pyspark 中处理 Glue 数据目录中的空表

在脚本的空表中删除具有 PK 约束的列