Как отфильтровать значения столбцов по списку строк
Я пытаюсь отфильтровать набор данных, сравнивая список строк со значениями столбцов.
Это хорошо работает с LIKE и одной строкой, используя 3 ГБ.
#standardSQL
SELECT substr(CAST((DATE) AS STRING),0,8) as daydate,
count(1) as count,
avg(CAST(REGEXP_REPLACE(V2Tone, r',.*', "")AS FLOAT64)) tone,
avg(SAFE_CAST(REGEXP_EXTRACT(GCAM, r'c1.3:(\d+)') as FLOAT64)) anew,
sum(SAFE_CAST(REGEXP_EXTRACT(GCAM, r'c12.1:(\d+)') as FLOAT64))
ridanxietycnt,
sum(SAFE_CAST(REGEXP_EXTRACT(GCAM, r'wc:(\d+)') as FLOAT64)) wordcount
FROM `gdelt-bq.gdeltv2.gkg_partitioned` t
where _PARTITIONTIME BETWEEN TIMESTAMP('2019-02-02') AND TIMESTAMP('2019-
02-02')
AND V2Themes LIKE 'ECON_INFLATION'
group by daydate
Однако при использовании более одной строки с "LIKE" запрос внезапно становится очень большим (8 ТБ).
#standardSQL
SELECT substr(CAST((DATE) AS STRING),0,8) as daydate,
count(1) as count,
avg(CAST(REGEXP_REPLACE(V2Tone, r',.*', "")AS FLOAT64)) tone,
avg(SAFE_CAST(REGEXP_EXTRACT(GCAM, r'c1.3:(\d+)') as FLOAT64)) anew,
sum(SAFE_CAST(REGEXP_EXTRACT(GCAM, r'c12.1:(\d+)') as FLOAT64))
ridanxietycnt,
sum(SAFE_CAST(REGEXP_EXTRACT(GCAM, r'wc:(\d+)') as FLOAT64)) wordcount
FROM `gdelt-bq.gdeltv2.gkg_partitioned` t
where _PARTITIONTIME BETWEEN TIMESTAMP('2019-02-02') AND TIMESTAMP('2019-
02-02')
AND V2Themes LIKE 'ECON_INFLATION' OR V2Themes LIKE 'ECON_STOCKMARKET'
group by daydate
Есть ли более эффективный (и дешевый) способ сравнить значения столбцов со списком строк? Любые идеи будут очень признательны.
1 ответ
Решение
Осторожно с логикой и OR
приоритет.
Эта:
WHERE _PARTITIONTIME BETWEEN TIMESTAMP('2019-02-02') AND TIMESTAMP('2019-02-02')
AND V2Themes LIKE 'ECON_INFLATION'
OR V2Themes LIKE 'ECON_STOCKMARKET'
не то же самое, что:
WHERE _PARTITIONTIME BETWEEN TIMESTAMP('2019-02-02') AND TIMESTAMP('2019-02-02')
AND (
V2Themes LIKE 'ECON_INFLATION'
OR V2Themes LIKE 'ECON_STOCKMARKET'
)
Первый не фильтрует разделение, а второй -.