2017-12-14 4 views
3

を使用して:私は、テキストファイルに次の行を抱えているスパークのJava

Some different lines.... 

Name : Praveen 
Age : 24 
Contact : 1234567890 
Location : India 

Some different lines.... 

Name : John 
Contact : 1234567890 
Location : UK 

Some different lines.... 

Name : Joe 
Age : 54 
Contact : 1234567890 
Location : US 

いくつかの異なるライン間でいくつかの他の情報があることを示します。

私はファイルを読んで人情報を抽出する必要があります。いずれかのキーが見つからない場合は、空の文字列として読み取られる必要があります(2番目の人の情報には年齢がありません)。

JavaRDD<String> data = jsc.textFile("person.report"); 

List<String> name = data.filter(f -> f.contains("Name")).collect(); 
List<String> age = data.filter(f -> f.contains("Age")).collect(); 
List<String> contact = data.filter(f -> f.contains("Contact")).collect(); 
List<String> location = data.filter(f -> f.contains("Location")).collect(); 

上記のようにしてforループを繰り返すと、3人目の年齢が2番目の人に割り当てられます。

答えて

2

まず、ドライバのすべてを収集していますが、それはあなたがしたいことですか?大きなデータセットでは機能しません。

基本的には、レコードとみなすのは1行ではありません。デフォルトでは、sparkは各行を別々のレコードと見なします。しかし、あなたのレコードはいくつかの行(名前、年齢、場所...)にあります。これを克服するには、別の区切り文字を見つける必要があります。 「いくつかの異なるライン」の場合は、特定の文字列があり、それを使用してこのプロパティを設定:人物に対応するすべての行がする

val cols = Seq("Name","Age", "Contact", "Location") 
sc.textFile("...") 
    .map(_.split("\n")) 
    .map(x => cols 
     .map(col => x.find(_.startsWith(col)).getOrElse(col+" :"))) 

sc.hadoopConfiguration.set("textinputformat.record.delimiter","specific string") 

次に、あなたのような何かを書くことができあなたが望むようにあなたが処理するために同じレコードに入ってください。適切な区切り文字が見つからない場合は、レコードにすべて名前が付いている可能性がありますので、おそらく "名前:"を使用できます。

java8では、ストリームを使用して同じ方法で実装できます。

String[] array = {"Name", "Age", "Contact", "Location"}; 
List<String> list = Arrays.asList(array); 
sc.textFile("...") 
    .map(x -> Arrays.asList(x.split("\n"))) 
    .map(x -> list.stream() 
        .map(col -> x.stream() 
           .filter(line -> line.startsWith(col)) 
           .findAny() 
           .orElse(col+" :")) 
        .collect(Collectors.toList())); 
+0

あなたが任意のJavaコードを共有してください –

+0

を持っている場合、私は、Scalaの上の知識を持っている 'tを私は次のJavaバージョンを追加しました:質問はあなたが行くが、Java用の頼まれたので、これは少しより冗長以上であります同じ論理。あなたはtextinputformat.record.delimiterを変更する考えをしましたか?それが本当に重要です。 – Oli

+0

はデリミタなしで可能ですか? –

関連する問題