Aracılığıyla paylaş


U-SQL geliştiricileri için Apache Spark kodunu anlama

Önemli

Azure Data Lake Analytics 29 Şubat 2024'te kullanımdan kaldırıldı. Bu duyuruyla daha fazla bilgi edinin.

Veri analizi için kuruluşunuz Azure Synapse Analytics veya Microsoft Fabric kullanabilir.

Bu bölüm, U-SQL Betiklerini Apache Spark'a dönüştürme konusunda üst düzey rehberlik sağlar.

U-SQL ve Spark dilini ve işleme paradigmalarını anlama

Azure Data Lake Analytics'in U-SQL betiklerini Spark'a geçirmeden önce, iki sistemdeki genel dil ve işleme felsefelerini anlamak yararlı olur.

U-SQL, veri akışı paradigması kullanan SQL benzeri bildirim temelli bir sorgu dilidir ve .NET (örneğin C#), Python ve R ile yazılmış kullanıcı kodunu kolayca eklemenizi ve ölçeğini genişletmenizi sağlar. Kullanıcı uzantıları basit ifadeler veya kullanıcı tanımlı işlevler uygulayabilir, ancak kullanıcıya satır kümesi düzeyinde dönüştürmeler, ayıklamalar ve yazma çıkışı gerçekleştirmek için özel işleçler uygulayan kullanıcı tanımlı işleçler uygulama olanağı da sağlayabilir.

Spark, scala, Java, Python, .NET vb. dillerinde çeşitli dil bağlamaları sunan bir ölçek genişletme çerçevesidir. Burada öncelikle kodunuzu bu dillerden birinde yazar, dayanıklı dağıtılmış veri kümeleri (RDD), veri çerçeveleri ve veri kümeleri olarak adlandırılan veri soyutlamaları oluşturur ve bunları dönüştürmek için LINQ benzeri bir etki alanına özgü dil (DSL) kullanırsınız. Ayrıca SparkSQL'i veri çerçevesi ve veri kümesi soyutlamalarında bildirim temelli bir alt dil olarak sağlar. DSL, iki işlem, dönüştürme ve eylem kategorisi sağlar. Veri soyutlamalarına dönüştürmeleri uygulamak dönüşümü yürütmez, bunun yerine bir eylemle değerlendirme için gönderilecek yürütme planını derler (örneğin, sonucu geçici bir tabloya veya dosyaya yazma veya sonucu yazdırma).

Bu nedenle, bir U-SQL betiğini bir Spark programına çevirirken, en azından veri çerçevesi soyutlamasını (şu anda en sık kullanılan veri soyutlamasıdır) oluşturmak için hangi dili kullanmak istediğinize ve DSL veya SparkSQL kullanarak bildirim temelli veri akışı dönüşümlerini yazmak isteyip istemediğinize karar vermeniz gerekir. Daha karmaşık bazı durumlarda, U-SQL betiğinizi bir Spark dizisine ve Azure Batch veya Azure İşlevleri ile uygulanan diğer adımlara bölmeniz gerekebilir.

Ayrıca Azure Data Lake Analytics, her iş için kaynakların ayrıldığı sunucusuz bir iş hizmeti ortamında U-SQL sunarken Azure Synapse Spark, Azure Databricks ve Azure HDInsight, Spark'ı küme hizmeti biçiminde veya Spark havuzu şablonları olarak adlandırılan bir şekilde sunar. Uygulamanızı dönüştürürken küme veya havuz oluşturma, boyutlandırma, ölçeklendirme ve kullanımdan kaldırmanın etkilerini dikkate almanız gerekir.

U-SQL betiklerini dönüştürme

U-SQL betikleri aşağıdaki işleme desenini izler:

  1. Deyim, konum veya dosya kümesi belirtimi, yerleşik veya kullanıcı tanımlı ayıklayıcı ve istenen şema kullanılarak EXTRACT ya da U-SQL tablolarından (yönetilen veya dış tablolar) veriler yapılandırılmamış dosyalardan okunur. Satır kümesi olarak temsil edilir.
  2. Satır kümeleri, satır kümelerine U-SQL ifadeleri uygulayan ve yeni satır kümeleri üreten birden çok U-SQL deyiminde dönüştürülür.
  3. Son olarak, sonuçta elde edilen satır kümeleri, konumları ve yerleşik veya kullanıcı tanımlı bir çıkışlayıcıyı belirten deyimi kullanılarak OUTPUT dosyalara veya bir U-SQL tablosuna aktarılır.

Betik gevşek bir şekilde değerlendirilir, yani her ayıklama ve dönüştürme adımı bir ifade ağacına oluşturulur ve genel olarak değerlendirilir (veri akışı).

Spark programları, Spark bağlayıcılarını kullanarak verileri okuyup veri çerçevelerini oluşturmanıza, ardından LINQ benzeri DSL veya SparkSQL kullanarak veri çerçevelerine dönüştürmeleri uygulamanıza ve ardından sonucu dosyalara, geçici Spark tablolarına, bazı programlama dili türlerine veya konsola yazmanıza benzer.

.NET kodunu dönüştürme

U-SQL'in ifade dili C# olup kullanıcı tanımlı işlevler, kullanıcı tanımlı işleçler ve kullanıcı tanımlı toplayıcılarla özel .NET kodunun ölçeğini genişletmenin çeşitli yollarını sunar.

Azure Synapse ve Azure HDInsight Spark artık Apache Spark için .NET ile .NET kodu yürütmeyi yerel olarak destekliyor. Bu, Spark ile .NET kullanıcı tanımlı işlevlerinizin bazılarını veya tümünü yeniden kullanabileceğiniz anlamına gelir. Apache Spark için .NET , .NET Core 3.1 veya sonraki bir sürümü temel alırken U-SQL'in .NET Framework kullandığını unutmayın.

U-SQL kullanıcı tanımlı işleçler (UDO'lar), işlecin kodunun ölçeklendirilmiş yürütülmesini sağlamak için U-SQL UDO modelini kullanır. Bu nedenle, UDO'ların Spark yürütme modeline sığmak için kullanıcı tanımlı işlevlere yeniden yazılması gerekir.

Apache Spark için .NET şu anda kullanıcı tanımlı toplayıcıları desteklememektedir. Bu nedenle, U-SQL kullanıcı tanımlı toplayıcıların Scala'da yazılmış Spark kullanıcı tanımlı toplayıcılara çevrilmesi gerekir.

Apache Spark için .NET özelliklerinden yararlanmak istemiyorsanız ifadelerinizi eşdeğer bir Spark, Scala, Java veya Python ifadesi, işlev, toplayıcı veya bağlayıcıya yeniden yazmanız gerekir.

Her durumda, U-SQL betiklerinizde büyük miktarda .NET mantığınız varsa, daha fazla rehberlik için lütfen Microsoft Hesabı temsilciniz aracılığıyla bizimle iletişime geçin.

Aşağıdaki ayrıntılar, U-SQL betiklerindeki farklı .NET ve C# kullanım örneklerine yöneliktir.

Satır içi U-SQL C# ifadelerini skaler dönüştürme

U-SQL'in ifade dili C# şeklindedir. Skaler satır içi U-SQL ifadelerinin çoğu iyileştirilmiş performans için yerel olarak uygulanırken, .NET çerçevesine çağrılarak daha karmaşık ifadeler yürütülebilir.

Spark'ın kendi skaler ifade dili (DSL'nin parçası olarak veya SparkSQL'de) vardır ve JVM, .NET veya Python çalışma zamanı için yazılmış kullanıcı tanımlı işlevlere çağrı yapılmasına olanak tanır.

U-SQL'de skaler ifadeleriniz varsa, önce en iyi performansı elde etmek için en uygun yerel olarak anlaşılan Spark skaler ifadesini bulmanız ve ardından diğer ifadeleri seçtiğiniz Spark çalışma zamanı dilinin kullanıcı tanımlı bir işleviyle eşlemeniz gerekir.

.NET ve C# değerlerinin JVM ve Python çalışma zamanlarından ve Spark'ın DSL'sinden farklı tür semantiğine sahip olduğunu unutmayın. Tür sistemi farklılıkları hakkında daha fazla bilgi için aşağıya bakın.

Kullanıcı tanımlı skaler .NET işlevlerini ve kullanıcı tanımlı toplayıcıları dönüştürme

U-SQL, rastgele skaler .NET işlevlerini çağırmanın ve .NET'te yazılmış kullanıcı tanımlı toplayıcıları çağırmanın yollarını sağlar.

Spark, Spark'ın DSL ve SparkSQL'sinden çağrılabilen barındırma dillerinin çoğunda yazılmış kullanıcı tanımlı işlevler ve kullanıcı tanımlı toplayıcılar için de destek sunar.

Yukarıda belirtildiği gibi Apache Spark için .NET, .NET'te yazılan kullanıcı tanımlı işlevleri destekler, ancak kullanıcı tanımlı toplayıcıları desteklemez. Bu nedenle kullanıcı tanımlı işlevler için Apache Spark için .NET kullanılabilirken, kullanıcı tanımlı toplayıcıların Spark için Scala'da yazılması gerekir.

Kullanıcı tanımlı işleçleri (UDF) dönüştürme

U-SQL; Python ve R'de .NET'te (ve - bir ölçüde- yazılabilir) ayıklayıcılar, çıkışlayıcılar, azaltıcılar, işlemciler, uygulayıcılar ve birleştiriciler gibi kullanıcı tanımlı işleçlerin (UTO' lar) çeşitli kategorilerini sağlar.

Spark, işleçler için aynı genişletilebilirlik modelini sunmaz, ancak bazıları için eşdeğer özelliklere sahiptir.

Ayıklayıcılara ve çıkışçılara eşdeğer Spark, Spark bağlayıcılarıdır. Birçok U-SQL ayıklayıcısı için Spark topluluğunda eşdeğer bir bağlayıcı bulabilirsiniz. Diğerleri için özel bir bağlayıcı yazmanız gerekir. U-SQL ayıklayıcısı karmaşıksa ve birkaç .NET kitaplığı kullanıyorsa, Scala'da verilerin gerçek işlemesini yapan .NET kitaplığına çağrı yapmak için birlikte çalışma kullanan bir bağlayıcı oluşturmak tercih edilebilir. Bu durumda, .NET Core çalışma zamanını Spark kümesine dağıtmanız ve başvuruda bulunılan .NET kitaplıklarının .NET Standard 2.0 uyumlu olduğundan emin olmanız gerekir.

Diğer U-SQL UDO türlerinin kullanıcı tanımlı işlevler ve toplayıcılar ve diğer uygun Spark DLS veya SparkSQL ifadesi kullanılarak yeniden yazılması gerekir. Örneğin, bir işlemci, bir veri çerçevesini bağımsız değişken olarak alan ve bir veri çerçevesi döndüren bir işlev olarak paketlenmiş çeşitli UDF çağrılarının SELECT'sine eşlenebilir.

U-SQL'in isteğe bağlı kitaplıklarını dönüştürme

U-SQL, Python, R, JSON, XML, AVRO desteği ve bazı Azure AI hizmetleri özellikleri sunan isteğe bağlı ve tanıtım kitaplıkları kümesi sağlar.

Spark sırasıyla pySpark ve SparkR olmak üzere kendi Python ve R tümleştirmesini sunar ve JSON, XML ve AVRO okumak ve yazmak için bağlayıcılar sağlar.

Azure AI hizmetleri kitaplıklarına başvuran bir betiği dönüştürmeniz gerekiyorsa Microsoft Hesabı temsilciniz aracılığıyla bizimle iletişime geçmenizi öneririz.

Türü yazılan değerleri dönüştürme

U-SQL'in tür sistemi .NET tür sistemini temel aldığı ve Spark'ın ana bilgisayar dili bağlaması tarafından etkilenen kendi tür sistemi olduğundan, üzerinde çalıştığınız türlerin yakın olduğundan ve belirli türler için tür aralıklarının, duyarlığının ve/veya ölçeğinin biraz farklı olabileceğinden emin olmanız gerekir. Ayrıca, U-SQL ve Spark değerleri farklı şekilde ele null alır.

Veri türleri

Aşağıdaki tabloda verilen U-SQL türleri için Spark, Scala ve PySpark'taki eşdeğer türler verilmiştir.

U-SQL Spark Scala PySpark
byte
sbyte ByteType Byte ByteType
int IntegerType Int IntegerType
uint
long LongType Long LongType
ulong
float FloatType Float FloatType
double DoubleType Double DoubleType
decimal DecimalType java.math.BigDecimal DecimalType
short ShortType Short ShortType
ushort
char Char
string StringType String StringType
DateTime DateType, TimestampType java.sql.Date, java.sql.Timestamp DateType, TimestampType
bool BooleanType Boolean BooleanType
Guid
byte[] BinaryType Array[Byte] BinaryType
SQL.MAP<K,V> MapType(keyType, valueType, valueContainsNull) scala.collection.Map MapType(keyType, valueType, valueContainsNull=True)
SQL.ARRAY<T> ArrayType(elementType, containsNull) scala.collection.Seq ArrayType(elementType, containsNull=True)

Daha fazla bilgi için bkz.

NULL'nin işlenmesi

Spark'ta, varsayılan başına türler NULL değerlere izin verirken U-SQL'de nesne olmayan skaler değerleri null atanabilir olarak açıkça işaretlersiniz. Spark bir sütunu boş değer atanamaz olarak tanımlamanıza olanak tanır ancak kısıtlamayı zorlamaz ve yanlış sonuç verebilir.

Spark'ta NULL değerin bilinmediğini gösterir. Spark NULL değeri, kendisi de dahil olmak üzere herhangi bir değerden farklıdır. İki Spark NULL değeri arasındaki veya NULL değer ile başka bir değer arasındaki karşılaştırmalar, her NULL değerinin değeri bilinmediğinden bilinmiyor sonucunu verir.

Bu davranış, herhangi bir değerden farklı ancak kendisine eşit olan C# semantiğini null izleyen U-SQL'den farklıdır.

Bu nedenle, kullanan WHERE column_name = NULL bir SparkSQL SELECT deyimi, içinde NULL değerleri column_nameolsa bile sıfır satır döndürür; U-SQL'de ise olarak ayarlandığı column_name nullsatırları döndürür. Benzer şekilde, kullanan WHERE column_name != NULL bir Spark SELECT deyimi, U-SQL'deyken içinde null olmayan değerler column_nameolsa bile sıfır satır döndürür ve null olmayan satırları döndürür. Bu nedenle, U-SQL null-check semantiğini istiyorsanız sırasıyla isnull ve isnotnull (veya DSL eşdeğeri) kullanmanız gerekir.

U-SQL katalog nesnelerini dönüştürme

Önemli bir fark, U-SQL Betiklerinin çoğu doğrudan Spark eşdeğeri olmayan katalog nesnelerini kullanabilmesidir.

Spark, veritabanları, tablolar ve görünümler olmak üzere Hive Meta Veri deposu kavramları için destek sağlar; böylece U-SQL veritabanlarını ve şemalarını Hive veritabanlarıyla ve U-SQL tablolarını Spark tablolarıyla eşleyebilirsiniz (bkz . U-SQL tablolarında depolanan verileri taşıma), ancak tablo değerli işlevler (TVF'ler), saklı yordamlar, U-SQL derlemeleri, dış veri kaynakları vb. için destek sağlamaz.

Görünümler, TVF'ler, saklı yordamlar ve derlemeler gibi U-SQL kod nesneleri Spark'taki kod işlevleri ve kitaplıkları aracılığıyla modellenebilir ve konak dilinin işlevi ve yordam soyutlama mekanizmaları (örneğin, Python modüllerini içeri aktarma veya Scala işlevlerine başvurma yoluyla) kullanılarak başvurulabilir.

U-SQL kataloğu projeler ve ekipler arasında veri ve kod nesneleri paylaşmak için kullanıldıysa, paylaşım için eşdeğer mekanizmaların kullanılması gerekir (örneğin, kod nesnelerini paylaşmak için Maven).

U-SQL satır kümesi ifadelerini ve SQL tabanlı skaler ifadeleri dönüştürme

U-SQL'in temel dili satır kümelerini dönüştürüyor ve SQL'i temel alıyor. Aşağıda, U-SQL'de sunulan en yaygın satır kümesi ifadelerinin tükenmez listesi yer alır:

  • SELECT/FROM/WHERE/GROUP BY+Toplamalar+HAVING/ORDER BY+FETCH

  • INNER/OUTER/CROSS/SEMIJOIN Ifa -de

  • CROSS/OUTERAPPLY Ifa -de

  • PIVOT/UNPIVOT Ifa -de

  • VALUES satır kümesi oluşturucu

  • İfadeleri ayarlama UNION/OUTER UNION/INTERSECT/EXCEPT

Buna ek olarak, U-SQL gibi çeşitli SQL tabanlı skaler ifadeler sağlar

  • OVER pencere ifadeleri
  • çeşitli yerleşik toplayıcılar ve derecelendirme işlevleri (SUMFIRSTvb.)
  • En tanıdık SQL skaler ifadelerinden bazıları: CASE, LIKE, (NOT) IN, ANDvb OR .

Spark, bu ifadelerin çoğu için hem DSL hem de SparkSQL biçiminde eşdeğer ifadeler sunar. Spark'ta yerel olarak desteklenmeyen ifadelerden bazılarının, yerel Spark ifadelerinin ve sembolik olarak eşdeğer desenlerin bir bileşimi kullanılarak yeniden yazılması gerekir. Örneğin, OUTER UNION projeksiyonların ve birleşimlerin eşdeğer birleşimine çevrilmesi gerekir.

NULL değerlerin farklı işlenmesi nedeniyle, karşılaştırılan sütunların her ikisi de null değer içeriyorsa U-SQL birleşimi her zaman bir satırla eşleşir; Spark'taki bir birleştirme ise açık null denetimler eklenmediği sürece bu sütunlarla eşleşmez.

Diğer U-SQL kavramlarını dönüştürme

U-SQL ayrıca SQL Server veritabanlarında federasyon sorguları, parametreler, skaler ve lambda ifade değişkenleri, sistem değişkenleri, OPTION ipuçları gibi çeşitli diğer özellikler ve kavramlar sunar.

SQL Server veritabanlarına/dış tablolarına karşı Federasyon Sorguları

U-SQL veri kaynağı ve dış tabloların yanı sıra Azure SQL Veritabanı karşı doğrudan sorgular sağlar. Spark aynı nesne soyutlamalarını sunmasa da, SQL veritabanlarını sorgulamak için kullanılabilecek Azure SQL Veritabanı için Spark bağlayıcısı sağlar.

U-SQL parametreleri ve değişkenleri

Parametreler ve kullanıcı değişkenleri, Spark'ta ve barındırma dillerinde eşdeğer kavramlara sahiptir.

Örneğin Scala'da anahtar sözcüğüyle var bir değişken tanımlayabilirsiniz:

var x = 2 * 3;
println(x)

U-SQL'in sistem değişkenleri (ile @@başlayan değişkenler) iki kategoriye ayrılabilir:

  • Betiklerin davranışını etkilemek için belirli değerlere ayarlanabilen ayarlanabilir sistem değişkenleri
  • Sistem ve iş düzeyi bilgilerini sorgulayan bilgi sistemi değişkenleri

Ayarlanabilir sistem değişkenlerinin çoğunun Spark'ta doğrudan eşdeğeri yoktur. Bilgi sistemi değişkenlerinden bazıları, iş yürütme sırasında bilgileri bağımsız değişken olarak geçirerek modellenebilir, diğerleri Spark'ın barındırma dilinde eşdeğer bir işleve sahip olabilir.

U-SQL ipuçları

U-SQL, sorgu iyileştiricisi ve yürütme altyapısına ipuçları sağlamak için çeşitli sağlam yollar sunar:

  • U-SQL sistem değişkeni ayarlama
  • veri OPTION veya plan ipucu sağlamak için satır kümesi ifadesiyle ilişkilendirilmiş bir yan tümcesi
  • birleştirme ifadesinin söz diziminde birleştirme ipucu (örneğin, BROADCASTLEFT)

Spark'ın maliyet tabanlı sorgu iyileştiricisi, ipuçları sağlamak ve sorgu performansını ayarlamak için kendi özelliklerine sahiptir. İlgili belgelere bakın.

Sonraki adımlar