我想创建一个稍后可以由三个不同的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个字符串值?或者我可以扩展我的功能吗?
答案 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(")",""))
}