Spark: Split не является членом org.apache.spark.sql.Row

Ниже мой код из Spark 1.6. Я пытаюсь преобразовать его в Spark 2.3, но получаю сообщение об ошибке при использовании разделения.

Код искры 1.6:

val file = spark.textFile(args(0))
val mapping = file.map(_.split('/t')).map(a => a(1))
mapping.saveAsTextFile(args(1))

Код искры 2.3:

val file = spark.read.text(args(0))
val mapping = file.map(_.split('/t')).map(a => a(1)) //Getting Error Here
mapping.write.text(args(1))

Сообщение об ошибке:

value split is not a member of org.apache.spark.sql.Row

person Vin    schedule 04.08.2019    source источник


Ответы (1)


В отличие от spark.textFile, который возвращает RDD, spark.read.text возвращает DataFrame, который по сути является RDD[Row]. Вы можете выполнить map с частичной функцией, как показано в следующем примере:

// /path/to/textfile:
// a    b   c
// d    e   f

import org.apache.spark.sql.Row

val df = spark.read.text("/path/to/textfile")

df.map{ case Row(s: String) => s.split("\\t") }.map(_(1)).show
// +-----+
// |value|
// +-----+
// |    b|
// |    e|
// +-----+
person Leo C    schedule 04.08.2019
comment
Вы также можете df.as[String].map(line => line.split(...)).show(). - person Luis Miguel Mejía Suárez; 04.08.2019
comment
df.as[String] работает, только если строки маленькие. Хотя есть предел, который можно увеличить, это не очень хорошо работает с длинными строками.... - person Juan Zamora; 27.05.2020