티스토리 뷰
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 로 필드를 변경하는 방법은 정말 방법이 없을까?
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 관련 명령은 테이블을 복제할때 스키마 정의를 쉽게 해주는 명령어라서 알아둬야 좋은데 이건 나중에 따로 글로 적도록 하겠다.
'데이터처리 > Flink' 카테고리의 다른 글
[Flink] Hive 연동시 슬롯보다 크게 TASK 가 잡히는 문제 (0) | 2022.03.21 |
---|---|
[Flink] yarn-session.sh 오류 : java.lang.NoClassDefFoundError (0) | 2022.03.18 |
[Flink] Yarn 환경에서 세팅시 high-availabillity.cluster-id 충돌문제 (0) | 2022.02.16 |
[FLINK] yarn 세션 모드 : 클러스터 N대로 sql-client 접속하는 방법 (0) | 2022.02.15 |
[Flink] sql-client 에서 쿼리 결과가 안나오는 문제 - checkpoint (0) | 2022.02.05 |