Формат файла CSV с созданием столбца в Spark Scala - PullRequest
1 голос
/ 29 мая 2019

У меня есть CSV-файл, как показано ниже

В нем 6 строк с верхней строкой в ​​качестве заголовка, в то время как заголовок, читаемый как метка «Студент отмечает», обрабатывает их как один столбец, теперь я хочу разделить оба столбцас данными.«ученик» и «отметки» разделены пробелом.

df.show()    
_______________
##Student Marks##    
---------------    
A   10;20;10;20    
A   20;20;30;10    
B   10;10;10;10    
B   20;20;20;10    
B   30;30;30;20

Теперь я хочу преобразовать эту таблицу CSV в два столбца, со студентом и отметками, также для каждого ученика отметки с суммированием, что-то вродениже

Student | Marks
A       | 30;40;40;30
B       | 60;60;60;40

Я пробовал ниже, но выдает ошибку

df.withColumn("_tmp", split($"Students Marks","\\ ")).select($"_tmp".getItem(0).as("col1"),$"_tmp".getItem(1).as("col2")).drop("_tmp")

Ответы [ 2 ]

2 голосов
/ 29 мая 2019

Вы можете прочитать CSV-файл с желаемым разделителем и рассчитать результат, как показано ниже

    val df = spark.read
      .option("header", true)
      .option("delimiter", " ")
      .csv("path to csv")

После того, как вы получите фрейм данных df

val resultDF = df.withColumn("split", split($"Marks", ";"))
  .withColumn("a", $"split"(0))
  .withColumn("b", $"split"(1))
  .withColumn("c", $"split"(2))
  .withColumn("d", $"split"(3))
  .groupBy("Student")
  .agg(concat_ws(";", array(
     Seq(sum($"a"), sum($"b"), sum($"c"), sum($"d")): _*)
  ).as("Marks"))


resultDF.show(false)

Выход:

+-------+-------------------+
|Student|Marks              |
+-------+-------------------+
|B      |60.0;60.0;60.0;40.0|
|A      |30.0;40.0;40.0;30.0|
+-------+-------------------+
1 голос
/ 29 мая 2019

Три идеи. Первый - прочитать файл, разделить его по пробелам, а затем создать фрейм данных:

val df = sqlContext.read
  .format("csv")
  .option("header", "true")
  .option("delimiter", " ")
  .load("your_file.csv")

Второй - прочитать файл в информационный кадр и разделить его:

df.withColumn("Student", split($"Students Marks"," ").getItem(0))
  .withColumn("Marks", split($"Students Marks"," ").getItem(1))
  .drop("Students Marks")

Последний вариант - ваше решение. Он должен работать, но когда вы используете select, вы не используете $ "_ tmp", поэтому он должен работать без .drop ("_ tmp")

df.withColumn("_tmp", split($"Students Marks"," "))
  .select($"_tmp".getItem(0).as("Student"),$"_tmp".getItem(1).as("Marks"))
...