Share via


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 duyuru ile 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'ın U-SQL betiklerini Spark'a geçirmeden önce, iki sistemin genel dil ve işleme felsefelerini anlamak yararlı olacaktır.

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 olarak adlandırılan uygulama olanağı da sağlayabilir.

Spark, scala, Java, Python, .NET gibi birçok dil bağlaması 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 etki alanına özgü bir dil (DSL) kullanırsınız. Ayrıca veri çerçevesi ve veri kümesi soyutlamalarında bildirim temelli bir alt dil olarak SparkSQL sağlar. DSL iki işlem kategorisi sağlar: dönüştürmeler ve eylemler. Veri soyutlamalarına dönüştürmeler uygulanması dönüşümü yürütmez, bunun yerine değerlendirme için bir eylemle gönderilecek yürütme planını derler (örneğin, sonucu geçici bir tabloya veya dosyaya yazma ya da sonucu yazdırma).

Bu nedenle, bir U-SQL betiğini bir Spark programına çevirirken, en azından veri çerçevesi soyutlamasını oluşturmak için hangi dili kullanmak istediğinize (şu anda en sık kullanılan veri soyutlamasıdır) 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 Spark, Azure Databricks ve Azure HDInsight Azure Synapse Spark'ı küme hizmeti biçiminde veya Spark havuz şablonları olarak adlandırılan bir şekilde sunar. Uygulamanızı dönüştürürken şimdi 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. Bir 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ış oluşturucuyu belirten deyimi kullanılarak OUTPUT dosyalara veya bir U-SQL tablosuna alınır.

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

Spark programları, Verileri okumak ve veri çerçevelerini oluşturmak için Spark bağlayıcılarını kullanmanı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 dil türlerine veya konsola yazmanıza benzer.

.NET kodunu dönüştürme

U-SQL'in ifade dili C# dilindedir ve kullanıcı tanımlı işlevler, kullanıcı tanımlı işleçler ve kullanıcı tanımlı toplayıcılar ile ö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, .NET kullanıcı tanımlı işlevlerinizin bazılarını veya tümünü Spark ile yeniden kullanabileceğiniz anlamına gelir. Apache Spark için .NET ,NET Core 3.1 veya sonraki sürümleri 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çeği genişletilmiş olarak 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.

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

U-SQL'in ifade dili C# dilidir. 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 vardır (DSL veya SparkSQL'nin bir parçası olarak) 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şlevine 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 ayrıca, 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 (UPO' lar) 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 çeşitli .NET kitaplıklarından yararlanıyorsa, Scala'da verilerin gerçek işlenmesini 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 ad açısından 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ını etkileyen 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 null değerleri farklı değerlendirir.

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ür sayısı NULL değerlere izin verirken U-SQL'de skaler, nesne olmayan değerleri null atanabilir olarak açıkça işaretlersiniz. Spark, bir sütunu null atanamaz olarak tanımlamanıza olanak tanır ancak kısıtlamayı zorlamaz ve yanlış sonuçla sonuçlanabilir.

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 bilinmeyen döndürür.

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 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 ayarlanmış nullsatırları column_name döndürür.WHERE column_name = NULL Benzer şekilde, kullanan WHERE column_name != NULL bir Spark SELECT deyimi, içinde null olmayan değerler column_nameolsa bile, U-SQL'de 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, Özellikle veritabanları, tablolar ve görünümler olmak üzere Hive Meta 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ı kullanılarak başvurulabilir (örneğin, Python modüllerini içeri aktarma veya Scala işlevlerine başvurma yoluyla).

U-SQL kataloğu projeler ve takımlar arasında veri ve kod nesnelerini 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ürmektir ve SQL'i temel alır. Aşağıda, U-SQL'de sunulan en yaygın satır kümesi ifadelerinin tükenen 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 pencereleme 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 diğer açıdan 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ında/dış tablolarda Federasyon Sorguları

U-SQL, veri kaynağı ve dış tabloların yanı sıra Azure SQL Veritabanına yönelik 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 ise 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
  • OPTION veri 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