scala – 在Spark SQL表中分解多个列
发布时间:2020-12-16 18:13:26 所属栏目:安全 来源:网络整理
导读:这里有一个关于这个问题的问题: Explode (transpose?) multiple columns in Spark SQL table 假设我们有额外的列,如下所示: **userId someString varA varB varC varD** 1 "example1" [0,2,5] [1,9] [a,b,c] [red,green,yellow] 2 "example2" [1,20,5] [9,
这里有一个关于这个问题的问题:
Explode (transpose?) multiple columns in Spark SQL table 假设我们有额外的列,如下所示: **userId someString varA varB varC varD** 1 "example1" [0,2,5] [1,9] [a,b,c] [red,green,yellow] 2 "example2" [1,20,5] [9,null,6] [d,e,f] [white,black,cyan] 得出如下输出: userId someString varA varB varC varD 1 "example1" 0 1 a red 1 "example1" 2 2 b green 1 "example1" 5 9 c yellow 2 "example2" 1 9 d white 2 "example2" 20 null e black 2 "example2" 5 6 f Cyan 答案是将udf定义为: val zip = udf((xs: Seq[Long],ys: Seq[Long]) => xs.zip(ys)) 并定义“withColumn”. df.withColumn("vars",explode(zip($"varA",$"varB"))).select( $"userId",$"someString",$"vars._1".alias("varA"),$"vars._2".alias("varB")).show 如果我们需要扩展上面的答案,使用更多列,修改上述代码的最简单方法是什么.请帮忙. 解决方法
使用zip udf的方法似乎没问题,但是如果需要更多集合,则需要扩展.不幸的是,没有非常好的方法来压缩4个Seqs,但这应该有效:
def assertSameSize(arrs:Seq[_]*) = { assert(arrs.map(_.size).distinct.size==1,"sizes differ") } val zip4 = udf((xa:Seq[Long],xb:Seq[Long],xc:Seq[String],xd:Seq[String]) => { assertSameSize(xa,xb,xc,xd) xa.indices.map(i=> (xa(i),xb(i),xc(i),xd(i))) } ) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |