加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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)))
  }
)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读