티스토리 뷰

타조는 일반적인 텍스트 파일(CSV, JSON, 기타..)과 시퀀스 파일, 칼럼 스토리지 파일(RC, ORC, Parquet) 등 다양한 파일 포맷을 지원합니다. 그리고 각 파일 포맷의 표준을 지원하기 때문에 타조에서 만든 시퀀스 파일을 하이브에서 조회할 수 있고, 하이브에서 만든 ORC 파일을 타조에서 조회할 수 있습니다. 마찬가지로 스파크에서 만든 파케이(Parquet) 파일을 타조에서 조회할 수 있고, 타조에서 만든 파케이 파일을 스파크나 하이브에서 조회할 수 있습니다.


하지만 파케이 포맷의 경우 스키마 설정에 주의가 필요합니다. 파케이 파일을 만들때 스키마와 타조에서 테이블 생성시 사용하는 스키마가 100% 일치해야 합니다. 독자분들의 이해를 돕기 위하여 하이브에서 파케이 파일을 만들고, 타조에서 스캔하는 경우를 예로 들어보겠습니다.


우선 하이브에 샘플 테이블을 생성합니다. 필자는 TPC-H 1G 벤치마크 데이터셋의 nation 테이블을 사용했습니다.

hive> CREATE EXTERNAL TABLE nation (

n_nationkey int,

n_name string,

n_regionkey int,

n_comment string)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '|'

LOCATION

hdfs://localhost:9010/tpch/nation';


하이브에서 파케이 테이블 생성합니다.

hive> CREATE TABLE nation_parquet (n_nationkey int, n_name string, n_regionkey int, n_comment string) STORED AS PARQUET;


hive> desc extended nation_parquet;

OK

n_nationkey          int                                     

n_name               string                                  

n_regionkey          int                                     

n_comment            string                                  

Detailed Table Information Table(tableName:nation_parquet, dbName:default, owner:blrunner, createTime:1453880912, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:n_nationkey, type:int, comment:null), FieldSchema(name:n_name, type:string, comment:null), FieldSchema(name:n_regionkey, type:int, comment:null), FieldSchema(name:n_comment, type:string, comment:null)], location:hdfs://localhost:9010/user/hive/warehouse/nation_parquet, inputFormat:org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe, parameters:{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}, skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), storedAsSubDirectories:false), partitionKeys:[], parameters:{totalSize=3216, numRows=25, rawDataSize=100, COLUMN_STATS_ACCURATE=true, numFiles=1, transient_lastDdlTime=1453881026}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE)

Time taken: 0.068 seconds, Fetched: 6 row(s)


텍스트 파일 테이블의 데이터를 파케이 테이블로 로딩합니다.

hive> insert overwrite table nation_parquet select * from nation;


파케이 테이블을 조회합니다.

hive> select * from nation_parquet limit 3;

OK

0 ALGERIA 0 haggle. carefully final deposits detect slyly agai

1 ARGENTINA 1 al foxes promise slyly according to the regular accounts. bold requests alon

2 BRAZIL 1 y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special

Time taken: 0.043 seconds, Fetched: 3 row(s)


5. 타조에서 파케이 테이블을 생성합니다. 이때 LOCATION은 하이브에서 desc 코맨드로 확인한 경로를 사용합니다.

default> create external table nation_parquet_tajo (N_NATIONKEY bigint, N_NAME text, N_REGIONKEY bigint, N_COMMENT text)

using parquet location 'hdfs://localhost:9010/user/hive/warehouse/nation_parquet';


타조의 파케이 테이블의 전체 레코드 건수를 조회합니다.

default> select count(*) from nation_parquet_tajo;

Progress: 100%, response time: 1.892 sec

?count

-------------------------------

25

(1 rows, 1.892 sec, 16 B selected)


이번에는 실제 레코드 내용을 조회합니다. 하지만 레코드가 출력되지 않고, 에러 메세지만 출력됩니다.

default> select * from nation_parquet_tajo limit 3;

n_nationkey,  n_name,  n_regionkey,  n_comment

-------------------------------

ERROR: internal error: internal error: Can not read value at 0 in block -1 in file hdfs://localhost:9010/user/hive/warehouse/nation_parquet/000000_0


왜 건수는 알 수 있는데,  레코드는 조회하지 못할까요? 원인은 하이브와 타조의 스키마가 일치하지 않기 때문입니다. nation 테이블의 스키마를 살펴보면, 하이브에서는 n_nationkey와 n_regionkey 칼럼을 int로 설정했는데, 타조에서는 bigint로 설정했기 때문입니다. 그래서 파케이 파일을 읽을 때, 잘못된 칼럼 타입의 바이트 수만큼 데이터를 읽어서 레코드를 인식하지 못한것입니다.


이제 다음과 같이 하이브 스키마에 맞게 테이블을 생성하면, 데이터가 정상적으로 조회되는 것을 확인할 수 있습니다.

default> create external table nation_parquet_tajo2 (N_NATIONKEY int, N_NAME text, N_REGIONKEY int, N_COMMENT text)

using parquet location 'hdfs://localhost:9010/user/hive/warehouse/nation_parquet';

OK

default> select * from nation_parquet_tajo2 limit 3;

n_nationkey,  n_name,  n_regionkey,  n_comment

-------------------------------

0,  ALGERIA,  0,   haggle. carefully final deposits detect slyly agai

1,  ARGENTINA,  1,  al foxes promise slyly according to the regular accounts. bold requests alon

2,  BRAZIL,  1,  y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special

(3 rows, 0.06 sec, 0 B selected)



저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
댓글
댓글쓰기 폼