чтение текстового файла с помощью искры Scala с разделителем строк - PullRequest
0 голосов
/ 29 октября 2018

У меня есть один текстовый файл в следующем формате.

id##name##subjects$$$
1##a##science
english$$$
2##b##social
mathematics$$$

Я хочу создать DataFrame как

id | name | subject
1  | a    | science
   |      | english

Когда я делаю это Scala, я получаю только RDD[String]. Как я могу конвертировать RDD[String] в DataFrame

val rdd = sc.textFile(fileLocation)
val a = rdd.reduce((a, b) => a + " " + b).split("\\$\\$\\$").map(f => f.replaceAll("##","")

1 Ответ

0 голосов
/ 29 октября 2018

С учетом предоставленного вами текстового файла и при условии, что вы хотите, чтобы весь ваш файл примера был преобразован в следующее (поместите текст примера в файл example.txt)

+---+----+-----------+
| id|name|   subjects|
+---+----+-----------+
|  1|   a|    science|
|   |    |    english|
|  2|   b|     social|
|   |    |mathematics|
+---+----+-----------+

Вы можете запустить код ниже (спарк 2.3.2)

val fileLocation="example.txt"
val rdd = sc.textFile(fileLocation)

def format(x : (String, String, String)) : String = {
  val a = if ("".equals(x._1)) "| " else x._1 + " | "
  val b = if ("".equals(x._2)) "| " else x._2 + " | "
  val c = if ("".equals(x._3)) "" else x._3
  return a + b + c
}

var rdd2 = rdd.filter(x => x.length != 0).map(s => s.split("##")).map(a =>  {
  a match {
  case Array(x) =>
    ("", "", x.split("\\$\\$\\$")(0))
  case Array(x, y, z) =>
   (x, y, z.split("\\$\\$\\$")(0))
  }
})

rdd2.foreach(x => println(format(x)))

val header = rdd2.first()

val df = rdd2.filter(row => row != header).toDF(header._1, header._2, header._3)
df.show

val ds = rdd2.filter(row => row != header).toDS.withColumnRenamed("_1", header._1).withColumnRenamed("_2", header._2).withColumnRenamed("_3", header._3)
ds.show
...