Чтение CSV-файла со значениями, содержащими разделитель в Apache spark - PullRequest
0 голосов
/ 01 апреля 2020

Каков будет эффективный способ чтения файла csv , в котором значения содержат разделитель в apache Искра ?

Ниже мой набор данных :

ID,Name,Age,Add,ress,Salary
1,Ross,32,Ah,med,abad,2000
2,Rachel,25,Delhi,1500
3,Chandler,23,Kota,2000
4,Monika,25,Mumbai,6500
5,Mike,27,Bhopal,8500
6,Phoebe,22,MP,4500
7,Joey,24,Indore,10000

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

{

//  1. read csv:
  val df1 = spark.read.option("header", "true").csv(fileFullName)
  df1.show(false)
// when you have format: 
//  ID,Name,Age,Add,ress,Salary
//  1,Ross,32,Ah,"med,abad",2000
//  2,Rachel,25,Delhi,,1500
//  3,Chandler,23,Kota,,2000
//  4,Monika,25,Mumbai,,6500
//  5,Mike,27,Bhopal,,8500
//  6,Phoebe,22,MP,,4500
//  7,Joey,24,Indore,,10000

//  3. result 


//    +---+--------+---+------+--------+------+
//    |ID |Name    |Age|Add   |ress    |Salary|
//    +---+--------+---+------+--------+------+
//    |1  |Ross    |32 |Ah    |med,abad|2000  |
//    |2  |Rachel  |25 |Delhi |null    |1500  |
//    |3  |Chandler|23 |Kota  |null    |2000  |
//    |4  |Monika  |25 |Mumbai|null    |6500  |
//    |5  |Mike    |27 |Bhopal|null    |8500  |
//    |6  |Phoebe  |22 |MP    |null    |4500  |
//    |7  |Joey    |24 |Indore|null    |10000 |
//    +---+--------+---+------+--------+------+

}

0 голосов
/ 01 апреля 2020

Данные необходимо очистить, так как нет способа систематически создавать фрейм данных, когда разделитель текста непредсказуем.

Один из способов сделать это - переместить последний столбец и заключить в кавычки необработанные адресные данные:

val rdd = sc.textFile("file.csv")

//move last column
val rdd2 = rdd.map(s => s.substring(s.lastIndexOf(",")+1) 
               + "," + s.substring(0, s.lastIndexOf(",")))

//enclose last column in " and make a DS
val stringDataset = rdd2.map(s => s.replaceAll("(.*?,.*?,.*?,.*?,|.$)", "$1\"")).toDS()

//create data frame:
val df = spark.read.option("header","true").csv(stringDataset)

df.show() выходы:

+------+---+--------+---+-----------+
|Salary| ID|    Name|Age|   Add,ress|
+------+---+--------+---+-----------+
|  2000|  1|    Ross| 32|Ah,med,abad|
|  1500|  2|  Rachel| 25|      Delhi|
|  2000|  3|Chandler| 23|       Kota|
|  6500|  4|  Monika| 25|     Mumbai|
|  8500|  5|    Mike| 27|     Bhopal|
|  4500|  6|  Phoebe| 22|         MP|
| 10000|  7|    Joey| 24|     Indore|
+------+---+--------+---+-----------+
...