একক আরডিডিতে একাধিক পাঠ্য ফাইল কীভাবে পড়বেন?


178

আমি এইচডিএফএস অবস্থান থেকে একগুচ্ছ পাঠ্য ফাইলগুলি পড়তে এবং স্পার্কটি ব্যবহার করে একটি পুনরাবৃত্তিতে এটিতে ম্যাপিং করতে চাই।

JavaRDD<String> records = ctx.textFile(args[1], 1); একসাথে কেবল একটি ফাইল পড়তে সক্ষম।

আমি একাধিক ফাইল পড়তে এবং তাদের একক আরডিডি হিসাবে প্রসেস করতে চাই। কিভাবে?

উত্তর:


298

আপনি পুরো ডিরেক্টরিগুলি নির্দিষ্ট করতে পারেন, ওয়াইল্ডকার্ড এবং এমনকি ডিরেক্টরি এবং ওয়াইল্ডকার্ডের সিএসভি ব্যবহার করতে পারেন। উদাহরণ:

sc.textFile("/my/dir1,/my/paths/part-00[0-5]*,/another/dir,/a/specific/file")

যেমন নিক চামাস নির্দেশ করেছেন এটি হ্যাডোপের একটি এক্সপোজার FileInputFormatএবং তাই এটি হাদুপ (এবং স্ক্যালডিং) এর সাথেও কাজ করে।


10
হ্যাঁ, একক আরডিডি হিসাবে একাধিক ফাইল খোলার এটি সবচেয়ে সুবিধাজনক উপায়। এখানে এপিআই হ্যাডোপের ফাইলআইপুটফর্ম্যাট এপিআইয়ের একমাত্র এক্সপোজার , তাই সমস্ত একই Pathবিকল্প প্রয়োগ করা হয়।
নিক চামাস

7
sc.wholeTextFilesলাইন-
সীমানাবিহীন

1
যদিও এটি অদ্ভুত যে আপনি যদি এটি করেন এবং সমান্তরালতা নির্দিষ্ট করে থাকেন তবে বলুন sc.textFile(multipleCommaSeparatedDirs,320)এটি 19430পরিবর্তে মোট 320union
কাজগুলিকে

2
পরিশেষে আমি পাওয়া কীভাবে এই মন্দ ফাইল প্যাটার্ন ম্যাচিং কাজ করে stackoverflow.com/a/33917492/306488 তাই আমি করতে কমা সীমানা আর প্রয়োজন হবে না
lisak

@femibyte আমি তা মনে করি না, তবে কেন আপনি বাদে অন্য কোনও পরিস্থিতিতে ফাইলের নাম জানতে চাইবেন তা আমি জানি না wholeTextFiles। আপনার ব্যবহারের ক্ষেত্রে কী? যদি আপনি ফাইলগুলির মতো একই সংখ্যক পার্টিশন ব্যবহার করেন তবে আমি একটি
কর্মপরিকল্পনা বিবেচনা

35

unionনিম্নলিখিত হিসাবে ব্যবহার করুন :

val sc = new SparkContext(...)
val r1 = sc.textFile("xxx1")
val r2 = sc.textFile("xxx2")
...
val rdds = Seq(r1, r2, ...)
val bigRdd = sc.union(rdds)

তারপরে bigRddসমস্ত ফাইল সহ আরডিডি হয়।


আপনাকে মেঘ ধন্যবাদ, আমি চাইলে আমি সমস্ত ফাইল পড়তে পারি, তবে একটি! তবুও, আমাকে অনেক কিছু লিখতে হবে ...
gsamaras

30

আপনি একাধিক ফাইল পড়তে একটি একক পাঠ্য ফাইল কল ব্যবহার করতে পারেন। scala:

sc.textFile(','.join(files)) 

5
এবং অভিন্ন পাইথন সিনট্যাক্স
প্যাট্রিকসুরি

8
আমি মনে করি এটি কেবল অজগর সিনট্যাক্স। স্কাল সমতুল্য হবেsc.textFile(files.mkString(","))
দাভোস

9

আপনি এটি ব্যবহার করতে পারেন

প্রথমে আপনি এস 3 পাথের একটি বাফার / তালিকা পেতে পারেন:

