Transform 절

Transform 절

설명

TRANSFORM 절은 사용자가 지정한 명령이나 스크립트를 사용하여 입력을 변환할 수 있게 해줍니다.

출처: 문서

본문

구문

query:
   SELECT TRANSFORM ( expression [ , ... ] )
   [ inRowFormat ]
   [ inRecordWriter ]
   USING command_or_script
   [ AS colName [ colType ] [ , ... ] ]
   [ outRowFormat ]
   [ outRecordReader ]

rowFormat
  : ROW FORMAT
    (DELIMITED [FIELDS TERMINATED BY char]
               [COLLECTION ITEMS TERMINATED BY char]
               [MAP KEYS TERMINATED BY char]
               [ESCAPED BY char]
               [LINES SEPARATED BY char]
     |
     SERDE serde_name [WITH SERDEPROPERTIES
                            property_name=property_value,
                            property_name=property_value, ...])

outRowFormat : rowFormat
inRowFormat : rowFormat
outRecordReader : RECORDREADER className
inRecordWriter: RECORDWRITER record_write_class

참고:

  • MAP ..REDUCE ..는 해당 쿼리에 대해 Hive dialect에서 SELECT TRANSFORM ( ... )의 문법적 변형입니다. 따라서 SELECT TRANSFORM 대신 MAP / REDUCE를 사용할 수 있습니다.

매개변수

  • inRowFormat

    실행 중인 스크립트에 입력 데이터를 공급할 때 사용할 행 형식을 지정합니다. 기본적으로 열은 STRING으로 변환되고 TAB으로 구분되어 사용자 스크립트에 공급됩니다. 마찬가지로 모든 NULL 값은 빈 문자열과 NULL 값을 구분하기 위해 리터럴 문자열 \N으로 변환됩니다.

  • outRowFormat

    실행 중인 스크립트에서 출력을 읽을 때 사용할 행 형식을 지정합니다. 기본적으로 사용자 스크립트의 표준 출력은 TAB으로 구분된 STRING 열로 취급되며, \N만 포함하는 셀은 NULL로 재해석된 후 결과 STRING 열이 테이블 선언에 지정된 데이터 타입으로 일반적인 방식으로 캐스팅됩니다.

  • inRecordWriter

    입력 데이터를 쓰는 데 사용할 writer(정규화된 클래스 이름)를 지정합니다. 기본값은 org.apache.hadoop.hive.ql.exec.TextRecordWriter입니다.

  • outRecordReader

    출력 데이터를 읽는 데 사용할 reader(정규화된 클래스 이름)를 지정합니다. 기본값은 org.apache.hadoop.hive.ql.exec.TextRecordReader입니다.

  • command_or_script

    데이터를 처리할 명령 또는 스크립트 경로를 지정합니다.

    참고:

    • 스크립트 파일을 추가한 후 그 스크립트로 입력을 변환하는 것은 아직 지원되지 않습니다.
    • 사용되는 스크립트는 로컬 스크립트여야 하며 클러스터의 모든 호스트에서 접근 가능해야 합니다.
  • colType

    명령/스크립트의 출력을 캐스팅할 데이터 타입을 지정합니다. 기본값은 STRING 데이터 타입입니다.

( AS colName ( colType )? [, ... ] )?에 대해 다음 동작에 유의하세요.

  • 실제 출력 열 수가 사용자가 지정한 출력 열 수보다 적으면 추가로 지정된 출력 열은 NULL로 채워집니다.
  • 실제 출력 열 수가 사용자가 지정한 출력 열 수보다 많으면 해당하는 열을 유지하면서 실제 출력이 잘립니다.
  • 사용자가 절 ( AS colName ( colType )? [, ... ] )?를 지정하지 않으면 기본 출력 스키마는 (key: STRING, value: STRING)입니다. key 열은 첫 번째 탭 앞의 모든 문자를 포함하고 value 열은 첫 번째 탭 뒤의 나머지 문자를 포함합니다. 탭이 없으면 두 번째 열 value에는 NULL 값이 반환됩니다. 이는 AS key, value를 지정하는 것과 다릅니다. AS key, value의 경우 탭이 여러 개면 value는 첫 번째 탭과 두 번째 탭 사이의 부분만 포함하기 때문입니다.

예시

CREATE TABLE src(key string, value string);
-- transform using
SELECT TRANSFORM(key, value) USING 'cat' from t1;

-- transform using with specific record writer and record reader
SELECT TRANSFORM(key, value) ROW FORMAT SERDE 'MySerDe'
 WITH SERDEPROPERTIES ('p1'='v1','p2'='v2')
 RECORDWRITER 'MyRecordWriter'
 USING 'cat'
 ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
 RECORDREADER 'MyRecordReader' FROM src;

-- use keyword MAP instead of TRANSFORM
FROM src INSERT OVERWRITE TABLE dest1 MAP src.key, CAST(src.key / 10 AS INT) USING 'cat' AS (c1, c2);

-- specific the output of transform
SELECT TRANSFORM(key, value) USING 'cat' AS c1, c2;
SELECT TRANSFORM(key, value) USING 'cat' AS (c1 INT, c2 INT);

더 알아보기 (Learn more)