如何从 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时如何设置分区数?