我有一个用一系列客户的产品数据填充的BigQuery表。已使用查询将数据展平。我想以csv格式将每个客户端的数据导出到Google Cloud Storage存储桶中-这样每个客户端都有自己的csv。
这里有100多个客户机,每个客户机都有一个client_id,表本身的大小是1 1GB。我已经研究过使用云函数来查询表,但这将花费超过100,000 GB的数据。我还研究了如何将客户端直接从源导入到各个表中,但我需要在每个表上运行扁平化查询-这同样会导致很高的数据成本。
有没有办法限制数据的使用?
发布于 2021-10-19 08:13:45
正如@Mr.Batra所提到的,您可以基于client_id在表上创建partitions,以控制查询的数据量和成本。
实现云函数并在没有分区的情况下遍历每个客户端id将花费更多成本,因为对于每个SELECT * FROM table WHERE client_id=xxx,查询将扫描整个表。
发布于 2021-10-18 18:05:56
你有没有考虑过Dataproc?
您可以编写简单的PySpark脚本,在其中从BigQuery加载数据,并通过client_id将数据写入Bucket splitting,如下所示:
"""
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()您需要:
假设你有如下架构:
bigquery:myproject:mydataset.mytable
存储桶:gs://mybucket/
数据处理集群集群:my-
因此,您需要运行以下命令:
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
https://stackoverflow.com/questions/69612600
复制相似问题