FLATTEN в BigQuery (устаревшая SQL) приводит к потере записей - PullRequest
0 голосов
/ 06 августа 2020

В BigQuery, устаревший SQL, у меня есть этот запрос (после серьезного упрощения и анонимности конфиденциальные данные мне не разрешено раскрывать):

SELECT
    TABLE1.t as t,
    TABLE1.feat1 as feat1,
    TABLE1.feat2 as feat2,
    TABLE1.id as id,
    TABLE1.feat3 as feat3,
    TABLE2.time2 as time2,
FROM
    (SELECT
       time.hour as t,
       feat1,
       feat2,
       feat4,
       featA.id as id,
       feat3,
     FROM FLATTEN(BIGTABLE, featA.id)
     WHERE _PARTITIONTIME > TIMESTAMP(1590883200+9*60*60*24) AND _PARTITIONTIME <= TIMESTAMP(1590883200+11*60*60*24)
     AND feat2 = "ab" and feat1 = "AB" and feat4 = "DD"
     AND featA.id = "somehash" and feat3 = "KD"
     GROUP BY 1,2,3,4,5,6) as TABLE1

  LEFT JOIN (
     SELECT
        featB.share_time.hour as t,
        time.hour as time2,
        featB.id as id,
        feat2,
        featB.feat1,
        featB.feat4 as feat4,
        featB.feat3 as feat3,
     FROM BIGTABLE
     WHERE featB.id IS NOT NULL
     and _PARTITIONTIME > TIMESTAMP(1590883200+10*60*60*24) AND _PARTITIONTIME <= TIMESTAMP(1590883200+11*60*60*24)
     AND featB.time_since_event < 1440
     GROUP BY 1,2,3,4,5,6,7
    ) as TABLE2 
  ON TABLE2.t = TABLE1.t
     AND TABLE2.id = TABLE1.id
     AND TABLE2.feat4 = TABLE1.feat4
     AND TABLE2.feat2 = TABLE1.feat2
     AND TABLE2.feat1 = TABLE1.feat1
     AND TABLE2.feat3 = TABLE1.feat3
  order by t

Сейчас. Проблема в том, что удаление предложения FLATTEN приводит к другим результатам, чем его сохранение (т. Е. FROM FLATTEN(BIGTABLE, featA.id) приводит к другим результатам, чем просто FROM BIGTABLE), и с FLATTEN я теряю некоторые строки, которые мне нужны.

Две части _PARTITIONTIME намеренно различаются, чтобы разрешить инкрементную загрузку таблицы, позволяя при этом LEFT JOIN не терять данные из-за _PARTITIONTIME. Если оба _PARTITIONTIME похожи, тогда я не вижу проблемы (но я не могу загружать данные постепенно).

Это особенно проблема здесь, потому что в исходном запросе-монстре, что * За 1014 * следовало LEFT JOIN на featA.id, а FLATTEN требуется (насколько я знаю), чтобы избежать дублирования регистров featA.id.

Кроме того, если я выделю этот подзапрос в, просто:

SELECT
       time.hour as t,
       feat1,
       feat2,
       feat4,
       featA.id as id,
       feat3,
FROM FLATTEN(BIGTABLE, featA.id)
WHERE _PARTITIONTIME > TIMESTAMP(1590883200+9*60*60*24) AND _PARTITIONTIME <= TIMESTAMP(1590883200+11*60*60*24)
AND feat2 = "ab" and feat1 = "AB" and feat4 = "DD"
AND featA.id = "somehash" and feat3 = "KD"
GROUP BY 1,2,3,4,5,6

результат идентичен независимо от того, присутствует FLATTEN или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...