Nasıl yinelerler büyük Pyspark Dataframe bir sütununun belirgin değerlerinin yoluyla mı? .distinct (). toplamak () büyük bir görev uyarı yükseltir

oy
0

Büyük bir Pyspark Dataframe ait sütunda farklı değerlerin tüm yineleme yapmak için çalışıyorum. I () sadece iki ayrı değer olsa bile uyarı bir çok büyük bir görev yükseltir .distinct (). Toplamak kullanarak bunu yapmak çalıştığınızda. İşte bazı örnek kod:

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

Bu kod, data.select x in için hat ( a ) ifade eder, bu uyarı üreten ayrı () toplamak ()..:

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.

Nasıl bellek sorunları çalıştırmadan büyük Pyspark Dataframe sütunundaki farklı değerlere yineleyebilirsiniz?

Oluştur 13/01/2020 saat 21:54
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
0

Bildiğiniz gibi, .collect()bir iyi uygulama değildir. Çünkü, bu sürücüye uygulayıcıları tüm verileri aktarmak bir eylem bu. Yani, farklı değerlerin bir sürü büyük dataframe içinde, toplamak hiç çalışmaz. Senin sorunun kökü Sürücü PVM içine uygulamacı JVM gelen tüm dağıtılmış veri getirmek istiyorum olmasıdır.

Yüksek düzeyde olarak, soruna yönelik bir çalışma etrafında disk değişimi belleğine olabilir.

Tek bir csv farklı değerler ile dataframe yazıp Python veya Pandalar * doğrultusunda yeniden hat okuyabilirsiniz:

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

Bu çözüm ile bellek ile herhangi bir sorun olmayacaktır.

* Python veya Pandalar ile büyük bir CSV okuma hakkında bir çok çözüme vardır.

Cevap 14/01/2020 saat 22:37
kaynak kullanıcı

oy
0

Uyarı:

Evre 0 çok büyük boyut (154 KB) bir görevi içerir: 20/01/13 20:39:01 TaskSetManager WARN. önerilen maksimum görev boyutu 100 KB.

Görev boyutuna emirleri yerine getirenlerin bu Kıvılcım send bahsediyor. Bu nedenle, bu bellek ile ancak görevin büyüklüğüne ve onunla göndermek verilerle ilgisi yoktur düşünüyorum. Senin durumunda veri yoluyla üretilir:

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

Şimdi problem şu dataframe boyutu 100 KB, izin verilen görev boyutu boyutunu aşıyor olmasıdır. Sen boyutunu alabilir table_dataile:

table_data.info(memory_usage='deep')

Bu size = 4710.4KB yaklaşık 4.6MB vermelidir. Senin durumunda görev boyutu biz veri kümesi 4710/154 ~ 30 bölümleri olduğu sonucuna varıldı (lütfen onayla birlikte mümkünse alabileceğiniz 154KB olan data.rdd.getNumPartitions()).

4710/50 = 94.2KB: Çözelti daha küçük bir görev boyutu <= 100 KB örneğin sahip olmak için daha yüksek bir sayı bölümlerini yeniden için olabilir. Nihai sorgu sonraki olarak görünmelidir:

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

Şimdi ne oldu biz her görevin (~ 94KB yukarıda gördüğümüz gibi) için çok daha küçük veri büyüklüğü 50 bölümleri sonuçları başlangıçtaki veri kümesini ayırmaları.

Cevap 29/01/2020 saat 17:10
kaynak kullanıcı

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