Как проанализировать строку CSV в кадре данных Spark, используя Scala? - PullRequest
0 голосов
/ 02 мая 2018

Я хотел бы преобразовать RDD, содержащий записи строк, как показано ниже, в фрейм данных Spark.

"Mike,2222-003330,NY,34"
"Kate,3333-544444,LA,32"
"Abby,4444-234324,MA,56"
....

Строка схемы находится не внутри того же RDD, а в другой переменной:

val header = "name,account,state,age"

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

Я выполнил поиск и увидел сообщение: Могу ли я прочитать CSV, представленный в виде строки, в Apache Spark, используя spark-csv . Однако это не совсем то, что мне нужно, и я не могу придумать, как изменить этот кусок кода, чтобы он работал в моем случае.

Ваша помощь очень ценится.

1 Ответ

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

Более простой способ, вероятно, состоит в том, чтобы начать с CSV-файла и прочитать его непосредственно в виде кадра данных (указав схему). Вы можете увидеть пример здесь: Предоставить схему при чтении CSV-файла в качестве кадра данных .


Когда данные уже существуют в СДР, вы можете использовать toDF() для преобразования в фрейм данных. Эта функция также принимает имена столбцов в качестве входных данных. Чтобы использовать эту функциональность, сначала импортируйте импликные эффекты, используя объект SparkSession:

val spark: SparkSession = SparkSession.builder.getOrCreate()
import spark.implicits._

Поскольку СДР содержит строки, его необходимо сначала преобразовать в кортежи, представляющие столбцы в кадре данных. В этом случае это будет RDD[(String, String, String, Int)], поскольку имеется четыре столбца (последний столбец age заменен на int, чтобы проиллюстрировать, как это можно сделать).

Предполагая, что входные данные находятся в rdd:

val header = "name,account,state,age"

val df = rdd.map(row => row.split(","))
  .map{ case Array(name, account, state, age) => (name, account, state, age.toInt)}
  .toDF(header.split(","):_*)

Результирующий кадр данных:

+----+-----------+-----+---+
|name|    account|state|age|
+----+-----------+-----+---+
|Mike|2222-003330|   NY| 34|
|Kate|3333-544444|   LA| 32|
|Abby|4444-234324|   MA| 56|
+----+-----------+-----+---+
...