使用 Go 插入消防水管

Posted

技术标签:

【中文标题】使用 Go 插入消防水管【英文标题】:Inserting into firehose with Go 【发布时间】:2022-01-02 01:39:45 【问题描述】:

我有以下 JSON 文件


    "@timestamp": "2021-11-19T21:32:55.196Z",
    "@version": "1",
    "message": "Manual test to firehose."

我有以下 Go 函数

func insertIntoFireHose(sess *session.Session, hoseName string) 
    svc := firehose.New(sess, aws.NewConfig().WithRegion("us-east-1"))
    //firehoseData := getObjectFromS3Bucket(sess)
    firehoseData, _ := os.ReadFile("/temp/test.json")

    var rec firehose.Record

    var recInput firehose.PutRecordInput

    dataJson, _ := json.Marshal(firehoseData)
    rec.SetData(dataJson)
    recInput.SetDeliveryStreamName(hoseName)
    recInput.SetRecord(&rec)

    res, err1 := svc.PutRecord(&recInput)

    if err1 != nil 
        log.Fatal(err1)
    
    fmt.Println(res)


我想要做的是获取一个文件并将其插入到 firehose 中,但我收到以下错误消息:

"type":"mapper_parsing_exception","reason":"failed to parse","caused_by":
"type":"not_x_content_exception",
"reason":"not_x_content_exception: Compressor detection can only be called on some xcontent bytes or compressed xcontent bytes"

而且我不太确定自己做错了什么。

更改记录以直接从文件中获取数据会返回此错误:

One or more records are malformed. Please ensure that each record is single valid JSON object and that it does not contain newlines.

【问题讨论】:

您提供的上述错误消息是对 kinesis putRecord API 的响应还是您在 firehose 控制台上找到的? 【参考方案1】:

    "@timestamp": "2021-11-19T21:32:55.196Z",
    "@version": "1",
    "message": "Manual test to firehose.",

我不认为这是一个有效的 JSON,它在第 3 行有一个尾随逗号。

这是有效的


    "@timestamp": "2021-11-19T21:32:55.196Z",
    "@version": "1",
    "message": "Manual test to firehose."

而 firehoseData 已经是[]byte,所以我认为您不需要再次json.Marshal

这是元帅的结果

代码:

package main

import (
    "encoding/json"
    "fmt"
    "os"
)

func main() 
    firehoseData, _ := os.ReadFile("./file.json") // same value

    fmt.Printf("%+v\n", string(firehoseData))

    test, err := json.Marshal(firehoseData)

    fmt.Printf("%+v\n", string(test))
    fmt.Printf("%+v\n", err)

输出:


    "@timestamp": "2021-11-19T21:32:55.196Z",
    "@version": "1",
    "message": "Manual test to firehose.",   

"ew0KICAgICJAdGltZXN0YW1wIjogIjIwMjEtMTEtMTlUMjE6MzI6NTUuMTk2WiIsDQogICAgIkB2ZXJzaW9uIjogIjEiLA0KICAgICJtZXNzYWdlIjogIk1hbnVhbCB0ZXN0IHRvIGZpcmVob3NlLiIsDQp9"
<nil>

【讨论】:

json 上的附加逗号是我的拼写错误,问题仍然存在。将 firehosedata 直接设置到记录中会返回一个新错误:一条或多条记录格式错误。请确保每条记录都是单个有效的 JSON 对象,并且不包含换行符。 that it does not contain newlines,也许你可以尝试将你的json压缩到1行,就像这样"@timestamp": "2021-11-19T21:32:55.196Z","@version": "1","message": "Manual test to firehose."当你用os.ReadFile读取它时,它也会读取新行(输入)i.imgur.com/NahL9o4_d.webp?maxwidth=760&fidelity=grand长度不一样 错误消失了,但没有插入任何东西,真是让人头疼。 好吧,我以前从未尝试过亚马逊消防软管,无法为您提供更多帮助,抱歉。

以上是关于使用 Go 插入消防水管的主要内容,如果未能解决你的问题,请参考以下文章

Go-插入排序

luoguP4172 [WC2006]水管局长

批量MySQL插入比PHP慢2倍

Go Home | 这是一支走心的消防公益广告……

Go 单链表有序插入

Go 单链表有序插入