【问题标题】:Is there a way to optimize the following insert with PrestoDB?有没有办法使用 PrestoDB 优化以下插入?
【发布时间】:2020-05-02 06:02:07
【问题描述】:

我正在运行一个查询,该查询使用 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;

有没有办法更有效地做到这一点?我找不到任何有关此的资源。

【问题讨论】:

  • 一个选项是单词和数字的映射表,可以在insert之前使用join

标签: regex amazon-s3 hive presto


【解决方案1】:

您可以使用不区分大小写的正则表达式(添加(?i))并去掉LOWER()

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

虽然不区分大小写的正则表达式看起来更简单,但由于并行执行,这对提高性能没有太大帮助。

【讨论】:

  • 谢谢!我认为@vamsi 的建议也有效。我稍后会详细说明。
【解决方案2】:

@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 中的 CASE。由于我每天执行一次基于 CASE 的 SQL,而另一个执行 100 次,这是一个很大的改进。

【讨论】:

    猜你喜欢
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2020-12-24
    • 1970-01-01
    • 2011-04-21
    相关资源
    最近更新 更多