Ich lade in hochdimensionale Parkett-Dateien, brauche aber nur ein paar Spalten. Mein aktueller Code sieht so aus:
%Vor%Mein geistiges Modell für das, was passiert, ist, dass es alle Daten einlädt und dann die Spalten auswirft, die ich nicht haben will. Ich würde es natürlich vorziehen, in diesen Spalten nicht einmal zu lesen, und von dem, was ich über Parkett verstehe, scheint das möglich zu sein.
Also gibt es zwei Fragen:
sqc.parquetFile()
dazu zwingen, Daten effizienter einzulesen? Spark macht Dinge immer auf eine faule Art und Weise, indem er eine native Scala-Funktion verwendet. Der Scala-Code ist bereits kompiliert und macht die Laufzeit intelligent, ich meine faul, Entscheidungen. Mit Parkett sollte es nur die notwendigen Daten lesen, auf die der Code verweist. Das hängt natürlich von der Struktur der jeweiligen Parkettfeile ab. Der Punkt ist, dass es das Spaltenformat ausnutzen wird. Ich weiß nicht genug über Python, aber es sollte in der Lage sein, das Gleiche zu tun. Vielleicht überprüfen Sie, ob die Klasse pyspark Row irgendeine Art von fauler Magie verwendet. Eine schnelle Möglichkeit zur Überprüfung besteht darin, ein kontrolliertes Experiment durchzuführen, eine weitere rdd-Operation zu schreiben, die mehr Felder referenziert, diese aber nicht ausgibt. Dann können Sie einfach den Zeitunterschied der Wanduhr zwischen den 2 Operationen vergleichen. Abhängig von einigen relevanten Details der zugrunde liegenden Parkettdatei, sehen Sie möglicherweise nicht den Unterschied, auch wenn es lazy lädt.
Ja, es werden nur Felder von Disk ausgewählt.
"öffnet alle Datendateien, liest aber nur den Teil jeder Datei, der die Werte für diese Spalte enthält. Die Spaltenwerte werden fortlaufend gespeichert, wodurch die für die Verarbeitung der Werte innerhalb einer einzelnen Spalte erforderlichen E / A minimiert werden."
Diese Dokumentation ist für Impalas gedacht, ich denke, Leselogik ist für Funken auch die gleiche Ссылка
Tags und Links apache-spark pyspark apache-spark-sql parquet