将数据帧列表转换为具有 Scala 中特定列的单个数据帧

黑客

我正在尝试将数据帧列表转换为下面给出的单个数据帧,
其中 dfList 是 List[sql.Dataframe]

dfList=List([ID: bigint, A: string], [ID: bigint, B: string], [ID: bigint, C: string], [ID: bigint, D: string])

dfList = List( +--------+-------------+  +--------+-------------+ +--------+--------+ +--------+--------+
               |    ID  |     A       |   ID      |     B       | |   ID   |     C  | |   ID   |   D    |
               +--------+-------------+  +--------+-------------+ +--------+--------+ +--------+--------+
               |    9574|            F|  |    9574|       005912| |    9574| 2016022| |    9574|      VD|
               |    9576|            F|  |    9576|       005912| |    9576| 2016022| |    9576|      VD|
               |    9578|            F|  |    9578|       005912| |    9578| 2016022| |    9578|      VD|
               |    9580|            F|  |    9580|       005912| |    9580| 2016022| |    9580|      VD|
               |    9582|            F|  |    9582|       005912| |    9582| 2016022| |    9582|      VD|
               +--------+-------------+, +--------+-------------+,+--------+--------+,+--------+--------+ )

异常输出

+--------+-------------+----------+--------+-------+
|   ID   |     A       |      B   |  C     |  D    |
+--------+-------------+----------+--------+-------+
|    9574|            F|    005912| 2016022|     00|
|    9576|            F|    005912| 2016022|     01|
|    9578|            F|    005912| 2016022|     20|
|    9580|            F|    005912| 2016022|     19|
|    9582|            F|    005912| 2016022|     89|
+--------+-------------+----------+--------+-------+
埃文奥曼

您将希望foldLeftjoin.

生成数据

scala> val dfList = ('a' to 'd').map(col => (1 to 5).zip(col.toInt to col.toInt + 4).toDF("ID", col.toString)).toList
dfList: List[org.apache.spark.sql.DataFrame] = List([ID: int, a: int], [ID: int, b: int], [ID: int, c: int], [ID: int, d: int])

这给了我以下数据帧:

+---+---+   +---+---+   +---+---+   +---+---+
| ID|  a|   | ID|  b|   | ID|  c|   | ID|  d|
+---+---+   +---+---+   +---+---+   +---+---+
|  1| 97|   |  1| 98|   |  1| 99|   |  1|100|
|  2| 98|   |  2| 99|   |  2|100|   |  2|101|
|  3| 99|   |  3|100|   |  3|101|   |  3|102|
|  4|100|   |  4|101|   |  4|102|   |  4|103|
|  5|101|   |  5|102|   |  5|103|   |  5|104|
+---+---+   +---+---+   +---+---+   +---+---+

加入数据帧

scala> val joinedDF = dfList.tail.foldLeft(dfList.head)((accDF, newDF) => accDF.join(newDF, Seq("ID")))
joinedDF: org.apache.spark.sql.DataFrame = [ID: int, a: int ... 3 more fields]

scala> joinedDF.show
+---+---+---+---+---+
| ID|  a|  b|  c|  d|
+---+---+---+---+---+
|  1| 97| 98| 99|100|
|  2| 98| 99|100|101|
|  3| 99|100|101|102|
|  4|100|101|102|103|
|  5|101|102|103|104|
+---+---+---+---+---+

在 Scala 中,afold是一种将集合缩减为单个元素的方法。在这种情况下,我们从列表的头部 ( dfList.head) 开始,然后将列表尾部的每个元素 ( dfList.tail) 连接在一起以获得一个最终的 DataFrame。accDF是累积的 DataFrame(从“迭代”传递到“迭代”),然后newDF是要添加的下一个或新的 DataFrame。

有关fold工作原理的更多示例,请参见此处此处

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spark Scala 数据帧将嵌套地图转换为单个数据帧行?

将scala FP增长RDD输出转换为数据帧

使用 Scala 将 JavapairRDD 转换为数据帧

如何将数据帧的所有列转换为 R 中的单个列表?

将具有不同长度的列表转换为R中的数据帧或数据表

Scala-Spark-如何将包含一个字符串列的数据帧转换为具有rigth类型列的DF?

将具有不同大小的元素的列表转换为R中的数据帧

将具有groupby的分组数据转换为数据帧

Python将多个数据帧中的列合并到单个数据帧中

如何将具有字典列的数据帧转换为多级数据帧

Pandas:将具有多行的 JSON 列转换为多个数据帧行

将数组转换为具有Scala中列和索引的数据框

R将具有多个字符串长度的列表转换为数据帧

通过具有多个列表将数据帧转换为字典?

如何将具有不同长度向量的大列表转换为数据帧?

将具有不同大小的字符向量列表组合到单个数据帧中

如何将数据帧的单行转换为 Scala 中的字符串?

如何将 seq[row] 转换为 Scala 中的数据帧

使用 spark/scala 按照 json 文件中首先列出的列的顺序将 json 转换为数据帧

将具有整数列的数据帧转换为列表列,其中列表中的每个元素都是整数向量

将具有不同长度的嵌套列表和空元素的列表转换为R中的数据帧

如何将列表的列表转换为带有索引的数据帧中的列?

如何在 Scala 中将列表列表转换为数据帧?

将单个数据帧转换为数据帧列表(将列名解析为前缀和后缀)

具有来自单个数据帧的特定列的子图

将向量转换为R中具有两列的数据帧

在r中,将数据帧的列转换为不带“ unlist”且具有动态名称的向量

将图像转换为具有R中坐标和像素值列的数据帧

将 foreach 中给出的多个数据帧合并为一个数据帧 - Scala spark