Spark'da DataFrame, Dataset ve RDD arasındaki fark


Yanıtlar:


233

A DataFrame, "DataFrame tanımı" için bir Google aramasıyla iyi tanımlanmıştır:

Veri çerçevesi, her sütunun bir değişken üzerinde ölçümler içerdiği ve her satırın bir vaka içerdiği bir tablo veya iki boyutlu dizi benzeri bir yapıdır.

Bu nedenle, a DataFrame, Spark'ın sonlandırılmış sorguda belirli optimizasyonları çalıştırmasına izin veren sekmeli biçimi nedeniyle ek meta verilere sahiptir.

Bir RDDdiğer taraftan, sadece a, R ' esilient D istributed D ataset kısıtlı daha fazla karşı gerçekleştirilen işlemleri olarak optimize edilemez bir veri Blackbox olduğu, değildir.

Ancak, bir bir DataFrame dan gidebilir RDDonun aracılığı rddyöntemiyle ve bir gidebilirsiniz RDDbir etmek DataFrameyoluyla (RDD tablo biçiminde ise) toDFyönteminin

GenelDataFrame olarak, yerleşik sorgu optimizasyonu nedeniyle mümkün olan yerlerde kullanılması önerilir .


6
Yanıt, veri kümeleri hakkında açıklama sağlamaz. Spark- The Definitive Guide'a göre, bir veri kümesi, güvenli bir yapılandırılmış API türüdür. Böylece şemanızın türünü önceden sağlayabilirsiniz.
Chintan Pandya

3
Teşekkürler - orijinal başlık ve açıklama orijinal sorulardan (veri
kümelerini

220

İlk şey DataFramegelişti SchemaRDD.

SchemaRDD için kullanım dışı yöntem

Evet .. arasında dönüşüm Dataframeve RDDkesinlikle mümkündür.

Aşağıda bazı örnek kod parçacıkları verilmiştir.

  • df.rdd dır-dir RDD[Row]

Aşağıda veri çerçevesi oluşturma seçeneklerinden bazıları verilmiştir.

  • 1) yourrddOffrow.toDFdönüştürür DataFrame.

  • 2) createDataFramesql bağlamının kullanımı

    val df = spark.createDataFrame(rddOfRow, schema)

şema güzel SO post tarafından tarif edildiği gibi aşağıdaki seçeneklerden bazıları olabilir ..
scala vaka sınıfından ve scala yansıma api

import org.apache.spark.sql.catalyst.ScalaReflection
val schema = ScalaReflection.schemaFor[YourScalacaseClass].dataType.asInstanceOf[StructType]

VEYA kullanarak Encoders

import org.apache.spark.sql.Encoders
val mySchema = Encoders.product[MyCaseClass].schema

Şema tarafından tarif edildiği gibi, StructTypeve kullanılarak da oluşturulabilir.StructField

val schema = new StructType()
  .add(StructField("id", StringType, true))
  .add(StructField("col1", DoubleType, true))
  .add(StructField("col2", DoubleType, true)) etc...

görüntü açıklaması

Aslında 3 Apache Spark API'si var ..

resim açıklamasını buraya girin

  1. RDD API:

RDD(Esnek dağıtılmış veri kümesi) API 1.0 sürümü beri Spark olmuştur.

