Ausführliche Erklärung von Sparks DataFrame und Schema sowie praktische Falldemo

1. Konzepteinführung

Spark ist ein verteiltes Computer-Framework zur Abwicklung umfangreicher Datenverarbeitungsaufgaben. In Spark ist DataFrame eine verteilte Datensammlung, ähnlich einer Tabelle in einer relationalen Datenbank. DataFrame bietet eine Abstraktion auf höherer Ebene, die es Benutzern ermöglicht, Daten deklarativ zu verarbeiten, ohne sich um die Details der zugrunde liegenden Daten und die Komplexität verteilter Datenverarbeitung kümmern zu müssen. Schema wird in Spark verwendet, um die Datenstruktur in DataFrame zu beschreiben, ähnlich der Spaltendefinition in einer Tabelle.

Lassen Sie uns DataFrame und Schema separat vorstellen:

Datenrahmen:

Ein DataFrame ist eine verteilte Sammlung von Daten, die aus Zeilen und Spalten besteht und der Struktur einer herkömmlichen Datenbank oder Tabelle ähnelt. Der DataFrame von Spark weist die folgenden Merkmale auf:
Verteiltes Rechnen: DataFrame ist verteilt und kann parallel auf mehreren Knoten im Cluster verarbeitet werden, um eine leistungsstarke Datenverarbeitung in großem Maßstab zu erreichen.
Unveränderlichkeit: DataFrames sind unveränderlich, was bedeutet, dass sie nach ihrer Erstellung nicht mehr geändert werden können. Stattdessen generieren Operationen an DataFrames neue DataFrames.
Verzögerte Ausführung: Spark verwendet eine verzögerte Ausführungsstrategie, das heißt, die Vorgänge auf dem DataFrame werden nicht sofort ausgeführt, sondern optimiert und ausgeführt, wenn Ausgabeergebnisse erforderlich sind.
Benutzer können SQL-Anweisungen, die Spark-API oder Spark SQL verwenden, um DataFrame zu betreiben, Datenfilterung, Konvertierung, Aggregation und andere Vorgänge durchzuführen. Der Vorteil von DataFrame liegt in seiner Benutzerfreundlichkeit und seinen Optimierungsmöglichkeiten. Spark optimiert den gesamten Berechnungsprozess entsprechend dem Ausführungsplan des Vorgangs, um die Leistung zu verbessern.

Schema:

Schema ist eine strukturelle Beschreibung der Daten in DataFrame, die die Spaltennamen und Datentypen von DataFrame definiert. In Spark ist ein Schema eine Sammlung von Metadaten, einschließlich Spaltennamen und Datentypen. Die Schemainformationen eines DataFrames sind entscheidend für eine optimierte Berechnung und korrekte Interpretation von Datentypen.
Normalerweise wird das Schema automatisch abgeleitet, wenn der DataFrame erstellt wird, oder es kann explizit programmgesteuert angegeben werden. Der Vorteil der Angabe eines Schemas besteht darin, dass sichergestellt wird, dass die Daten korrekt interpretiert werden und potenzielle Fehler bei der Typkonvertierung vermieden werden. Wenn die Datenquelle keine Schemainformationen enthält oder das Schema geändert werden muss, können Sie StructType und StructField verwenden, um das Schema anzupassen. Sie können beispielsweise ein Schema mit mehreren Feldern und Datentypen erstellen, z. B. Zeichenfolgen, Ganzzahlen, Datumsangaben usw.

Wenn Spark zum Lesen von Datenquellen wie CSV-Dateien, JSON-Daten, Datenbanktabellen usw. verwendet wird, versucht Spark, das Schema der Daten automatisch abzuleiten. Wenn die Datenquelle selbst nicht genügend Informationen bereitstellt, können Sie die Schema-Option verwenden, um das Schema des DataFrame durch nachfolgende Datentransformationsvorgänge anzugeben oder anzupassen.

Zusammenfassung: DataFrame ist eine leistungsstarke verteilte Datenstruktur in Spark, die es Benutzern ermöglicht, Daten auf deklarative Weise zu verarbeiten, während Schema zur Beschreibung der Strukturinformationen von Daten in DataFrame verwendet wird, um sicherzustellen, dass Daten korrekt interpretiert und verarbeitet werden. Diese beiden Konzepte zusammen bilden die leistungsstarken Datenverarbeitungsfunktionen von Spark.

Code-Kampf

package test.scala

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.Row
import org.apache.spark.sql.types.{
    
    IntegerType, StringType, StructType}

object TestSchema {
    
    
  def getSparkSession(appName: String, localType: Int): SparkSession = {
    
    
    val builder: SparkSession.Builder = SparkSession.builder().appName(appName)
    if (localType == 1) {
    
    
      builder.master("local[8]") // 本地模式,启用8个核心
    }

    val spark = builder.getOrCreate() // 获取或创建一个新的SparkSession
    spark.sparkContext.setLogLevel("ERROR") // Spark设置日志级别
    spark
  }

