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