當前位置: 妍妍網 > 碼農

PySpark題外話(二):想通訊?談錢多俗,談ProtoBuf

2024-02-20碼農

戳藍字 Python都知道 關註 我哦!

前言

哈嘍大家好,我是了不起。

大數據開發中,除了儲存,還有個很重要的問題就是數據傳輸,怎麽去安全有效,並且有很強的拓展性去傳輸數據是非常重要,這就要說下今天的主角ProtoBuf

什麽是ProtoBuf

protocol buffers 是一種語言無關、平台無關、可延伸的序列化結構數據的方法,它可用於(數據)通訊協定、數據儲存等。

protobuf對於結構中的每個成員會提供set系列函式和get系列函式。與XML相比,protoBuf更小更快更簡單。你可以用定義protobuf的數據結構。用protobuf編譯器生成特定語言的原始碼,如C++,Java,Python等。

ProtoBuf的優點:

  • 平台無關、語言無關

  • 二進制、數據字描述

  • 提供了完整詳細的操作API

  • 高效能比XML要快20-100倍

  • 尺寸小比XML要小3-10倍高可延伸性

  • 數據字描述前後相容

  • ProtoBuf的缺點:

  • 語言覆蓋度低,官方支持java、c++、python語言環境

  • 自訂protobuf的工作量偏大

  • 為什麽是ProtoBuf

    ProtoBuf使用的最佳場景,就是制定協定。

    只要只官方支持的語言環境,只需要制定一套協定,大家可以各自生成自己的解析工具,接收到協定後進行解析。

    協定也是支持變更的,在一定情況下,也不會影響低版本的協定解析,所以一方針對某些場景進行升級時,不用通知所有的終端,只需要相應有依賴的終端進行升級即可。

    ProtoBuf的數據是用二進制儲存的,本身相比json或者xml數據儲存就小,如果再加上壓縮,那會更加降低頻寬。

    如何使用ProtoBuf

    首先,需要安裝protobuf庫:

    pip install protobuf

    接著,需要編寫.proto檔定義數據結構,比如定義一個簡單的訊息:

    syntax = "proto3";
    package test;
    message Person {
    int32 id = 1;
    string name = 2;
    int32 age = 3;
    }

    然後,根據.proto檔生成對應的Python程式碼:

    protoc --proto_path=. --python_out=. persion.proto

    這樣就生成了一個Python檔persion_pb2.py,裏麵包含與訊息相關的、自動生成的程式碼。

    接下來就可以在Python中使用protobuf了:

    import persion_pb2
    # 建立一個Person例項
    person = persion_pb2.Person()
    person.id = 123
    person.name = "Jack"
    person.age = 18
    # 將Person序列化成二進制數據
    data = person.SerializeToString()
    # 將二進制數據反序列化成Person物件
    new_person = persion_pb2.Person()
    new_person.ParseFromString(data)
    # 輸出Person物件的內容值
    print(new_person.id)
    print(new_person.name)
    print(new_person.age)

    輸出結果:

    123 Jack 18

    這就是使用protobuf在Python中進行序列化和反序列化操作了。

    總結

    今天給大家帶來的是在Python中使用ProtoBuf,在日常開發中面對接收數據後進行清洗或者處理等會經常用到。

    如果您喜歡我的文章,可以持續關註,後續文章更精彩,敬請期待。

    PS Python都知道技術交流群(技術交流、摸魚、白嫖課程為主)又不定時開放了,感興趣的朋友,可以在下方公號內回復: 666 ,即可進入。

    老規矩 ,道友們還記得麽, 右下角的 「在看」 點一下 如果感覺文章內容不錯的話,記得分享朋友圈讓更多的人知道!