0

我正在尝试在这个谷歌公共 BigQuery 表上使用 pySpark (表大小:268.42 GB,行数:611,647,042)。我将集群的区域设置为 US(与BigQuery表相同),但即使在集群中使用多台高性能机器时,代码也非常慢。知道为什么吗?我应该在我的存储桶中创建公共BigQuery表的副本吗?如果是,如何?

from pyspark.sql import SparkSession

spark = SparkSession.builder \
  .master('yarn') \
  .appName('spark-bigquery-crypto') \
  .config('spark.jars', 'gs://spark-lib/bigquery/spark-bigquery-latest_2.12.jar') \
  .getOrCreate()

# Use the Cloud Storage bucket for temporary BigQuery export data used
# by the spark-bigquery-connector.
bucket = "dataproc-staging-us-central1-397704471406-lrrymuq9"
spark.conf.set('temporaryGcsBucket', bucket)

# Load data from BigQuery.
eth_transactions = spark.read.format('bigquery') \
  .option('table', 'bigquery-public-data:crypto_ethereum.transactions') \
  .load()
eth_transactions.createOrReplaceTempView('eth_transactions')

# Perform SQL query.
df = spark.sql('''SELECT * FROM eth_transactions WHERE DATE(block_timestamp) between "2019-01-01" and "2019-01-31"''')
4

1 回答 1

0

这是因为 Spark 需要先将整个表加载到内存中,然后再在 Spark 执行器上运行查询。

如果您直接在 BigQuery UI 上运行此查询,将比使用 Spark 快得多。

如果您的项目足够简单,我建议使用 Composer 之类的调度程序运行 SQL 查询。但是,如果您想坚持使用 Spark,请尝试在 BigQuery 上过滤尽可能多的数据。

于 2021-07-02T15:15:35.107 回答