scala逻辑中的转置

rfbsl7qr  于 2021-05-17  发布在  Spark
关注(0)|答案(1)|浏览(448)

我在spark scalaDataframe中有以下Dataframe:

-------------
a | b| c| d |
-------------
1 | 2| 3 | 4 |
5 | 6| 7 | 8 |
9 | 10| 11 | 12 |
13 | 14| 15 | 16 |

从我的代码中,它变成了每一行的Map,我尝试的代码是:

df.select(map(df.columns.flatMap(c => Seq(lit(c),col(c))):_*).as("map"))
Map(String-> String) with 4 records only
Map(a->1,b->2,c->3,d->4)
Map(a->5,b->6,c->7,d->8)
Map(a->9,b->10,c->11,d->12)
Map(a->13,b->14,c->15,d->16)

但我想改变如下:

a->1
b->2 
c->3
d->4
a->5
b->6 
c->7
d->8
a->9
b->10 
c->11
d->12
a->13
b->14
c->15
d->16

任何更改/添加代码以获得所需结果的建议,我认为应该是任何转置逻辑,我在scala中是新的。

cu6pst1q

cu6pst1q1#

使用 explode 要分解Map数据,请尝试以下代码。

df.select(map(df.columns.flatMap(c => Seq(lit(c),col(c))):_*).as("map"))
.select(explode($"map"))
.show(false)

没有 map 使用 array ```
val colExpr = array(
df
.columns
.flatMap(c => Seq(struct(lit(c).as("key"),col(c).as("value")).as("map"))):_*
).as("map")

df
.select(colExpr)
.select(explode($"map").as("map"))
.select($"map.*").show(false)

相关问题