open-index/hacker-news · Datasets at Hugging Face
Feed

open-index/hacker-news · Datasets at Hugging Face

OpenIndex
2026.03.25
·Hugging Face·by 배레온/부산/개발자
#data analysis#dataset#Hacker News#Hugging Face#NLP

핵심 포인트

  • 1이 데이터셋은 2006년 10월부터 2026년 3월까지의 모든 Hacker News 아이템(스토리, 댓글, 설문조사 등)을 포함하며, 4,740만 개 이상의 항목으로 5분마다 실시간 업데이트됩니다.
  • 2데이터는 월별 Parquet 파일로 구성되어 있으며, 당일 활동은 5분 단위의 Parquet 블록으로 저장되고 매일 자정 UTC에 월별 파일로 통합됩니다.
  • 3사용자는 DuckDB, Hugging Face의 `datasets` 라이브러리, `huggingface_hub`, 또는 pandas를 통해 이 데이터에 쉽게 접근하고 분석할 수 있습니다.

이 문서는 Hugging Face에 호스팅된 "Hacker News - Complete Archive" 데이터셋에 대한 상세한 설명을 제공합니다. 이 데이터셋은 2006년 10월부터 현재(2026년 3월 25일 기준)까지 Hacker News에 제출된 모든 아이템(스토리, 댓글, Ask HN, Show HN, 구인 게시물, 설문조사 등)을 포함하며, 총 4,740만 개 이상의 아이템으로 구성된 방대한 아카이브입니다. Y Combinator가 2007년부터 운영해 온 Hacker News는 기술 커뮤니티에서 가장 오래 지속되고 영향력 있는 플랫폼 중 하나로 인정받고 있습니다.

핵심 방법론 (데이터 수집 및 파이프라인):
이 데이터셋의 가장 중요한 특징은 Hacker News 웹사이트와 실시간으로 동기화된다는 점입니다. 데이터 수집은 자동화된 라이브 파이프라인을 통해 이루어지며, 매 5분마다 Hacker News API에서 새로운 아이템을 가져와서 바로 데이터셋에 커밋합니다. 이 과정은 다음과 같은 방식으로 진행됩니다:

  1. 실시간 블록 커밋: 매 5분마다 새로 수집된 아이템들은 개별 Parquet 파일 블록으로 today/ 디렉토리(예: YYYY/MM/DD/HH/MM.parquet)에 저장됩니다.
  2. 월별 전체 업데이트: UTC 자정(midnight UTC)이 되면, 해당 월의 전체 데이터(현재 진행 중인 월의 데이터)를 원본 소스에서 다시 한 번 완전히 가져와 하나의 권한 있는(authoritative) Parquet 파일(예: YYYY/MM.parquet)로 저장합니다. 이 과정이 완료되면, today/ 디렉토리에 임시로 저장되었던 해당 월의 5분 단위 블록 파일들은 모두 삭제됩니다.
  3. 데이터 구성: 데이터셋은 data/ 디렉토리 아래 연도별로 정리되며, 각 월별로 하나의 Parquet 파일이 존재합니다(예: data/2006/2006-10.parquet). today/ 디렉토리에는 실시간으로 업데이트되는 당일의 5분 단위 Parquet 블록 파일들이 저장됩니다.
  4. 메타데이터 관리: 파이프라인의 진행 상황과 데이터의 완전성을 검증하기 위해 stats.csv 파일은 커밋된 각 월별 데이터의 아이템 수, ID 범위, 파일 크기, 가져오기(fetch) 소요 시간, 커밋 타임스탬프 등의 메타데이터를 기록합니다. stats_today.csv는 당일 커밋된 각 5분 블록에 대한 유사한 통계를 제공합니다.

데이터 구조 및 필드:
모든 Hacker News 아이템은 Parquet 파일 형식으로 저장되며, 다음과 같은 스키마를 가집니다:

  • id: 아이템의 고유 식별자 (uint32)
  • deleted: 아이템 삭제 여부 (uint8)
  • type: 아이템 유형 (int8): 1=story, 2=comment, 3=poll, 4=pollopt, 5=job
  • by: 작성자 사용자 이름 (string). DuckDB에서 "by"는 예약어이므로 쿼리 시 인용 부호가 필요합니다.
  • time: 아이템 생성 시간 (timestamp[ms, tz=UTC])
  • text: 아이템 내용 (string)
  • dead: 아이템 비활성화 여부 (uint8)
  • parent: 부모 아이템의 ID (댓글 또는 투표 옵션의 경우, uint32)
  • poll: 설문조사의 ID (설문조사 옵션의 경우, uint32)
  • kids: 자식 아이템 ID 목록 (list)
  • url: 연결된 URL (string)
  • score: 아이템 점수 (int32)
  • title: 아이템 제목 (string)
  • parts: 설문조사 옵션의 ID 목록 (설문조사의 경우, list)
  • descendants: 댓글 수 (스토리 또는 설문조사의 경우, int32)
  • words: text 또는 title 필드의 토큰화된 단어 목록 (list)

