Spark Under the Hood: randomSplit() and sample() Inner Workings

Spark Implementation of randomSplit()

the signature function of randomSplit() includes a weight list and a seed specification. A súlyjegyzékben meg kell adni az egyes részek számát és százalékát (hozzávetőleges), a vetőmag pedig reprodukálhatóságra szolgál. Az arány hozzávetőleges a kiszámításának jellege miatt.

például a 3. ábrán látható következő kód két adatkeretre osztaná a df-et, a train_df 80% és a test_df az eredeti adatkeret 20% – a. Használatával ugyanazt az értéket random seed, várjuk, hogy ugyanazokat az adatokat pont ugyanabban a split ha újra futtatni a szkriptet vagy Szikra belsőleg újraépíti a spárgát.

3. ábra: randomSplit () signature function example

A motorháztető alatt

a következő folyamat megismétlődik az egyes osztott adatkeretek létrehozásához: particionálás, partíciókon belüli rendezés és Bernoulli mintavétel. Ha az eredeti adatkeret nincs Gyorsítótárazva, akkor az adatok újra letöltésre kerülnek, újra megosztásra kerülnek, majd minden egyes osztott számításhoz újra rendezésre kerülnek. Ez a potenciális anomáliák forrása. Összefoglalva, randomSplit () egyenértékű teljesítő minta () minden osztott a százalékos minta változik a split végezzük. Ez nyilvánvaló, ha megvizsgálja a forráskódot randomSplit () a PySpark3. Ez a blog⁴ is nyújt néhány további információt és látvány, hogyan randomSplit () végrehajtása.

sétáljunk át egy példát. A 4. ábra a minta () diagramja minden egyes felosztáshoz, kezdve a 0,80 osztással.

4.: folyamat generáló 0,8 osztott. Azonos a minta () végrehajtásával.

Spark hasznosítja Bernoulli mintavétel, amely lehet összefoglalni generáló véletlen számok egy elem (adatpont), és elfogadja azt egy osztott, ha a generált szám esik egy bizonyos tartományba, határozza meg a split Arány. 0, 8 osztott adatkeret esetén a Bernoulli cellamintázó elfogadási tartománya lenne .

ugyanazt a mintavételi folyamatot követi az 5. ábrán látható 0.20 felosztás, csak az elfogadás határai változnak .

5.: folyamat generáló 0.2 osztott. Azonos a mintával(). végrehajtás. A partíció tartalma állandó marad, a rendezési sorrend megmarad, biztosítva az érvényes felosztást.

az adatkeret újra lekérésre kerül, particionálásra kerül, majd ismét partíciókon belül rendezésre kerül. A példában láthatja,hogy az RDD partíciók idempotent. Ami azt jelenti, hogy a 4.ábrán szereplő egyes partíciók adatpontjai ugyanabban a partícióban maradnak az 5. ábrán. Például a b és c pontok az 1. partícióban vannak mind a 4., mind az 5. ábrán. Ezenkívül az egyes partíciókhoz társított mag mindig állandó marad, a partíciókon belüli sorrend pedig azonos. Mindhárom pont alapvető fontosságú mind a minta (), mind a randomSplit () szempontjából. Annak biztosítása, hogy ugyanazt a mintát ugyanazzal a maggal állítsák elő az előbbiben, és garantálva, hogy az utóbbiban ne legyenek másolatok vagy eltűnő adatpontok.

megoldások a következetlenségek elkerülésére

ezeknek a problémáknak a megoldása annak biztosításában rejlik, hogy az RDD partíciók és a rendezési sorrend idempotens legyen. Az alábbi három módszer bármelyike biztosítja ezt, és alkalmazható: 1)az adatkeret gyorsítótárazása a műveletek előtt 2) oszlop vagy oszlopkészlet újraparticionálása, és 3) aggregált funkciók használata⁵. Az egyes módszerek példáját a 6. ábra mutatja.

6. ábra: Három különböző módszer a következetlenségek elkerülésére randomSplit() és sample()

gyorsítótárazása az eredeti adatkeret vezet partíció tartalom tartják a memóriában. Tehát ahelyett, hogy újra lekérné az adatokat, particionálás, válogatás, Spark folytatja műveleteket a particionált adatok a memóriában. Vegye figyelembe, hogy a gyorsítótár() a persist(pyspark.StorageLevel.memory_only) álneve, amely nem feltétlenül ideális, ha memória korlátozásokkal rendelkezik. Ehelyett megfontolhatja a persist(pyspark.StorageLevel.memory_and_disk_only)használatát. Ha nem áll rendelkezésre memória vagy lemezterület, a Spark újra lekérheti és partíciós adatokat a semmiből, ezért bölcs dolog lehet ezt a Spark webes felhasználói felületéről ellenőrizni. A gyorsítótárazás az a megoldás, amelyet az én esetemben választottam.

összefoglaló és kulcs Elvitel

A történet tanulsága: ha váratlan viselkedés történik a Sparkban, akkor csak egy kicsit mélyebbre kell ásni! Itt van egy összefoglaló a főbb pontok az e cikk:

  • randomSplit() egyenértékű alkalmazása minta() az adatforgalmi keret többször, minden egyes minta újra elragadó, particionálás, illetve válogatás az adatok időn belül partíciókat.
  • a partíciók közötti adateloszlás és a rendezési sorrend mind a randomSplit (), mind a sample () esetében fontos. Ha az adatok újbóli lekérése után megváltozik, lehetnek ismétlődések vagy hiányzó értékek a hasadásokon, és ugyanaz a minta ugyanazt a magot használva eltérő eredményeket hozhat.
  • Ezek az ellentmondások nem történik meg, minden fut, de, hogy megszüntesse azokat teljesen, továbbra is fennállnak (aka gyorsítótár) az adatok keret felosztása egy oszlop(ok), vagy alkalmazni összesített funkciók, mint például a groupBy.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük