본문 바로가기

Programming Language/golang

map[string]interface 데이터를 avro 포맷으로 파일 저장하는 방법

package main

import (
	"encoding/json"
	"fmt"
	"github.com/linkedin/goavro"
	"os"
	"time"
)

func main() {
	// Avro 스키마 정의
	schemaJSON := `{
	   "type": "record",
	   "name": "Example",
	   "fields": [
	       {"name": "username", "type": "string"},
	       {"name": "age", "type": "int"}
	   ]
	}`

	codec, err := goavro.NewCodec(schemaJSON)
	if err != nil {
		panic(err)
	}

	// 파일 생성
	file, err := os.Create("avro_data.avro")
	if err != nil {
		panic(err)
	}
	defer file.Close()

	// Avro 데이터 생성 및 파일에 적재
	ticker := time.NewTicker(1 * time.Second)
	defer ticker.Stop()

	for range ticker.C {
		// 예시 데이터 생성
		data := map[string]interface{}{
			"username": "JohnDoe",
			"age":      30,
		}

		b, err := json.Marshal(data)
		if err != nil {
			panic(err)
		}
		fmt.Println(string(b))

		//Avro 데이터 생성
		native, _, err := codec.NativeFromTextual(b)
		if err != nil {
			panic(err)
		}

		binaryData, err := codec.BinaryFromNative(nil, native)
		if err != nil {
			panic(err)
		}

		// 파일에 Avro 데이터 쓰기
		if _, err := file.Write(binaryData); err != nil {
			panic(err)
		}

		// 줄 바꿈
		if _, err := file.WriteString("\n"); err != nil {
			panic(err)
		}

		fmt.Println("Avro 데이터를 파일에 적재했습니다.")
	}
}

 

위 코드에서 중요한 것은 NativeFromTextual 메서드와 json.Marshal을 통해 byte로 변환하는 부분입니다. NativeFromTextual는 Avro 데이터를 지정한 포맷을 기반으로 데이터를 저장하는데 사용됩니다. 그런데 이 메서드를 받는 파라미터는 byte이므로 반드시 byte로 변환해야만 합니다. 

 

이를 위한 json.Marshal을 사용하여 데이터를 byte로 변환하여 avro 형태에 맞는 codec을 통해 변환시키는데 사용됩니다.

 

 

참고 문헌

https://pkg.go.dev/github.com/linkedin/goavro/v2#section-readme

 

goavro package - github.com/linkedin/goavro/v2 - Go Packages

Discover Packages github.com/linkedin/goavro/v2 Version: v2.12.0 Opens a new window with list of versions in this module. Published: Aug 19, 2022 License: Apache-2.0 Opens a new window with license information. Imports: 23 Opens a new window with list of i

pkg.go.dev

 

반응형