Closed14

データ基盤構築についてのメモ

nk_worknk_work

Avroって何?
Apache Avro is for transform data among systems and seriarizing format.(by using at Hadroop and Kalfa)

What benefits:
Encode to accommodate various schemas by binary..For evolution of schema

Parquet:Columns
Apache:Row

Apache Iceberg is an open table format designed for managing large-scale data tables. Some of Iceberg's metadata is stored in Avro files.

nk_worknk_work

OpenMetadata って何?
メタデータを管理する。さまざまなデータソースからメタデータで自動的に収集。
データカタログ作るのとデータリネージとは、データの生成から使用までの流れを追跡するツール
包括的な感じを受ける

nk_worknk_work

aws glue 初めて使ってる。がUIが色々多くて迷う。

nk_worknk_work

avroファイルでスキーマをどんどん追加していく(スキーマエヴォリューション)がその過程や差分を追いたい...そういった時に必要になるのが可視化ツール
OpenMetadataやAthenaでも可能dbtなどもぎりぎりできるみたい
とりあえずOpenMetadataで少量のスキーマで試作する。

nk_worknk_work

公式のdocker compose yamlをインストールするところからやる
For OpenMetadata with PostgreSQL Database -

docker compose -f docker-compose-postgres.yml up --detach

postgresql用のopenmetadataを入れる

nk_worknk_work

docker上に構築していたが、重すぎた。
サンドボックス環境があるのでそちらを使用

nk_worknk_work

AWSとの連携をしたいのでs3に何か大きめのデータを置く。
athena とglueを使いavroのスキーマエヴォリューションを確認できるような挙動を試して、openmetadataで可視化....という感じ?

nk_worknk_work

スキーマエヴォリューションってどうやってやるの?
複数のcsvがある状態から
それぞれのCSVバージョンに対応するAvroスキーマを作成

nk_worknk_work

S3にCSVを保存
AWS Glue Crawlerを使ってデータカタログを作成
Athenaを使ってクエリを実行
OpenMetadataとの接続

あえてawsですべてやってから他の方法も試す

nk_worknk_work

簡単なparquetを作るコード 圧縮方法はいくつかあったがsnappy
import duckdb
import pandas as pd

data = {
"customer_id": [101, 102, 103, 104, 105],
"customer_name": ["Alice Smith", "Bob Johnson", "Charlie Lee", "David Brown", "Eve Davis"],
"age": [29, 34, 41, 27, 38],
"city": ["New York", "Los Angeles", "Chicago", "Houston", "Phoenix"],
"transaction_amount": [250.50, 500.00, 75.00, 200.00, 600.00],
"transaction_date": ["2024-01-15", "2024-02-10", "2024-02-22", "2024-03-05", "2024-04-01"]
}

df = pd.DataFrame(data)
con = duckdb.connect()
con.execute("CREATE TABLE customer_data AS SELECT * FROM df")

output_path = './customer_transactions.parquet'

con.execute(f"""
COPY customer_data TO '{output_path}'
(FORMAT 'parquet', CODEC 'snappy');
""")

nk_worknk_work

こんどはavroを作るコード 検証不足で違う値がprintされている

import fastavro
schema = {
"type": "record",
"name": "User",
"fields": [
{"name": "name", "type": "string"},
{"name": "age", "type": "int"},
{"name": "email", "type": "string"}
]
}

data = [
{"name": "Alice", "age": 25, "email": "alice@example.com"},
{"name": "Bob", "age": 30, "email": "bob@example.com"},
]

with open("users.avro", "wb") as avro_file:
# Avroファイルにデータを書き込みます
fastavro.writer(avro_file, schema, data)

with open("users.avro", "rb") as avro_file:
reader = fastavro.reader(avro_file)
for record in reader:
print(record)

意外なほどに二つとも簡単に作れる

nk_worknk_work

メタデータを付与する場合はどうすれば良いのか、あとここから発展してデータの変化をopenmetadata上で見たい。スタースキーマまで作る?

このスクラップは18日前にクローズされました