  def main(args: Array[String]): Unit = {
    
    
    println("Start TestSchema")
    val spark: SparkSession = getSparkSession("TestSchema", 1)

    val structureData = Seq(
      Row("36636", "Finance", Row(3000, "USA")),
      Row("40288", "Finance", Row(5000, "IND")),
      Row("42114", "Sales", Row(3900, "USA")),
      Row("39192", "Marketing", Row(2500, "CAN")),
      Row("34534", "Sales", Row(6500, "USA"))
    )

    val structureSchema = new StructType()
      .add("id", StringType)
      .add("dept", StringType)
      .add("properties", new StructType()
        .add("salary", IntegerType)
        .add("location", StringType)
      )

    val df = spark.createDataFrame(
      spark.sparkContext.parallelize(structureData), structureSchema)
    df.printSchema()
    df.show(false)

    val row = df.first()
    val schema = row.schema
    val structTypeList = schema.toList
    println(structTypeList.size)
    for (i <- 0 to structTypeList.size - 1) {
    
    
      val structType = structTypeList(i)
      println(structType.name, row.getAs(structType.name), structType.dataType, structType.dataType)
    }
  }
}

Ausgabe

Starten Sie TestSchema
mit dem Standard-log4j-Profil von Spark: org/apache/spark/log4j-defaults.properties
23.07.29 09:47:59 INFO SparkContext: Ausführen von Spark Version 2.4.0
23.07.29 09:47:59 WARN NativeCodeLoader : Native-Hadoop-Bibliothek für Ihre Plattform kann nicht geladen werden … ggf. mit integrierten Java-Klassen
23.07.29 09:47:59 INFO SparkContext: Eingereichte Anwendung: TestSchema
23.07.29 09:47:59 INFO SecurityManager: Änderung ACLs anzeigen zu: Nebula
23.07.29 09:47:59 INFO SecurityManager: ACLs ändern zu ändern zu: Nebula
23.07.29 09:47:59 INFO SecurityManager: ACLs-Gruppen anzeigen zu ändern zu:
23.07.29 09: 47:59 INFO SecurityManager: Ändern von ACLS-Gruppen in:
23.07.29 09:47:59 INFO SecurityManager: SecurityManager: Authentifizierung deaktiviert; UI-ACLs deaktiviert; Benutzer mit Ansichtsberechtigungen: Set(Nebula); Gruppen mit Ansichtsberechtigungen: Set(); Benutzer mit Änderungsberechtigungen: Set(Nebula); Gruppen mit Änderungsberechtigungen: Set()
23.07.29 09:48:01 INFO Utils: Dienst „sparkDriver“ auf Port 60785 erfolgreich gestartet.
23.07.29 09:48:01 INFO SparkEnv: MapOutputTracker registrieren
23.07. 29 09:48:01 INFO SparkEnv: Registrieren von BlockManagerMaster
23.07.29 09:48:01 INFO BlockManagerMasterEndpoint: Verwendung von org.apache.spark.storage.DefaultTopologyMapper zum Abrufen von Topologieinformationen
23.07.29 09:48:01 INFO BlockManagerMasterEndpoint : BlockManagerMasterEndpoint hoch
23.07.29 09:48:01 INFO DiskBlockManager: Lokales Verzeichnis unter C:\Users\Nebula\AppData\Local\Temp\blockmgr-6f861361-4d98-4372-b78a-2949682bd557 erstellt 23.07.29 09:48
: 01 INFO MemoryStore: MemoryStore mit Kapazität 8,3 GB gestartet
23.07.29 09:48:01 INFO SparkEnv: OutputCommitCoordinator registrieren
23.07.29 09:48:01 INFO Utils: Dienst „SparkUI“ auf Port 4040 erfolgreich gestartet.
23/ 29.07. 09:48:01 INFO SparkUI: SparkUI an 0.0.0.0 gebunden und unter http://LAPTOP-PEA8R2PO:4040 gestartet.
29.07.23 09:48:01 INFO Executor: Executor-ID-Treiber wird auf dem Host localhost gestartet
23.07.29 09:48:01 INFO Utils: Dienst „org.apache.spark.network.netty.NettyBlockTransferService“ auf Port 60826 erfolgreich gestartet.
23.07.29 09:48:01 INFO NettyBlockTransferService: Server erstellt auf LAPTOP-PEA8R2PO:60826
23.07.29 09:48:01 INFO BlockManager: Verwendung von org.apache.spark.storage.RandomBlockReplicationPolicy für Blockreplikationsrichtlinie
23/ 29.07. 09:48:01 INFO BlockManagerMaster: BlockManager BlockManagerId(Treiber, LAPTOP-PEA8R2PO, 60826, Keine) registrieren
29.07.23 09:48:01 INFO BlockManagerMasterEndpoint: Blockmanager LAPTOP-PEA8R2PO:60826 mit 8,3 GB RAM registrieren , BlockManagerId(Treiber, LAPTOP-PEA8R2PO, 60826, Keine)
23.07.29 09:48:01 INFO BlockManagerMaster: Registrierter BlockManager BlockManagerId(Treiber, LAPTOP-PEA8R2PO, 60826, Keine)
23.07.29 09:48:01 INFO BlockManager: Initialisierter BlockManager: BlockManagerId(Treiber, LAPTOP-PEA8R2PO, 60826, Keine)

Ich denke du magst

Origin blog.csdn.net/programmer589/article/details/131991436
Empfohlen
Rangfolge