创建spark函数,接受键,值作为参数并返回RDD [string]?

时间:2015-10-20 15:21:37

标签: scala apache-spark

我想创建一个稍后可以由三个不同的RDD数据集使用的函数。 函数接受键和值并转换为seq [String]

def ConvertToMap2(value: RDD[(String, (String,String,String,String,String,String))]): Seq[String]  = {
  value.collect().toMap.values.toSeq.map(x => x.toString.replace("(","").replace(")",""))
}

当我尝试通过一个数据集应用它时,因为它有一个带有6个值示例的键: -

val StatusRDD=ConvertToMap(FilterDataSet("1013").map(x => ((x(5)+x(4)),(x(5),x(4),x(1),x(6),x(7),x(8)))))

但我尝试应用另一个数据集,我需要编写该函数,因为其他数据集包含7个值,其中一个键使得重写函数具有相同的逻辑但名称不同。

def ConvertToMap2(value: RDD[(String,(String,String,String,String,String,String,String))]): Seq[String]  = {
  value.collect().toMap.values.toSeq.map(x => x.toString.replace("(","").replace(")",""))
}

val LuldRDD2=ConvertToMap2(FilterDataSet("1041").map(x => ((x(5)+x(4)),(x(5),x(4),x(1),x(6),x(7),x(8),x(9)))))

有没有办法为两者写一个函数,只用一个键接受6或7个字符串值?或者我可以扩展我的功能吗?

2 个答案:

答案 0 :(得分:2)

TupleX类继承自Product,所以我会定义这样的函数:

def convertToSeq(rdd: RDD[(String, Product)]): Seq[String] = {
  rdd.values.map(x => x.productIterator.mkString).collect().toSeq
}

请注意,TupleX类有productIterator我在这里用来创建字符串(我发现你的方式有点冗长,更难以阅读)而且我也在推迟{{ 1}}在转换值之后调用,因此map操作并行运行。

最后,我更改了该功能的名称,因为它转换为collect而不是Seq

答案 1 :(得分:0)

是的,答案需要使用任何

的数据类型
def ConvertToMap (value: RDD[(String,Any)]): Seq[String]  = {
   value.collect().toMap.values.toSeq.map(x => x.toString.replace("(","").replace(")",""))
}