Python UDF, Scala UDF και σύνθετοι τύποι δεδομένων σε εγγενή μηχανή εκτέλεσης

Ο εγγενής μηχανισμός εκτέλεσης στο Microsoft Fabric υποστηρίζει πλέον συναρτήσεις Python που ορίζονται από το χρήστη (UDF), Scala UDF και σύνθετους τύπους δεδομένων (πίνακες, χάρτες και δομές). Αυτές οι δυνατότητες σάς επιτρέπουν να γράφετε εκφραστικές εφαρμογές Spark χωρίς να θυσιάζετε την απόδοση.

Υποστήριξη Python UDF

Η Python είναι μια από τις πιο δημοφιλείς γλώσσες στη μηχανική δεδομένων και την επιστήμη δεδομένων. Ιστορικά, τα Python UDF εισήγαγαν σημαντικά γενικά έξοδα στο Spark λόγω του κόστους σειριοποίησης μεταξύ των διεργασιών JVM και Python worker. Η εγγενής μηχανή εκτέλεσης ελαχιστοποιεί αυτές τις δαπανηρές μεταβάσεις, επιτρέποντας ταχύτερη εκτέλεση χωρίς αλλαγές κώδικα.

Πώς λειτουργούν τα Python UDF στην εγγενή μηχανή εκτέλεσης

Σε ένα συμβατικό μοντέλο εκτέλεσης Spark, η εκτέλεση Python UDF περιλαμβάνει:

  1. Μετατροπή δεδομένων από την εσωτερική μορφή του Spark.
  2. Σειριοποίηση και μεταφορά σε διεργασίες Python worker.
  3. Python Εκτέλεση UDF.
  4. Σειριοποίηση των αποτελεσμάτων πίσω στο JVM.
  5. Το Spark συνεχίζει την εκτέλεση.

Αυτή η κίνηση διασταυρούμενου χρόνου εκτέλεσης δημιουργεί κόστος σειριοποίησης/αποσειριοποίησης, αναποτελεσματικότητα CPU και σπασμένους αγωγούς εκτέλεσης στηλών. Η εγγενής μηχανή εκτέλεσης μειώνει αυτή την επιβάρυνση βελτιστοποιώντας τη διαδρομή μεταφοράς δεδομένων και διατηρώντας τη διανυσματική επεξεργασία όπου είναι δυνατόν.

Υποστηριζόμενοι τύποι Python UDF

Ο εγγενής μηχανισμός εκτέλεσης υποστηρίζει:

  • Ανυσματικά UDF: Συναρτήσεις Python σειρά προς σειρά που έχουν καταχωρηθεί με udf().
  • Vectorized (Pandas) UDF: Λειτουργίες διακοσμημένες με @pandas_udf που λειτουργούν σε παρτίδες δεδομένων χρησιμοποιώντας το Apache Arrow για αποτελεσματική μεταφορά.

Τα διανυσματικά UDF βλέπουν τα μεγαλύτερα κέρδη απόδοσης επειδή ευθυγραμμίζονται φυσικά με το μοντέλο επεξεργασίας στηλών της εγγενούς μηχανής εκτέλεσης.

Παράδειγμα: Vectorized Python UDF

import pandas as pd
from pyspark.sql.functions import pandas_udf
from pyspark.sql.types import DoubleType

@pandas_udf(DoubleType())
def calculate_discount(price: pd.Series, rate: pd.Series) -> pd.Series:
    return price * (1 - rate)

df = spark.table("sales.transactions")
result = df.withColumn("discounted_price", calculate_discount(df.price, df.discount_rate))
result.show()

Δεν απαιτείται πρόσθετη διαμόρφωση πέρα από την ενεργοποίηση του εγγενούς μηχανισμού εκτέλεσης. Τα υπάρχοντα Python UDF επωφελούνται αυτόματα.

Υποστήριξη εφαρμογής Scala UDF

Η εγγενής μηχανή εκτέλεσης επιταχύνει επίσης τα Scala UDF. Επειδή τα Scala UDF εκτελούνται εγγενώς στο JVM, ο κινητήρας μπορεί να εκφορτώσει τις υποστηριζόμενες λειτουργίες στη διανυσματική διαδρομή εκτέλεσης C++, διατηρώντας παράλληλα την αξιολόγηση Scala UDF αποτελεσματική εντός του ίδιου χρόνου εκτέλεσης.

Παράδειγμα: Scala UDF

import org.apache.spark.sql.functions.udf

val toUpperCase = udf((s: String) => s.toUpperCase)
val df = spark.table("catalog.customers")
val result = df.withColumn("name_upper", toUpperCase(df("name")))
result.show()

Τα Scala UDF που λειτουργούν σε υποστηριζόμενους τύπους δεδομένων επιταχύνονται χωρίς αλλαγές κώδικα όταν είναι ενεργοποιημένος ο εγγενής μηχανισμός εκτέλεσης.

Υποστήριξη σύνθετων τύπων δεδομένων

Οι σύγχρονες αρχιτεκτονικές λιμνών εξαρτώνται από ημιδομημένα και ένθετα δεδομένα. Η εγγενής μηχανή εκτέλεσης παρέχει τώρα βελτιστοποιημένη υποστήριξη για:

