Elasticsearch의 Date Histogram Aggregation과 MySQL 날짜 그룹화 비교하기

DOHYEON AN·2023년 7월 10일
0

data-engineering

목록 보기
2/3

안녕하세요! 이전 포스팅에서는 Elasticsearch의 집계 기능과 MySQL의 GROUP BY를 비교하는 시간을 가졌습니다. 오늘은 Elasticsearch의 date_histogram 집계에 대해 이야기해보고, 이를 MySQL의 날짜 그룹화와 비교하겠습니다.

다음의 예시 데이터셋으로 시작해봅시다.

#sales 인덱스:
[
  { "sale_id": 1, "date": "2023-01-01", "category": "Electronics", "amount": 200 },
  { "sale_id": 2, "date": "2023-01-02", "category": "Electronics", "amount": 150 },
  { "sale_id": 3, "date": "2023-01-07", "category": "Books", "amount": 20 },
  { "sale_id": 4, "date": "2023-02-01", "category": "Books", "amount": 25 },
  { "sale_id": 5, "date": "2023-02-02", "category": "Books", "amount": 30 },
  { "sale_id": 6, "date": "2023-02-07", "category": "Electronics", "amount": 300 }
]

이 데이터셋은 각각의 판매 건에 대한 정보를 담고 있습니다. 각 판매는 sale_id, date, category, amount 필드를 가지고 있습니다.

Elasticsearch의 Date Histogram Aggregation

Elasticsearch에서 date_histogram 집계는 특정 시간 간격으로 날짜 필드를 버킷화하는 데 사용됩니다. 또한 bool 필터를 사용하여 특정 조건을 충족하는 문서만 대상으로 집계를 수행할 수 있습니다.

#GET /sales/_search
{
  "size": 0,
  "query": {
    "bool": {
      "filter": {
        "term": { "category.keyword": "Electronics" }
      }
    }
  },
  "aggs": {
    "sales_over_time": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      }
    }
  }
}

이 쿼리는 category.keyword가 "Electronics"인 판매 건만을 대상으로, 월별로 판매 건을 집계합니다.

반환된 응답은 다음과 같습니다.

{
  ...
  "aggregations": {
    "sales_over_time": {
      "buckets": [
        {
          "key_as_string": "2023-01-01",
          "key": 1672444800000,
          "doc_count": 2
        },
        {
          "key_as_string": "2023-02-01",
          "key": 1672531200000,
          "doc_count": 1
        }
      ]
    }
  }
}

MySQL의 날짜 그룹화

이제 같은 작업을 SQL을 사용하여 수행해보겠습니다. SQL에서는 WHERE 절과 GROUP BY 절을 사용하여 동일한 결과를 얻을 수 있습니다.

SELECT DATE_FORMAT(date, '%Y-%m') as month, COUNT(*) 
FROM sales 
WHERE category = 'Electronics'
GROUP BY month;

이 쿼리는 'category'가 'Electronics'인 판매 건만을 대상으로, 월별로 판매 건을 집계합니다. 결과는 다음과 같습니다.

+---------+----------+
| month   | COUNT(*) |
+---------+----------+
| 2023-01 | 2        |
| 2023-02 | 1        |
+---------+----------+

결론

Elasticsearch의 date_histogram 집계와 SQL의 날짜 그룹화는 동일한 목적을 위해 사용되지만, 그 구현 방식과 사용자 인터페이스에서 차이가 있습니다. Elasticsearch는 NoSQL 데이터베이스로서, 데이터의 분포를 그래픽으로 표현하거나 시간 별로 데이터를 분류하는 등의 분석에 더 효과적입니다. 반면에, SQL은 관계형 데이터베이스로서, 정형화된 데이터와 관계를 이용한 복잡한 쿼리에 더 강점을 가지고 있습니다.
이상으로 Elasticsearch와 SQL의 날짜 집계 방식에 대해 간략하게 살펴보았습니다. 향후에는 더 복잡한 집계와 분석을 위해 Elasticsearch의 다양한 집계 기능을 활용하는 방법에 대해 알아보겠습니다. 감사합니다!

profile
데이터 엔지니어 안도현입니다 :)

0개의 댓글