根据Scala中另一列的值映射RDD列

时间:2019-10-30 17:28:11

标签: scala apache-spark

我是这里的初学者。我正在使用Spark 2.4.4和Scala。

我有一个三列的RDD,第一个条目是这样的:

(String, Double, String) = (100,10,neg)

RDD有数千个条目。我想在同一行中有'neg'时将double的值更改为负值,而在有其他短语时不执行任何操作。我想得到以下输出:

(String, Double) = (100,-10)

我认为map函数可以用于创建新的RDD,但是如果还有其他选择,请告诉我。

1 个答案:

答案 0 :(得分:0)

当所有必需的数据都放在同一项目上时,可以使用map进行数据转换。

val yourRDD = spark.sparkContext.parallelize(Seq(
    ("10", 2.0, "neg"),
    ("50", 6.0, "other"),
    ("40", -5.0, "neg"),
    ("100", 1.0, ""))) // Sample data
// org.apache.spark.rdd.RDD[(String, Double, String)]

val updatedRDD = yourRDD.map(item=>{
  val tag = item._3 // position of your tag 
  val outputValue = if(tag.equals("neg") && item._2>0) item._2 * -1 // only if your tag is 'neg' and the value is possitive
                else item._2 
  (item._1 ,outputValue)
})
// Output data: ((10,-2.0), (50,6.0), (40,-5.0), (100,1.0))