SQL 기반 수집으로 파일 로드하기
SQL 기반 수집으로 파일 로드하기 (Load files with SQL-based ingestion)
Druid 24.0에 새로 추가된 druid-multi-stage-query 확장 프로그램을 사용하는 SQL 기반 배치 수집을 설명하는 페이지예요. Connect external data 마법사로 외부에 호스팅된 데이터를 참조하는 쿼리를 생성하는 방법을 보여 드릴게요.
출처: 문서
본문
어떤 수집 방법이 적합한지 결정하려면 수집 방법 (ingestion methods) 표를 참고해 주세요.
다음 예시는 EXTERN 을 사용해 https://druid.apache.org/data/wikipedia.json.gz 에 있는 JSON 파일을 쿼리해요.
UI에서 쿼리를 수동으로 만들 수도 있지만, Druid가 요구 사항에 맞게 수정할 수 있는 기본 쿼리를 생성해 주게 할 수도 있어요.
외부 데이터에서 쿼리를 생성하려면 다음을 수행해 주세요:
-
웹 콘솔의 Query 뷰에서 Connect external data 를 클릭해 주세요.
-
Select input type 화면에서 HTTP(s) 를 선택하고 URIs 필드에 다음 값을 입력해 주세요:
https://druid.apache.org/data/wikipedia.json.gz. HTTP auth 사용자 이름과 비밀번호는 비워 두세요. -
Connect data 를 클릭해 주세요.
-
Parse 화면에서 데이터를 Druid에 로드하기 전에 추가 작업을 수행할 수 있어요:
- 행을 펼쳐서 소스의 어떤 데이터에 대응하는지 확인해 보세요.
- Input format 과 관련 옵션(예: JSON 파일의 경우 JSON 파서 기능 추가)을 선택해 Druid가 데이터를 처리하는 방식을 사용자 지정해 주세요.
-
준비되면 Done 을 클릭해 주세요. 외부 소스의 데이터를
wikipedia라는 테이블에 삽입할 시작 쿼리를 볼 수 있는 Query 뷰로 돌아가요:쿼리 보기 (Show the query)
REPLACE INTO "wikipedia" OVERWRITE ALL WITH ext AS ( SELECT * FROM TABLE ( EXTERN ( '{"type":"http","uris":["https://druid.apache.org/data/wikipedia.json.gz"]}' , '{"type":"json"}' , '[{"name":"isRobot","type":"string"},{"name":"channel","type":"string"},{"name":"timestamp","type":"string"},{"name":"flags","type":"string"},{"name":"isUnpatrolled","type":"string"},{"name":"page","type":"string"},{"name":"diffUrl","type":"string"},{"name":"added","type":"long"},{"name":"comment","type":"string"},{"name":"commentLength","type":"long"},{"name":"isNew","type":"string"},{"name":"isMinor","type":"string"},{"name":"delta","type":"long"},{"name":"isAnonymous","type":"string"},{"name":"user","type":"string"},{"name":"deltaBucket","type":"long"},{"name":"deleted","type":"long"},{"name":"namespace","type":"string"},{"name":"cityName","type":"string"},{"name":"countryName","type":"string"},{"name":"regionIsoCode","type":"string"},{"name":"metroCode","type":"long"},{"name":"countryIsoCode","type":"string"},{"name":"regionName","type":"string"}]' ) ) ) SELECT TIME_PARSE ( "timestamp" ) AS __time , isRobot , channel , flags , isUnpatrolled , page , diffUrl , added , comment , commentLength , isNew , isMinor , delta , isAnonymous , user , deltaBucket , deleted , namespace , cityName , countryName , regionIsoCode , metroCode , countryIsoCode , regionName FROM ext PARTITIONED BY DAY -
쿼리를 검토하고 필요에 맞게 수정해 주세요. 예를 들어 테이블 이름을 바꾸거나 세그먼트 granularity를 변경할 수 있어요.
ALL이 아닌 다른 것으로 파티셔닝하려면SELECT문에TIME_PARSE("timestamp") AS __time를 포함해 주세요. 예를 들어 일(day) 기반 세그먼트 granularity를 지정하려면 파티셔닝을PARTITIONED BY DAY로 변경하면 돼요:INSERT INTO . . . SELECT TIME_PARSE ( "timestamp" ) AS __time , . . . . . . PARTITIONED BY DAY -
선택적으로 Preview 를 선택해 수집하기 전에 데이터를 검토해 주세요. 미리 보기는
REPLACE INTO절 없이LIMIT을 추가해 쿼리를 실행해요. 삽입을 확정하기 전에 데이터의 대략적인 모양을 볼 수 있어요.LIMIT덕분에 쿼리가 더 빨리 실행되지만 결과가 불완전할 수 있어요. -
Run 을 클릭해 쿼리를 실행해 주세요. 쿼리는 지속 시간과 테이블에 삽입된 행 수를 포함한 정보를 반환해요.
데이터 쿼리하기 (Query the data)
수집이 완료된 뒤 wikipedia 테이블을 쿼리할 수 있어요. 예를 들어 테이블의 데이터를 분석해 상위 채널 목록을 만들 수 있어요:
SELECT
channel,
COUNT(*)
FROM "wikipedia"
GROUP BY channel
ORDER BY COUNT(*) DESC
EXTERN 함수를 사용하면 먼저 수집하지 않고도 외부 데이터에서 같은 쿼리를 직접 실행할 수 있어요:
쿼리 보기 (Show the query)
SELECT
channel,
COUNT(*)
FROM TABLE(
EXTERN(
'{"type": "http", "uris": ["https://druid.apache.org/data/wikipedia.json.gz"]}',
'{"type": "json"}',
'[{"name": "added", "type": "long"}, {"name": "channel", "type": "string"}, {"name": "cityName", "type": "string"}, {"name": "comment", "type": "string"}, {"name": "commentLength", "type": "long"}, {"name": "countryIsoCode", "type": "string"}, {"name": "countryName", "type": "string"}, {"name": "deleted", "type": "long"}, {"name": "delta", "type": "long"}, {"name": "deltaBucket", "type": "string"}, {"name": "diffUrl", "type": "string"}, {"name": "flags", "type": "string"}, {"name": "isAnonymous", "type": "string"}, {"name": "isMinor", "type": "string"}, {"name": "isNew", "type": "string"}, {"name": "isRobot", "type": "string"}, {"name": "isUnpatrolled", "type": "string"}, {"name": "metroCode", "type": "string"}, {"name": "namespace", "type": "string"}, {"name": "page", "type": "string"}, {"name": "regionIsoCode", "type": "string"}, {"name": "regionName", "type": "string"}, {"name": "timestamp", "type": "string"}, {"name": "user", "type": "string"}]'
)
)
GROUP BY channel
ORDER BY COUNT(*) DESC
더 읽어보기 (Further reading)
- SQL 기반 수집 개요 (SQL-based ingestion overview) — SQL 기반 수집을 더 자세히 살펴보기.
- SQL 기반 수집 참조 (SQL-based ingestion reference) — 컨텍스트 파라미터, 함수, 오류 코드에 대한 참조.
더 알아보기 (Learn more)
- SQL 기반 수집 (SQL-based ingestion) — MSQ를 사용한 SQL 기반 수집 개요.
- SQL 기반 수집 참조 (SQL-based ingestion reference) —
EXTERN함수 등 상세 참조.