2016-03-23 6 views
0

Bir nokta işaretini kullanarak PySpark öğelerine erişebilirsiniz: r= Row(name="Alice", age=11) verilirse, sırasıyla r.name veya r.age kullanarak ad veya yaş alabilirsiniz. Birinin adı element değişkeninde kayıtlı bir öğe alması gerektiğinde ne olur? Bir seçenek r.toDict()[element] yapmaktır. Ancak, büyük bir DataFrame olduğu bir durumu düşünün ve bu veri çerçevesinin her satırındaki bir işlevi haritalamak isteriz. Biz kesinlikle AncakpPySpark Satır nesneleri: Satır öğelerine değişken adlarına erişme

def f(row, element1, element2): 
    row = row.asDict() 
    return ", ".join(str(row[element1]), str(row[element2])) 

result = dataframe.map(lambda row: f(row, 'age', 'name')) 

gibi bir şey yapabilirsiniz, her satırda toDict() arayarak çok verimsiz olacak gibi görünüyor. Daha iyi bir yolu var mı?

+0

> Belki bir 'filter' Örnek gösterebiliyor musunuz, bunun için 'filter' kullanmayı nasıl anlayamıyorum. –

+0

Üzgünüm, benim hatam, ancak küçük açıklamamın ikinci kısmı doğru. Bir 'harita' en hızlı işlerden biridir çünkü paralelleştirilmesi kolaydır. –

+0

"Haritanın" iyi olduğunu biliyorum. Ben daha iyi yapmak istiyorum ama her satırın bir dict –

cevap

2

Her zaman Python'da olduğu gibi bir şey çalışıyorsa orada sihir yok. Bir şey işlediğinde, burada nokta sözdizimi gibi, öngörülebilir bir olay zinciri anlamına gelir. Özellikle sen __getattr__ yöntemi denilen olacağını bekleyebilirsiniz:

a_row.__getitem__("foo") 
## 1 

O köşeli parantez açıklaması kullanabileceğiniz anlamına gelir:

a_row["bar"] 
## True 

from pyspark.sql import Row 

a_row = Row(foo=1, bar=True) 

a_row.__getattr__("foo") 
## 1 
a_row.__getattr__("bar") 
True 

Satır da aynı davranışı sahip __getitem__ geçersiz kılar

Sorun, verimli olmamasıdır. Her arama O (N) olup, geniş satır ve çoklu çağrınız varsa dict'a tek bir dönüşüm daha verimli olabilir. Genelde

böyle aramaları kaçınmalısınız: UDF olarak verimsiz fakat genel

  • yılında daha temiz yerleşik SQL ifadeleri
  • map üzerinde yapmamalısın tercih edilmelidir kullanıyor kullanarak

    • DataFrame üzerinden doğrudan harita. Yakında kullanımdan kaldırılacak.
  • +0

    > Her arama O (N) N sütun sayısı mı? Benim durumumda bu oldukça küçük ve '.asDict()' eşlik eden bellek ayırma/çöp toplama daha fazla zaman alacağından şüpheleniyorum. Sanırım zamanlamaları ölçmek zorundayım. Teşekkür ederim –

    +0

    Komik olan şu ki, bu soruyu sormadan önceki gün, bir paket sarıcı yazdım ve birkaç __getattr__' ve '__getitem__' fonksiyonlarını uyguladık. Daha sonra bağlamı değiştirdim ve onları unuttum :-) –

    +0

    Python haritacılarını Spark SQL'de kullanmama rağmen ve bu açık değerleri mapper'ı çalıştırmadan açıkça kullanırsanız, muhtemelen hakkınızda haklısınız. – zero323