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

Spark Implementation of randomSplit()

randomsplit() signature-funktio sisältää painolistan ja siemenmäärityksen. Painoluettelossa on ilmoitettava jaottelujen lukumäärä ja prosenttiosuus (likimääräinen) kussakin, ja siemen on uusittavissa. Suhdeluku on likimääräinen sen laskutavan luonteen vuoksi.

esimerkiksi kuvan 3 seuraava koodi jakaisi df: n kahteen tietokehykseen, train_df olisi 80% ja test_df olisi 20% alkuperäisestä tietokehyksestä. Käyttämällä samaa arvoa random seedille, odotamme, että samat datapisteet ovat samassa jaossa, jos ajamme skriptin uudelleen tai Spark sisäisesti uudistaa jaot.

kuva 3: randomSplit () signature function example

Hoodin alla

seuraava prosessi toistetaan jokaisen jaetun tietokehyksen tuottamiseksi: osiointi, lajittelu osioiden sisällä ja Bernoullin näytteenotto. Jos alkuperäistä tietokehystä ei tallenneta välimuistiin, tiedot haetaan uudelleen, jaetaan uudelleen ja lajitellaan uudelleen jokaista jakolaskua varten. Tämä on mahdollisten poikkeamien lähde. Yhteenvetona voidaan todeta, että randomSplit() vastaa suoritusnäytettä () kunkin jaon osalta siten, että prosenttiosuus näytteestä muuttuu jaon suoritettaessa. Tämä käy ilmi, jos tarkastellaan Randomsplitin() lähdekoodia Pyypark3: ssa. Tämä blogi YB tarjoaa myös hieman lisää tietoa ja kuvia siitä, miten randomSplit() on toteutettu.

kävellään esimerkin läpi. Kuva 4 on diagrammi näytteen () jokaisesta jaosta alkaen 0,80 jaosta.

Kuva 4: prosessi tuottaa 0,8 split. Identtinen otoksen () toteutuksen kanssa.

Spark hyödyntää Bernoullin otantaa, jonka voi tiivistää tuottavan satunnaislukuja kohteelle (datapisteelle) ja hyväksyvän sen jaettavaksi, jos luotu luku sijoittuu tiettyyn jakosuhteen määrittämälle alueelle. Bernoullin kennonäytteenottimen hyväksymisalue olisi 0,8-jakoiselle datakehykselle .

samaa otantaprosessia noudatetaan Kuvan 5 0,20 jaossa, jolloin vain hyväksymisen rajat muuttuvat.

kuva 5: prosessi tuottaa 0.2 split. Identtinen näytteen kanssa (). täytäntöönpano. Osion sisältö pysyy vakiona ja lajittelujärjestys säilyy varmistaen pätevän jaon.

tietokehys noudetaan, jaetaan ja lajitellaan osioiden sisällä uudelleen. Näet esimerkistä, että RDD-osiot ovat idempotentteja. Mikä tarkoittaa, että datapisteet kunkin osion Kuvassa 4, pysyvät samassa osion Kuvassa 5. Esimerkiksi pisteet b ja c ovat osiossa 1 sekä Kuvassa 4 että 5. Lisäksi jokaiseen osioon liittyvä siemen pysyy aina vakiona, ja järjestys osioiden sisällä on sama. Kaikki kolme näistä pisteistä ovat oleellisia sekä otokselle () että randomsplitille (). Varmistetaan, että sama näyte tuotetaan samalla siemenellä ensin mainitussa, ja varmistetaan, että jälkimmäisessä ei ole päällekkäisyyksiä tai häviäviä datapisteitä.

ratkaisut epäjohdonmukaisuuksien välttämiseksi

näiden ongelmien korjaaminen on sen varmistamista, että RDD-osiot ja lajittelujärjestys ovat idempotentteja. Mikä tahansa seuraavista kolmesta menetelmästä varmistaa tämän, ja sitä voidaan soveltaa: 1) tietokehyksen välimuistiin tallentaminen ennen operaatioita 2) uudelleenjakaminen sarakkeella tai sarakejoukolla ja 3) aggregoitujen funktioiden jaon avulla. Esimerkki kustakin menetelmästä on esitetty kuvassa 6.

kuva 6: Kolme eri tapaa välttää epäjohdonmukaisuuksia randomSplit () ja sample ()

Alkuperäisen tietokehyksen välimuistin tallentaminen johtaa osion sisällön säilyttämiseen muistissa. Spark ei siis Hae dataa, osioi ja lajittele, vaan jatkaa toimintoja osioidun datan avulla muistissa. Huomaa, että välimuisti() on alias persist(pyspark.StorageLevel.memory_only), joka ei välttämättä ole ideaali, jos on muistirajoituksia. Sen sijaan voi harkita persist(pyspark.StorageLevel.memory_and_disk_only). Jos muistia tai levytilaa ei ole saatavilla, Spark hakee ja osioi TIEDOT uudelleen tyhjästä, joten voi olla viisasta seurata tätä Spark Web-käyttöliittymästä. Välimuisti on ratkaisu, jonka valitsin tapauksessani.

yhteenveto ja Keskeiset Takeaways

tarinan opetus on: jos Sparkissa tapahtuu odottamatonta käyttäytymistä, on vain kaivettava vähän syvemmälle! Tässä on yhteenveto kaikista tämän artikkelin keskeisistä kohdista:

  • randomSplit() vastaa näytteen() levittämistä tietokehykseesi useita kertoja, jolloin jokainen näyte hakee uudelleen, osioi ja lajittelee tietokehyksesi osioissa.
  • tiedon jakautuminen osioiden ja lajittelujärjestyksen yli on tärkeää sekä satunnaisotannalla() että otoksella(). Jos jompikumpi muuttuu tietojen uudelleenhaun yhteydessä, jaotteluissa voi olla päällekkäisyyksiä tai puuttuvat arvot, ja sama näyte, jossa käytetään samaa siementä, voi tuottaa erilaisia tuloksia.
  • näitä epäjohdonmukaisuuksia ei välttämättä tapahdu jokaisella ajolla, mutta niiden poistamiseksi kokonaan, säilyttää (aka välimuisti) tietokehyksesi, jakaa uudelleen sarakkeeseen(sarakkeisiin) tai soveltaa yhteenlaskettuja toimintoja, kuten groupBy.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *