Cloud/AWS Cloud Computing

[AWS] Athena 테이블 생성, 데이터 붓기 (CREATE Table, CTAS, INSERT INTO SELECT)

스파이디웹 2023. 1. 20. 09:57
728x90

이번 포스트에는 Athena를 통해 Glue Catalog에 데이터베이스와 테이블을 생성하는 방법을 포스팅 하겠습니다.

*IAM에서 S3, Athena, Glue에 대한 FullAccess 정책을 부여 받았다고 가정하고 실행

 

1. 일반적인 EXTERNAL TABLE 생성

1) 결과 파일 s3경로 지정

settings의 manage 클릭

manage settings의 browse s3로 결과가 담길 S3 URI를 지정


2) database 생성

문법

CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
  [COMMENT 'database_comment']
  [LOCATION 'S3_loc']
  [WITH DBPROPERTIES ('property_name' = 'property_value') [, ...]]

실제 생성

CREATE DATABASE first_db
    COMMENT 'first_database'
    LOCATION 's3://data-lake-s3-withglue/first_db/'

생성된 데이터베이스 확인


3) table 생성

문법

CREATE EXTERNAL TABLE [IF NOT EXISTS]
 [db_name.]table_name [(col_name data_type [COMMENT col_comment] [, ...] )]
 [COMMENT table_comment]
 [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
 [CLUSTERED BY (col_name, col_name, ...) INTO num_buckets BUCKETS]
 [ROW FORMAT row_format]
 [STORED AS file_format] 
 [WITH SERDEPROPERTIES (...)]
 [LOCATION 's3://bucket_name/[folder]/']
 [TBLPROPERTIES ( ['has_encrypted_data'='true | false',] ['classification'='aws_glue_classification',] property_name=property_value [, ...] )

실제 생성

CREATE EXTERNAL TABLE IF NOT EXISTS first_db.tab1(
    col1 string COMMENT 'column1',
    col2 string COMMENT 'column2',
    col3 bigint COMMENT 'column3',
    col4 string COMMENT 'column4'
)
COMMENT 'table1'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 's3://data-lake-s3-withglue/first_db/tab1/'
TBLPROPERTIES ('classification'='csv')

* 참고로 big data 개념에 맞게 athena(glue catalog)에는 PK 및 FK의 개념이 없음

생성된 테이블 확인


4) 데이터 insert

INSERT INTO first_db.tab1 VALUES
('first','one',1,'하나'),
('second','two',2,'둘'),
('third','three',3,'셋'),
('fourth','four',4,'넷'),
('fifth','five',5,'다섯'),
('sixth','six',6,'여섯'),
('seventh','seven',7,'일곱')

데이터(파일) 생성 확인

데이터 조회

select *
from first_db.tab1

2. CTAS(Create Table As Select)

버킷 내에 폴더가 생성되지 않아 있어도, 로케이션을 주면 자동으로 생성 됨

CREATE TABLE first_db.ctas_tab1 
WITH (format = 'parquet',
      write_compression = 'SNAPPY',
      external_location = 's3://data-lake-s3-withglue/first_db/ctas_tab1/'
     )
AS SELECT *
FROM first_db.tab1

테이블 정보 확인

SHOW CREATE TABLE first_db.ctas_tab1

데이터(파일) 생성 확인

데이터 조회


3. SELECT INSERT INTO

1) tab2 생성

tab1과 컬럼의 데이터형식이 동일해야 한다(그래야 데이터가 잘리지도 않을 뿐더러 같은 형식으로 들어오게 된다.)

CREATE EXTERNAL TABLE IF NOT EXISTS first_db.tab2(
    col1 string,
    col2 string,
    col3 bigint,
    col4 string
)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  's3://data-lake-s3-withglue/first_db/tab2/'
TBLPROPERTIES (
  'has_encrypted_data'='false', 
  'parquet.compression'='SNAPPY', 
  'presto_query_id'='20230120_002823_00030_n2p9w')

2) 데이터 입력

INSERT INTO first_db.tab2
SELECT *
FROM first_db.tab1

데이터(파일) 생성 확인

데이터 조회

SELECT *
FROM first_db.tab2

 


4. Glue Data Catalog에서 생성된 DB, Table 확인

 

728x90