如何基于索引Spark Scala

问题描述

我当前的数据框是这个。

+-------------------------------------------------------------------------------------+
|scores                                                                               |
+-------------------------------------------------------------------------------------+
|[[1000,1234,4.6789],[2000,4.0],[3000,3.6789],[4000,2.6789]]|
+-------------------------------------------------------------------------------------+

我想将其转换为下面的列,其中列在2d scores数组中的索引分开。

+---------------------+---------------------+---------------------------+
|score 1              |score2               |score3                     |
+---------------------+---------------------+---------------------------+
|[1000,2000,3000,4000]|[1234,1234]|[4.6789,4.0,3.6789,2.6789] |
+---------------------+---------------------+---------------------------+

解决方法

我已经分解了下面的必要步骤。

首先,我重新创建了您的数据,如下所示:

name

下一步将每个数组中的每个元素拆分为一列

email

然后,我们将每一列中的行收集为一个序列

recipientDefaults

最后,我们将数据转换为您要求的格式

val scores = spark.read.json(Seq("""{"scores": [[1000,1234,4.6789],[2000,4.0],[3000,3.6789],[4000,2.6789]]}""").toDS)

scores.select(explode($"scores").alias("scores")).show(false)

+------------------------+
|scores                  |
+------------------------+
|[1000.0,1234.0,4.6789]|
|[2000.0,4.0]   |
|[3000.0,3.6789]|
|[4000.0,2.6789]|
+------------------------+