Как определить пустые поля в CSV-файле?
Я использую Spark 2.1.1 и Scala 2.11.8.
Я должен прочитать данные из файла CSV со столбцами в диапазоне от 6 до 8 столбцов. Я должен разделить 9 записей и после разделения столбцы с 0 по 5 всегда будут иметь данные. Однако данные могут присутствовать или отсутствовать в столбцах с 6 по 8. Я выделил и сохранил необходимые столбцы в RDD, используя:
val read_file = sc.textFile("Path to input file");
val uid = read_file.map(line => {var arr = line.split(","); (arr(2).split(":")(0),arr(3),arr(4).split(":")(0),arr(5).split(":")(0),arr(6).split(":")(0),arr(7).split(":")(0),arr(8).split(":")(0))})
Теперь в полученном 'uid' СДР столбцы с 0 по 3 всегда будут заполнены, но от 4 до 7 могут иметь или не иметь данные. Например: CSV-файл, из которого я читаю данные,
2017-05-09 21:52:42 , 1494391962 , p69465323_serv80i:10:450 , 7 , fb_406423006398063:396560, guest_861067032060185_android:671051, fb_100000829486587:186589, fb_100007900293502:407374, fb_172395756592775:649795
2017-05-09 21:52:42 , 1494391962 , z67265107_serv77i:4:45 , 2:Re , fb_106996523208498:110066, fb_274049626104849:86632, fb_111857069377742:69348, fb_127277511127344:46246
2017-05-09 21:52:42 , 1494391962 , v73392772_serv33i:9:1400 , 1:4x , c2eb11fd-99dc-4dee-a75c-bc9bfd2e0ae4iphone:314129, fb_217409795286934:294262
Как видно, первая запись имеет все 9 заполненных столбцов, вторая запись имеет 8 заполненных, а третья запись имеет только 6 заполненных столбцов.
Из полученного СДР мне нужно сопоставить столбец arr(1)(0) со столбцами arr(3)(0) и arr(7)(0). Отображение столбца 1 следует выполнять только с заполненными столбцами от 3 до 7. Пустые столбцы от 3 до 7 не обязательно должны быть сопоставлены со столбцом 1. Я пытался сделать это с помощью цикла for:
После того, как я выполнил инструкцию val uid = read_file.map():
(String, String, String, String, String, String, String) = (" p69465323_serv80i"," 7 "," fb_406423006398063"," guest_861067032060185_android"," fb_100000829486587"," fb_100007900293502"," fb_172395756592775")
Я делаю:
for (var x <= 5 to 7) { if var arr => (arr(x) != null) {
val pairedRdd = uid.map(x => ((x._1, x._3), (x._1, x._4), (x._1, x._5), (x._1, x._6), (x._1, x._7)) ) }
Это будет работать для первого утверждения в примере данных, но не для второго и третьего.
Я признаю, что логика неверна, но она лишь передает идею того, что я пытаюсь сделать.
PS: использование Spark SQL не допускается.
1 ответ
Вы можете сделать следующее
val read_file = sc.textFile("Path to input file")
val uid = read_file.map(line => line.split(",")).map(array => array.map(arr => {
if(arr.contains(":")) (array(2).split(":")(0), arr.split(":")(0))
else (array(2).split(":")(0), arr)
}))
Сейчас занимаюсь
uid.map(array => array.drop(2)).map(array => array.toSeq)
даст вам rdd
как
WrappedArray(( p69465323_serv80i, p69465323_serv80i), ( p69465323_serv80i, 7 ), ( p69465323_serv80i, fb_406423006398063), ( p69465323_serv80i, guest_861067032060185_android), ( p69465323_serv80i, fb_100000829486587), ( p69465323_serv80i, fb_100007900293502), ( p69465323_serv80i, fb_172395756592775))
WrappedArray(( z67265107_serv77i, z67265107_serv77i), ( z67265107_serv77i, 2), ( z67265107_serv77i, fb_106996523208498), ( z67265107_serv77i, fb_274049626104849), ( z67265107_serv77i, fb_111857069377742), ( z67265107_serv77i, fb_127277511127344))
WrappedArray(( v73392772_serv33i, v73392772_serv33i), ( v73392772_serv33i, 1), ( v73392772_serv33i, c2eb11fd-99dc-4dee-a75c-bc9bfd2e0ae4iphone), ( v73392772_serv33i, fb_217409795286934))
Принимая во внимание, что делать
uid.map(array => array.drop(2)).flatMap(array => array)
даст вам rdd
как
( p69465323_serv80i, p69465323_serv80i)
( p69465323_serv80i, 7 )
( p69465323_serv80i, fb_406423006398063)
( p69465323_serv80i, guest_861067032060185_android)
( p69465323_serv80i, fb_100000829486587)
( p69465323_serv80i, fb_100007900293502)
( p69465323_serv80i, fb_172395756592775)
( z67265107_serv77i, z67265107_serv77i)
( z67265107_serv77i, 2)
( z67265107_serv77i, fb_106996523208498)
( z67265107_serv77i, fb_274049626104849)
( z67265107_serv77i, fb_111857069377742)
( z67265107_serv77i, fb_127277511127344)
( v73392772_serv33i, v73392772_serv33i)
( v73392772_serv33i, 1)
( v73392772_serv33i, c2eb11fd-99dc-4dee-a75c-bc9bfd2e0ae4iphone)
( v73392772_serv33i, fb_217409795286934)
Выбор за вами