地图&具有Seri​​alizable的产品的案例

时间:2018-02-04 21:30:13

标签: scala case

运行时:

rdd.zipWithIndex().map { case ((a,b),c) => (a,b,c)}.collect()

没关系。

如果(a,b)实际上是具有Seri​​alizable的产品怎么办?例如。 2,3和4个元素,甚至N个元素?那么如何为任意数量的值编写案例?列表?

2 个答案:

答案 0 :(得分:2)

使用List而不是RDD,但核心逻辑将保持不变。使用元组的productIterator方法来实现这一目标。

rdd.zipWithIndex.map{ 
  case (tuple, idx) => 
  Row.fromSeq(tuple.productIterator.toSeq :+ idx)
}

我们的想法不是提取元组,而是保留它并使用" productIterator"并附加它。此方法适用于RDD记录中的任何类型的数据,也将支持复杂的数据结构。

答案 1 :(得分:1)

首先,我想说出你能做什么,然后我想说出你为什么不应该这样做。

你可以这样做:

Microsoft.Bot.Connector.Teams

鉴于生成// for (arity <- 2 to 20) { // println( // "case (" + // (0 until arity).map(i => ('a' + i).toChar).mkString("(", ",", ")") + // ",idx) => (" + // (0 until arity).map(i => ('a' + i).toChar).mkString(",") + // ",idx)" // ) // } rdd.zipWithIndex.map{ case ((a,b),idx) => (a,b,idx) case ((a,b,c),idx) => (a,b,c,idx) case ((a,b,c,d),idx) => (a,b,c,d,idx) case ((a,b,c,d,e),idx) => (a,b,c,d,e,idx) case ((a,b,c,d,e,f),idx) => (a,b,c,d,e,f,idx) case ((a,b,c,d,e,f,g),idx) => (a,b,c,d,e,f,g,idx) case ((a,b,c,d,e,f,g,h),idx) => (a,b,c,d,e,f,g,h,idx) case ((a,b,c,d,e,f,g,h,i),idx) => (a,b,c,d,e,f,g,h,i,idx) case ((a,b,c,d,e,f,g,h,i,j),idx) => (a,b,c,d,e,f,g,h,i,j,idx) case ((a,b,c,d,e,f,g,h,i,j,k),idx) => (a,b,c,d,e,f,g,h,i,j,k,idx) case ((a,b,c,d,e,f,g,h,i,j,k,l),idx) => (a,b,c,d,e,f,g,h,i,j,k,l,idx) case ((a,b,c,d,e,f,g,h,i,j,k,l,m),idx) => (a,b,c,d,e,f,g,h,i,j,k,l,m,idx) case ((a,b,c,d,e,f,g,h,i,j,k,l,m,n),idx) => (a,b,c,d,e,f,g,h,i,j,k,l,m,n,idx) case ((a,b,c,d,e,f,g,h,i,j,k,l,m,n,o),idx) => (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,idx) case ((a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p),idx) => (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,idx) case ((a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q),idx) => (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,idx) case ((a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r),idx) => (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,idx) case ((a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s),idx) => (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,idx) case ((a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t),idx) => (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,idx) case _ => throw new Error("not a tuple") } Product2的源代码,乍一看它可能看起来像一个丑陋但又可接受的解决方案。

但是,请注意,如果您执行此操作一次,则在下一步中最终会出现完全相同的情况。你再次拥有一个充满不同维度元组的RDD。那你怎么办?同样可怕的比赛案例?如果你继续这样做,它将感染你的整个代码库。

因此,最好立即咬住子弹,并尽快将其转换为某种Product22。您可以使用Seq。考虑使用某种Lists或spark.sql productIterator。也许是这样的:

Row