Menulis dan memanggil UDF di .NET untuk lingkungan interaktif Apache Spark

Dalam artikel ini, Anda akan mempelajari cara menggunakan fungsi yang ditentukan pengguna (UDF) di lingkungan interaktif .NET untuk Apache Spark.

Prasyarat

  1. Instal .NET Interactive
  2. Menginstal lab Jupyter

.NET untuk pengalaman Interaktif Apache Spark

.NET untuk Apache Spark menggunakan .NET Interactive untuk memberikan dukungan .NET untuk pengalaman interaktif di dalam Spark. Untuk memahami cara menyiapkan lingkungan untuk mencoba .NET Interactive dengan notebook Jupyter, lihat repositori Interaktif .NET.

Selain itu, disarankan untuk melalui artikel ini tentang serialisasi UDF di .NET untuk Apache Spark untuk memahami apa itu UDF dan bagaimana serialisasinya di .NET untuk Apache Spark. Panduan ini menggunakan Jupyter Notebooks untuk menggambarkan cara menggunakan UDF dalam pengalaman interaktif.

Menentukan UDF di .NET Interactive

Dalam pengalaman interaktif, sel dapat dianggap sebagai cuplikan kode yang dikirimkan sebagai bagian dari satu iterasi REPL. Misalnya, lihat buku catatan berikut ini untuk memahami apa artinya:

Jupyter Notebook cells

Masing-masing blok yang ditandai dengan panah merah adalah satu sel, atau satu pengiriman kode ke Spark. Sekarang saat menentukan UDF yang mereferensikan objek kustom yang ditentukan pengguna, UDF harus ditentukan dalam sel yang sama tempat objek yang direferensikannya ditentukan. Mari kita lihat seperti apa yang terlihat sebagai contoh:

Working UDF

Memanggil UDF pada DataFrame

Saat memanggil UDF yang ditentukan sebelumnya pada DataFrame , penting untuk memastikan UDF didefinisikan dalam sel yang dikirimkan sebelumnya, sebelum memanggilnya, seperti yang dapat dilihat dalam contoh sebelumnya.

Sekarang mari kita lihat apa yang terjadi jika kita memanggil UDF di sel yang sama tempat UDF ditentukan.

failing UDF call

Kesalahan yang disorot di atas adalah karena rakitan UDF harus terlebih dahulu dikompilasi dan dikirim ke pekerja sebelum dapat dipanggil pada DataFrame.

Ini adalah beberapa hal penting yang perlu diingat saat menerapkan UDF di .NET untuk pengalaman interaktif Apache Spark (seperti Azure Synapse Notebooks).

Tanya Jawab Umum

  1. Mengapa UDF saya mereferensikan objek kustom yang ditentukan pengguna memunculkan kesalahan Type Submission#_ is not marked as serializable? .NET Interactive membungkus masing-masing sel ini dengan kelas pembungkus nomor pengiriman sel, untuk mengidentifikasi setiap sel yang dikirim secara unik. Sekarang seperti yang dijelaskan secara rinci dalam panduan ini, ketika UDF yang mereferensikan objek kustom sedang diserialisasikan targetnya juga diambil untuk serialisasi, yang dalam kasus .NET Interactive dibungkus oleh kelas pembungkus sel tempat objek kustom ditentukan. Sekarang mari kita lihat bagaimana hal itu memengaruhi definisi UDF kita di notebook:

    UDF serialization error

    Seperti yang dapat dilihat dalam kasus udf2_fails, kita melihat pesan kesalahan yang mengatakan Jenis Submission#7 tidak ditandai sebagai dapat diserialisasikan, ini karena .NET Interactive membungkus setiap objek yang ditentukan dalam sel dengan kelasnya Submission# , yang dihasilkan dengan cepat dan karenanya tidak ditandai sebagai Serializable.

    Untuk alasan ini, diperlukan bahwa UDF yang mereferensikan objek kustom didefinisikan dalam sel yang sama dengan objek tersebut.

  2. Mengapa Variabel Siaran tidak berfungsi dengan .NET Interactive? Untuk alasan yang dijelaskan sebelumnya, variabel siaran tidak berfungsi dengan .NET Interactive. Adalah ide yang baik untuk melalui panduan ini pada variabel siaran untuk mendapatkan pemahaman yang lebih mendalam tentang variabel siaran apa dan cara menggunakannya. Alasan variabel siaran tidak berfungsi dengan skenario interaktif adalah karena desain interaktif .NET untuk menambahkan setiap objek yang ditentukan dalam sel dengan kelas pengiriman selnya, yang karena tidak ditandai dapat diserialisasikan, gagal dengan pengecualian yang sama seperti yang ditunjukkan sebelumnya. Mari kita selidiki sedikit lebih dalam dengan contoh berikut:

    Broadcast Variables fail

    Seperti yang direkomendasikan di bagian sebelumnya, kami mendefinisikan UDF dan objek yang dirujuknya (variabel siaran dalam kasus ini) dalam sel yang sama, tetapi kami masih melihat SerializationException kesalahan yang mengeluh Microsoft.Spark.Sql.Session tidak ditandai sebagai dapat diserialisasikan. Ini karena ketika pengkompilasi mencoba membuat serialisasi objek bvvariabel siaran , ia menemukan namanya untuk ditambahkan dengan SparkSession objek spark, yang perlu ditandai sebagai dapat diserialisasikan. Ini dapat ditunjukkan dengan lebih mudah dengan mengintip rakitan yang didekompilasi dari pengiriman sel ini:

    Decompiled Assembly code

    Jika kita menandai SparkSession kelas sebagai [Serializable], kita bisa membuat ini berfungsi, tetapi ini bukan solusi yang ideal karena kita tidak ingin memberi pengguna kemampuan untuk membuat serialisasi objek SparkSession, karena itu dapat menyebabkan beberapa perilaku yang aneh dan tidak diinginkan. Ini adalah masalah yang diketahui dan akan diselesaikan dalam versi mendatang.