2017-04-02 200 views
0

我有一個csv文件的工作就像下面轉換數據集[數組[字符串]]到數據集[MyCaseClass]

"age;""job"";""marital""" 
"58;""management"";""married""" 
"44;""technician"";""single""" 

因爲額外的報價,spark.read.csv不給清潔列。 所以我想到了使用給出數據集[String]的spark.read.textFile。我使用下面的代碼來刪除引號並將其拆分。

case class MyCaseClass(age: String, job: String, marital: String) 
val inputDS = spark.read.textFile(inpPath) 
val cleanDS = inputDS.map(_.replaceAll(""""""", "").split(";")) 
val seperatedDS = cleanDS.as[MyCaseClass] //fails 

有沒有辦法實現這種數據集轉換或更好的方式分成多個列? 現在我正在使用RDD來完成工作,但想知道數據集/數據框的做法。

回答

1

您可以從每個分割線構建的MyCaseClass記錄,讓你有RDD[MyCaseClass],那麼你可以直接將其轉換爲數據幀:

val cleanDS = inputDS.map(line => { 
    val fields = line.replaceAll("\"", "").split(";") 
    MyCaseClass(fields(0), fields(1), fields(2)) 
}) 

cleanDS 
// res37: org.apache.spark.sql.Dataset[MyCaseClass] = [age: string, job: string ... 1 more field] 

cleanDS.toDF.show 
+---+----------+-------+ 
|age|  job|marital| 

+---+----------+-------+ 
|age|  job|marital| 
| 58|management|married| 
| 44|technician| single| 
+---+----------+-------+ 
+1

當然是可以做的!謝謝!! – Shasankar