作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个非常大的表,来自通过 Google Cloud Storage 进行的大查询。
表中的字段之一是邮政编码 (00000)。
无论如何,是否可以通过邮政编码查询表,并将结果导出到文件,以邮政编码作为文件名。每个文件都会有该邮政编码的记录。
这可以做到吗?
最佳答案
这是一个 Python 解决方案,我没有使用 BigQuery 导出。最终结果仍以换行符分隔的 json 文件形式保存在存储中(以便随后可以加载回 BigQuery)。它涉及一个查询,但对于非常大的表来说可能会变得昂贵。我使用一个包含一个 ZipCode 列和另外两列(col1、col2)的表作为示例,但这应该不重要。另外,我对身份验证部分进行了硬编码。
#!/usr/bin/python
from argparse import ArgumentParser
from google.cloud import bigquery
from google.cloud import storage
def main(project_id, dataset_id, table_id, bucket_name):
client = bigquery.Client.from_service_account_json('service_account.json',project=project_id)
dataset = client.dataset(dataset_id)
# Create a table for intermediate results
table_ref = client.dataset(dataset_id).table('tmp')
# Query job with 'tmp' as destination
# Group by non grouped/aggregated field ZipCode using ARRAY_AGG
job_config = bigquery.QueryJobConfig()
job_config.destination = table_ref
sql = 'SELECT ZipCode, ARRAY_AGG(STRUCT(col1, col2)) FROM `{}.{}.{}` GROUP BY ZipCode'.format(project_id, dataset_id, table_id)
query_job = client.query(
sql,
location='US',
job_config=job_config)
query_job.result()
storage_client = storage.Client()
bucket = storage_client.get_bucket(bucket_name)
rows = client.list_rows(client.get_table(table_ref))
for row in rows:
record=''
# Rest of row is a list of dictionaries with unicode items
for r in row[1:][0]:
r = {str(k):str(v) for k,v in r.items()}
record+=(str(r))+'\n'
# row[0] will have ZipCode which we want to use to name the exported files
filename=row[0]+'.json'
blob = bucket.blob(filename)
print 'Exporting to gs://{}/{}'.format(bucket_name,filename)
blob.upload_from_string(record)
# Delete the tmp table
client.delete_table(table_ref)
if __name__ == '__main__':
parser = ArgumentParser()
parser.add_argument('-p','--project', help="project where the ZipCode table resides", dest='project_id')
parser.add_argument('-d','--dataset', help="dataset with the ZipCode table", dest='dataset_id')
parser.add_argument('-t','--table', help="ZipCode table", dest='table_id')
parser.add_argument('-b','--bucket', help="destination bucket", dest='bucket')
args = parser.parse_args()
main(args.project_id,args.dataset_id,args.table_id,args.bucket)
关于python - 如何将表导出到以字段值作为文件名而不是部分的文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52371766/
我是一名优秀的程序员,十分优秀!