繁体   English   中英

在 bigquery 中对列表应用分区

[英]Apply partitioning over a list in bigquery

我使用 FARM_FINGERPRINT function (ABS(MOD(FARM_FINGERPRINT((COUNTRY)),4000) 在国家列的事实表中应用分区)。现在基于包含每个区域的国家列表的不同表(表 1)(例如,在“欧洲”中,我们有“法国”、“德国”、“西班牙”)我想运行一个查询来检测给定区域内的国家/地区列表,并根据该列表应用分区运行 where 子句(以避免全扫描)。但当我运行此查询时,分区未应用:

 WITH step1 AS ( SELECT ARRAY_AGG(ABS(MOD(FARM_FINGERPRINT((MULTIDIVISION_CLUSTER_CODE)),4000))) AS list FROM ( SELECT DISTINCT(MULTIDIVISION_CLUSTER_CODE) AS MULTIDIVISION_CLUSTER_CODE FROM `project.dataset.table1` table1 WHERE table1.MULTIDIVISION_ZONE = "Europe" )), step2 AS( SELECT * FROM `project.dataset.table2` WHERE _hash_partition IN UNNEST((select list from step1)) ) SELECT * FROM step2

有关信息,如果我将“_hash_partition IN UNNEST((从步骤 1 中选择列表)”替换为“_hash_partition IN(2591,287,3623,1537)”或“_hash_partition IN UNNEST(([2591,287,3623,1537]))”它有效(查询不进行全面扫描)

表 1:(地区、国家)

表 2:(日期、区域、国家、_hash_partition、mesure)

您可以尝试下面的动态 sql。 FORMAT function 将生成与您所说的相同的查询。

-- simplified query for *step1* CTE.
CREATE TEMP TABLE step1 AS SELECT [2591,287,3623,1537] AS list;

EXECUTE IMMEDIATE FORMAT("""
WITH step2 AS (
  SELECT
    *
  FROM
    `project.dataset.table2`
  WHERE
    _hash_partition IN UNNEST(%s)
)
SELECT * FROM step2;
""", (SELECT FORMAT('%t', list) FROM step1));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM