PySpark में, मुझे फ़ाइलों को पार्स करने का एक अतिरिक्त उपयोगी तरीका मिला है। शायद स्काला में एक समकक्ष है, लेकिन मैं एक कामकाजी अनुवाद के साथ आने में सहज नहीं हूं। यह वास्तव में, लेबल के अतिरिक्त के साथ एक टेक्स्टफाइल कॉल है (नीचे उदाहरण में कुंजी = फ़ाइल नाम, मान = फ़ाइल से 1 पंक्ति)।
"लेबल" टेक्स्ट फ़ाइल
इनपुट:
import glob
from pyspark import SparkContext
SparkContext.stop(sc)
sc = SparkContext("local","example") # if running locally
sqlContext = SQLContext(sc)
for filename in glob.glob(Data_File + "/*"):
Spark_Full += sc.textFile(filename).keyBy(lambda x: filename)
आउटपुट: फ़ाइल नाम-की-कुंजी का उपयोग करके और फ़ाइल की प्रत्येक पंक्ति = का उपयोग करके प्रत्येक प्रविष्टि के साथ सरणी। (तकनीकी रूप से, इस पद्धति का उपयोग करके आप वास्तविक फ़ाइलपथ नाम के अलावा एक अलग कुंजी का उपयोग भी कर सकते हैं- शायद मेमोरी पर सहेजने के लिए हैशिंग प्रतिनिधित्व)। अर्थात।
[('/home/folder_with_text_files/file1.txt', 'file1_contents_line1'),
('/home/folder_with_text_files/file1.txt', 'file1_contents_line2'),
('/home/folder_with_text_files/file1.txt', 'file1_contents_line3'),
('/home/folder_with_text_files/file2.txt', 'file2_contents_line1'),
...]
आप लाइनों की एक सूची के रूप में या तो पुनर्संयोजन भी कर सकते हैं:
Spark_Full.groupByKey().map(lambda x: (x[0], list(x[1]))).collect()
[('/home/folder_with_text_files/file1.txt', ['file1_contents_line1', 'file1_contents_line2','file1_contents_line3']),
('/home/folder_with_text_files/file2.txt', ['file2_contents_line1'])]
या एकल स्ट्रिंग्स पर वापस संपूर्ण फ़ाइलों को पुन: संयोजित करें (इस उदाहरण में परिणाम वही है जो आपको संपूर्ण टेक्स्ट से मिलता है, लेकिन स्ट्रिंग "फ़ाइल:" फ़ाइलपथ से छीन लिया गया है।)।
Spark_Full.groupByKey().map(lambda x: (x[0], ' '.join(list(x[1])))).collect()
Path
विकल्प लागू होते हैं।