欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang使用DuckDB查詢Parquet文件數(shù)據(jù)的操作代碼

 更新時(shí)間:2025年01月23日 10:09:41   作者:夢(mèng)想畫(huà)家  
本文介紹DuckDB查詢Parquet文件的典型應(yīng)用場(chǎng)景,掌握DuckDB會(huì)讓你的產(chǎn)品分析能力更強(qiáng),相反系統(tǒng)運(yùn)營(yíng)成本相對(duì)較低,為了示例完整,我也提供了如何使用Python導(dǎo)出MongoDB數(shù)據(jù),需要的朋友可以參考下

Apache Parquet文件格式在存儲(chǔ)和傳輸大型數(shù)據(jù)集方面變得非常流行。最近遇到一個(gè)典型應(yīng)用場(chǎng)景,在MongoDB中存儲(chǔ)大量結(jié)構(gòu)化數(shù)據(jù)的成本過(guò)高。相反,我們將這些數(shù)據(jù)以Parquet格式存儲(chǔ)在S3中。為了提供偶爾的查詢,我們下載S3文件并使用DuckDB加載/查詢。

導(dǎo)出MongoDB數(shù)據(jù)

將 MongoDB 中的數(shù)據(jù)導(dǎo)入為 Parquet 格式的步驟及相應(yīng)的代碼示例(使用 Python),主要包括三個(gè)步驟:

  1. 從 MongoDB 中讀取數(shù)據(jù)。
  2. 將讀取的數(shù)據(jù)存儲(chǔ)為 DataFrame 格式(使用 pandas)。
  3. 使用 pyarrow 將 DataFrame 轉(zhuǎn)換為 Parquet 格式。
import pymongo
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq


# 連接 MongoDB
def connect_to_mongodb(host='localhost', port=27017, db_name='your_db_name', collection_name='your_collection_name'):
    client = pymongo.MongoClient(host, port)
    db = client[db_name]
    collection = db[collection_name]
    return collection


# 從 MongoDB 讀取數(shù)據(jù)
def read_from_mongodb(collection):
    data = list(collection.find())
    df = pd.DataFrame(data)
    return df


# 將 DataFrame 轉(zhuǎn)換為 Parquet 并保存
def convert_to_parquet(df, output_path='output.parquet'):
    table = pa.Table.from_pandas(df)
    pq.write_table(table, output_path)


if __name__ == "__main__":
    # 連接 MongoDB
    collection = connect_to_mongodb(db_name='test_db', collection_name='test_collection')
    # 從 MongoDB 讀取數(shù)據(jù)
    df = read_from_mongodb(collection)
    # 將數(shù)據(jù)存儲(chǔ)為 Parquet 格式
    convert_to_parquet(df, output_path='mongodb_data.parquet')

注意:

  • 首先,確保已經(jīng)安裝所需的 Python 庫(kù):

pip install pymongo pandas pyarrow
  1. 替換代碼中的 db_name 和 collection_name 為你實(shí)際的 MongoDB 數(shù)據(jù)庫(kù)和集合名稱。

  2. 運(yùn)行代碼,將從 MongoDB 中讀取數(shù)據(jù),并將其存儲(chǔ)為 Parquet 格式的文件,文件名為 mongodb_data.parquet。

Go 查詢parquet文件

Parquet 是一種列式存儲(chǔ)格式,專為高效存儲(chǔ)和處理大規(guī)模數(shù)據(jù)而設(shè)計(jì)。它支持多種數(shù)據(jù)類型,能對(duì)數(shù)據(jù)進(jìn)行壓縮和編碼,以減少存儲(chǔ)空間并提高讀寫(xiě)性能。Parquet 具有良好的可擴(kuò)展性和兼容性,可與 Hadoop、Spark 等大數(shù)據(jù)處理框架無(wú)縫集成,廣泛應(yīng)用于數(shù)據(jù)倉(cāng)庫(kù)、數(shù)據(jù)分析等領(lǐng)域,能有效提升數(shù)據(jù)處理的效率和靈活性。

下面是用Golang編寫(xiě)的代碼。

package main

import (
 "database/sql"
 "fmt"
 "log"

 _ "github.com/marcboeker/go-duckdb"
)

func main() {
    db := OpenDuckDB()
    rows, err := db.Query("SELECT id, first_name, family_name from read_parquet('employee.parquet');")
    if err != nil {
    	panic(fmt.Sprintf("failed to run select query against parquet file %v", err))
    }
    type Employee struct {
        Id         string `db:"id"`
        FirstName  string `db:"first_name"`
        FamilyName string `db:"family_name"`
    }
    
    var row Employee
    
    defer rows.Close()
    for rows.Next() {
        err := rows.Scan(&row.Id, &row.FirstName, &row.FamilyName)
        if err != nil {
            log.Fatal(err)
        }
        log.Printf("%v", row)
    }
    
    err = rows.Err()
    if err != nil {
    	log.Fatal(err)
    }
}