데이터 활용:
이 데이터셋은 표준 Hugging Face Parquet 레이아웃을 따르므로, 다양한 도구를 사용하여 쉽게 접근하고 분석할 수 있습니다.

  • DuckDB: Hugging Face에서 Parquet 파일을 직접 읽을 수 있어 다운로드 없이 빠른 탐색이 가능합니다. DuckDB SQL 쿼리 예시:
    • read_parquet('hf://datasets/open-index/hacker-news/data/*/*.parquet')
    • SELECT strftime(time, '%Y-%m') AS month, count(*) AS items FROM read_parquet('hf://datasets/open-index/hacker-news/data/2024/*.parquet') GROUP BY month ORDER BY month;
    • SELECT"by",count()ASpostsFROMreadparquet(hf://datasets/openindex/hackernews/data//.parquet)WHEREtype=1ANDtitleLIKEAskHN:SELECT "by", count(*) AS posts FROM read_parquet('hf://datasets/open-index/hacker-news/data/*/*.parquet') WHERE type = 1 AND title LIKE 'Ask HN:%' GROUP BY "by" ORDER BY posts DESC LIMIT 20;
    • SELECTextract(yearFROMtime)ASyear,regexpextract(url,https?://([/]+),1)ASdomain,count()ASstoriesFROMreadparquet(hf://datasets/openindex/hackernews/data//.parquet)WHEREtype=1ANDurl!=GROUPBYyear,domainQUALIFYrownumber()OVER(PARTITIONBYyearORDERBYstoriesDESC)<=5ORDERBYyear,storiesDESC;SELECT extract(year FROM time) AS year, regexp_extract(url, 'https?://([^/]+)', 1) AS domain, count(*) AS stories FROM read_parquet('hf://datasets/open-index/hacker-news/data/*/*.parquet') WHERE type = 1 AND url != '' GROUP BY year, domain QUALIFY row_number() OVER (PARTITION BY year ORDER BY stories DESC) <= 5 ORDER BY year, stories DESC;
  • datasets 라이브러리 (Python): 스트리밍 모드를 통해 전체 기록을 다운로드하지 않고 접근하거나, 특정 연도/월 데이터를 메모리에 로드할 수 있습니다.
    • from datasets import load_dataset
    • ds=loaddataset("openindex/hackernews",split="train",streaming=True)ds = load_dataset("open-index/hacker-news", split="train", streaming=True)
    • ds=loaddataset("openindex/hackernews",datafiles="data/2024/.parquet",split="train")ds = load_dataset("open-index/hacker-news", data_files="data/2024/*.parquet", split="train")
  • huggingface_hub (Python): 특정 연도 데이터와 같이 필요한 파일만 선택적으로 다운로드할 수 있습니다.
    • from huggingface_hub import snapshot_download
    • snapshotdownload("openindex/hackernews",repotype="dataset",localdir="./hn/",allowpatterns="data/2024/")snapshot_download("open-index/hacker-news", repo_type="dataset", local_dir="./hn/", allow_patterns="data/2024/*")
  • CLI: huggingface-cli download 명령어를 사용하여 단일 월 데이터를 다운로드할 수 있습니다.
  • Pandas + DuckDB (Python): DuckDB와 Pandas를 연동하여 데이터 분석을 수행할 수 있습니다.
    • importduckdb;conn=duckdb.connect()import duckdb; conn = duckdb.connect()
    • df=conn.sql("""SELECTpercentiledisc(0.50)WITHINGROUP(ORDERBYscore)ASp50,...FROMreadparquet(hf://datasets/openindex/hackernews/data//.parquet)WHEREtype=1;""").df()df = conn.sql("""SELECT percentile_disc(0.50) WITHIN GROUP (ORDER BY score) AS p50, ... FROM read_parquet('hf://datasets/open-index/hacker-news/data/*/*.parquet') WHERE type = 1;""").df()

이 데이터셋은 Hacker News 데이터의 완전하고 정기적으로 업데이트되는 미러(mirror)로서, 사회과학, 자연어 처리, 커뮤니티 분석 등 다양한 연구 분야에 활용될 수 있는 귀중한 자료입니다.