首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于客户端id从BigQuery导出到CSV

基于客户端id从BigQuery导出到CSV
EN

Stack Overflow用户
提问于 2021-10-18 08:01:21
回答 2查看 146关注 0票数 0

我有一个用一系列客户的产品数据填充的BigQuery表。已使用查询将数据展平。我想以csv格式将每个客户端的数据导出到Google Cloud Storage存储桶中-这样每个客户端都有自己的csv。

这里有100多个客户机,每个客户机都有一个client_id,表本身的大小是1 1GB。我已经研究过使用云函数来查询表,但这将花费超过100,000 GB的数据。我还研究了如何将客户端直接从源导入到各个表中,但我需要在每个表上运行扁平化查询-这同样会导致很高的数据成本。

有没有办法限制数据的使用?

EN

回答 2

Stack Overflow用户

发布于 2021-10-19 08:13:45

正如@Mr.Batra所提到的,您可以基于client_id在表上创建partitions,以控制查询的数据量和成本。

实现云函数并在没有分区的情况下遍历每个客户端id将花费更多成本,因为对于每个SELECT * FROM table WHERE client_id=xxx,查询将扫描整个表。

票数 1
EN

Stack Overflow用户

发布于 2021-10-18 18:05:56

你有没有考虑过Dataproc?

您可以编写简单的PySpark脚本,在其中从BigQuery加载数据,并通过client_id将数据写入Bucket splitting,如下所示:

代码语言:javascript
复制
"""
File takes 3 arguments:
    BIGQUERY-SOURCE-TABLE
        desc: table being source of data in BiqQuery
        format: project.dataset.table (str)
    
    BUCKET-DEST-FOLDER
        desc: path to bucket folder where CSV files will be stored
        format: gs://bucket/folder/ (str)
    
    SPLITER:
        desc: name of column on which spit will be done during data saving
        format: column-name (str)
"""

import sys
from pyspark.sql import SparkSession

if len(sys.argv) != 4:
    raise Exception("""Usage: 
                    filename.py BIGQUERY-SOURCE-TABLE BUCKET-DEST-FOLDER SPLITER"""
                    )


def main():
    spark = SparkSession.builder.getOrCreate()

    df = (
        spark.read
        .format("bigquery")
        .load(sys.argv[1])
        )

    (
        df
        .write
        .partitionBy(sys.argv[2])
        .format("csv")
        .option("header", True)
        .mode("overwrite").
        save(sys.argv[3])
    )

if __name__ == "__main__":
    main()

您需要:

  1. 将此脚本保存在Google Bucket中,
  2. 创建数据过程群集一段时间,下面编写的
  3. 运行命令,
  4. 删除数据过程群集。

假设你有如下架构:

bigquery:myproject:mydataset.mytable

存储桶:gs://mybucket/

数据处理集群集群:my-

因此,您需要运行以下命令:

代码语言:javascript
复制
gcloud dataproc jobs submit pyspark gs://mybucket/script-from-above.py \
--cluster my-cluster \
--region [region-of-cluster] \
--jars gs://spark-lib/bigquery/spark-bigquery-latest_2.12.jar \
-- \
myproject:mydataset.mytable gs://mybucket/destination/ client_id

这将保存在由client_id拆分的gs://mybucket/destination/数据中,您的文件将命名为:

client_id=1

client_id=2

..。

client_id=n

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69612600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档