배경
- 수치 데이터 만으론 설명되지 않는게 있다. 예를 들어 평균 연봉을 계산할때는, 일괄적으로 순위를 내는게 아니라. 직군별로 묶어서 계산해야 공정하다. 그럴때 내용 외에 메타데이터를 섞어주면 좋다.
- 그렇게다면 모든 요소를 DB에 저장하는 방식도 있지 않을까? -> 아주 대용량이 아니라면 따로 DB 서버를 유지하는건 비효율적인것 같다. 여기에 더해서 메타데이터를 활용하면 좀 더 복잡한 구조도 가볍게 저장 가능하다. DB라면 구조가 복잡해 질수록 테이블이 늘어나고, Join 연산이 많아져 쿼리 비용이 늘어날꺼다.
- 다음은 메타데이터를 활용하면 좋은 예시이다.
예시: 문서 관리 시스템에서 메타데이터를 활용한 데이터 저장
시나리오:
문서 관리 시스템에서 여러 문서 파일을 관리하고, 문서에 대한 정보(예: 제목, 작성자, 태그, 생성일 등)를 메타데이터로 관리합니다. 메타데이터는 JSON 형식으로 저장되고, 문서를 검색할 때 메타데이터를 활용해 필터링할 수 있습니다.
1. 메타데이터를 사용하여 문서 정보 저장
import json
from datetime import datetime
# 문서 정보 (메타데이터 포함)
documents = [
{
"id": 1,
"title": "Data Engineering Overview",
"author": "John Doe",
"tags": ["data", "engineering", "overview"],
"created_at": "2002.02.28",
"modified_at": datetime.now().isoformat(),
"content": "Data engineering is the process of transforming raw data into useful information...",
},
{
"id": 2,
"title": "Machine Learning Basics",
"author": "Jane Smith",
"tags": ["machine learning", "AI", "basics"],
"created_at": "2002.02.29",
"modified_at": datetime.now().isoformat(),
"content": "Machine learning is a field of artificial intelligence that uses statistical techniques...",
}
]
# 메타데이터를 JSON 파일로 저장
with open('documents_metadata.json', 'w', encoding='utf-8') as f:
json.dump(documents, f, ensure_ascii=False, indent=4)
print("문서 메타데이터 저장 완료.")
이 코드는 각 문서에 대한 메타데이터(예: 제목, 작성자, 태그 등)를 JSON 파일에 저장하는 예제입니다.
중간에 modified_at에 datetime.now().isoformat() 를 삽입함으로 인해서, 파일의 수정한 날짜가 매번 갱신될 수 있을듯 하다.
2. 메타데이터를 활용해 데이터를 검색하거나 필터링
저장된 메타데이터 파일을 불러와서 특정 조건에 맞는 문서를 검색할 수 있습니다. 예를 들어, 특정 태그가 포함된 문서를 찾거나, 특정 작성자가 작성한 문서를 검색할 수 있습니다.
# JSON 파일에서 메타데이터 불러오기
def load_documents_metadata(filepath):
with open(filepath, 'r', encoding='utf-8') as f:
return json.load(f)
documents = load_documents_metadata('documents_metadata.json')
# 특정 태그를 가진 문서 검색
def search_documents_by_tag(documents, tag):
return [doc for doc in documents if tag in doc['tags']]
# 특정 작성자가 작성한 문서 검색
def search_documents_by_author(documents, author):
return [doc for doc in documents if doc['author'] == author]
# 'data' 태그가 포함된 문서 찾기
tagged_docs = search_documents_by_tag(documents, 'data')
print(f"'data' 태그를 포함하는 문서:\n{tagged_docs}")
# 'Jane Smith'가 작성한 문서 찾기
author_docs = search_documents_by_author(documents, 'Jane Smith')
print(f"'Jane Smith'가 작성한 문서:\n{author_docs}")
3. 메타데이터를 활용해 문서를 갱신하고 관리
문서를 수정할 때도 메타데이터를 활용해 수정일을 업데이트하거나, 태그를 추가하는 식으로 문서를 관리할 수 있습니다.
def update_document(documents, doc_id, updated_content=None, updated_tags=None):
for doc in documents:
if doc["id"] == doc_id:
if updated_content:
doc["content"] = updated_content
if updated_tags:
doc["tags"] = updated_tags
doc["modified_at"] = datetime.now().isoformat()
return doc
return None
# 문서 1번의 내용을 수정하고 태그를 업데이트
updated_doc = update_document(documents, 1, updated_content="Updated data engineering content", updated_tags=["data", "engineering", "update"])
print(f"수정된 문서:\n{updated_doc}")
# 수정된 메타데이터를 다시 JSON 파일로 저장
with open('documents_metadata.json', 'w', encoding='utf-8') as f:
json.dump(documents, f, ensure_ascii=False, indent=4)
print("문서 메타데이터 업데이트 완료.")
4. 메타데이터를 활용한 계산
메타데이터를 통해 여러 가지 계산을 할 수 있습니다. 예를 들어, 문서의 작성일과 수정일을 비교하여 며칠 후에 수정되었는지 계산할 수 있습니다.
from datetime import datetime
def calculate_days_between_dates(start_date_str, end_date_str):
start_date = datetime.fromisoformat(start_date_str)
end_date = datetime.fromisoformat(end_date_str)
return (end_date - start_date).days
# 문서 1번의 생성일과 수정일 간 차이 계산
doc = documents[0]
days_diff = calculate_days_between_dates(doc["created_at"], doc["modified_at"])
print(f"문서 {doc['id']}의 생성일과 수정일 간 차이: {days_diff}일")
이 코드에서는 문서의 메타데이터에 포함된 created_at
과 modified_at
필드를 이용해 문서가 몇 일 후에 수정되었는지를 계산할 수 있습니다.
요약:
- 메타데이터 관리: 각 데이터(문서, 파일 등)에 대한 추가 정보를 메타데이터로 관리하여 데이터를 효과적으로 검색하고 관리할 수 있습니다.
- 검색 및 필터링: 메타데이터의 내용을 기반으로 데이터에 대한 검색이나 필터링을 수행할 수 있습니다.
- 갱신 관리: 수정된 내용을 메타데이터로 기록하고, 변경 사항을 추적할 수 있습니다.
- 계산: 메타데이터를 활용하여 날짜 계산 등 여러 가지 유용한 분석을 수행할 수 있습니다.
'사용툴 분석' 카테고리의 다른 글
피클(pkl)과 json의 차이. (2) | 2024.10.03 |
---|---|
RabbitMQ로 우선순위 큐 실제 적용해보자 (0) | 2024.10.02 |
TypedDict의 개념과 langsmith (1) | 2024.09.08 |
VScode에 공짜 로컬 GPT 연결하기(continue) (0) | 2024.08.02 |
개발 환경과 유용한 툴 설명 (0) | 2024.07.26 |