RDDAPI gibi bir çok transformasyon yöntemler sağlar map(), filter) (ve reduce() veriler üzerinde hesaplamalar gerçekleştirmek için. Bu yöntemlerin her biri RDDdönüştürülmüş verileri temsil eden yeni bir sonuç verir . Bununla birlikte, bu yöntemler sadece gerçekleştirilecek işlemleri tanımlar ve bir eylem yöntemi çağrılıncaya kadar dönüşümler gerçekleştirilmez. Eylem yöntemlerine örnekler:collect () ve saveAsObjectFile() gösterilebilir.

RDD Örneği:

rdd.filter(_.age > 21) // transformation
   .map(_.last)// transformation
.saveAsObjectFile("under21.bin") // action

Örnek: RDD ile özelliğe göre filtreleme

rdd.filter(_.age > 21)
  1. DataFrame API

Spark 1.3 yeni tanıttı DataFrame , Spark'ın performansını ve ölçeklenebilirliğini artırmak isteyen Project Tungsten girişiminin bir parçası olarak API . DataFrameAPI tanıtır bir şema kavramı şemasını yönetmek ve yalnızca Java seri hale getirme kullanılarak çok daha verimli bir şekilde, düğümler arasında veri iletmek için Spark izin verileri tanımlamak için.

DataFrameAPI oldukça farklı RDDbu Spark'ın Catalyst iyileştirici sonra yürütebileceği bir ilişkisel sorgu planı oluşturmak için bir API olduğu için API. API, sorgu planları oluşturmaya aşina olan geliştiriciler için doğaldır

Örnek SQL stili:

df.filter("age > 21");

Sınırlamalar: Kod adlarına göre veri özniteliklerine atıfta bulunduğundan, derleyicinin herhangi bir hatayı yakalaması mümkün değildir. Özellik adları yanlışsa, hata yalnızca çalışma zamanında, sorgu planı oluşturulduğunda algılanır.

DataFrameAPI'nin bir başka dezavantajı , çok skala merkezli olması ve Java'yı desteklerken desteğin sınırlı olmasıdır.

Örneğin, DataFramemevcut RDDbir Java nesnelerinden bir oluştururken Spark'ın Catalyst optimizer şemayı çıkartamaz ve DataFrame içindeki herhangi bir nesnenin scala.Productarabirimi uyguladığını varsayar . Scala case classkutuyu çıkarır çünkü bu arayüzü uygularlar.

  1. Dataset API

DatasetSpark 1.6 de bir API önizleme olarak yayımlanan API, iki dünyanın en iyisini vermeyi amaçlamaktadır; tanıdık nesne yönelimli programlama stili ve derleme zamanı tip güvenliğiRDDAPI'nin ancak Catalyst sorgu optimize edicisinin performans avantajları ile. Veri kümeleri ayrıca DataFrameAPI ile aynı verimli yığın dışı depolama mekanizmasını kullanır .

Verilerin serileştirilmesi söz konusu olduğunda, DatasetAPI kodlayıcı kavramına sahiptir JVM gösterimleri (nesneler) ve Spark'ın dahili ikili biçimi arasında çeviri . Spark, yığın dışı verilerle etkileşimde bulunmak ve tüm nesnenin serileştirilmesini gerektirmeden bireysel özniteliklere isteğe bağlı erişim sağlamak için bayt kodu üretmeleri bakımından çok gelişmiş yerleşik kodlayıcılara sahiptir. Spark henüz özel kodlayıcıların uygulanması için bir API sağlamaz, ancak gelecekteki bir sürüm için planlanmıştır.

Ayrıca, DatasetAPI hem Java hem de Scala ile eşit derecede iyi çalışacak şekilde tasarlanmıştır. Java nesneleriyle çalışırken, tam olarak fasulye uyumlu olmaları önemlidir.

Örnek DatasetAPI SQL stili:

dataset.filter(_.age < 21);

Değerlendirmeler farklıdır. arasında DataFrame& DataSet: resim açıklamasını buraya girin

Katalist seviye akışı. (Spark zirvesinden DataFrame ve Veri Kümesi sunumunun algılanması) resim açıklamasını buraya girin

Daha fazla okuma ... veri tabanları makalesi - Üç Apache Spark API'sinin Hikayesi: RDD'ler ve DataFrames ve Veri Kümeleri


Güçlü tipli yapı Veri Kümesi nedir? DataFrame'den farkı nedir?
Arvind Kumar

Veri Kümelerinde ne tür Analiz Hataları ele alınır?
Neeleshkumar S

5
@ neelesh-srinivasan: veri çerçevesi sözdiziminde örnek alın, df.filter("age > 21");bu yalnızca çalışma zamanında değerlendirilebilir / analiz edilebilir. dizesinden beri. Veri Kümeleri durumunda, Veri Kümeleri fasulye uyumludur. yani yaş fasulye malı. Eğer yaş özelliği fasulyenizde değilse, derleme zamanıyla (yani dataset.filter(_.age < 21);) erken öğreneceksiniz . Analiz hatası Değerlendirme hataları olarak yeniden adlandırılabilir.
Ram Ghadiyaram

@NeeleshSrinivasan: daha fazla bilgi ve detaylar için apache-spark-api-kıyaslamasına bakınız
Ram Ghadiyaram

İlk resim yanıltıcı. Veri setleri Python
Yeikel

136

Apache Spark üç tip API sunar

  1. RDD
  2. Veri çerçevesi
  3. Veri kümesi

RDD, Veri Çerçevesi ve Veri Kümesi API'lerini Karşılaştırma

İşte RDD, Dataframe ve Dataset arasındaki API'lerin karşılaştırması.

RDD

Spark'ın sağladığı temel soyutlama, paralel olarak çalıştırılabilen kümenin düğümleri arasında bölünmüş bir öğe koleksiyonu olan esnek bir dağıtılmış veri kümesidir (RDD).

RDD Özellikleri: -

  • Dağıtılmış koleksiyon:
    RDD, bir kümede paralel, dağıtılmış bir algoritmaya sahip büyük veri kümelerinin işlenmesi ve oluşturulması için yaygın olarak benimsenen MapReduce işlemlerini kullanır. Kullanıcıların, iş dağılımı ve hata toleransı konusunda endişelenmeksizin, bir dizi üst düzey operatör kullanarak paralel hesaplamalar yazmalarına olanak tanır.

  • Değişmez: Bölümlenmiş kayıtlardan oluşan RDD'ler. Bir bölüm, bir RDD'deki temel bir paralellik birimidir ve her bölüm, değiştirilemeyen ve mevcut bölümlerdeki bazı dönüşümler yoluyla oluşturulan bir mantıksal veri bölümüdür.

  • Arıza toleranslı: RDD'nin bazı bölümlerini kaybedersek, birden fazla düğümde veri çoğaltması yapmak yerine aynı hesaplamayı elde etmek için soydaki bu bölümdeki dönüşümü tekrarlayabiliriz.Bu özellik RDD'nin en büyük faydasıdır çünkü veri yönetimi ve çoğaltılması konusunda çok çaba harcar ve böylece daha hızlı hesaplamalar gerçekleştirir.

  • Tembel değerlendirmeler: Spark'taki tüm dönüşümler, sonuçlarını hemen hesaplamamaları nedeniyle tembeldir. Bunun yerine, bazı temel veri kümelerine uygulanan dönüşümleri hatırlarlar. Dönüşümler yalnızca, bir eylemin sürücü programına döndürülmesi için bir sonucun gerekli olması durumunda hesaplanır.

  • İşlevsel dönüşümler: RDD'ler iki tür işlemi destekler: varolan bir veri kümesinden yeni bir veri kümesi oluşturan dönüşümler ve veri kümesinde bir hesaplama yaptıktan sonra sürücü programına bir değer döndüren eylemler.

  • Veri işleme formatları:
    Yapılandırılmamış verilerin yanı sıra yapılandırılmış verileri de kolay ve verimli bir şekilde işleyebilir.

  • Desteklenen Programlama Dilleri:
    RDD API, Java, Scala, Python ve R'de mevcuttur.

RDD Sınırlamaları: -

  • Dahili optimizasyon motoru yok: Yapılandırılmış verilerle çalışırken RDD'ler, Spark'ın katalizör optimizatörü ve Tungsten yürütme motoru da dahil olmak üzere gelişmiş optimize edicilerden yararlanamaz. Geliştiricilerin her bir RDD'yi özelliklerine göre optimize etmesi gerekir.

  • Yapısal verilerin işlenmesi : Dataframe ve veri kümelerinin aksine, RDD'ler yutulan verilerin şemasını çıkarmaz ve kullanıcının bunu belirtmesini gerektirir.

Dataframes

Spark, Spark 1.3 sürümünde Dataframes'i tanıttı. Veri çerçevesi RDD'lerin karşılaştığı temel zorlukların üstesinden gelir.

Bir DataFrame, adlandırılmış sütunlar halinde düzenlenmiş dağıtılmış bir veri koleksiyonudur. Kavramsal olarak ilişkisel veritabanındaki bir tabloya veya bir R / Python Veri Çerçevesine eşdeğerdir. Dataframe ile birlikte Spark, genişletilebilir bir sorgu optimize edici oluşturmak için gelişmiş programlama özelliklerinden yararlanan katalizör optimize edicisini de tanıttı.

Dataframe Özellikleri: -

  • Satır Nesnesinin dağıtılmış koleksiyonu: DataFrame, adlandırılmış sütunlar halinde düzenlenmiş dağıtılmış bir veri koleksiyonudur. Kavramsal olarak ilişkisel bir veritabanındaki bir tabloya eşdeğerdir, ancak başlık altında daha zengin optimizasyonlar vardır.

  • Veri İşleme: Yapısal ve yapılandırılmamış veri biçimlerini (Avro, CSV, elastik arama ve Cassandra) ve depolama sistemlerini (HDFS, HIVE tabloları, MySQL, vb.) İşleme. Tüm bu çeşitli veri kaynaklarını okuyabilir ve yazabilir.

  • Katalizör optimize edici kullanarak optimizasyon: Hem SQL sorgularına hem de DataFrame API'sine güç sağlar. Veri çerçevesi dört aşamada katalizör ağacı dönüşüm çerçevesini kullanır,

     1.Analyzing a logical plan to resolve references
     2.Logical plan optimization
     3.Physical planning
     4.Code generation to compile parts of the query to Java bytecode.
    
  • Kovan Uyumluluğu: Spark SQL kullanarak mevcut Kovan depolarınızda değiştirilmemiş Kovan sorguları çalıştırabilirsiniz. Hive ön ucunu ve MetaStore'u yeniden kullanır ve mevcut Hive verileri, sorgular ve UDF'lerle tam uyumluluk sağlar.

  • Tungsten: Tungsten, hafızayı açıkça yöneten ve ifade değerlendirmesi için dinamik olarak bayt kodu üreten fiziksel bir yürütme arka ucu sağlar.

  • Desteklenen Programlama Dilleri:
    Dataframe API'sı Java, Scala, Python ve R'de mevcuttur.

Veri Çerçevesi Sınırlamaları: -

  • Derleme zamanı türü güvenliği: Tartışıldığı gibi, Dataframe API'si yapı bilinmediğinde verileri işlemenizi kısıtlayan derleme zamanı güvenliğini desteklemez. Aşağıdaki örnek derleme zamanında çalışır. Ancak, bu kodu yürütürken bir Çalışma Zamanı özel durumu alırsınız.

Misal:

case class Person(name : String , age : Int) 
val dataframe = sqlContext.read.json("people.json") 
dataframe.filter("salary > 10000").show 
=> throws Exception : cannot resolve 'salary' given input age , name

Bu, özellikle birkaç dönüşüm ve toplama adımıyla çalışırken zorlayıcıdır.

  • Etki alanı nesnesi üzerinde çalışamıyor (kayıp etki alanı nesnesi): Bir etki alanı nesnesini veri çerçevesine dönüştürdüğünüzde, nesneyi yeniden oluşturamazsınız. Aşağıdaki örnekte, personRDD'den personDF oluşturduktan sonra, Person sınıfının orijinal RDD'sini (RDD [Kişi]) kurtarmayacağız.

Misal:

case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContext.createDataframe(personRDD)
personDF.rdd // returns RDD[Row] , does not returns RDD[Person]

Veri Kümeleri API'sı

Veri Kümesi API'si, tür güvenli bir nesne tabanlı programlama arabirimi sağlayan DataFrames'ın bir uzantısıdır. İlişkisel bir şemaya eşlenen, kuvvetle yazılmış, değişmez bir nesne koleksiyonudur.

Veri Kümesinin özünde API, JVM nesneleri ile tablo gösterimi arasında dönüşüm yapmaktan sorumlu olan enkoder adı verilen yeni bir kavramdır. Sekmeli gösterim Spark dahili Tungsten ikili formatı kullanılarak saklanır ve serileştirilmiş veriler üzerinde işlem yapılmasına ve bellek kullanımının iyileştirilmesine olanak tanır. Spark 1.6, ilkel türler (örneğin String, Integer, Long), Scala vaka sınıfları ve Java Beans dahil olmak üzere çok çeşitli türler için otomatik olarak kodlayıcı oluşturma desteği ile birlikte gelir.

Veri Kümesi Özellikleri: -

  • Hem RDD hem de Dataframe'in en iyisini sağlar: RDD (fonksiyonel programlama, tip güvenli), DataFrame (ilişkisel model, Sorgu optimizasyonu, Tungsten yürütme, sıralama ve karıştırma)

  • Kodlayıcılar: Kodlayıcıların kullanımıyla, herhangi bir JVM nesnesini bir Veri Kümesine dönüştürmek kolaydır ve kullanıcıların Dataframe'in aksine hem yapılandırılmış hem de yapılandırılmamış verilerle çalışmasına izin verir.

  • Desteklenen Programlama Dilleri: Veri Kümeleri API'sı şu anda yalnızca Scala ve Java'da kullanılabilmektedir. Python ve R şu anda 1.6 sürümünde desteklenmemektedir. Sürüm 2.0 için Python desteği sunulmaktadır.

  • Tip Güvenliği: Veri Kümeleri API'si, Veri Çerçevelerinde bulunmayan derleme zamanı güvenliği sağlar. Aşağıdaki örnekte, Veri Kümesinin, lambda derleme işlevlerine sahip etki alanı nesneleri üzerinde nasıl çalışabileceğini görebiliriz.

Misal:

case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContext.createDataframe(personRDD)
val ds:Dataset[Person] = personDF.as[Person]
ds.filter(p => p.age > 25)
ds.filter(p => p.salary > 25)
 // error : value salary is not a member of person
ds.rdd // returns RDD[Person]
  • Birlikte çalışabilir: Veri Kümeleri, mevcut RDD'lerinizi ve Veri Çerçevelerinizi kaynak kodu olmadan veri kümelerine kolayca dönüştürmenize olanak tanır.

Veri Kümeleri API Sınırlaması: -

  • Dize için tür dökümü gerektirir: Veri kümelerinden verileri sorgulamak, şu anda sınıftaki alanları dize olarak belirtmemizi gerektirir. Verileri sorguladıktan sonra, gerekli veri türüne sütun yayınlamak zorunda kalıyoruz. Öte yandan, Veri Kümeleri üzerinde harita işlemi kullanırsak, Catalyst optimizer kullanılmaz.

Misal:

ds.select(col("name").as[String], $"age".as[Int]).collect()

Python ve R için destek yok: 1.6 sürümünden itibaren, Veri Kümeleri yalnızca Scala ve Java'yı destekler. Python desteği Spark 2.0'da tanıtılacak.

Veri Kümeleri API'sı, daha iyi tip güvenliği ve fonksiyonel programlama ile mevcut RDD ve Dataframe API'sine göre çeşitli avantajlar getirir.


2
Kaynaktan spark.apache.org/docs/latest/... Scala API olarak, DataFrame sadece Veri Dizisi [Satır] bir tür diğer adıdır.
Dean Chen

veri kümesi ile tip güvenliği kazandığımızı ve optimize ediciyi kaybettiğimizi söylemek doğru olur mu?
Khoa

Eğer tip güvenliğini kazanmak ve hala optimize edici olması @BlueSky
Gabber

@AmitDubey Bu doğru değil. DatasetLINQ değildir ve lambda ifadesi, ifade ağaçları olarak yorumlanamaz. Bu nedenle, kara kutular vardır ve optimize edici avantajların hemen hemen hepsini kaybedersiniz. Olası olumsuz yanların sadece küçük bir alt kümesi: Spark 2.0 Veri Kümesi ve DataFrame . Ayrıca, sadece bir kez tekrarladığım bir şeyi tekrarlamak için - genel olarak uçtan uca tip kontrolü DatasetAPI ile mümkün değildir . Birleşme en belirgin örnektir.
zero323

52

Hepsi (RDD, DataFrame ve DataSet) tek bir resimde.

RDD ve DataFrame ve DataSet Karşılaştırması

görüntü kredileri

RDD

RDD paralel olarak çalıştırılabilen hataya dayanıklı eleman koleksiyonudur.

DataFrame

DataFrameadlandırılmış sütunlar halinde düzenlenmiş bir Veri Kümesidir. Kavramsal olarak ilişkisel bir veritabanındaki bir tabloya veya R / Python'daki bir veri çerçevesine eşdeğerdir, ancak başlık altında daha zengin optimizasyonlar vardır .

Dataset

Datasetdağıtılmış bir veri koleksiyonudur. Veri Kümesi, Spark SQL'in optimize edilmiş çalıştırma motorunun avantajlarıyla RDD'lerin (güçlü yazma, güçlü lambda işlevlerini kullanma yeteneği) faydalarını sağlayan yeni bir arabirimdir .


Not:

Satır Veri Kümesi ( Dataset[Row]Scala / Java) sık sık sevk edecektir DataFrames olarak .


Nice comparison of all of them with a code snippet.

RDD vs DataFrame vs DataSet kodlu

kaynak


S: RDD gibi birini DataFrame'e veya tam tersine dönüştürebilir misiniz?

Evet, ikisi de mümkün

1. RDD-DataFrame ile.toDF()

val rowsRdd: RDD[Row] = sc.parallelize(
  Seq(
    Row("first", 2.0, 7.0),
    Row("second", 3.5, 2.5),
    Row("third", 7.0, 5.9)
  )
)

val df = spark.createDataFrame(rowsRdd).toDF("id", "val1", "val2")

df.show()
+------+----+----+
|    id|val1|val2|
+------+----+----+
| first| 2.0| 7.0|
|second| 3.5| 2.5|
| third| 7.0| 5.9|
+------+----+----+

daha fazla yol: Bir RDD nesnesini Spark'ta Dataframe'e dönüştürme

2. DataFrame/ DataSetiçin RDDolan .rdd()bir yöntem

val rowsRdd: RDD[Row] = df.rdd() // DataFrame to RDD

27

Çünkü DataFramezayıf yazılmıştır ve geliştiriciler yazım sisteminin avantajlarından yararlanamamaktadır. Örneğin, SQL'den bir şey okumak ve üzerinde bir miktar toplama çalıştırmak istediğinizi varsayalım:

val people = sqlContext.read.parquet("...")
val department = sqlContext.read.parquet("...")

people.filter("age > 30")
  .join(department, people("deptId") === department("id"))
  .groupBy(department("name"), "gender")
  .agg(avg(people("salary")), max(people("age")))

Dediğiniz zaman people("deptId"), bir Int, ya da birLongColumn üzerinde çalışmanız gereken bir nesneyi geri alıyorsunuz demektir . Scala gibi zengin tip sistemlere sahip dillerde, derleme zamanında keşfedilebilecek şeyler için çalışma zamanı hatalarının sayısını artıran tüm tip güvenliğini kaybedersiniz.

Aksine, DataSet[T]yazılır. ne zaman yaparsın:

val people: People = val people = sqlContext.read.parquet("...").as[People]

Aslında bir Peoplenesneyi geri alıyorsunuz ,deptId bir sütun tipi değil, gerçek bir integral türü, böylece yazı sisteminden faydalanıyorsunuz.

Spark 2.0'dan itibaren, DataFrame ve DataSet API'leri birleştirilecek ve burada DataFramebir tür takma adı olacaktır DataSet[Row].


5
Spark 2.0 olarak net olmak gerekirse Dataframe sadece bir takma addır içinDataset[Row]
zero323

1
@ zero323 Evet, ama yine de zayıf yazılmış, bunu aktarmaya çalışıyordum.
Yuval Itzchakov

Evet, ama bir kabın kendisinden daha çok depolanmış değerler meselesi. 1.6'da bile bu ikisi teknik olarak özdeşti ve ayrı kalmanın ana nedeni DataFrameAPI değişikliklerini kırmaktan kaçınmaktı. Her neyse, sadece belirtmek istedim. Düzenleme ve benden alınan oy için teşekkürler.
zero323

25

Basitçe RDDçekirdek bileşen, amaDataFrame kıvılcım 1.30'da sunulan bir API.

RDD

Veri bölümlerinin toplanması denir RDD. Bunlar RDDaşağıdaki gibi birkaç özelliği izlemelidir:

  • Immutable,
  • Hata müsaması,
  • Dağıtılmış,
  • Daha.

İşte RDDya yapılandırılmış ya da yapılandırılmamış.

Veri çerçevesi

DataFrameScala, Java, Python ve R'de bulunan bir API'dir. Her türlü Yapısal ve yarı yapılandırılmış verinin işlenmesini sağlar. Tanımlamak için DataFrame, denilen adlı sütunlar halinde organize dağıtılan verilerin bir koleksiyon DataFrame. Kolayca optimize edebilirsiniz RDDsiçinde DataFrame. Kullanarak JSON verilerini, parke verilerini, HiveQL verilerini aynı anda işleyebilirsiniz DataFrame.

val sampleRDD = sqlContext.jsonFile("hdfs://localhost:9000/jsondata.json")

val sample_DF = sampleRDD.toDF()

Burada Sample_DF olarak düşünün DataFrame. sampleRDD(ham veri) denir RDD.


12

Cevapların çoğu doğrudur, buraya sadece bir nokta eklemek istiyorum

Spark 2.0'da iki API (DataFrame + DataSet) birlikte tek bir API'de birleştirilecektir.

"DataFrame ve Veri Kümesini Birleştirme: Scala ve Java'da DataFrame ve Veri Kümesi birleştirildi, yani DataFrame yalnızca Satır Veri Kümesi için bir tür diğer adıdır. Python ve R'de, tür güvenliği olmadığı için DataFrame ana programlama arabirimidir."

Veri kümeleri RDD'lere benzer, ancak Java serileştirme veya Kryo kullanmak yerine, nesneleri ağ üzerinden işlemek veya iletmek üzere serileştirmek için özel bir Kodlayıcı kullanırlar.

Spark SQL, mevcut RDD'leri Veri Kümelerine dönüştürmek için iki farklı yöntemi destekler. İlk yöntem, belirli nesne türlerini içeren bir RDD'nin şemasını çıkarmak için yansıma kullanır. Bu yansıma tabanlı yaklaşım, daha özlü bir kod sağlar ve Spark uygulamanızı yazarken şemayı zaten bildiğinizde iyi çalışır.

Veri Kümeleri oluşturmanın ikinci yöntemi, bir şema oluşturmanıza ve daha sonra varolan bir RDD'ye uygulamanıza izin veren programlı bir arabirimdir. Bu yöntem daha ayrıntılı olsa da, sütunlar ve türleri çalışma zamanına kadar bilinmediğinde Veri Kümeleri oluşturmanıza olanak tanır.

RDD tof Veri çerçevesi konuşma cevabını burada bulabilirsiniz

Rdd nesnesini kıvılcım içinde dataframe'e dönüştürme


8

Bir DataFrame, RDBMS'deki bir tabloya eşdeğerdir ve RDD'lerde "yerel" dağıtılmış koleksiyonlara benzer şekilde manipüle edilebilir. RDD'lerin aksine, Veri Çerçeveleri şemayı takip eder ve daha iyi bir yürütme sağlayan çeşitli ilişkisel işlemleri destekler. Her DataFrame nesnesi mantıksal bir planı temsil eder, ancak "tembel" doğaları nedeniyle, kullanıcı belirli bir "çıktı işlemini" çağırana kadar yürütme gerçekleşmez.


2
RDD'ler de bu arada tembel.
kon psych

6

RDF ve DataFrame kullanım perspektifinden birkaç öngörü:

  1. RDD'ler harika! neredeyse her türlü veriyle başa çıkabilmemiz için bize esneklik sağladıklarından; yapılandırılmamış, yarı yapılandırılmış ve yapılandırılmış veriler. Çoğu zaman, veriler bir DataFrame'e (JSON'a) sığmaya hazır olmadığından, RDD'ler bir veri çerçevesine sığabilmesi için veriler üzerinde önişleme yapmak için kullanılabilir. RDD'ler Spark'daki çekirdek veri soyutlamasıdır.
  2. DataFrames üzerinde RDD üzerinde mümkün olan tüm dönüşümler mümkün değildir, örnek subtract () RDD için vs hariç () DataFrame içindir.
  3. DataFrames bir ilişkisel tablo gibi olduğundan, set / ilişkisel teori dönüşümlerini kullanırken katı kurallara uyarlar, örneğin iki veri çerçevesini birleştirmek istiyorsanız, her iki dfs'nin de aynı sayıda sütun ve ilişkili sütun veri türlerine sahip olması gerekir. Sütun adları farklı olabilir. Bu kurallar RDD'ler için geçerli değildir. İşte bu gerçekleri açıklayan iyi bir öğretici .
  4. Diğerleri daha önce açıklamış olduğu gibi DataFrames'i kullanırken performans kazanımları vardır.
  5. DataFrames kullanarak RDD'lerle programlama yaparken yaptığınız gibi rasgele işlevi iletmeniz gerekmez.
  6. Veri karelerini kıvılcım eko ​​sisteminin SparkSQL alanında oldukları gibi programlamak için SQLContext / HiveContext'e ihtiyacınız vardır, ancak RDD için yalnızca Spark Core kütüphanelerinde bulunan SparkContext / JavaSparkContext'e ihtiyacınız vardır.
  7. RDD'den bir şema tanımlayabilirseniz, bir df oluşturabilirsiniz.
  8. Ayrıca bir df'yi rdd'ye ve rdd'yi df'ye dönüştürebilirsiniz.

Umut ediyorum bu yardım eder!


5

Veri Çerçevesi, her biri bir kaydı temsil eden bir RDD Row nesnesidir. Bir Dataframe ayrıca satırlarının şemasını (yani veri alanlarını) da bilir. Veri Çerçeveleri normal RDD'lere benzese de, dahili olarak verileri şemalarından yararlanarak daha verimli bir şekilde depolarlar. Ayrıca, RDD'lerde bulunmayan, SQL sorgularını çalıştırma yeteneği gibi yeni işlemler sağlarlar. Veri çerçeveleri dış veri kaynaklarından, sorguların sonuçlarından veya normal RDD'lerden oluşturulabilir.

Referans: Zaharia M., vd. Spark Öğrenme (O'Reilly, 2015)


1

Spark RDD (resilient distributed dataset) :

RDD temel veri soyutlama API'sıdır ve Spark'ın (Spark 1.0) ilk sürümünden beri kullanılabilir. Dağıtılmış veri toplamayı işlemek için daha düşük seviyeli bir API'dir. RDD API'leri, temeldeki fiziksel veri yapısı üzerinde çok sıkı kontrol elde etmek için kullanılabilecek bazı son derece kullanışlı yöntemler ortaya koyar. Farklı makinelere dağıtılan bölünmüş verilerin değişmez (salt okunur) bir koleksiyonudur. RDD, büyük veri işlemlerini hataya dayanıklı bir şekilde hızlandırmak için büyük kümelerde bellek içi hesaplamaya olanak tanır. Hata toleransını etkinleştirmek için RDD, bir dizi köşe ve kenardan oluşan DAG (Yönlü Asiklik Grafiği) kullanır. DAG'daki köşeler ve kenarlar, sırasıyla RDD'yi ve söz konusu RDD'ye uygulanacak işlemi temsil eder. RDD'de tanımlanan dönüşümler tembeldir ve yalnızca bir eylem çağrıldığında yürütülür

Spark DataFrame :

Spark 1.3 iki yeni veri soyutlama API'sı tanıttı - DataFrame ve DataSet. DataFrame API'leri, verileri ilişkisel veritabanındaki tablo gibi adlandırılmış sütunlar halinde düzenler. Programcıların dağıtılmış bir veri toplama şemasını tanımlamasını sağlar. Bir DataFrame içindeki her satır, nesne türü satırından oluşur. Bir SQL tablosu gibi, her sütun bir DataFrame içinde aynı sayıda satıra sahip olmalıdır. Kısacası, DataFrame, verilerin dağıtılmış toplanması üzerinde gerçekleştirilmesi gereken işlemleri belirten tembel olarak değerlendirilen bir plandır. DataFrame aynı zamanda değişmez bir koleksiyon.

Spark DataSet :

DataFrame API'lerinin bir uzantısı olarak Spark 1.3, Spark'ta kesinlikle yazılan ve nesneye yönelik programlama arabirimi sağlayan DataSet API'lerini de tanıttı. Değişmez, tip-güvenli dağıtılmış verilerin toplanmasıdır. DataFrame gibi DataSet API'leri de yürütme optimizasyonunu etkinleştirmek için Catalyst motorunu kullanır. DataSet, DataFrame API'lerinin bir uzantısıdır.

Other Differences -

resim açıklamasını buraya girin


0

DataFrame , şeması olan bir RDD'dir . İlişkisel veritabanı tablosu olarak düşünebilirsiniz, çünkü her sütunun bir adı ve bilinen bir türü vardır. DataFrames'ın gücü, yapılandırılmış bir veri kümesinden (Json, Parquet ..) bir DataFrame oluşturduğunuzda, Spark'ın (Json, Parquet ..) tüm veri kümesini geçirerek bir şema çıkarabildiği gerçeğinden kaynaklanır. yükleniyor. Daha sonra, uygulama planını hesaplarken Spark, şemayı kullanabilir ve daha iyi hesaplama optimizasyonları yapabilir. O Not DataFrame Kıvılcım 1.3.0 sürümündeki önce SchemaRDD çağrıldı


0

Apache Spark - RDD, DataFrame ve DataSet

Spark RDD -

RDD, Esnek Dağıtılmış Veri Kümeleri anlamına gelir. Kayıtların salt okunur bölüm koleksiyonudur. RDD, Spark'ın temel veri yapısıdır. Bir programcının büyük kümeler üzerinde hataya dayanıklı bir şekilde bellek içi hesaplamalar yapmasını sağlar. Böylece görevi hızlandırın.

Kıvılcım Veri Çerçevesi -

RDD'den farklı olarak, veriler adlandırılmış sütunlar halinde düzenlenmiştir. Örneğin ilişkisel veritabanındaki bir tablo. Değişmez dağıtılmış veri toplanmasıdır. Spark'daki DataFrame, geliştiricilerin dağıtılmış bir veri koleksiyonuna bir yapı dayatmasına izin vererek daha yüksek düzey soyutlamaya izin verir.

Spark Veri Kümesi -

Apache Spark'daki veri kümeleri, tür güvenli, nesne yönelimli programlama arabirimi sağlayan DataFrame API'sının bir uzantısıdır. Veri Kümesi, ifadeleri ve veri alanlarını bir sorgu planlayıcıya göstererek Spark's Catalyst optimizer'dan yararlanır.


-1

RDD'leri Yapılandırılmış ve yapılandırılmamış olarak kullanabilirsiniz; burada Veri Çerçevesi / Veri Kümesi yalnızca Yapılandırılmış ve Yarı Yapılandırılmış Verileri işleyebilir (Uygun şemaya sahiptir)


-2

Tüm harika cevaplar ve her API'yi kullanmanın bir sonucu vardır. Veri kümesi, çok fazla sorunu çözmek için süper API olacak şekilde üretilmiştir, ancak verilerinizi anlarsanız ve işleme algoritması büyük verilere tek geçişte çok şey yapmak için optimize edilmişse, çoğu zaman RDD en iyi şekilde çalışırsa, RDD en iyi seçenek gibi görünüyor.

Veri kümesi API'sını kullanarak toplama işlemi hala bellek tüketir ve zamanla daha iyi hale gelir.

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.