2015-09-29 11 views
10

मैं एक निर्देशिका संरचना दो विभाजन के आधार पर, इस तरह है:की बचत की छत को subpartition

People 
    > surname=Doe 
     > name=John 
     > name=Joe 
    > surname=White 
     > name=Josh 
     > name=Julien 

मैं पढ़ रहा हूँ छत फ़ाइलों जानकारी सभी करता है केवल बारे में साथ है, और इसलिए मैं सीधे निर्दिष्ट उपनाम = डो हूँ मेरे डेटाफ्रेम के लिए आउटपुट निर्देशिका के रूप में। अब समस्या यह है कि मैं लेखन पर partitionBy("name") के साथ नाम-आधारित विभाजन जोड़ने की कोशिश कर रहा हूं।

Caused by: java.lang.AssertionError: assertion failed: Conflicting partition column names detected: 
    Partition column name list #0: surname, name 
    Partition column name list #1: surname 

किसी भी सुझाव दिए गए हैं कि यह कैसे हल करने के लिए:

df.write.partitionBy("name").parquet(outputDir) 

यह नीचे की तरह एक त्रुटि का कारण बनता है (outputDir डो निर्देशिका में एक पथ है)? यह शायद उपनाम निर्देशिका में बनाई गई _SUCCESS फ़ाइल की वजह से होती है, जो स्पार्क को गलत संकेत देता है - जब मैं _SUCCESS और _metadata फ़ाइलों को हटा देता हूं स्पार्क किसी भी मुद्दे के बिना सब कुछ पढ़ने में सक्षम है।

उत्तर

7

मैं एक समाधान के साथ इसे हल करने में कामयाब रहे - मुझे नहीं लगता कि यह एक अच्छा विचार है, लेकिन मैं के साथ अतिरिक्त _SUCCESS और _metadata फ़ाइलों के निर्माण अक्षम:

sc.hadoopConfiguration.set("mapreduce.fileoutputcommitter.marksuccessfuljobs", "false") 
sc.hadoopConfiguration.set("parquet.enable.summary-metadata", "false") 

इस तरह स्पार्क नहीं मिलेगा विभाजन संरचनाओं के बारे में कोई बेवकूफ विचार।

एक अन्य विकल्प के लिए "उचित" निर्देशिका की बचत है - लोग और विभाजन उपनाम और नाम से है, लेकिन फिर आपको लगता है कि केवल समझदार विकल्प SaveModeAppend करने और स्थापित कर रही है मैन्युअल निर्देशिका आप होने की उम्मीद को हटाने को ध्यान में रखना है इस उपनाम डायरेक्टरी सभी जाएंगे -

df.write.mode(SaveMode.Append).partitionBy("surname","name").parquet("/People") 

इस मामले में owerwrite SaveMode उपयोग न करें: ओवरराइट (इस वास्तव में त्रुटियां उत्पन्न हो सकती)।

+0

के बाद से कोई भी किसी और पोस्ट और मेरे इनाम समाप्त हो रहा है , मैं इस समाधान को केवल एक के रूप में स्वीकार कर रहा हूं। – Niemand

+0

यह स्पार्क 1.6.3 'sc._jsc.hadoop कॉन्फ़िगरेशन() के लिए मेरे लिए काम करता है। (" Mapreduce.fileoutputcommitter.marksUccessfuljobs "," false ") sc._jsc.hadoop कॉन्फ़िगरेशन()। सेट (" parquet.enable.summary -मैटडाटा "," झूठा ")' – Vezir

2
sc.hadoopConfiguration.set("parquet.enable.summary-metadata", "false") 

काफी समझदार है, यदि आप सारांश मेटाडाटा तो सक्षम मेटाडाटा फ़ाइल पर रीड और राईट एक आईओ टोंटी बन सकता है लेखन किया है।

अपने समाधान के लिए वैकल्पिक रास्ता ("जोड़ना") आपके लिखने के लिए एक .mode जोड़ने के लिए हो सकता है, लेकिन गंतव्य के रूप में मूल मूल निर्देशिका के साथ,

df.write.mode("append").partitionBy("name").parquet("/People") 
+0

संलग्न करने में समस्या यह है कि मुझे डेटा को मैन्युअल रूप से हटाना होगा, जो मेरे मामले में परेशान होगा। – Niemand

+0

सच है, लेकिन फिर स्पार्क में फ़ाइल विभाजन को हटाना वैसे भी प्राथमिक है ... –

संबंधित मुद्दे