Поскольку у вас есть простая строка и вы пытаетесь получить из нее значения с плавающей точкой, вы фактически не фильтруете по типу. Но, если они могут быть проанализированы, чтобы плавать вместо этого.
Вы можете сделать это, используя flatMap
вместе с Option
.
import org.apache.spark.sql.SparkSession
import scala.util.Try
val spark = SparkSession.builder.master("local[*]").appName("Float caster").getOrCreate()
val sc = spark.sparkContext
val data = List("x,10", "y,3.3", "z,a")
val rdd = sc.parallelize(data) // rdd: RDD[String]
val filtered = rdd.flatMap(line => Try(line.split(",")(1).toFloat).toOption) // filtered: RDD[Float]
filtered.collect() // res0: Array[Float] = Array(10.0, 3.3)
Для партии > 40
вы можете либо выполнить другой фильтр после, либо отфильтровать внутренний Option
.
(Оба должны выполнять более или менее равные из-за лени искры, поэтому выберите тот, который более понятен для вас) .
// Option 1 - Another filter.
val filtered2 = filtered.filter(x => x > 40)
// Option 2 - Filter the inner option in one step.
val filtered = rdd.flatMap(line => Try(line.split(",")(1).toFloat).toOption.filter(x => x > 40))
Дайте мне знать, если у вас есть какие-либо вопросы.