Я собираюсь сделать некоторые предположения в этом ответе, которые могут быть неверными, но я полагаю, что они верны на основе предоставленных вами данных и предоставленных ошибок.
- Предположение 1: Ваши данныеразделенный пробелами, несколькими пробелами.Я пришел к этому предположению на основе вашего NumberFormatException пустых строк, которые вы предоставили.Если бы ваш файл был разделен вкладками, мы бы не столкнулись с этим.
- Предположение 2 (Это для моего собственного ума, но может быть и не так): Каждый элемент данных разделяется пробеломтакое же количество пробелов.В оставшейся части этого ответа я буду считать, что количество пробелов равно четырем.Если это предположение не так, это становится гораздо более сложной проблемой.
- Предположение 3: только последние 2 из 7 элементов данных являются необязательными и иногда не отображаются.
Исключение NumberFormatException вызвано разделением на один пробел.Предположим, что следующая строка разделена пробелами:
NEW50752085 84.0485 -76.3851 85.1 THE NAME OF AN OBJECT
Когда вы разбиваете на один пробел, эта строка преобразуется в следующий массив:
Array(NEW50752085, "", "", "", 84.0485, "", "", "", -76.3851, "", "", "", 85.1, "", "", "", THE, NAME, OF, AN, OBJECT)
Второй элемент этого массива,которая является пустой строкой, это то, что вы пытаетесь преобразовать в Double.Это то, что дает вам NumberFormatException для пустой строки.
.map(_.split(" "))
Когда вы изменяете это, чтобы разделить на 4 пробела (основываясь на моем предположении, которое может или не может быть правдой), вы получаете следующее:
Array(NEW50752085, 84.0485, -76.3851, 85.1, THE NAME OF AN OBJECT)
Но теперь мы столкнулись с другой проблемой - в ней всего пять элементов!Мы хотим семь.
Мы можем изменить это, изменив ваш более поздний код:
val df = dataArray.map(record => {
(record(0), record(1).toDouble, record(2).toDouble, record(3).toDouble, record(4),
if(record.size > 5) record(5) else "",
if(record.size > 6) record(6) else "")
}).map{case (c1, c2, c3, c4, c5, c6, c7) => caseClass(c1, c2, c3, c4, c5, c6, c7)}.toDF
df.show
+-----------+-------+--------+----+--------------------+---+-----+
| c1| c2| c3| c4| c5| c6| c7|
+-----------+-------+--------+----+--------------------+---+-----+
|NEW50752085|84.0485|-76.3851|85.1|THE NAME OF AN OB...| | |
|DEM00752631|51.9581|-85.3315|98.5|THE NAME OF AN OB...| | |
|KI004867205|40.8518| 15.9351|76.5|THE NAME OF AN OB...|FHG|41196|
+-----------+-------+--------+----+--------------------+---+-----+
Опять же, этот подход будет работать, только если все элементы ограничены одинаковым количеством пробелов.