import scala.collection.JavaConverters._
import java.util.ArrayList
import com.amazonaws.services.s3.AmazonS3Client
import com.amazonaws.services.s3.model.ObjectListing
import com.amazonaws.services.s3.model.S3ObjectSummary
import com.amazonaws.services.s3.model.ListObjectsRequest

def listFiles(s3_bucket:String, base_prefix : String) = {
    var files = new ArrayList[String]

    //S3 Client and List Object Request
    var s3Client = new AmazonS3Client();
    var objectListing: ObjectListing = null;
    var listObjectsRequest = new ListObjectsRequest();

    //Your S3 Bucket
    listObjectsRequest.setBucketName(s3_bucket)

    //Your Folder path or Prefix
    listObjectsRequest.setPrefix(base_prefix)

    //Adding s3:// to the paths and adding to a list
    do {
      objectListing = s3Client.listObjects(listObjectsRequest);
      for (objectSummary <- objectListing.getObjectSummaries().asScala) {
        files.add("s3://" + s3_bucket + "/" + objectSummary.getKey());
      }
      listObjectsRequest.setMarker(objectListing.getNextMarker());
    } while (objectListing.isTruncated());

    //Removing Base Directory Name
    files.remove(0)

    //Creating a Scala List for same
    files.asScala
  }

এখন এই তালিকা অবজেক্টটি নীচের কোডের টুকরোতে পাস করুন, দ্রষ্টব্য: এসসি এসকিউএল কনটেক্সট এর একটি অবজেক্ট

var df: DataFrame = null;
  for (file <- files) {
    val fileDf= sc.textFile(file)
    if (df!= null) {
      df= df.unionAll(fileDf)
    } else {
      df= fileDf
    }
  }

এখন আপনি একটি চূড়ান্ত ইউনিফাইড আরডিডি পেয়েছেন অর্থাৎ ডিএফ

Ptionচ্ছিক, এবং আপনি এটি একটি বিগআরডিডি-তে পুনরায় ভাগ করতে পারেন

val files = sc.textFile(filename, 1).repartition(1)

পুনঃবিভাজন সবসময় কাজ করে: ডি


এর অর্থ এই নয় যে ফাইল তালিকা তুলনামূলকভাবে ছোট হতে হবে? কয়েক মিলিয়ন ফাইল নয়।
ম্যাথিউ লংটিন

2
আমরা কি তালিকাবদ্ধ ফাইলগুলি পড়ার ক্রিয়াকে সমান্তরাল করতে পারি? sc.parallelize মত কিছু?
অলসউইজ

1
@ ম্যাথিউলংটিন: আপনি যদি আপনার স্পার্ক কোডটিতে পার্টিশন আবিষ্কার প্রয়োগ করতে পারেন তবে এটি দুর্দান্ত হবে অন্যথায় আপনার মতোই এটি করা দরকার। আমি প্রায় এক মিনিটে 10 কে ফাইল খুলতাম।
মুর্তজা কাঁচওয়ালা

@ লাজিউইজ আপনি যদি একটি একক আরডিডি তৈরি করতে চান না তবে কেবল পুনরায় ভাগ করার ক্রিয়াটি সরিয়ে দিন।
মুর্তজা কাঁচওয়ালা

3

