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
반응형
'Programming Language > golang' 카테고리의 다른 글
Redis-go를 interface화 하여 사용하기 (0) | 2024.02.26 |
---|---|
json value가 null일때 golang은 Unmarshal을 잘 할 수 있을까? (0) | 2024.01.18 |
golang struct type을 JSON으로 Print 하기 (0) | 2023.03.29 |
golang prviate repository에서 디펜던시 가져오는 방법 (0) | 2023.03.06 |
goroutine 함수 여러번 실행 결과값 기다리는 2가지 방법 - js callback 처럼 (1) | 2023.03.03 |
go gin framework graceful shutdown 예제 (0) | 2023.03.03 |