转置rdd行的一部分

时间:2017-04-03 10:33:56

标签: scala apache-spark

我有一个要求,我只需转置每个RDD行元素的某些元素。我有下面的输入文件。

sno|fname |lname |f1 |f2  |f3  |f4
1  |sunil |kumar |500|1000|2000|3000
2  |mahesh|kalani|600|700 |800 |1000

我需要如下的oputput。

1|sunil |kumar |f1|500
1|sunil |kumar |f2|1000
1|sunil |kumar |f3|2000
1|sunil |kumar |f4|3000
2|mahesh|kalani|f1|600
2|mahesh|kalani|f2|700
2|mahesh|kalani|f3|800
2|mahesh|kalani|f4|1000

如何在RDD上编写映射器函数来获取输出?

1 个答案:

答案 0 :(得分:0)

您可以使用flatMap

rdd.flatMap {
  case (sno, fname, name, f1, f2, f3, f4) => 
    List("f1", "f2", "f3", "f4").zip(List(f1, f2, f3, f4)).map {
      case (k, v) => (sno, fname, name, k, v)
    }
}

这假设您已经删除了标题行,并将每个行解析为元组。

修改

要将每一行解析为元组,您可以执行以下操作:

rawRdd.map(row => row.split("|") match {
  case Array(sno, fname, name, f1, f2, f3, f4) => (sno, fname, name, f1, f2, f3, f4)
}

请注意,您也可以将这两个步骤合并为一个,仅使用flatMap