有没有办法用prestodb优化下面的insert?

ecfsfe2w  于 2021-06-25  发布在  Hive
关注(0)|答案(2)|浏览(295)

我正在运行一个查询,使用prestodb和awss3(以及元数据的粘合)将数据从源表插入到目标表。
查询如下所示(尽管它有更多的案例):

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;

有没有更有效的方法?我找不到这方面的任何资料。

epggiuax

epggiuax1#

可以使用不区分大小写的regexp(add (?i) )把它扔掉 LOWER() :

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

虽然不区分大小写的regexp看起来更简单,但由于并行执行,它对提高性能没有多大帮助。

acruukt9

acruukt92#

由@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

我将它插入到一个表中,这样我就可以加入到查询中,并在另一个sql中去掉大小写。由于我每天执行一次基于示例的sql,另一次执行100次,这是一个很大的改进。

相关问题