2014-09-25 12 views
12

Apache Spark'da yeniyim ve çekirdek veri yapısının RDD olduğunu biliyorum. Şimdi eleman konum bilgisi gerektiren bazı uygulamalar yazıyorum. Örneğin, bir ArrayList'i bir (Java) RDD'ye dönüştürdükten sonra, RDD'deki her bir tam sayı için, onun (global) dizi alt dizisini bilmem gerekir. Bunu yapmak mümkün mü?Spark'in RDD'sinde Öğe Konumunu Nasıl Alabilirim?

Bildiğim kadarıyla RDD için (int) işlevini al, bu yüzden konum bilgilerinin hala RDD'de tutulduğuna inanıyorum.

cevap

11

Esas olarak, RDD'nin zipWithIndex() yöntemi bunu yapıyor gibi görünüyor, ancak RDD'nin oluşturulduğu verilerin orijinal sıralamasını korumaz. En azından istikrarlı bir sipariş alacaksınız.

val orig: RDD[String] = ... 
val indexed: RDD[(String, Long)] = orig.zipWithIndex() 

Eğer zipWithIndex() API doc gömüldü orijinal verilerin sırasını koruyan bir şey bulmak olası nedeni:

"Fermuarlar onun elemanı endeksleri ile bu RDD. Sipariş, ilk önce bölüm indeksine ve daha sonra her bir bölüm içindeki öğelerin sıralamasına dayanmaktadır.İlk bölümdeki ilk öğe, dizin 0 ve son bölümdeki son öğenin en büyük endeksi alır. Bu Scala's zipWithIndex benzer ama Int yerine Int kullanır dizin tipi olarak. Orijinal düzeni koruyarak sizin için önemli değilse bu yöntem ". Bu RDD birden fazla bölümleri içerdiğinde, bir kıvılcım işi tetiklemek için

ihtiyacı Yani orijinal sipariş atılır gibi görünüyor., ihtiyacınız benziyor Eğer RDD oluşturmak önce endeksi ekleyin. Ben çoğu durumda iman

+0

Evet, RDD oluşturmadan önce ek bir öznitelik olarak dizi alt eklenmesi bu sorunu çözebilir. Bununla birlikte, iki ciddi sınırlama vardır: 1) Açıkça, bu ek indeks özniteliği, depolama maliyetini en azından ikiye katlayacak ve bu maliyet daha da fazla olabilir, örneğin, bir tamsayı/şamandıra dizisinde, endeks için uzun bir int alanı eklenir. 2) Ek endeks değerleri eklendiğinde Spark'e yüklenemediğinden, bu veri dönüşümü Spark ile de paralelleştirilemez. Böylece, dizin eklemek için diğer paralel teknikleri dahil etmeliyim. – SciPioneer

14

, zipWithIndex() hile olacaktır ve bu düzeni korumak olacaktır. yine yorumlarını okuyun. Benim anlayış tam olarak tutmak anlamına gelmesidir RDD'de sipariş

scala> val r1 = sc.parallelize(List("a", "b", "c", "d", "e", "f", "g"), 3) 
scala> val r2 = r1.zipWithIndex 
scala> r2.foreach(println) 
(c,2) 
(d,3) 
(e,4) 
(f,5) 
(g,6) 
(a,0) 
(b,1) 

Örnek olarak onaylayın. Kırmızı 3 bölümleri ve indeksi 1 ile b 0, b ile bir, vb.

+0

Cevabınız için teşekkürler! Çoğu durumda, bu yöntem kötü değildir, çünkü giriş dizisindeki/listesindeki eleman nispeten büyük bir nesne olabilir. Bununla birlikte, ilkel-tipli diziler, örneğin bir tamsayı dizisi için bir problem olabilir, çünkü bu sadece bir çözüm, hem hesaplama hem de depolama maliyetleri açısından oldukça verimsizdir. Her neyse, cevabınızdan çok memnunum. Umarım bir gün doğal olarak indeksi (zipWithIndex) olmadan sürdürmek Spark'in RDD'si için doğru olabilir. – SciPioneer

+0

Spark'in tasarımına dayanarak, depolama biriminden ödün vermeden öğenin indeksini korumanın iyi bir yolunu görüntüleyemiyorum. –

İlgili konular