Wie wollen Sie durchlaufen verschiedene Werte einer Spalte in einem großen Pyspark Datenrahmen? .distinct (). Collect () wirft eine große Aufgabe Warnung

stimmen
0

Ich versuche, durch all die unterschiedlichen Werte in Spalte eines großen Pyspark Datenrahmen zu wiederholen. Wenn ich versuche, es zu tun .distinct () verwenden. Collect () wirft er eine „Aufgabe zu groß“ Warnung, auch wenn es nur zwei verschiedene Werte. Hier ist ein Beispielcode:

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])+')

Dieser Code erzeugt diese Warnung, die für x in data.select ( a ) auf die Linie bezieht sich distinct () 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.

Wie kann man in einer Spalte eines großen Pyspark Datenrahmen unterschiedlicher Werte durchlaufen, ohne in den Speichern Probleme zu laufen?

Veröffentlicht am 13/01/2020 um 23:54
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Wie Sie bereits wissen, .collect()ist nicht eine bewährte Methode. Denn es ist eine Aktion , die alle Daten von Vollstrecker auf den Fahrer übertragen. Also, in einem großen Datenrahmen mit vielen verschiedenen Werten, wird die collect haupt nicht funktionieren. Ihr Problem Wurzel ist , dass Sie alle Ihre verteilten Daten von den Vollstreckern JVM in den Treiber PVM bringen wollen.

In einem hohen Niveau, eine Arbeit um für Ihr Problem zu Austauschspeichern mit Festplatte sein könnte.

Sie können Ihren Datenrahmen mit unterschiedlichen Werten in einer csv schreiben und es dann durch die Linie mit Python oder Pandas wieder Zeile gelesen *:

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

Mit dieser Lösung werden Sie keine Probleme mit dem Gedächtnis haben.

* Es gibt viele Lösungen, wie eine große CSV mit Python oder Pandas zu lesen.

Beantwortet am 15/01/2020 um 00:37
quelle vom benutzer

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