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.
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.
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 .
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.
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.