【问题标题】:How to filter on multiple predicates while querying a table in the Spark BigQuery Connector in Scala?如何在 Scala 的 Spark BigQuery 连接器中查询表时过滤多个谓词?
【发布时间】:2021-11-14 09:31:59
【问题描述】:

目前,我有一个要在 Spark 中查询的 BigQuery 表。这张表是按日期分区的,为了查询这张表,必须提供一个过滤器,以便 BQ 可以查询特定的分区。

我正在使用 Spark BigQuery 连接器:https://github.com/GoogleCloudDataproc/spark-bigquery-connector,并且正在使用类似于此处提供的示例的代码:

但是,这需要很长时间,因为该表的大小为数 TB。做"_PARTITION_DATE > '2019-01-01'" 我相信尝试将整个表加载到数据框中,然后运行完全不可行的查询。

由于表已经按日期分区,我希望改为运行类似

.option("filter", "_PARTITION_DATE = '2019-01-01'")

但我想在几个不同的日期执行此操作。有没有办法链接这些选项,以便我可以同时查询多个日期谓词?非常感谢。

【问题讨论】:

  • 我不确定 bigquery 及其连接器的工作原理。但是如果表是分区的,你应该得到分区修剪,因此它应该只扫描与你的谓词匹配的文件夹/文件,而不是扫描整个表。
  • 这个问题似乎与github.com/GoogleCloudDataproc/spark-bigquery-connector/issues/… 有关。从屏幕截图上方的一行中,“您还可以手动指定过滤选项,这将覆盖自动下推,Spark 将在客户端执行其余的过滤。”所以我认为使用过滤器选项不会只返回所需的分区。如果您可以更改伪列名称 _PARTITION_DATE,您可以在 where 语句中使用该列,这有望将请求推送到 BQ Storage API。

标签: scala apache-spark google-cloud-platform google-bigquery bigdata


【解决方案1】:

您可以使用以下过滤器,具体取决于您的用例:

  • _PARTITION_DATE BETWEEN '2019-01-01' AND '2019-01-07'
  • _PARTITION_DATE IN ('2019-01-01', '2019-02-01', '2019-03-01')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 2019-07-19
    相关资源
    最近更新 更多