Как я могу запустить последовательные временные таблицы и окончательный запрос SELECT - PullRequest
0 голосов
/ 24 мая 2019

Я привык к BigQuery, где я могу запускать временные таблицы с предложением WITH и затем соединять эти временные таблицы с помощью окончательного запроса.Однако теперь я использую базу данных Hive через DataGrip, где я не могу запустить последовательные временные таблицы в одном выполнении запроса.Вместо этого я должен выделить каждый блок временной таблицы (в пределах одного скрипта) и выполнить затем следующий, затем следующий, что очень раздражает.

Справка с двумя элементами:

  1. Кто-нибудь знает, как я могу запустить последовательные временные таблицы и затем, наконец, объединить их все с последним оператором SELECT?

  2. Кроме того, я обнаружил, что временные таблицы хранятся в моем сеансе, и мне нужно удалить их с помощью простой строки кода, которой нет в BigQuery (опять же раздражает).Может кто-нибудь помочь, как я могу справиться с этим?Потому что иногда временные таблицы могут изменять имена столбцов, и я не хочу беспокоиться об удалении предыдущей временной таблицы со старыми именами столбцов.

Вот пример кода:

-- audience temp table  
    CREATE TEMPORARY VIEW aud AS (
   1 SELECT
        exp_luid
    FROM audience_manager.segments5_luid
    WHERE segment_version_id IN (627, 629)
    )

-- KVJ table
    CREATE TEMPORARY VIEW prod AS (
    SELECT
        station_callsign,
        exp_luid,
        ds,
        ad_start_ts_utc as ad_time,
        COUNT(ds) AS impressions
    FROM vizio_production.kantar_vizio_v4_new
    WHERE  product_id = 36325675
        AND ds BETWEEN 20190101 AND 20190430
        AND exp_luid IS NOT NULL
    GROUP BY 1,2,3,4
    )



-- Join KVJ and audience data set
    CREATE TEMPORARY VIEW join_one AS (
    SELECT
        aud.exp_luid AS exp_luid,
        prod.station_callsign AS network,
        prod.ds AS ds,
        prod.ad_time AS ad_time,
        SUM(prod.impressions) AS impressions
    FROM aud
    INNER JOIN prod ON aud.exp_luid = prod.exp_luid
    GROUP BY 1,2,3,4
    )


SELECT * FROM join_one

Окончательное соединение из оператора select 'join_one' без кэширования временных таблиц и запуска всего сценария SQL в одном сценарии.выполнение.

1 Ответ

0 голосов
/ 24 мая 2019

Документация Hive заставляет меня поверить, что это сработает:

WITH aud AS (
SELECT
    exp_luid
FROM audience_manager.segments5_luid
WHERE segment_version_id IN (627, 629)
),


prod AS (
SELECT
    station_callsign,
    exp_luid,
    ds,
    ad_start_ts_utc as ad_time,
    COUNT(ds) AS impressions
FROM vizio_production.kantar_vizio_v4_new
WHERE  product_id = 36325675
    AND ds BETWEEN 20190101 AND 20190430
    AND exp_luid IS NOT NULL
GROUP BY 1,2,3,4
),


join_one AS (
SELECT
    aud.exp_luid AS exp_luid,
    prod.station_callsign AS network,
    prod.ds AS ds,
    prod.ad_time AS ad_time,
    SUM(prod.impressions) AS impressions
FROM aud
INNER JOIN prod ON aud.exp_luid = prod.exp_luid
GROUP BY 1,2,3,4
)


SELECT * FROM join_one

Я не совсем понимаю, зачем вам нужно расширять это до CTE, когда выполнение одного запроса является относительно компактным:

  SELECT
    aud.exp_luid AS exp_luid,
    prod.station_callsign AS network,
    prod.ds AS ds,
    prod.ad_time AS ad_time,
    SUM(prod.impressions) AS impressions
  FROM 
    audience_manager.segments5_luid aud
    INNER JOIN 
    (
      SELECT
        station_callsign,
        exp_luid,
        ds,
        ad_start_ts_utc as ad_time,
        COUNT(ds) AS impressions
      FROM vizio_production.kantar_vizio_v4_new
      WHERE  product_id = 36325675
        AND ds BETWEEN 20190101 AND 20190430
        AND exp_luid IS NOT NULL
      GROUP BY 1,2,3,4
    ) prod 
    ON aud.exp_luid = prod.exp_luid
  WHERE aud.segment_version_id IN (627, 629) 
  GROUP BY 1,2,3,4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...