雅典娜查询花费很长时间

时间:2020-07-22 01:15:40

标签: amazon-athena

我有一个很大的Textfile文件,该文件用管道分隔,可能超过一百万条记录。我将其复制到s3中,然后将其加载到athena中:

CREATE EXTERNAL TABLE IF NOT EXISTS main
                      ( `pin` string,
                        `service_location_no` string,
                        `practice_type` string)
                      ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
                      WITH SERDEPROPERTIES (
                        'serialization.format' = '|',
                        'field.delim' = '|',
                        'collection.delim' = 'undefined',
                        'mapkey.delim' = 'undefined'
                      ) LOCATION 's3://file_bucket/ci/main_file/main/'
                      TBLPROPERTIES ('has_encrypted_data'='false');

我还有另一个较小的文件(相同格式),并将其加载到雅典娜

 CREATE EXTERNAL TABLE IF NOT EXISTS static
                         ( `pin` string,
                            `service_location_no` string,
                            `practice_type` string)
                      ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
                      WITH SERDEPROPERTIES (
                        'serialization.format' = '|',
                        'field.delim' = '|',
                        'collection.delim' = 'undefined',
                        'mapkey.delim' = 'undefined'
                      ) LOCATION 's3://file_bucket/ci/static_file/static/'
                      TBLPROPERTIES ('has_encrypted_data'='false');
  

所以我现在有2个主表和静态表。两者都有相同的列。 我的目标是创建第3个表,其中包含来自主查询和静态记录的查询。

   CREATE TABLE final
                        WITH (
                          format = 'TEXTFILE',
                          external_location = 's3://file_bucket/ci/final_file/final/',
                          field_delimiter = '|',
                          bucketed_by = ARRAY['pin'],
                          bucket_count = 1
                        ) AS
                        SELECT   *
                FROM     main m
                WHERE   pin NOT IN (SELECT  DISTINCT pin FROM static)
                UNION
                SELECT  * FROM static

这需要2多个小时,并且超时。我正在尝试看看是否可以通过更有效的方式来实现。

2 个答案:

答案 0 :(得分:0)

我认为有两个问题:正如其他人在评论中指出的那样,对NOT IN查询的DISTINCT检查可能很慢,但是另一个可能更重要的问题是分区。 main列中pin中有多少个不同的值?顾名思义,它不是低基数列,但我当然可能错了。可能有太多不同的值要为其写输出。

答案 1 :(得分:0)

我在下面对查询进行了一些调整,它有所帮助。我还不得不将DML查询的超时时间增加到3小时,因为它花了大约2.5小时。

SELECT              m.*
FROM                main m
LEFT OUTER JOIN     static s
   ON               m.pin = s.pin
WHERE               s.pin is null  
 UNION ALL
SELECT * FROM static

主要共有大约100万条记录。 引脚不是唯一的-可以有1行具有唯一的引脚,也可以有1000行具有相同的引脚

我想知道是否可以按引脚对主表或静态表进行分区,但是据我了解,S3中的文件必须按引脚进行分区 但是,我得到了1个巨型文件,并且具有所有销钉。我想知道是否可以对这里的表进行分区(如果可能的话)?