데이터 쿼리하기

데이터 쿼리하기 (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 데이터소스 트리를 펼쳐 주세요. page dimension에 대한 쿼리를 만들 거예요.

  • 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 값이 있는 행만 보여 주도록 해 볼게요.

  • 왼쪽 창에서 countryName dimension을 클릭하고 첫 번째 필터링 옵션을 선택해 주세요. 정확히 우리가 원하는 건 아니지만, 직접 수정할 거예요. 새 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)