티스토리 뷰

반응형

flink 에서는 create table like 구분이 있어서, 필드가 동일한 필드를 상속받듯이 필드선언을 할 수 있다. 

하지만 alter table 에 대한 document 를 확인해보면, 테이블의 이름과 테이블 속성값만 바꿀수 있다.

https://nightlies.apache.org/flink/flink-docs-master/docs/dev/table/sql/alter/#alter-table

 

재밌는건, table api 에는 addColumns, AddOrReplaceColumns, DropColumns 가 지원되지만, sql 로는 이걸 사용할수 없다는점이다. 그럼 flink 에서 sql 로 필드를 변경하는 방법은 정말 방법이 없을까?

https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/dev/table/tableapi/#column-operations

sql 로 필드를 변경하기

삽질을 하다가 알아낸건 한가지 꼼수가 있다. 이것도 완벽하다고 볼순 없지만 Hive Dialect 를 이용해서 hql 의 표현을 빌리면 변경이 가능하다. 예를 들면 다음과 같이 꼼수(?)를 통해 필드타입을 바꾸거나 혹은 필드명을 변경할 수 있다.

create table sample (
  id STRING,
  created_at BIGINT
);

-- created_at 의 타입을 BIGINT -> STRING 으로 바꾸기
SET 'table.sql-dialect' = 'hive';
ALTER TABLE sample CHANGE created_at created_at STRING;
SET table.sql-dialect=default;

describe 명령을 통해 스키마를 확인하면 타입이 BIGINT 가 아닌 STRING 으로 바뀐걸 알수 있다.

주의할점?

Hive Dialect 를 이용하면 필드의 이름을 바꾸거나, 타입을 바꿀수 있는데 주의할점이 있다.

이렇게 사용하면, Table 속성정보에 alter.table.op 라는 속성이 붙는다. 이게 뭔 대수냐고 할수 있지만, 보통 flink 에서 테이블을 선언할때는 connector 를 연결해서 사용하다보니, 이 속성이 추가되면 알수없는 속성이라고 에러를 뱉을수 있다.

Flink SQL> show create table sample;
CREATE TABLE `default_catalog`.`default_database`.`sample` (
  `id` VARCHAR(2147483647),
  `created_at` VARCHAR(2147483647)
) WITH (
  'alter.table.op' = 'ALTER_COLUMNS'
)

실제로 elasticsearch 를 연동한 테이블의 타입을 이런 꼼수로 변경했는데, elasticsearch connector 에서는 'alter.table.op' 라는 옵션이 없기 때문에 지원하지 않는 옵션이라고 에러를 뱉었다. 그래서 이 문제때문에 create table like 문을 이용해서 또 제 3의 테이블을 만들어 재복재하고 속성을 다시 지정하는걸로 해결했었다.

 

create table 에서 like 관련 명령은 테이블을 복제할때 스키마 정의를 쉽게 해주는 명령어라서 알아둬야 좋은데 이건 나중에 따로 글로 적도록 하겠다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함