데이터 쿼리하기
데이터 쿼리하기 (Query data)
Apache Druid에서 SQL로 데이터를 쿼리하는 방법을 보여 드릴게요. 웹 콘솔, 커맨드라인 유틸리티, HTTP POST 세 가지 방식으로 Druid SQL 쿼리를 실행하는 방법을 하나씩 살펴봐요.
출처: 문서
본문
이 튜토리얼은 Quickstart 또는 다음 튜토리얼 중 하나를 완료했다고 가정해요. 아래 데이터소스들은 그 중 하나를 따라 만들었을 테니까요:
Druid SQL 쿼리를 실행하는 방법은 다양해요: 웹 콘솔에서 실행하기, 커맨드라인 유틸리티 사용하기, HTTP로 쿼리 게시하기. 각각을 살펴볼게요.
웹 콘솔에서 SQL 쿼리하기 (Query SQL from the web console)
웹 콘솔에는 쿼리를 손쉽게 만들고 테스트하며 결과를 볼 수 있는 뷰가 포함되어 있어요.
-
아직 실행 중이 아니라면 Druid 클러스터를 시작하고 웹 브라우저에서 웹 콘솔을 열어 주세요.
-
헤더에서 Query 를 클릭해 Query 뷰를 열어 주세요. 편집 창에 쿼리를 직접 쓸 수도 있지만, Query 뷰는 시작 쿼리를 만드는 데 사용할 SQL 쿼리 구성을 도와주는 기능도 제공해요.
-
왼쪽 창에서
wikipedia데이터소스 트리를 펼쳐 주세요.pagedimension에 대한 쿼리를 만들 거예요. -
page를 클릭하고 메뉴에서 Show :page 를 선택해 주세요. 쿼리 편집 창에SELECT쿼리가 나타나고 즉시 실행돼요. 하지만 이 경우 기본적으로 쿼리가 지난 하루의 데이터만 필터링하도록 되어 있어서, 우리 데이터는 그보다 훨씬 오래됐기 때문에 쿼리가 데이터를 반환하지 않아요. 필터를 제거해 볼게요. -
Run 을 클릭해 쿼리를 실행해 주세요. 이제
page이름과 count라는 두 개의 데이터 컬럼이 보여야 해요. Smart query limit 기능 덕분에 콘솔의 결과가 기본적으로 약 100개로 제한된다는 점을 확인해 주세요. 이 기능은 사용자가 실수로 과도한 양의 데이터를 반환해서 시스템을 압도할 수 있는 쿼리를 실행하지 않도록 도와줘요. -
쿼리를 직접 편집해서 편집기의 쿼리 빌딩 기능 몇 가지를 살펴볼게요. 쿼리 편집 창을 클릭하고 다음 변경을 해 주세요:
- 첫 번째 컬럼
"page"다음 줄을 추가하고 새 컬럼"countryName"의 이름을 입력하기 시작하세요. 자동완성 메뉴가 컬럼 이름, 함수, 키워드 등을 제안하는 것을 확인할 수 있어요. "countryName"을 선택하고, 새 컬럼을 이름으로 또는 위치인2로 참조해GROUP BY절에도 추가해 주세요.- 가독성을 위해
Count컬럼 이름을Edits로 바꿔 주세요.COUNT()함수가 실제로 페이지의 편집 횟수를 반환하니까요.ORDER BY절에서도 같은 컬럼 이름 변경을 해 주세요. COUNT()함수는 Druid SQL 쿼리에서 사용할 수 있는 여러 함수 중 하나예요. 자동완성 메뉴에서 함수 이름 위에 마우스를 올리면 함수에 대한 간단한 설명을 볼 수 있어요. 또한 Druid 문서에서 더 많은 정보를 찾을 수 있어요. 예를 들어COUNT()함수는 Aggregation functions에서 설명돼요.
이제 쿼리는 다음과 같아야 해요:
SELECT "page", "countryName", COUNT(*) AS "Edits" FROM "wikipedia" GROUP BY 1, 2 ORDER BY "Edits" DESC쿼리를 다시 실행하면 새 dimension인
countryName이 생기는 걸 볼 수 있는데, 대부분의 행에서 그 값이null이에요.countryName값이 있는 행만 보여 주도록 해 볼게요. - 첫 번째 컬럼
-
왼쪽 창에서
countryNamedimension을 클릭하고 첫 번째 필터링 옵션을 선택해 주세요. 정확히 우리가 원하는 건 아니지만, 직접 수정할 거예요. 새WHERE절이 쿼리에 나타날 거예요. -
countryName값이 없는 결과를 제외하도록WHERE절을 수정해 주세요:WHERE "countryName" IS NOT NULL쿼리를 다시 실행해 주세요. 이제 국가별 상위 편집 수가 보여야 해요.
-
내부적으로 모든 Druid SQL 쿼리는 데이터 노드에서 실행되기 전에 JSON 기반의 Druid 네이티브 쿼리(native query) 형식으로 변환돼요. 이 쿼리의 네이티브 쿼리를 보려면
...을 클릭하고 Explain SQL Query 를 선택하면 돼요. 대부분의 목적에는 Druid SQL을 사용할 수 있지만, 복잡한 쿼리를 구성하거나 성능 문제를 해결할 때는 네이티브 쿼리에 익숙한 것이 유용해요. 더 자세한 내용은 Native queries를 참고해 주세요.
Explain plan을 보는 또 다른 방법은 쿼리 앞에 EXPLAIN PLAN FOR 을 추가하는 거예요:
EXPLAIN PLAN FOR
SELECT
"page",
"countryName",
COUNT(*) AS "Edits"
FROM "wikipedia"
WHERE "countryName" IS NOT NULL
GROUP BY 1, 2
ORDER BY "Edits" DESC
이 방법은 커맨드라인이나 HTTP로 쿼리를 실행할 때 특히 유용해요.
- 마지막으로
...을 클릭하고 Edit context 를 선택해 쿼리 실행을 제어하는 추가 파라미터를 어떻게 추가하는지 확인해 보세요. 필드에 Set query context에 설명된 대로 쿼리 컨텍스트 옵션을 JSON 키-값 쌍으로 입력하면 돼요.
됐어요! 웹 콘솔에 내장된 쿼리 빌더 기능 중 일부를 사용해 간단한 쿼리를 만들었어요. 다음 섹션들에서 시도할 수 있는 예제 쿼리를 몇 개 더 제공해요.
Druid SQL HTTP API를 사용하는 예시는 Query SQL over HTTP를 참고해 주세요.
Druid SQL 예제 더 보기 (More Druid SQL examples)
다음 쿼리들을 시도해 Druid SQL의 몇 가지 트릭을 더 배워 보세요:
시간별 쿼리 (Query over time)
SELECT FLOOR(__time to HOUR) AS HourTime, SUM(deleted) AS LinesDeleted
FROM wikipedia
WHERE TIME_IN_INTERVAL("__time", '2016-06-27/2016-06-28')
GROUP BY 1
일반 group by (General group by)
SELECT channel, page, SUM(added)
FROM wikipedia
WHERE TIME_IN_INTERVAL("__time", '2016-06-27/2016-06-28')
GROUP BY channel, page
ORDER BY SUM(added) DESC
HTTP로 SQL 쿼리하기 (Query SQL over HTTP)
네이티브 쿼리를 Druid Broker에 HTTP로 직접 제출할 수 있어요. 요청 본문은 JSON 객체여야 하며, query 키의 값에 쿼리 텍스트가 들어 있어요:
{
"query": "SELECT page, COUNT(*) AS Edits FROM wikipedia WHERE TIME_IN_INTERVAL(\"__time\", '2016-06-27/2016-06-28') GROUP BY page ORDER BY Edits DESC LIMIT 10"
}
튜토리얼 패키지는 위에 보인 SQL 쿼리를 담은 예제 파일을 quickstart/tutorial/wikipedia-top-pages-sql.json 에 포함해요. 그 쿼리를 Druid Broker에 제출해 보세요:
curl -X 'POST' -H 'Content-Type:application/json' -d @quickstart/tutorial/wikipedia-top-pages-sql.json http://localhost:8888/druid/v2/sql
다음과 같은 결과가 반환되어야 해요:
[
{
"page": "Copa América Centenario",
"Edits": 29
},
{
"page": "User:Cyde/List of candidates for speedy deletion/Subpage",
"Edits": 16
},
{
"page": "Wikipedia:Administrators' noticeboard/Incidents",
"Edits": 16
},
{
"page": "2016 Wimbledon Championships – Men's Singles",
"Edits": 15
},
{
"page": "Wikipedia:Administrator intervention against vandalism",
"Edits": 15
},
{
"page": "Wikipedia:Vandalismusmeldung",
"Edits": 15
},
{
"page": "The Winds of Winter (Game of Thrones)",
"Edits": 12
},
{
"page": "ولاية الجزائر",
"Edits": 12
},
{
"page": "Copa América",
"Edits": 10
},
{
"page": "Lionel Messi",
"Edits": 10
}
]
더 읽어보기 (Further reading)
Druid SQL 쿼리 사용에 대한 자세한 내용은 Druid SQL 문서를 참고해 주세요.
Druid 네이티브 쿼리에 대한 자세한 내용은 Queries 문서를 참고해 주세요.
더 알아보기 (Learn more)
- Druid SQL 문서 (Druid SQL documentation) — SQL 쿼리 사용법.
- Queries 문서 (Queries documentation) — Druid 네이티브 쿼리.
- 쿼리 컨텍스트 설정 (Set query context) — 쿼리 실행을 제어하는 파라미터.