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
- Instal .NET Interactive
- 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:

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:

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.

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
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:
Seperti yang dapat dilihat dalam kasus
udf2_fails, kita melihat pesan kesalahan yang mengatakan JenisSubmission#7tidak ditandai sebagai dapat diserialisasikan, ini karena .NET Interactive membungkus setiap objek yang ditentukan dalam sel dengan kelasnyaSubmission#, yang dihasilkan dengan cepat dan karenanya tidak ditandai sebagaiSerializable.Untuk alasan ini, diperlukan bahwa UDF yang mereferensikan objek kustom didefinisikan dalam sel yang sama dengan objek tersebut.
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:

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
SerializationExceptionkesalahan yang mengeluhMicrosoft.Spark.Sql.Sessiontidak ditandai sebagai dapat diserialisasikan. Ini karena ketika pengkompilasi mencoba membuat serialisasi objekbvvariabel siaran , ia menemukan namanya untuk ditambahkan denganSparkSessionobjekspark, yang perlu ditandai sebagai dapat diserialisasikan. Ini dapat ditunjukkan dengan lebih mudah dengan mengintip rakitan yang didekompilasi dari pengiriman sel ini:
Jika kita menandai
SparkSessionkelas 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.