[JAVA] Vergleich der Verarbeitungszeit für die Konvertierung von Apache Arrow und JSON in Yosegi

In diesem Artikel möchte ich die Verarbeitungszeit für die Konvertierung von Apache Arrow und JSON in das Spaltenformat Yosegi vergleichen. Überlegen.

Yosegi vorbereiten

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"}

Zum Vergleich verwendete Daten

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

Überprüfungsarbeit

Konvertierung von JSON nach Yosegi

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

Umstellung von Yosegi auf Apache Arrow

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

Konvertierung von Apache Arrow nach Yosegi

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

Yosegi zu JSON Konvertierung

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

Zusammenfassung des Vergleichs

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.

Zusammenfassung

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.

Bonus

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

schließlich

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

Vergleich der Verarbeitungszeit für die Konvertierung von Apache Arrow und JSON in Yosegi
Konvertieren Sie mit Ruby von JSON nach TSV und von TSV nach JSON
Konvertieren Sie Java Enum Enumeration und JSON von und nach Jackson
[Java] Konvertieren Sie JSON in Java und Java in JSON-How to use GSON and Jackson-
[Android] Konvertieren Sie Map in JSON mit GSON mit Kotlin und Java
Konvertieren Sie das Ruby-Objekt in das JSON-Format
Im Vergleich zu Summe und Summierung Int
So konvertieren Sie LocalDate und Timestamp
Konvertieren Sie von der Java-UTC-Zeit in die JST-Zeit