Свести массив в строке в Scala - PullRequest
0 голосов
/ 30 января 2019

У меня есть Spark-код в Scala, например:

scala> myfile.filter(!_.contains("BatchNumber")).map(line=>line.split("\t")).map(line=>Row(line(0),(for (i <- 30 to 33) yield line(i)),line(1))).take(2)

результат приведенного выше кода ниже, а это не то, что я хочу

res85: Array[org.apache.spark.sql.Row] = Array([C002,Vector(323.000, 0.000, 0.000, 323.000),2RFG], [C002,Vector(33.000, 0.000, 0.000, 33.000),2RFG])

То, что я хочу:

Array([C002,323.000, 0.000, 0.000, 323.000.2RFG], [C002,33.000, 0.000, 0.000, 33.000,2RFG])

Я знаю, что ниже код работает, но это не то, что я хочу

myfile.filter(!_.contains("BatchNumber")).map(line=>line.split("\t")).map(line=>Row(line(0), line(30),line(31),line(32),line(33),line(1))).take(2)

, потому что в реальном мире у меня около 50 столбцов, я не хочу перечислятьвсе они в коде

myfile.filter(!_.contains("BatchNumber")).map(line=>line.split("\t")).map(line=>Row(line(0),(for (i <- 30 to 50) yield line(i)),line(1))).take(2)

Я пытаюсь использовать flatMap в коде ниже:

scala> myfile.filter(!_.contains("BatchNumber")).map(line=>line.split("\t")).flatMap(line=>Row(line(0),(for (i <- 30 to 33) yield line(i)),line(1))).take(2)

, но получил ошибку

1 Ответ

0 голосов
/ 30 января 2019

Уже есть обходной путь:

myfile.map(line=>line.split("\t")).map(line=>Row((for (i<-0 to 33 if (i==0) ||  ((i>=30) && (i<=33)) || (i==1)) yield{if (i==30) line(i).toDouble else line(i)}):_*))

Оказывается, мне нужно сначала получить все результаты, как этот формат: Vector (C002,323.000,0.000,0.000,323.000,2RFG), затем сделать что-то вродеthis: строка (вектор (C002,323.000,0.000,0.000323.000,2RFG): _ *)

...