Есть ли способ оптимизировать следующую вставку с PrestoDB? - PullRequest
1 голос
/ 15 января 2020

Я выполняю запрос, который вставляет данные из исходной таблицы в таблицу назначения, используя PrestoDB и AWS S3 (и Glue для метаданных).

Запрос выглядит следующим образом (даже если он есть еще много случаев):

INSERT INTO my_table
SELECT other_field AS other_field ,
       (CASE
            WHEN regexp_like(LOWER(user_agent) , LOWER('bot')) THEN '1'
            WHEN regexp_like(LOWER(user_agent) , LOWER('spider')) THEN '2'
            WHEN regexp_like(LOWER(user_agent) , LOWER('crawler')) THEN '3'
            WHEN regexp_like(LOWER(user_agent) , LOWER('Google-AdSense-Auto')) THEN '4'
            WHEN regexp_like(LOWER(user_agent) , LOWER('Google-Adwords-DisplayAds-WebRender')) THEN '5'
            ELSE NULL
        END) AS bot_type
FROM source_table;

Есть ли способ сделать это более эффективно? Я не смог найти никаких ресурсов по этому поводу.

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Вы можете использовать регулярное выражение без учета регистра (добавьте (?i)) и избавиться от LOWER():

WHEN regexp_like(user_agent,'(?i)bot') THEN '1' 
WHEN regexp_like(user_agent,'(?i)spider') THEN '2'
...

Это не поможет значительно повысить производительность из-за параллельного выполнения, хотя регистр не учитывается регулярное выражение выглядит проще.

1 голос
/ 15 января 2020

Предложено @Vamsi Prabhala

WITH
user_agents AS
    (SELECT DISTINCT
            headers_user_agent
        FROM
            source_table
        WHERE
            YEAR = '2020')
bot_types AS
    (SELECT
      headers_user_agent,
      (CASE
        WHEN regexp_like(LOWER(headers_user_agent), LOWER('bot'))     THEN '2'
        WHEN regexp_like(LOWER(headers_user_agent), LOWER('spider'))  THEN '3'
        ELSE NULL)
        AS
          bot_type
        FROM
          user_agents)
SELECT
  *
FROM
  bot_types
WHERE
  bot_type IS NOT NULL

Я вставляю это в таблицу, чтобы присоединиться к запросу и избавиться от CASE в другом SQL. Поскольку я выполняю основанный на CASE SQL один раз, а другой - 100 раз в день, это большое улучшение.

...