func OpenDuckDB() (db *sql.DB) {
    db, err := sql.Open("duckdb", "")
    if err != nil {
    	panic(fmt.Sprintf("failed to open parquet file using duckdb %v", err))
    }
    _, err = db.Exec("INSTALL parquet;")
    if err != nil {
    	panic(fmt.Sprintf("failed to INSTALL parquet extension. %v", err))
    }
    _, err = db.Exec("LOAD parquet;")
    if err != nil {
    	panic(fmt.Sprintf("failed to LOAD parquet extension. %v", err))
    }
    return
}

雖然Parquet文件主要用于將數(shù)據(jù)從事務(wù)性數(shù)據(jù)庫(kù)傳輸?shù)綌?shù)據(jù)倉(cāng)庫(kù),但它也可以用于直接在Parquet文件之上構(gòu)建查詢和分析。

到此這篇關(guān)于Golang使用DuckDB查詢Parquet文件數(shù)據(jù)的操作代碼的文章就介紹到這了,更多相關(guān)Golang DuckDB查詢Parquet數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go實(shí)現(xiàn)后臺(tái)任務(wù)調(diào)度系統(tǒng)的實(shí)例代碼

    Go實(shí)現(xiàn)后臺(tái)任務(wù)調(diào)度系統(tǒng)的實(shí)例代碼

    平常我們?cè)陂_(kāi)發(fā)API的時(shí)候,前端傳遞過(guò)來(lái)的大批數(shù)據(jù)需要經(jīng)過(guò)后端處理,如果后端處理的速度快,前端響應(yīng)就快,反之則很慢,影響用戶體驗(yàn),為了解決這一問(wèn)題,需要我們自己實(shí)現(xiàn)后臺(tái)任務(wù)調(diào)度系統(tǒng),本文將介紹如何用Go語(yǔ)言實(shí)現(xiàn)后臺(tái)任務(wù)調(diào)度系統(tǒng),需要的朋友可以參考下
    2023-06-06
  • go語(yǔ)言中時(shí)間戳格式化的方法

    go語(yǔ)言中時(shí)間戳格式化的方法

    這篇文章主要介紹了go語(yǔ)言中時(shí)間戳格式化的方法,涉及Go語(yǔ)言中time的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • Go結(jié)構(gòu)體SliceHeader及StringHeader作用詳解

    Go結(jié)構(gòu)體SliceHeader及StringHeader作用詳解

    這篇文章主要為大家介紹了Go結(jié)構(gòu)體SliceHeader及StringHeader作用的功能及面試官愛(ài)問(wèn)的實(shí)際意義詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 詳解Go channel管道的運(yùn)行原理

    詳解Go channel管道的運(yùn)行原理

    Go推薦通過(guò)通信來(lái)共享內(nèi)存,而channel就實(shí)現(xiàn)了這一理念。那channel是怎么運(yùn)行的呢?本文將帶你搞懂Go channel管道的運(yùn)行原理,感興趣的同學(xué)可以參考一下
    2023-05-05
  • GOLANG使用Context實(shí)現(xiàn)傳值、超時(shí)和取消的方法

    GOLANG使用Context實(shí)現(xiàn)傳值、超時(shí)和取消的方法

    這篇文章主要介紹了GOLANG使用Context實(shí)現(xiàn)傳值、超時(shí)和取消的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • golang gorm 操作mysql及gorm基本用法

    golang gorm 操作mysql及gorm基本用法

    golang 官方的那個(gè)操作mysql的有點(diǎn)麻煩所以就使用了gorm,下面就gorm的使用做下簡(jiǎn)單介紹,感興趣的朋友跟隨小編一起看看吧
    2018-11-11
  • Go語(yǔ)言實(shí)現(xiàn)的可讀性更高的并發(fā)神庫(kù)詳解

    Go語(yǔ)言實(shí)現(xiàn)的可讀性更高的并發(fā)神庫(kù)詳解

    這篇文章主要為大家介紹了Go語(yǔ)言實(shí)現(xiàn)的可讀性更高的并發(fā)神庫(kù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • go語(yǔ)言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析

    go語(yǔ)言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析

    這篇文章主要為大家介紹了go語(yǔ)言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Golang中互斥鎖和讀寫(xiě)互斥鎖原理及示例代碼

    Golang中互斥鎖和讀寫(xiě)互斥鎖原理及示例代碼

    在Golang中,互斥鎖是一種基本的同步原語(yǔ),用于實(shí)現(xiàn)對(duì)共享資源的互斥訪問(wèn),讀寫(xiě)互斥鎖是一種特殊類型的互斥鎖,它允許多個(gè)協(xié)程同時(shí)讀取某個(gè)共享資源,本文將通過(guò)過(guò)示例代碼詳細(xì)介紹Golang中互斥鎖和讀寫(xiě)互斥鎖,需要的朋友可以參考下
    2023-05-05
  • Go語(yǔ)言實(shí)現(xiàn)Snowflake雪花算法

    Go語(yǔ)言實(shí)現(xiàn)Snowflake雪花算法

    雪花算法產(chǎn)生的背景當(dāng)然是twitter高并發(fā)環(huán)境下對(duì)唯一ID生成的需求,得益于twitter內(nèi)部牛的技術(shù),雪花算法能夠流傳于至今并且被廣泛使用,本文就詳細(xì)的介紹一下,感興趣的可以了解一下
    2021-06-06

最新評(píng)論