从 Big Query python API 调用返回的列列表中删除列

Posted

技术标签:

【中文标题】从 Big Query python API 调用返回的列列表中删除列【英文标题】:Remove a column from a list of columns returned from a Big Query python API call 【发布时间】:2020-07-27 02:16:33 【问题描述】:

我想从 Big Query 查询返回的列列表中删除一列。

我正在使用 python Big Query API 并使用 sql 语句返回列列表:

SELECT column_name FROM `project_id.dataset_id`.INFORMATION_SCHEMA.COLUMNS

然后对返回的结果进行列表:

bq_schema_target = list(query_job.result())

print(bq_schema_target)

返回--->

[Row(('crownumber',), 'column_name': 0), Row(('cstring1',), 'column_name': 0)]

我正在尝试的方法是:

Column = 'cstring1'

if Column in bq_schema_target :
    bq_schema_target.remove(Column)

这种方法在列表中找不到我的列

任何建议将不胜感激。

【问题讨论】:

【参考方案1】:

我了解到您想从您的查询结果中删除列列表中的特定元素。

您尝试使用remove() 方法的方法不起作用,因为list(query_job.result()) 返回一个元组列表。因此,为了访问其中的特定元素,有必要:遍历列表,忽略不需要的元素,将结果附加到新列表中。我为您的案例创建了两种方法。此外,通过以下解决方案,我使用了公共数据集 census_bureau_usa 来测试代码。

首先,部分使用您的代码:

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

list_of_columns=[]

query = """
    SELECT
     column_name
    FROM
     `bigquery-public-data`.census_bureau_usa.INFORMATION_SCHEMA.COLUMNS
    WHERE
     table_name="population_by_zip_2010"
"""

query_job = client.query(query)  # Make an API request
query
bq_schema_target = list(query_job.result())

for row in bq_schema_target:
    if row[0] != "geo_id":
        list_of_columns.append(row)
    
print("Initial list of columns:\n".format(bq_schema_target))
print("\n\n")
print("Final list of columns:\n".format(list_of_columns))

还有输出,

    Initial list of columns:
    [Row(('geo_id',), 'column_name': 0), Row(('zipcode',), 'column_name': 0), Row(('population',), 'column_name': 0), Row(('minimum_age',), 'column_name': 0), Row(('maximum_age',), 'column_name': 0), Row(('gender',), 'column_name': 0)]
    
    Final list of columns:
    [Row(('zipcode',), 'column_name': 0), Row(('population',), 'column_name': 0), Row(('minimum_age',), 'column_name': 0), Row(('maximum_age',), 'column_name': 0), Row(('gender',), 'column_name': 0)]

请注意,名为geo_id 的列未包含在最终列表list_of_columns 中。

其次,在这种方法中,不使用列表方法,而是直接访问查询结果,仅将所需的列附加到最终的列列表中。如下,

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

list_of_columns=[]

query = """
    SELECT
     column_name
    FROM
     `bigquery-public-data`.census_bureau_usa.INFORMATION_SCHEMA.COLUMNS
    WHERE
     table_name="population_by_zip_2010"
"""

query_job = client.query(query)  # Make an API request

for row in query_job:
    if row[0] != "geo_id":
        list_of_columns.append(row[0])
        #print(row[0])
        
#print("Initial list of columns:\n".format(bq_schema_target))
#print("\n\n")
print("Final list of columns:\n".format(list_of_columns))

还有输出,

Final list of columns:
['zipcode', 'population', 'minimum_age', 'maximum_age', 'gender']

再一次,geo_id 列不在最终输出中。

【讨论】:

@BSpinoza,我很高兴知道它有帮助。如果您也能接受答案,我将不胜感激。

以上是关于从 Big Query python API 调用返回的列列表中删除列的主要内容,如果未能解决你的问题,请参考以下文章

Big Query 服务帐号的访问权限已被撤销?

Python GAE - 如何以编程方式将数据从备份导出到 Big Query?

通过 API 将 csv 数据加载到 Big Query

我们可以在 Big Query 中使用 post api 请求插入多行吗?

如何以 CSV 表格格式将原始数据源从 Google Big Query 导出到 R 服务器?

使用 Big Query API 将数据提取到按时间分区的表中,但出现 SyntaxError: Unexpected end of input