создать фрейм данных в искре из неразобранной текстовой строки - PullRequest
0 голосов
/ 16 мая 2018

Я использую Scala и Spark для анализа некоторых данных.Извините, я новичок в этой области.

У меня есть данные в следующем формате (ниже). Я хочу создать RDD для фильтрации данных, группировки и преобразования данных.

В настоящее время у меня есть rdd ссписок неразобранных строк, которые я создал из rawData: список строк

val rawData  ( this is ListBuffer[String] )
val rdd = sc.parallelize(rawData)

Как создать набор данных для манипулирования данными?Я хочу, чтобы в Rdd были объекты с именованными полями, строки ob.name, obj.year и т. Д. Каков правильный подход?

Должен ли я создать фрейм данных для этого?

Строки необработанных данных выглядят так: это список строк с разделенными пробелами значениями

Значение столбца: «имя», год »,« месяц »,« tmax »,« tmin », "afdays", "rainmm", "sunhours"

aberporth    1941  10    ---     ---    ---    106.2     ---
aberporth    1941  11    ---     ---    ---     92.3     ---
aberporth    1941  12    ---     ---    ---     86.5     ---
aberporth    1942   1    5.8     2.1    ---    114.0    58.0
aberporth    1942   2    4.2    -0.6    ---     13.8    80.3
aberporth    1942   3    9.7     3.7    ---     58.0   117.9
aberporth    1942   4   13.1     5.3    ---     42.5   200.1
aberporth    1942   5   14.0     6.9    ---    101.1   215.1
aberporth    1942   6   16.2     9.9    ---      2.3   269.3
aberporth    1942   7   17.4    11.3    12     70.2*   185.0
aberporth    1942   8   18.7    12.3    5-     78.5   141.9
aberporth    1942   9   16.4    10.7    123    146.8   129.1#
aberporth    1942  10   13.1     8.2    125    131.1    82.1l

--- - означает отсутствие данных, думаю, я могу поставить 0 в этот столбец.

70.2 *, 129.1 #, 82.l - *, # и l здесь должны быть отфильтрованы

Пожалуйста, укажите мне правильное направление.

Я нашел одно из возможных решений здесь: https://medium.com/@mrpowers/manually-creating-spark-dataframes-b14dae906393

Этот пример выглядит хорошо:

val someData = Seq(
  Row(8, "bat"),
  Row(64, "mouse"),
  Row(-27, "horse")
)

val someSchema = List(
  StructField("number", IntegerType, true),
  StructField("word", StringType, true)
)

val someDF = spark.createDataFrame(
  spark.sparkContext.parallelize(someData),
  StructType(someSchema)
)

Как преобразовать список строк в Seq of Row?

1 Ответ

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

Вы можете прочитать данные в виде текстового файла и заменить --- на 0 и удалить специальные символы или отфильтровать. (Я заменил в приведенном ниже примере)

Создание класса дел для представления данных

case class Data(
                 name: String, year: String, month: Int, tmax: Double,
                 tmin: Double, afdays: Int, rainmm: Double, sunhours: Double
             )

Прочитать файл

val data = spark.read.textFile("file path")  //read as a text file
  .map(_.replace("---", "0").replaceAll("-|#|\\*", ""))  //replace special charactes 
  .map(_.split("\\s+"))
  .map(x =>  // create Data object for each record
    Data(x(0), x(1), x(2).toInt, x(3).toDouble, x(4).toDouble, x(5).toInt, x(6).toDouble, x(7).replace("l", "").toDouble)
  )

Теперь вы получаете Dataset[Data], который является набором данных, проанализированным из текста.

Выход:

+---------+----+-----+----+----+------+------+--------+
|name     |year|month|tmax|tmin|afdays|rainmm|sunhours|
+---------+----+-----+----+----+------+------+--------+
|aberporth|1941|10   |0.0 |0.0 |0     |106.2 |0.0     |
|aberporth|1941|11   |0.0 |0.0 |0     |92.3  |0.0     |
|aberporth|1941|12   |0.0 |0.0 |0     |86.5  |0.0     |
|aberporth|1942|1    |5.8 |2.1 |0     |114.0 |58.0    |
|aberporth|1942|2    |4.2 |0.6 |0     |13.8  |80.3    |
|aberporth|1942|3    |9.7 |3.7 |0     |58.0  |117.9   |
|aberporth|1942|4    |13.1|5.3 |0     |42.5  |200.1   |
|aberporth|1942|5    |14.0|6.9 |0     |101.1 |215.1   |
|aberporth|1942|6    |16.2|9.9 |0     |2.3   |269.3   |
|aberporth|1942|7    |17.4|11.3|12    |70.2  |185.0   |
|aberporth|1942|8    |18.7|12.3|5     |78.5  |141.9   |
|aberporth|1942|9    |16.4|10.7|123   |146.8 |129.1   |
|aberporth|1942|10   |13.1|8.2 |125   |131.1 |82.1    |
+---------+----+-----+----+----+------+------+--------+

Надеюсь, это поможет!

...