我有一个很大的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多个小时,并且超时。我正在尝试看看是否可以通过更有效的方式来实现。
答案 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个巨型文件,并且具有所有销钉。我想知道是否可以对这里的表进行分区(如果可能的话)?