- hn.unlurker.com을 만들며 작성한 HN API 클라이언트에 전체 item을 순서대로 받는
scan 기능을 넣고, Hacker News 전체 데이터를 로컬에 내려받음
hn scan --no-cache --asc -c- -o full.json 실행 중 다운로드가 몇 차례 멈췄지만, 재개 가능한 scan 덕분에 몇 시간 뒤 20 GiB JSON 파일을 확보함
- DuckDB의
read_json_auto로 JSON을 테이블화한 뒤, text ILIKE와 12주 이동평균 SQL로 Python, JavaScript, Java, Ruby, Rust 언급 비율을 집계함
- 단순
grep만으로도 “correct horse battery staple” 문구가 Hacker News에 231번 등장한 것을 확인했고, DuckDB는 이 규모의 일회성 분석에 잘 맞아 보임
- 로컬에 전체 데이터가 생기면 Hacker News의 과거 콘텐츠를 여러 방식으로 분석할 수 있지만, 이 프로젝트는 여기서 마무리되고 다음 단계는 다른 사람이 이어갈 몫으로 남음
Hacker News 전체 item 내려받기
- hn.unlurker.com을 만들기 위해 HN API 클라이언트를 작성함
- 이미 여러 클라이언트가 있었지만, 새 프로젝트에서 최신 Go 기능과 린터를 써보고 싶었음
- HN API에서 댓글과 스토리는 item으로 불림
- 클라이언트는 활성 item과 item 목록 등을 가져올 수 있음
- 실제 프로젝트에는 최근 item만 필요했지만, 완성도를 위해
scan 기능을 추가함
scan은 item을 0부터 최신까지 또는 반대 방향으로 순서대로 다운로드함
- 전체 다운로드는 수만 GiB가 아니라 수십 GiB JSON 정도로 예상되어 시도함
hn scan --no-cache --asc -c- -o full.json
- 다운로드가 몇 차례 멈춰
CTRL-C로 중단했지만, scan이 재개 가능해서 몇 시간 뒤 완료됨
- 결과물은 Hacker News에서 발생한 모든 내용을 담은 20 GiB JSON 파일임
- 같은 명령을 다시 실행하면 최신 데이터로 다시 채울 수 있음
DuckDB로 로컬 데이터 분석하기
- 처음에는 단순히
grep으로 검색함
- 이후 DuckDB로 분석을 시도함
- DuckDB는 임베드 가능한 빠른 분석 실행 엔진이며 명령줄 도구로도 제공됨
- 새 UI 덕분에 초보자도 쓰기 쉬웠고, LLM이 SQL 쿼리 작성에 도움을 줌
- JSON 데이터는 DuckDB에서 다음 방식으로 가져옴
CREATE TABLE items AS
SELECT *
FROM read_json_auto('/home/jason/full.json', format='nd', sample_size=-1);
- 예시 쿼리는 주 단위로 item을 묶고, 전체 item 중 특정 단어가 포함된 비율을 계산함
python, javascript, java, ruby, rust를 text ILIKE로 검색함
- 각 비율에 대해 12주 이동평균을 계산함
- 같은 방식으로 데이터베이스 관련 단어도 시각화함
- 예시 그래프에는
mysql, postgres, mongo, redis, sqlite의 12주 이동평균 언급 비율이 포함됨
- DuckDB는 이 정도 크기의 데이터셋을 분석하는 데 매우 좋아 보였음
- 전체 Hacker News 콘텐츠의 로컬 복사본을 갖게 되었지만, 프로젝트는 여기서 끝내기로 함