Как мне разобрать данные из файла, разделенного произвольным числом пробелов? - PullRequest
0 голосов
/ 30 мая 2018

У меня есть набор данных, который выглядит следующим образом:

https://www1.ncdc.noaa.gov/pub/data/ghcn/daily/ghcnd-stations.txt

Это текстовый файл фиксированной ширины.

Как разделить значения вфайл для загрузки их во фрейм данных?

Что может быть хорошим регулярным выражением для разбиения?

var result=data.map(line=>line.split("\\t"))

Я попытался использовать разделитель "\ t", но он не разделяет значения правильно.Я не уверен, какой разделитель я должен использовать.

Я пытаюсь разбить каждую строку на массив значений, подобных этому

arr = ["ACW00011604", "17.1167", "- 61.7833", "10.1", "ST JOHNS COOLIDGEFLD "].

Я использую spark 1.6, а не блоки данных.

Формат фрейма данных:

+--------------------+---+---+---+
|  a                 | b | c | d |e 
+--------------------+---+---+---+ 
| ACW00011604 17.1...|   |   |   | 
| ACW00011647 17.1...|   |   |   | 
| AE000041196 25.3...|   |   |   | 
| AEM00041194 25.2...|   |   |   |

1 Ответ

0 голосов
/ 31 мая 2018

Вам нужно разобрать строки самостоятельно.

В Scala я сначала создал бы класс case, относящийся к желаемому выводу:

case class Measure(val1: Option[String], val2:Option[Double], val3:Option[Double], val4:Option[Double], val5:Option[String], val6:Option[String], val7:Option[Int])

Затем следует некоторый пользовательский анализ строки, основанный на предопределенномширина столбца:

spark
  .read
  .textFile("src/main/resources/fixedcol.txt")
    .map(str => {
      val positions = List(11, 20, 30, 37, 72, 75, 85)
      val positionsFromTo = (0 :: positions).sliding(2).map(p => (p(0),p(1))).toList
      val subItems = positionsFromTo.map{
        case (from, to) => Try(str.substring(from, to).trim).toOption
      }

      Measure(
        subItems(0),
        subItems(1).map(_.toDouble),
        subItems(2).map(_.toDouble),
        subItems(3).map(_.toDouble),
        subItems(4),
        subItems(5),
        subItems(6).map(_.toInt)
      )
    })(Encoders.product[Measure])
  .show(false)

В результате

+-----------+-------+--------+------+-------------------+----+-----+
|val1       |val2   |val3    |val4  |val5               |val6|val7 |
+-----------+-------+--------+------+-------------------+----+-----+
|ACW00011604|17.1167|-61.7833|10.1  |null               |null|null |
|ACW00011647|17.1333|-61.7833|19.2  |null               |null|null |
|AE000041196|25.333 |55.517  |34.0  |SHARJAH INTER. AIRP|GSN |41196|
|AEM00041194|25.255 |55.364  |10.4  |DUBAI INTL         |    |41194|
|AEM00041217|24.433 |54.651  |26.8  |ABU DHABI INTL     |    |41217|
|AEM00041218|24.262 |55.609  |264.9 |AL AIN INTL        |    |41218|
|AF000040930|35.317 |69.017  |3366.0|NORTH-SALANG       |GSN |40930|
|AFM00040938|34.21  |62.228  |977.2 |HERAT              |    |40938|
|AFM00040948|34.566 |69.212  |1791.3|KABUL INTL         |    |40948|
|AFM00040990|31.5   |65.85   |1010.0|KANDAHAR AIRPORT   |    |40990|
|AG000060390|36.7167|3.25    |24.0  |ALGER-DAR EL BEIDA |GSN |60390|
|AG000060590|30.5667|2.8667  |397.0 |EL-GOLEA           |GSN |60590|
|AG000060611|28.05  |9.6331  |561.0 |IN-AMENAS          |GSN |60611|
|AG000060680|22.8   |5.4331  |1362.0|TAMANRASSET        |GSN |60680|
|AGE00135039|35.7297|0.65    |50.0  |null               |null|null |
|AGE00147704|36.97  |7.79    |161.0 |null               |null|null |
+-----------+-------+--------+------+-------------------+----+-----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...