在 os.Create() 不加載數據後將 CSV 文件加載到 bigquery

Avishay28

我正在嘗試運行以下流程:

  1. 從某處獲取數據
  2. 創建新的本地 CSV 文件,將數據寫入該文件
  3. 將 CSV 上傳到 Bigquery
  4. 刪除本地文件

但它似乎加載了空數據。這是代碼:

func (c *Client) Do(ctx context.Context) error {
    bqClient, err := bigquerypkg.NewBigQueryUtil(ctx, "projectID", "datasetID")
    if err != nil {
        return err
    }

    data, err := c.GetSomeData(ctx)
    if err != nil {
        return err
    }

    file, err := os.Create("example.csv")
    if err != nil {
        return err
    }
    defer file.Close()
    // also file need to be delete

    writer := csv.NewWriter(file)
    defer writer.Flush()

    timestamp := time.Now().UTC().Format("2006-01-02 03:04:05.000000000")
    for _, d := range data {
        csvRow := []string{
            d.ID,
            d.Name,
            timestamp,
        }
        err = writer.Write(csvRow)
        if err != nil {
            log.Printf("error writing data to CSV: %v\n", err)
        }
    }

    source := bigquery.NewReaderSource(file)
    source.Schema = bigquery.Schema{
        {Name: "id", Type: bigquery.StringFieldType},
        {Name: "name", Type: bigquery.StringFieldType},
        {Name: "createdAt", Type: bigquery.TimestampFieldType},
    }
    if _, err = bqClient.LoadCsv(ctx, "tableID", source); err != nil {
        return err
    }

    return nil
}

LoadCSV() 看起來像這樣:

func (c *Client) LoadCsv(ctx context.Context, tableID string, src bigquery.LoadSource) (string, error) {
    loader := c.bigQueryClient.Dataset(c.datasetID).Table(tableID).LoaderFrom(src)
    loader.WriteDisposition = bigquery.WriteTruncate
    job, err := loader.Run(ctx)
    if err != nil {
        return "", err
    }
    status, err := job.Wait(ctx)
    if err != nil {
        return job.ID(), err
    }

    if status.Err() != nil {
        return job.ID(), fmt.Errorf("job completed with error: %v", status.Err())
    }

    return job.ID(), nil
}

運行此操作後,bigquery 確實創建了架構但沒有數據。如果我要更改os.Create()os.Open()並且文件已經存在,則一切正常。就像加載CSV時文件數據尚未寫入(?)是什麼原因?

丹尼爾·法雷爾

我在這裡看到的問題是您沒有將文件句柄的光標倒回到文件的開頭。因此,下一個讀將在的文件,並且將一個0字節讀取。這就解釋了為什麼文件中似乎沒有內容。

https://pkg.go.dev/os#File.Seek可以為您處理。

實際上,Flush不相關,因為您使用相同的文件句柄來讀取文件而不是寫入文件,因此即使沒有刷新,您也會看到自己寫入的字節如果文件由不同的進程打開或重新打開,則不會出現這種情況。

示範:

package main

import (
    "fmt"
    "io"
    "os"
)

func main() {
    f, err := os.CreateTemp("", "data.csv")
    if err != nil {
        panic(err)
    } else {
        defer f.Close()
        defer os.Remove(f.Name())
    }
    fmt.Fprintf(f, "hello, world")
    fmt.Fprintln(os.Stderr, "Before rewind: ")
    if _, err := io.Copy(os.Stderr, f); err != nil {
        panic(err)
    }
    f.Seek(0, io.SeekStart)
    fmt.Fprintln(os.Stderr, "\nAfter rewind: ")
    if _, err := io.Copy(os.Stderr, f); err != nil {
        panic(err)
    }
    fmt.Fprintln(os.Stderr, "\n")
}
% go run t.go
Before rewind:

After rewind:
hello, world

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

將 gzip mysql 表文件加載到本地 mysql 時出錯

將數組中的數據加載並彙總到變量中

將數據加載到 postgreSQL 數據庫中

如何將txt文件加載到二維矩陣中?

如何將反應數據加載到多選組件?

如何將多個 csv 文件加載到 Python 中的可迭代變量?

wxpython - 使用 treectrl 將本地 html 文件加載到面板中

在 Python 中將文件加載到列表中

使用換行符加載 CSV

根據 id 將節點從 CSV 加載到 Neo4j 中?

使用 NumPy 加載 CSV 數據失敗並出現錯誤

如何使用數據工廠將數據從 Azure Blob 存儲增量加載到 Azure SQL 數據庫?

如何從 Nestjs 中的 URL 將數據下載到 JSON 文件中?

Python,將Excel文件加載到字典

將 TSV 文件中的列加載到 python 列表中

Python 將巨大的 csv 加載到 postgresql

SwiftUI 加載數據

需要每周自動將excel數據加載到數據庫表中

React-Native FlatList 白屏不加載數據

SwiftUI Firestore 等待加載數據

使用python將csv文件加載到谷歌表中

如何使用數組類型列從 CSV 加載數據以生成數據框

使用 http.createServer 的回調將兩種不同類型的數據加載到網頁中

加載 csv 並將每個值傳遞給 url 參數?

將 CSV 從 GCS 批量加載到 BigQuery 時,表數據是增量查看還是僅加載所有文件一次?

使用python代碼將csv文件中的數據加載到oracle db時,真值顯示為1,假值顯示為0

根據兩個文件中的匹配部分將數據從一個文件加載到另一個文件

如何使用python將數據加載到redshift表中?

將表從數據庫加載到運行時創建的 DataGridView - C# 表單