본문 바로가기

빅데이터/Kafka

KSQL에러 extraneous input 'properties' expecting

KSQL에서 stream을 생성하다가 아래와 같은 오류를 만났다.

line 3:3: extraneous input 'properties' expecting 
{'INTEGER', 'DATE', 'TIME', 'TIMESTAMP', 'INTERVAL',
'YEAR', 'MONTH', 'DAY', 'HOUR', 'MINUTE', 'SECOND', 
'ZONE', 'PARTITION', 'STRUCT', 'EXPLAIN', 'ANALYZE', 
'TYPE', 'SHOW', 'TABLES', 'COLUMNS', 'COLUMN', 'PARTITIONS', 
'FUNCTIONS', 'FUNCTION', 'ARRAY', 'MAP', 'SET', 'RESET', 'SESSION', 
'IF', IDENTIFIER, DIGIT_IDENTIFIER, QUOTED_IDENTIFIER, BACKQUOTED_IDENTIFIER}

상기와 같은 오류가 난 원인은 아래와 같이 json의 key에 예약어가 있기 때문인데 해당 예약어는 properties이다.

{
   "id":1234,
   "properties": {
      "name":"hong",
      "age":13
   }
}

상기와 같은 json record를 stream으로 만들기 위해서 아래와 같이 명령어를 쳤을 경우 에러가 발생한다.

CREATE STREAM users_original(
  id varchar,
  properties STRUCT<
    name varchar,
    age varchar
  >
)
WITH(KAFKA_TOPIC='users', value_format='json');

에러를 해결하기 위해 아래와 같이 `로 감싸서 생성하면된다.

CREATE STREAM users_original(
  id varchar,
  `PROPERTIES` STRUCT<
    name varchar,
    location varchar
  >
)
WITH(KAFKA_TOPIC='users', value_format='json');

여기서 중요한 것이 properties를 소문자로 하면 select 를 했을때 데이터가 null이 나온다.

반드시 PROPERTIES와 같이 대문자로 적고 `로 감싸야한다.

이 이슈는 현재 KSQL issue에 등록되어 있다.

 

관련 ksql github issue : https://github.com/confluentinc/ksql/issues/677

KSQL syntax : https://docs.confluent.io/current/ksql/docs/developer-guide/syntax-reference.html