In diesem Artikel möchte ich die Verarbeitungszeit für die Konvertierung von Apache Arrow und JSON in das Spaltenformat Yosegi vergleichen. Überlegen.
Yosegi hat CLI, verwenden Sie diese.
Klonen Sie zuerst von GitHub. Führen Sie den Setup-Befehl aus, nachdem Sie diese JAR kompiliert haben.
$ git clone https://github.com/yahoojapan/yosegi-tools
$ mvn clean package
$ ./bin/setup.sh
Dadurch wird der Befehl verfügbar. Es gibt eine JSON-Beispieldatei, die Sie hier überprüfen können.
$ ./bin/yosegi.sh create -i ./etc/sample_json.txt -o /tmp/a.json -f json
$ ./bin/yosegi.sh cat -i /tmp/a.json -o "-"
{"summary":{"total_price":550,"total_weight":412},"number":5,"price":110,"name":"apple","class":"fruits"}
{"summary":{"total_price":800,"total_weight":600},"number":10,"price":80,"name":"orange","class":"fruits"}
Verwenden Sie die Daten, die Sie durch Konvertieren des Lineitems von TPC-H in JSON erhalten haben. Die Datengröße beträgt ca. 3,5 GB.
$ ls -l /tmp/lineitem.json
-rwxrwxrwx 1 hoge hoge 3665538085 Mar 6 14:24 /tmp/lineitem.json
Konvertieren Sie von JSON nach Yosegi. Die Verarbeitungszeit betrug ca. 2 Minuten und 41 Sekunden.
$ time HEAP_SIZE=1g ./bin/yosegi.sh create -i /tmp/lineitem.json -o /tmp/lineitem.yosegi.gz -f json
real 2m41.488s
user 1m47.595s
sys 0m44.432s
Konvertiert die Yosegi-Ausgabedatei in das Apache Arrow-Format. Die Bearbeitungszeit betrug ca. 16 Sekunden.
$ time HEAP_SIZE=1g ./bin/yosegi.sh to_arrow -i /tmp/lineitem.yosegi.gz -o /tmp/lineitem.arrow
real 0m16.134s
user 0m9.927s
sys 0m2.392s
Die Datengröße beträgt ca. 1,5 GB. Da es nur wenige Schlüsselinformationen gibt, sind diese erheblich geringer als bei JSON.
$ ls -l /tmp/lineitem.arrow
-rwxrwxrwx 1 hoge hoge 1566760242 Mar 6 16:24 /tmp/lineitem.arrow
Konvertiert die ausgegebene Apache Arrow-Datei in das Yosegi-Format. Die Verarbeitungszeit betrug ca. 1 Minute und 9 Sekunden.
$ time HEAP_SIZE=1g ./bin/yosegi.sh from_arrow -i /tmp/lineitem.arrow -o /tmp/lineitem_from_arrow.yosegi.gz
real 1m9.046s
user 1m4.562s
sys 0m1.558s
Führen Sie abschließend die Konvertierung von Yosegi nach JSON durch. Die Verarbeitungszeit betrug ca. 14 Minuten und 43 Sekunden.
$ time HEAP_SIZE=1g ./bin/yosegi.sh cat -i /tmp/lineitem.yosegi.gz -f json -o /tmp/lineitem_from_yosegi.json
real 14m42.576s
user 0m10.492s
sys 8m23.839s
Da das Schreibziel eine Festplatte ist, werde ich sie zum Vergleich auf / dev / null setzen.
Die Konvertierung von JSON dauerte ca. 46 Sekunden und die Konvertierung von Apache Arrow ca. 10 Sekunden.
$ time HEAP_SIZE=1g ./bin/yosegi.sh cat -i /tmp/lineitem.yosegi.gz -f json -o "-" > /dev/null
real 0m45.748s
user 0m44.851s
sys 0m0.429s
$ time HEAP_SIZE=1g ./bin/yosegi.sh to_arrow -i /tmp/lineitem.yosegi.gz -o "-" > /dev/null
real 0m10.141s
user 0m9.431s
sys 0m0.347s
wird bearbeitet | JSON-Zeit | Apache Arrow Zeit | Apache Arrow Zeit/JSON-Zeit |
---|---|---|---|
Schreiben Sie an Yosegi | 161s | 69s | 0.43 |
Lesen Sie von Yosegi | 46s | 10s | 0.22 |
Apache Arrow ist etwa 2,3-mal schneller zum Schreiben und 4,55-mal schneller zum Lesen als JSON.
Beim Schreibvorgang wird JSON zum Speichervorgang mit der Spaltendatenstruktur hinzugefügt. Apache Arrow verfügt über eine Spaltendatenstruktur, sodass es unverändert konvertiert werden kann. Daher entfällt der Vorgang zum vorübergehenden Speichern im Speicher. Es wird angenommen, dass der Grund, warum der Unterschied zum Lesen gering ist, darin besteht, dass die Verarbeitungszeit für die Komprimierung groß ist.
Beim Lesen wird JSON mit der Spaltendatenstruktur in den Speicher geladen, dann Nachrichteneinheiten eingelesen und in JSON konvertiert. Apache Arrow verfügt über eine Spaltendatenstruktur, sodass es unverändert geladen werden kann. Daher entfallen der Prozess des Lesens und der Prozess des Konvertierens jeder Nachricht.
Daraus lässt sich ableiten, dass es effizient ist, sich gegenseitig über Apache Arrow zu konvertieren. Unter der Annahme, dass Apache Arrow in Zukunft weit verbreitet sein wird, ist es möglicherweise effizienter, Ein- und Ausgaben basierend auf Apache Arrow zu entwerfen. In diesem Artikel wurden Datenformate beschrieben, aber wir möchten auch den Datenaustausch zwischen Sprachen besser verstehen.
Apache Arrow-Binärdateien können problemlos mit Python verarbeitet werden. Yosegi selbst unterstützt nur Java, kann jedoch einfach über Apache Arrow verknüpft werden.
import pyarrow as pa
reader = pa.RecordBatchFileReader( pa.OSFile( "/tmp/lineitem.arrow" ) )
rb = reader.get_record_batch(0)
df = rb.to_pandas()
print( df["l_linestatus"].value_counts() )
Das Ausführungsergebnis des obigen Programms ist wie folgt.
$ time python a.py
F 25129
O 24871
Name: l_linestatus, dtype: int64
real 0m0.327s
user 0m0.269s
sys 0m0.042s
Yosegi, das derzeit als OSS entwickelt wird, sucht Benutzer und Entwickler! Wenn Sie Interesse an Yosegi haben, können Sie sich gerne an uns wenden!
Recommended Posts