如何从 BigQuery 读取分区表到 Spark 数据帧(在 PySpark 中)

Posted

技术标签:

【中文标题】如何从 BigQuery 读取分区表到 Spark 数据帧(在 PySpark 中)【英文标题】:How to read partitioned table from BigQuery to Spark dataframe (in PySpark) 【发布时间】:2019-07-30 23:59:12 【问题描述】:

我有一个 BQ 表,它按默认 _PARTITIONTIME 进行分区。我想将其分区之一读取到 Spark 数据帧(PySpark)。但是,spark.read API 似乎无法识别分区列。以下是代码(不起作用):

table = 'myProject.myDataset.table'

df = spark.read.format('bigquery').option('table', table).load()

df_pt = df.filter("_PARTITIONTIME = TIMESTAMP('2019-01-30')")

分区很大,所以我无法读取为 pandas 数据帧。

非常感谢。

【问题讨论】:

哪一列用于表中的分区?我认为你应该在过滤器中使用它 它在 OP 中,列是 _PARTITIONTIME。问题是在 BQ 中它是一个隐藏列,在上面的代码中,df 无法识别该列。 【参考方案1】:

好问题

我提交了https://github.com/GoogleCloudPlatform/spark-bigquery-connector/issues/50 来跟踪这个。

今天的解决方法是读取 filter 参数

df = spark.read.format('bigquery').option('table', table) \
  .option('filter', "_PARTITIONTIME = '2019-01-30'")).load()

今天应该可以工作。

【讨论】:

【参考方案2】:

尝试使用“$”运算符:https://cloud.google.com/bigquery/docs/creating-partitioned-tables

因此,您要从中提取的表是“myProject.myDataset.table$20190130”

table = 'myProject.myDataset.table'
partition = '20190130'
df = spark.read.format('bigquery').option('table', f'table$partition').load()

【讨论】:

我在发布此问题之前尝试过,但没有成功。错误消息的 sn-p 是:Caused by: com.google.cloud.spark.bigquery.repackaged.io.grpc.StatusRuntimeException: INVALID_ARGUMENT: there was an error creating the session: table decorators are not supported in standard SQL

以上是关于如何从 BigQuery 读取分区表到 Spark 数据帧(在 PySpark 中)的主要内容,如果未能解决你的问题,请参考以下文章

在Apache Spark中使用Bigquery Connector时如何设置分区数?

如何在使用 Spark 读取时将数据分配到 X 分区?

将分区(火花)镶木地板加载到 bigquery 表

Spark - 从 S3 读取分区数据 - 分区是如何发生的?

从 Spark 读取时分区 sql 表数据的问题

多日期数据加载到 BigQuery 分区表中