आप पुनरावृति एक बड़ी Pyspark Dataframe में एक स्तंभ के विशिष्ट मानों के माध्यम से कैसे करूँ? .distinct ()। कलेक्ट () एक बड़े कार्य चेतावनी को जन्म देती है

वोट
0

मैं एक बड़ी Pyspark Dataframe के कॉलम में विशिष्ट मानों की सभी के माध्यम से पुनरावृति करने की कोशिश कर रहा हूँ। जब मैं .distinct ()। कलेक्ट () यह एक काम बहुत लंबा है चेतावनी भले ही केवल दो अलग-अलग मान रहे हैं को जन्म देती है का उपयोग कर यह करने के लिए प्रयास करें। यहां कुछ नमूना कोड है:

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

इस कोड को यह चेतावनी है जो एक्स के लिए data.select में लाइन ( एक ) को संदर्भित करता है पैदा करता है अलग () कलेक्ट ()।।:

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.

आप स्मृति मुद्दों में चलने के बिना एक बड़ी Pyspark Dataframe के एक स्तंभ में अलग-अलग मान के माध्यम से कैसे पुनरावृति कर सकते हैं?

13/01/2020 को 23:54
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
0

आप पहले से ही जानते हैं, .collect()एक सबसे अच्छा अभ्यास नहीं है। कारण, यह एक एक्शन जो ड्राइवर को निष्पादकों से सभी डेटा स्थानांतरित है। तो, विशिष्ट मानों की एक बहुत कुछ के साथ एक बड़े dataframe में, कलेक्ट सब पर काम नहीं करेगा। आपकी समस्या जड़ है कि आप ड्राइवर PVM में निष्पादकों JVM से अपने सभी वितरित डेटा लाना चाहते है।

एक उच्च स्तर में, आपकी समस्या के लिए एक काम के आसपास डिस्क के साथ विनिमय स्मृति के लिए हो सकता है।

आप एक csv में अलग-अलग मान के साथ अपने dataframe बारे में और उसके बाद अजगर या पांडा * के साथ लाइन द्वारा फिर से लाइन यह पढ़ सकते हैं:

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

इस समाधान के साथ आप स्मृति के साथ कोई समस्या नहीं होगी।

* वहाँ कैसे अजगर या पांडा के साथ एक बड़े सीएसवी को पढ़ने के लिए के बारे में समाधान की एक बहुत हैं।

15/01/2020 को 00:37
का स्रोत उपयोगकर्ता

वोट
0

चेतावनी:

20/01/13 20:39:01 चेतावनी TaskSetManager: स्टेज 0 बहुत बड़े आकार (154 KB) का एक काम में शामिल है। अधिकतम सिफारिश की कार्य आकार 100 KB है।

कार्य आकार की चर्चा करते हुए निष्पादकों है कि स्पार्क भेजना है। इसलिए, मैं इस स्मृति लेकिन कार्य के आकार और डेटा आप इसके साथ भेज साथ कोई संबंध नहीं है लगता है। आपके मामले में डेटा के माध्यम से उत्पादन किया जाता है:

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

अब समस्या यह है कि कि dataframe के आकार की अनुमति दी कार्य आकार जो 100KB है के आकार से अधिक है। आप का आकार प्राप्त कर सकते हैं table_dataके साथ:

table_data.info(memory_usage='deep')

यह आपको लगभग 4.6MB = 4710.4KB देना चाहिए। आपके मामले में कार्य आकार 154kb जहाँ से हम यह निष्कर्ष निकाल सकते हैं कि डाटासेट 4710/154 ~ 30 विभाजन है (कृपया पुष्टि करें यदि संभव हो तो साथ है data.rdd.getNumPartitions())।

4710/50 = 94.2KB: समाधान के लिए एक छोटे कार्य आकार <= 100KB यानी पाने के लिए एक उच्च संख्या के पुनर्विभाजन के लिए हो सकता है। आपकी अंतिम क्वेरी अगले के रूप में दिखना चाहिए:

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

अब क्या हुआ है कि हम प्रत्येक कार्य (~ 94kb के रूप में हम ऊपर देखा) के लिए बहुत छोटे डेटा आकार में 50 विभाजन जो परिणाम के लिए प्रारंभिक डाटासेट विभाजित है।

29/01/2020 को 19:10
का स्रोत उपयोगकर्ता

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