메인 콘텐츠로 건너뛰기
이 데이터셋은 New York Public Library에서 제작했습니다. 호텔, 레스토랑, 카페의 메뉴와 각 요리 가격에 관한 과거 데이터가 포함되어 있습니다. 출처: http://menus.nypl.org/data 이 데이터는 퍼블릭 도메인에 속합니다. 이 데이터는 도서관 아카이브에서 가져온 것이므로 일부 내용이 누락되어 있을 수 있고, 통계 분석에 활용하기에는 어려움이 있을 수 있습니다. 그럼에도 꽤 먹음직스러운 데이터이기도 합니다. 메뉴에 포함된 요리 관련 데이터는 총 130만 건에 불과하므로 ClickHouse 기준으로는 매우 작은 규모이지만, 여전히 좋은 예시입니다.

데이터셋 다운로드

다음 명령을 실행하십시오:
필요한 경우 http://menus.nypl.org/data에 있는 최신 링크로 교체하십시오. 다운로드 용량은 약 35 MB입니다.

데이터셋 압축 해제하기

압축되지 않은 크기는 약 150 MB입니다. 데이터는 정규화되어 있으며 4개의 테이블(table)로 구성됩니다:
  • Menu — 메뉴에 대한 정보입니다. 식당 이름, 메뉴가 확인된 날짜 등이 포함됩니다.
  • Dish — 요리에 대한 정보입니다. 요리 이름과 몇 가지 특성이 포함됩니다.
  • MenuPage — 메뉴의 페이지에 대한 정보입니다. 각 페이지는 하나의 메뉴에 속합니다.
  • MenuItem — 메뉴 항목입니다. 특정 메뉴 페이지에 있는 요리와 해당 가격을 나타내며, 요리와 메뉴 페이지를 연결합니다.

테이블 만들기

가격을 저장할 때 Decimal 데이터 타입을 사용합니다.

데이터 가져오기

ClickHouse에 데이터를 업로드하려면 다음 명령을 실행하십시오:
데이터가 헤더가 있는 CSV로 표현되므로 CSVWithNames 포맷을 사용합니다. 데이터 필드에는 큰따옴표만 사용하고 작은따옴표는 값 내부에 포함될 수 있으므로, CSV 파서가 이를 혼동하지 않도록 format_csv_allow_single_quotes를 비활성화합니다. 데이터에 NULL이 없으므로 input_format_null_as_default를 비활성화합니다. 그렇지 않으면 ClickHouse가 \N 시퀀스를 파싱하려고 시도하여 데이터 내의 \와 혼동할 수 있습니다. 설정 date_time_input_format best_effort를 사용하면 DateTime 필드를 매우 다양한 포맷으로 파싱할 수 있습니다. 예를 들어 초가 없는 ISO-8601 형식인 ‘2000-01-01 01:02’도 인식됩니다. 이 설정이 없으면 고정된 DateTime 포맷만 허용됩니다.

데이터 비정규화

데이터는 정규화된 형태로 여러 테이블에 나뉘어 있습니다. 즉, 예를 들어 메뉴 항목에서 요리 이름을 조회하려면 JOIN을 수행해야 합니다. 일반적인 분석 작업에서는 매번 JOIN을 수행하지 않기 위해 사전에 JOIN된 데이터를 사용하는 편이 훨씬 더 효율적입니다. 이를 “비정규화된” 데이터라고 합니다. 이제 모든 데이터를 JOIN해 함께 담은 menu_item_denorm 테이블을 생성하겠습니다:

데이터 확인

Query
Response

몇 가지 쿼리 실행해 보기

요리의 과거 평균 가격

Query
Response
너무 곧이곧대로 받아들이지는 마십시오.

버거 가격

Query
Response

보드카

Query
Response
보드카를 찾으려면 ILIKE '%vodka%'라고 써야 하며, 이건 확실히 강한 인상을 줍니다.

캐비아

캐비아 가격을 출력해 보겠습니다. 또한 캐비아가 들어간 아무 요리나 하나의 이름도 출력해 보겠습니다.
Query
Response
적어도 보드카와 함께 즐길 캐비아는 있습니다. 아주 좋습니다.

온라인 플레이그라운드

데이터가 ClickHouse Playground에 업로드되어 있습니다. 예시.
마지막 수정일 2026년 7월 2일