2014-12-31 14 views
6

में saveAsTextFile विधि मेरी प्रोजेक्ट में, मेरे पास तीन इनपुट फाइलें हैं और फ़ाइल नामों को तर्क (0) के रूप में तर्क (0) के रूप में बनाते हैं (2), मेरे पास स्रोत कोड में तर्क (3) के रूप में आउटपुट फ़ाइल नाम भी है I का उपयोगस्पार्क

val sc = new SparkContext() 
var log = sc.textFile(args(0)) 
for(i <- 1 until args.size - 1) log = log.union(sc.textFile(args(i))) 

मैं कुछ नहीं कर लॉग में लेकिन

log.coalesce(1, true).saveAsTextFile(args(args.size - 1)) 

का उपयोग करके एक पाठ फ़ाइल के रूप में सहेज लेकिन यह अभी भी पार्ट-00001, पार्ट-00000 के रूप में 3 फाइल करने के लिए बचाने के लिए, पार्ट-00002, तो क्या कोई तरीका है कि मैं तीन इनपुट फ़ाइलों को आउटपुट फ़ाइल में सहेज सकता हूं?

+1

क्या यह आपका पूरा कार्यक्रम है? यह ठीक दिखता है, आपके पास आउटपुट निर्देशिका में एक फ़ाइल 'part-00000' और '_SUCCESS' जैसी कुछ होना चाहिए। ध्यान दें कि 'saveAsTextFile' का तर्क वास्तव में एक निर्देशिका नाम है, जहां आउटपुट सहेजा जाता है। – lpiepiora

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद! वास्तव में मैं लॉग में कुछ कार्रवाई करता हूं। अभी, मैं कोशिश करता हूं और पाते हैं कि यह उपयोगी है, शायद मेरी परियोजना में कुछ त्रुटि हो, मैं इसे देख लूंगा! – kemiya

+1

मैंने अभी यह कोशिश की है और मैं केवल एक ही आउटपुट के साथ समाप्त होता हूं। क्या आप स्थानीय रूप से या क्लस्टर में स्पार्क चला रहे हैं? – climbage

उत्तर

2

एकाधिक आउटपुट फाइलें होने से मल्टी-मशीन क्लस्टर जैसे हडोप या स्पार्क का मानक व्यवहार होता है। आउटपुट फाइलों की संख्या reducers की संख्या पर निर्भर करता है।

यह कैसे "का समाधान करने के लिए" Hadoop में: merge output files after reduce phase

कैसे "का समाधान करने के लिए" स्पार्क में: how to make saveAsTextFile NOT split output into multiple file?

एक अच्छा जानकारी आप भी यहाँ प्राप्त कर सकते: तो http://apache-spark-user-list.1001560.n3.nabble.com/How-to-make-Spark-merge-the-output-file-td322.html

, आप coalesce(1,true) के बारे में सही थे। हालांकि, यह बहुत अक्षम है। दिलचस्प यह है कि (जैसा कि @climbage ने उनकी टिप्पणी में उल्लेख किया है) यदि आप इसे स्थानीय रूप से चलाते हैं तो आपका कोड काम कर रहा है।

आप पहले से फ़ाइलों को पढ़ने और फिर आउटपुट को सहेजने का प्रयास कर सकते हैं।

... 
val sc = new SparkContext() 
var str = new String("") 
for(i <- 0 until args.size - 1){ 
    val file = sc.textFile(args(i))  
    file.foreach(line => str+= line) 
} 
//and now you might save the content 
str.coalesce(1, true).saveAsTextFile("out") 

नोट: इस कोड भी अत्यंत अकुशल और केवल छोटे फ़ाइलों के लिए काम कर रहा है !!! आपको एक बेहतर कोड के साथ आने की जरूरत है। मैं फ़ाइल की संख्या को कम करने की कोशिश नहीं करता लेकिन इसके बजाय कई आउटपुट फाइलों को संसाधित करता हूं।

0

जैसा कि बताया गया है कि आपकी समस्या मानक एपीआई के माध्यम से कुछ हद तक अपरिहार्य है क्योंकि धारणा यह है कि आप डेटा की बड़ी मात्राओं से निपट रहे हैं। हालांकि, अगर मुझे लगता है अपने डेटा प्रबंधनीय है आप की कोशिश कर सकते निम्नलिखित

import java.nio.file.{Paths, Files}  
import java.nio.charset.StandardCharsets 

Files.write(Paths.get("./test_file"), data.collect.mkString("\n").getBytes(StandardCharsets.UTF_8)) 

क्या मैं यहाँ कर रहा हूँ एक कलेक्ट और फिर mkString प्रदर्शन से एक स्ट्रिंग में RDD परिवर्तित। मैं उत्पादन में ऐसा नहीं करने का सुझाव दूंगा। यह स्थानीय डेटा विश्लेषण (स्थानीय डेटा के 5 जीबी ~ के साथ काम करने) के लिए ठीक काम करता है