Spark: UDF birçok kez idam edildi


9

Aşağıdaki kod ile bir veri çerçevesi var:

def test(lat: Double, lon: Double) = {
  println(s"testing ${lat / lon}")
  Map("one" -> "one", "two" -> "two")
}

val testUDF = udf(test _)

df.withColumn("test", testUDF(col("lat"), col("lon")))
  .withColumn("test1", col("test.one"))
  .withColumn("test2", col("test.two"))

Şimdi günlükleri kontrol ederek, her satır için UDF'nin 3 kez yürütüldüğünü öğrendim. Bir "test.three" sütunundan "test3" eklersem, UDF bir kez daha yürütülür.

Birisi bana nedenini açıklayabilir mi?

Bu düzgün bir şekilde önlenebilir mi (bu işe yararsa bile "test" eklendikten sonra veri çerçevesini önbelleğe almadan)?


Ne demek istiyorsun? Test fonksiyonunu üç kez çağırıyorsunuz. Bu yüzden üç kez idam ediliyor. Neden bir UDF yaptığınızdan emin değilim. Neden sadece Harita'yı val yapmıyoruz?
user4601931

Bu sadece kıvılcımın davranışını gösteren bir örnektir. Benim için "test" bir yapı içeren yeni bir sütundur, daha sonra yapının herhangi bir kısmına erişmek UDF'yi tekrar yürütmemelidir. Nasıl yanılıyorum?
Rolintocour

Şemayı yazdırmaya çalıştım, "test" in DataType Mapdeğil bir Struct. Şimdi bir Harita döndürmek yerine, UDF Test (bir String, two: String) gibi bir vaka sınıfı döndürürse, o testzaman gerçekten bir Struct olur, ancak her zaman UDF'nin çok sayıda yürütülmesi vardır.
Rolintocour


önbellekleme şu cevaba göre çalışmalıdır: stackoverflow.com/a/40962714/1138523
Raphael Roth

Yanıtlar:


5

Bir udf'ye birden fazla çağrı yapmaktan kaçınmak istiyorsanız (özellikle udf işinizde bir darboğazsa yararlıdır) aşağıdaki gibi yapabilirsiniz:

val testUDF = udf(test _).asNondeterministic()

Temel olarak Spark'a işlevinizin deterministik olmadığını söylersiniz ve şimdi Spark sadece bir kez çağrıldığından emin olur, çünkü birden çok kez çağırmak güvenli değildir (her çağrı muhtemelen farklı sonuç döndürebilir).

Ayrıca bu hilenin ücretsiz olmadığını unutmayın, bunu yaparak optimize ediciye bazı kısıtlamalar koyuyorsunuz, bunun bir yan etkisi örneğin Spark optimizer'ın filtreleri deterministik olmayan ifadelerden itmediği için optimal Sorgunuzdaki filtrelerin konumu.


Güzel! bu cevap da buraya ait: stackoverflow.com/questions/40320563/…
Raphael Roth

Benim durumumda, asNondeterministicUDF'yi sadece bir kez yürütmeye zorlar. explode(array(myUdf($"id")))Çözüm ile hala iki kez idam edilir.
Rolintocour
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.