从 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 调用返回的列列表中删除列的主要内容,如果未能解决你的问题,请参考以下文章
Python GAE - 如何以编程方式将数据从备份导出到 Big Query?
我们可以在 Big Query 中使用 post api 请求插入多行吗?
如何以 CSV 表格格式将原始数据源从 Google Big Query 导出到 R 服务器?
使用 Big Query API 将数据提取到按时间分区的表中,但出现 SyntaxError: Unexpected end of input