Τύπος δεδομένων Περιγραφή Παράδειγμα υπόθεσης χρήσης
Παράταξη Διατεταγμένη συλλογή στοιχείων Ετικέτες συμβάντων, κατηγορίες προϊόντων
Χάρτης Ζεύγη κλειδιού-τιμής Ιδιότητες ρύθμισης παραμέτρων, μετα-δεδομένα
Δομή Επώνυμα πεδία με διαφορετικούς τύπους Ένθετες καρτέλες πελατών, αντικείμενα διευθύνσεων

Λειτουργίες που υποστηρίζονται για σύνθετους τύπους

Ο εγγενής μηχανισμός εκτέλεσης επιταχύνει κοινές λειτουργίες σε σύνθετους τύπους δεδομένων:

  • Συναρτήσεις πίνακα: explode, array_contains, size, flatten, transform
  • Λειτουργίες χάρτη: map_keys, map_values, element_at
  • Πρόσβαση δομής: Πρόσβαση στο πεδίο σημειογραφίας κουκκίδων, getField
  • Ένθετοι συνδυασμοί: Πίνακες δομών, χάρτες με τιμές πίνακα

Παράδειγμα: Εργασία με πίνακες και δομές

from pyspark.sql.functions import explode, col, size

# Read data with nested schema
df = spark.table("events.telemetry")

# Operations on arrays - accelerated by native engine
result = (df
    .filter(size(col("tags")) > 0)
    .select(
        col("event_id"),
        col("metadata.source"),  # Struct field access
        explode(col("tags")).alias("tag")
    )
)
result.show()

Παράδειγμα: Εργασία με χάρτες

from pyspark.sql.functions import map_keys, map_values, col

df = spark.table("config.settings")

# Map operations - accelerated by native engine
result = (df
    .select(
        col("setting_id"),
        map_keys(col("properties")).alias("keys"),
        map_values(col("properties")).alias("values")
    )
)
result.show()

Αποτελέσματα απόδοσης

Η εσωτερική συγκριτική αξιολόγηση επιδεικνύει σημαντικές βελτιώσεις σε φόρτους εργασίας που χρησιμοποιούν Python UDF και πολύπλοκους τύπους δεδομένων:

Τύπος φόρτου εργασίας Βελτίωση απόδοσης
Διανυσματικά UDF Python Έως και 5,76 φορές ταχύτερα
Βαθμωτά UDF Python Έως και 1,08 φορές ταχύτερη
TPC-DS από άκρο σε άκρο (με σύνθετους τύπους) Έως και 2,35 φορές πιο γρήγορα

Αυτά τα κέρδη προκύπτουν από τη μειωμένη επιβάρυνση σειριοποίησης, τη βελτιωμένη διανυσματοποίηση και την εκτέλεση στηλών από άκρο σε άκρο.

Οφέλη για προηγμένα μοτίβα λιμνών

Η επιτάχυνση σύνθετου τύπου δεδομένων είναι ιδιαίτερα σημαντική για:

  • Βελτιστοποίηση Z-ORDER: Οι ένθετες στήλες συμμετέχουν στη βελτιστοποιημένη διάταξη δεδομένων.
  • Ομαδοποίηση υγρών: Οι στήλες σύνθετου τύπου επωφελούνται από την ομαδοποίηση χωρίς ισοπέδωση.
  • Ημιδομημένη ανάλυση: Τα ωφέλιμα φορτία JSON και οι ροές συμβάντων παραμένουν ένθετα για φυσικά ερωτήματα.
  • Αρχιτεκτονικές που βασίζονται σε συμβάντα: Τα δεδομένα τηλεμετρίας και IoT διατηρούν την ιεραρχική τους δομή.

Αντί να ισοπεδώνετε δεδομένα ή να αναδιαρθρώνετε αγωγούς για απόδοση, εργαστείτε φυσικά με πολύπλοκα σχήματα, διατηρώντας παράλληλα υψηλή απόδοση εκτέλεσης.

Ενεργοποιήσετε τη δυνατότητα

Python Η υποστήριξη UDF, Scala UDF και σύνθετου τύπου δεδομένων είναι διαθέσιμη όταν είναι ενεργοποιημένη η εγγενής μηχανή εκτέλεσης. Δεν απαιτείται πρόσθετη διαμόρφωση.

Για να ενεργοποιήσετε τον εγγενή μηχανισμό εκτέλεσης, ανατρέξτε στο θέμα Εγγενής μηχανισμός εκτέλεσης για το Fabric Data Engineering.

Prerequisites

Περιορισμοί

  • Δεν υποστηρίζονται όλες οι βιβλιοθήκες Python εντός της διανυσματικής διαδρομής. Οι βιβλιοθήκες που απαιτούν αυθαίρετη σειριοποίηση αντικειμένων Python ενδέχεται να εξακολουθούν να ενεργοποιούν εναλλακτικές.
  • Οι βαθιά ένθετοι σύνθετοι τύποι (για παράδειγμα, πίνακες χαρτών δομών) ενδέχεται να επιστρέψουν στη μηχανή JVM για ορισμένες λειτουργίες.
  • Η λειτουργία ANSI δεν υποστηρίζεται με τον εγγενή μηχανισμό εκτέλεσης.