পাইস্পার্কে, আমি ফাইলগুলি বিশ্লেষণের জন্য একটি অতিরিক্ত দরকারী উপায় পেয়েছি। স্ক্যালায় সম্ভবত একটি সমতুল্য আছে তবে আমি একটি কার্যকরী অনুবাদ নিয়ে যথেষ্ট স্বাচ্ছন্দ্য বোধ করি না। এটি কার্যকরভাবে, লেবেলগুলি সংযোজন সহ একটি টেক্সটফিল কল (নীচের উদাহরণে কী = ফাইল নাম, ফাইল থেকে মান = 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()


যখন আমি কোড এই লাইন দৌড়ে - Spark_Full += sc.textFile(filename).keyBy(lambda x: filename) আমি ভুল অর্থাত পেয়েছিলাম TypeError: 'PipelinedRDD' object is not iterable। আমার বোধগম্যতা হল যে, সেই লাইনটি একটি আরডিডি তৈরি করে যা অপরিবর্তনীয়, তাই আমি ভাবছিলাম আপনি কীভাবে এটি অন্য ভেরিয়েবলের সাথে যুক্ত করতে পেরেছিলেন?
কার্তিককন্নাপুর

3

তুমি ব্যবহার করতে পার

JavaRDD<String , String> records = sc.wholeTextFiles("path of your directory")

এখানে আপনি আপনার ফাইলের পথ এবং সেই ফাইলটির বিষয়বস্তু পাবেন। যাতে আপনি একটি সময় পুরো ফাইলের যে কোনও ক্রিয়া সম্পাদন করতে পারেন যা ওভারহেড সংরক্ষণ করে


2

সমস্ত উত্তর সঙ্গে সঠিক sc.textFile

আমি কেবল ভাবছিলাম কেন wholeTextFilesএই ক্ষেত্রে নয় ...

val minPartitions = 2
val path = "/pathtohdfs"
    sc.wholeTextFiles(path,minPartitions)
      .flatMap{case (path, text) 
    ...

একটি সীমাবদ্ধতা হ'ল, আমাদের ছোট ফাইলগুলি লোড করতে হবে অন্যথায় কর্মক্ষমতা খারাপ হবে এবং OOM এর দিকে পরিচালিত করতে পারে।

বিঃদ্রঃ :

  • পুরো ফাইলটি স্মৃতিতে মাপসই করা উচিত
  • ফাইল ফর্ম্যাটগুলির জন্য ভাল যা লাইন দ্বারা বিভাজ্য নয় ... যেমন এক্সএমএল ফাইলগুলি

আরও রেফারেন্স দর্শন


বা কেবলsc.wholeTextFiles(folder).flatMap...
ইভহ্জ

sc.WoleTextFiles ("/ পথ / থেকে / dir")
রাম Ghadiyaram

1

একটি সোজা ফরোয়ার্ড পরিষ্কার সমাধান উপলব্ধ। পুরো টেক্সটফিল () পদ্ধতিটি ব্যবহার করুন। এটি একটি ডিরেক্টরি নেবে এবং একটি মূল মান জোড় গঠন করবে। ফিরে আসা আরডিডি হবে একজোড়া আরডিডি। স্পার্ক ডক্স থেকে বর্ণনা নীচে সন্ধান করুন :

SparkContext. wholeTextFiles আপনাকে একাধিক ছোট টেক্সট ফাইলযুক্ত ডিরেক্টরি পড়তে দেয় এবং সেগুলির প্রতিটি (ফাইলের নাম, সামগ্রী) জোড়া হিসাবে ফিরিয়ে দেয়। এটি টেক্সটফিলের সাথে বিপরীতে যা প্রতিটি ফাইলটিতে প্রতি লাইন এক করে রেকর্ড দেয়


-1

এটা চেষ্টা কর ইন্টারফেসটি ব্যবহার করে বাহ্যিক স্টোরেজ সিস্টেমে (যেমন ফাইল সিস্টেম, কী-মান স্টোর ইত্যাদি) ডেটাফ্রেম লেখার জন্য ব্যবহৃত হয়েছিল। এটি অ্যাক্সেস করতে ডেটা ফ্রেম.উইরাইট () ব্যবহার করুন।

1.4 সংস্করণে নতুন।

সিএসভি (পথ, মোড = কিছুই নয়, সংক্ষেপণ = কিছুই নয়, সেপ = কিছুই নয়, উদ্ধৃতি = কিছুই নয়, পালানো = কিছুই নয়, শিরোনাম = কিছুই নয়, নালভ্যালু = কিছুই নেই, পর্বতারোহণ = কিছুই নেই, কোটএল = কিছুই নয়, তারিখের বিন্যাস = কিছুই নেই, টাইমস্ট্যাম্পফর্ম্যাট = কিছুই নেই) সংরক্ষণ করে নির্দিষ্ট পথে সিএসভি ফর্ম্যাটে ডেটাফ্রেমের সামগ্রী।

পরামিতি: পথ - যে কোনও হডুপ সমর্থিত ফাইল সিস্টেম মোডের পথ - ডেটা ইতিমধ্যে উপস্থিত থাকলে সেভ অপারেশনের আচরণ নির্দিষ্ট করে।

সংযোজন: বিদ্যমান ডেটাতে এই ডেটা ফ্রেমের সামগ্রী যুক্ত করুন। ওভাররাইট: বিদ্যমান ডেটা ওভাররাইট করুন। উপেক্ষা করুন: ডেটা ইতিমধ্যে উপস্থিত থাকলে নিঃশব্দে এই অপারেশনটিকে উপেক্ষা করুন। ত্রুটি (ডিফল্ট কেস): ডেটা ইতিমধ্যে উপস্থিত থাকলে একটি ব্যতিক্রম নিক্ষেপ করুন। সংক্ষেপণ - ফাইল এ সংরক্ষণ করার সময় ব্যবহার করার জন্য সংক্ষেপণ কোডেক। এটি পরিচিত কেস-সংবেদনশীল সংক্ষিপ্ত নামগুলির মধ্যে একটি হতে পারে (কোনওটি নয়, bzip2, gzip, lz4, snappy and deflate)। sep - প্রতিটি ক্ষেত্র এবং মানের জন্য পৃথককারী হিসাবে একক অক্ষর সেট করে। যদি কোনওটি সেট না করা থাকে তবে এটি ডিফল্ট মান,, ব্যবহার করে। উদ্ধৃতি - উদ্ধৃত মানগুলি পালনের জন্য ব্যবহৃত একক অক্ষর সেট করে যেখানে বিভাজক মানের অংশ হতে পারে। যদি কোনওটি সেট না করা থাকে তবে এটি ডিফল্ট মানটি ব্যবহার করে, "। আপনি যদি উদ্ধৃতিগুলি বন্ধ করতে চান, আপনাকে একটি খালি স্ট্রিং সেট করতে হবে escape এস্কেপ - একটি ইতিমধ্যে উদ্ধৃত মানের ভিতরে উদ্ধৃতি অব্যাহত রাখতে ব্যবহৃত একক অক্ষর সেট করে If , এটি ডিফল্ট মান, \ EscapeQuotes ব্যবহার করে - একটি পতাকা নির্দেশ করে যে কোটগুলি সহ মানগুলি সর্বদা উদ্ধৃতিতে আবদ্ধ থাকা উচিত। যদি কোনওটি সেট না করা থাকে, তবে এটি একটি ডিফল্ট মানটি সত্য ব্যবহার করে একটি উদ্ধৃতি অক্ষরযুক্ত সমস্ত মানকে ছাড়িয়ে। কোটাআল - সমস্ত মান সর্বদা উদ্ধৃতিতে আবদ্ধ থাকা উচিত কিনা তা নির্দেশ করে এমন একটি পতাকা। যদি কোনওটি সেট না করা থাকে তবে এটি ডিফল্ট মানটি মিথ্যা ব্যবহার করে, কেবল উদ্ধৃতি অক্ষর সম্বলিত পলায়নের মান values শিরোনাম - প্রথম লাইন হিসাবে কলামগুলির নাম লিখেছে। যদি কোনওটি সেট না করা থাকে তবে এটি ডিফল্ট মান, মিথ্যা ব্যবহার করে। নালভ্যালু - নাল মানটির স্ট্রিং প্রতিনিধিত্ব করে। যদি কোনওটি সেট না করা থাকে তবে এটি ডিফল্ট মান, খালি স্ট্রিং ব্যবহার করে। ডেট ফরম্যাট - একটি স্ট্রিং সেট করে যা একটি তারিখের ফর্ম্যাটকে নির্দেশ করে। কাস্টম তারিখের ফর্ম্যাটগুলি java.text.SimpleDate Format এ ফর্ম্যাটগুলি অনুসরণ করে। এটি তারিখের প্রকারে প্রযোজ্য। যদি কোনওটি সেট না করা থাকে তবে এটি ডিফল্ট মান মান, yyyy-MM-dd ব্যবহার করে। টাইমস্ট্যাম্পফর্ম্যাট - স্ট্রিং সেট করে যা একটি টাইমস্ট্যাম্প বিন্যাসকে নির্দেশ করে। কাস্টম তারিখের ফর্ম্যাটগুলি java.text.SimpleDate Format এ ফর্ম্যাটগুলি অনুসরণ করে। এটি টাইমস্ট্যাম্প ধরণের ক্ষেত্রে প্রযোজ্য। যদি কোনওটি সেট না করা থাকে তবে এটি ডিফল্ট মান মান, yyyy-MM-dd'T'HH: মিমি: ss.SSSZZ ব্যবহার করে।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.