Hogyan halad végig a különböző értékek egy oszlop egy nagy Pyspark Dataframe? .distinct (). collect () felvet egy nagy feladat figyelmeztetés

szavazat
0

Próbálom végiglépdelni az egyedi értékek oszlopában nagy Pyspark Dataframe. Amikor megpróbálok csinálni a .distinct (). Collect () felveti a „feladat túl nagy” figyelmeztetés akkor is, ha csak két különböző értéket. Itt van néhány minta kód:

import pandas as pd
import numpy as np
from pyspark.sql import SparkSession
import pyarrow as pa

spark = SparkSession.builder.appName('Basics').getOrCreate()
spark.conf.set(spark.sql.execution.arrow.enabled, 'true')
length = 200000
table_data = pd.DataFrame({'a': np.random.randint(2,size = length), 'b': np.random.randint(2,size = length),'c': np.random.randint(2,size = length)})

data = spark.createDataFrame(table_data)

for x in data.select(a).distinct().collect():
    data = data.filter(a == '+str(x[0])+')

Ez a kód termel ez a figyelmeztetés arra utal, hogy a vonal „az x data.select (” a „). Elkülönült (). Collect ()”:

20/01/13 20:39:01 WARN TaskSetManager: Stage 0 contains a task of very large size (154 KB). The maximum recommended task size is 100 KB.

Hogyan lehet végighaladni egyedi értékek oszlopon nagy Pyspark Dataframe nélkül fut be a memória problémák?

A kérdést 13/01/2020 21:54
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
0

Mint már tudjuk, .collect()nem a legjobb gyakorlatot. Mert ez olyan intézkedésre, amely át az összes adatot végrehajtók a vezető számára. Tehát, egy nagy dataframe sok különböző értékek, a gyűjtés nem fog működni. A probléma gyökere az, hogy azt akarjuk, hogy az összes szétosztott adatok a végrehajtók JVM a vezetőfülkébe PVM.

A magas szintű, a munka körül a probléma lehet, hogy csere memória lemezre.

Megírhatjuk dataframe az egyedi értékek egy csv, majd olvasd el újra soronként Python vagy Pandák *:

data.select("a").distinct().coalesce(1).write.csv("temp.csv")
# Specifically, it's a directory with one csv.

Ezzel a megoldással nem lesz gond a memóriával.

* Van egy csomó megoldást, hogyan kell olvasni egy nagy CSV Python vagy Panda.

Válaszolt 14/01/2020 22:37
a forrás felhasználó

szavazat
0

A figyelmeztetés:

20/01/13 20:39:01 WARN TaskSetManager: Stage 0 tartalmaz egy feladatot a nagyon nagy méretű (154 KB). Az ajánlott maximális feladat mérete 100 KB.

Utal a feladat mérete Spark küldés a végrehajtók. Ezért úgy gondolom, hogy ennek semmi köze a memória, de a méret a feladat, és az adatokat küld vele. Az Ön esetében az adatok útján előállított:

pd.DataFrame({'a': np.random.randint(2,size = length), 'b': np.random.randint(2,size = length),'c': np.random.randint(2,size = length)})

Most a probléma az, hogy a méret, hogy dataframe mérete meghaladja a megengedett méretet feladat, ami 100KB. Lekérheti a méret a table_datakövetkezőkkel:

table_data.info(memory_usage='deep')

Ez ad kb 4,6MB = 4710.4KB. Az Ön esetében a feladat mérete 154KB amiből arra következtethetünk, hogy az adatkészletet 4710/154 ~ 30 válaszfalak (Kérjük, erősítse meg, ha lehetséges data.rdd.getNumPartitions()).

A megoldás lehet particionálnod hogy nagyobb számú annak érdekében, hogy egy kisebb feladat mérete <= 100KB azaz: 4710/50 = 94.2KB. A végső lekérdezés kell nézni a jövő:

data.repartition(50).select("a").distinct().collect()

Mi történt most az, hogy szét a kezdeti adatbázisba 50 partíciók eredmények sokkal kisebb adat mérete az egyes feladatokra (~ 94KB, mint fentebb láttuk).

Válaszolt 29/01/2020 17:10
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more