Was ist der Unterschied zwischen DataFrame und Dataset in Spark? Bitte erläutern Sie das Konzept und die Verwendung.

Was ist der Unterschied zwischen DataFrame und Dataset in Spark? Bitte erläutern Sie das Konzept und die Verwendung.

In Spark sind DataFrame und Dataset zwei wichtige Datenabstraktionsschichten. Dabei handelt es sich allesamt um Datenstrukturen auf hoher Ebene, die zur Darstellung verteilter Datensätze verwendet werden, APIs auf höherer Ebene und umfangreichere Funktionen bereitstellen und bequemer und effizienter als RDD sind.

Lassen Sie uns zunächst die Konzepte und Eigenschaften von DataFrame verstehen.

DataFrame ist eine spaltenbasierte Datenstruktur, ähnlich wie Tabellen in relationalen Datenbanken. Es verfügt über die folgenden Hauptmerkmale:

  1. Strukturierte Daten: DataFrame ist ein strukturiertes Datenformat, jede Spalte hat einen klaren Datentyp. Dadurch kann DataFrame halbstrukturierte und strukturierte Daten wie CSV-Dateien, JSON-Dateien und Datenbanktabellen besser verarbeiten.

  2. Verzögerte Berechnung: DataFrame verwendet eine verzögerte Berechnungsstrategie, das heißt, die Berechnung wird nur durchgeführt, wenn das Ergebnis benötigt wird. Dies kann die Berechnungseffizienz verbessern und unnötige Berechnungen vermeiden.

  3. Ausführungsplan optimieren: DataFrame wird bei der Ausführung des Plans optimiert, um die Abfrageleistung zu verbessern. Durch die Optimierung des Ausführungsplans kann Spark die beste Ausführungsmethode auswählen, z. B. die Auswahl der entsprechenden Operatorreihenfolge, die Verwendung von Indizes usw.

  4. SQL-Unterstützung: DataFrame bietet Unterstützung für SQL-Abfragen. Sie können SQL-Anweisungen verwenden, um DataFrame abzufragen und zu betreiben. Dadurch können Entwickler die vertraute SQL-Syntax für die Datenverarbeitung verwenden und so die Lernkosten senken.

Lassen Sie uns als Nächstes die Konzepte und Eigenschaften von Dataset verstehen.

Dataset ist eine stark typisierte Datenstruktur, die eine Erweiterung von DataFrame darstellt. Der Datensatz kann zur Kompilierungszeit eine Typprüfung durchführen und so eine bessere Typsicherheit und Fehlererkennungsfunktionen bieten.

Der Datensatz verfügt über die folgenden Hauptfunktionen:

  1. Stark typisierte Daten: Der Datensatz ist eine stark typisierte Datenstruktur, jedes Element hat einen klaren Datentyp. Dies ermöglicht es Entwicklern, Typfehler zur Kompilierzeit zu erkennen, was für eine bessere Typsicherheit sorgt.

  2. Hohe Leistung: Da Dataset zur Kompilierungszeit eine Typprüfung durchführen kann, können effizientere Ausführungspläne generiert werden. Dadurch erhält Dataset eine bessere Leistung, insbesondere wenn es um komplexe Datenoperationen geht.

  3. Datenquellenintegration: Der Datensatz kann in verschiedene Datenquellen integriert werden, einschließlich relationaler Datenbanken, Hive-Tabellen, Parquet-Dateien usw. Dies ermöglicht Entwicklern das einfache Lesen und Schreiben in verschiedene Datenquellen.

  4. Unterstützte Programmiersprachen: Dataset unterstützt mehrere Programmiersprachen, darunter Java, Scala und Python. Dadurch können Entwickler ihre vertraute Programmiersprache für die Datenverarbeitung und -analyse verwenden.

Das Folgende ist ein spezieller Fall der Verwendung von DataFrame und Dataset für die Datenverarbeitung, geschrieben in Java-Sprache:

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;

public class DataFrameAndDatasetExample {
    
    
    public static void main(String[] args) {
    
    
        // 创建SparkSession
        SparkSession spark = SparkSession.builder()
                .appName("DataFrameAndDatasetExample")
                .getOrCreate();

        // 读取CSV文件创建DataFrame
        Dataset<Row> df = spark.read()
                .option("header", true)
                .csv("hdfs://path/to/input.csv");

        // 显示DataFrame的前10行数据
        df.show(10);

        // 使用DataFrame进行查询和操作
        Dataset<Row> filteredDf = df.filter("age > 30");
        Dataset<Row> selectedDf = filteredDf.select("name", "age");
        Dataset<Row> sortedDf = selectedDf.orderBy("age");

        // 将DataFrame转换为Dataset
        Dataset<Person> dataset = sortedDf.as(Person.class);

        // 显示Dataset的前10行数据
        dataset.show(10);

        // 停止SparkSession
        spark.stop();
    }

    // 定义一个Person类,用于表示数据集的元素
    public static class Person {
    
    
        private String name;
        private int age;

        // 必须提供无参构造函数和getter/setter方法
        public Person() {
    
    }

        public String getName() {
    
    
            return name;
        }

        public void setName(String name) {
    
    
            this.name = name;
        }

        public int getAge() {
    
    
            return age;
        }

        public void setAge(int age) {
    
    
            this.age = age;
        }
    }
}

In diesem Beispiel erstellen wir zunächst ein SparkSession-Objekt, um eine Verbindung mit dem Spark-Cluster herzustellen. Anschließend readlesen wir mithilfe der Methode eine CSV-Datei aus HDFS und erstellen einen DataFrame. Als Nächstes verwenden wir die Abfrage- und Manipulationsmethoden von DataFrame, um Manipulationen an den Daten durchzuführen, z. B. Filtern, Auswählen und Sortieren. Anschließend askonvertieren wir den DataFrame mithilfe der Methode in einen Datensatz und geben dabei den Typ der Elemente als PersonKlasse an. Schließlich verwenden wir showdie Methode, um die ersten 10 Zeilen von DataFrame und Dataset anzuzeigen, und rufen stopdie Methode auf, um die SparkSession zu stoppen.

Anhand dieses Falles können wir die Unterschiede und Eigenschaften von DataFrame und Dataset erkennen. DataFrame ist eine spaltenbasierte Datenstruktur, die strukturierte Datenverarbeitung und SQL-Abfragefunktionen bietet. Der Datensatz ist eine stark typisierte Datenstruktur, die eine bessere Typsicherheit und hohe Leistung bietet. Sowohl DataFrame als auch Dataset sind wichtige Datenabstraktionsschichten in Spark für die Verarbeitung und Analyse großer verteilter Datensätze.

おすすめ

転載: blog.csdn.net/qq_51447496/article/details/132765097