2016-10-06 11 views
1

テキストファイルがあります。レコードはすべて "\ n \ n \ n \ n \ n"で区切られた複数行のレコードです。テキストファイルには、以下のようになります。Sparkでテキストファイルから複数行レコードを抽出する方法

​​

出力は次のとおりです:

scala> contact.show 
+------+------+-----+-------+--------------------+ 
| name|gender|title|company|   phone_info| 
+------+------+-----+-------+--------------------+ 
|Steven| male| mr.| ABC|[[cell,647-777-**...| 
| Al| male| mr.| DEF|[[home,905-111-**...| 
+------+------+-----+-------+--------------------+ 

とスキーマは次のとおりです。

scala> contact.printSchema 
root 
|-- name: string (nullable = true) 
|-- gender: string (nullable = true) 
|-- title: string (nullable = true) 
|-- company: string (nullable = true) 
|-- phone_info: array (nullable = true) 
| |-- element: struct (containsNull = true) 
| | |-- _1: string (nullable = true) 
| | |-- _2: string (nullable = true) 

name: Steven 
gender: male 
title: mr. 
company: ABC 

cell 647-777-**** 
home 905-000-**** 
work 289-***-1111 





name: Al 
gender: male 
title: mr. 
company: DEF 

home 905-111-**** 
cell 289-991-**** 

私がやったことは以下のコードであります

予想される出力は次のとおりです。

+------+------+-----+-------+-------------+------------+ 
| name|gender|title|company| phone_type|number  | 
+------+------+-----+-------+-------------+------------+ 
|Steven| male| mr.| ABC|   cell|647-777-****| 
|Steven| male| mr.| ABC|   home|905-000-****| 
|Steven| male| mr.| ABC|   work|289-***-1111| 
| Al| male| mr.| DEF|   home|905-111-****| 
| Al| male| mr.| DEF|   cell|289-991-****| 
+------+------+-----+-------+-------------+------------+ 

私が必要とする出力を得るためにコードを変更する方法を教えてもらえますか?ありがとう。

次はうまくいく

答えて

0

val contact = contact_raw.map(contacts => { 
     val per_person = contacts.split("\n\n") 
     (per_person(0), per_person(1)) 
    }).flatMap(
     contact_info => { 
     val personal_info = contact_info._1.split("\n") 
     var name = "" 
     var company = "" 
     var gender = "" 
     var title = "" 
     for (x <- personal_info) { 
      if (x.startsWith("name:")) { 
      name = x.split("name:")(1).trim 
      } else if (x.startsWith("gender:")) { 
      gender = x.split("gender:")(1).trim 
      } else if (x.startsWith("title:")) { 
      title = x.split("title:")(1) 
      } else if (x.startsWith("company:")) { 
      company = x.split("company:")(1) 
      } 
     } 
     contact_info._2.split("\n").map(
      pair => { 
      val phone_pair = pair.split("\\s") 
      (name, gender, title, company, phone_pair(0), phone_pair(1)) 
      } 
     ) 
     } 
    ).toDF("name", "gender", "title", "company", "phone_info") 
+0

ありがとうございました。私はあなたのコードを試して、それは動作します。 –

関連する問題