scala - 如何将列表列表转换为 Scala 中的 DataFrame?
问题描述
我正在学习 Spark 和 Scala,并在 spark REPL 中进行试验。
当我尝试将 List 转换为 DataFrame 时,它的工作原理如下:
val convertedDf = Seq(1,2,3,4).toDF("Field1")
但是,当我尝试将列表列表转换为具有两列(field1、field2)的 DataFrame 时,它失败了
java.lang.IllegalArgumentException:要求失败:列数不匹配
错误信息:
val twoColumnDf =Seq(Seq(1,2,3,4,5), Seq(5,4,3,2,3)).toDF("Field1", (Field2))
如何将这样的列表列表转换为 Scala 中的 DataFrame?
解决方案
如果您正在寻找将每个序列的每个元素放在相应列的每一行中的方法,那么以下是适合您的选项
压缩
zip
两个序列,然后应用toDF
为
val twoColumnDf =Seq(1,2,3,4,5).zip(Seq(5,4,3,2,3)).toDF("Field1", "Field2")
twoColumnDf
这应该给你
+------+------+
|Field1|Field2|
+------+------+
|1 |5 |
|2 |4 |
|3 |3 |
|4 |2 |
|5 |3 |
+------+------+
拉链
另一种更好的方法是使用 zipped as
val threeColumnDf = (Seq(1,2,3,4,5), Seq(5,4,3,2,3), Seq(10,10,10,12,14)).zipped.toList.toDF("Field1", "Field2", "field3")
这应该给你
+------+------+------+
|Field1|Field2|field3|
+------+------+------+
|1 |5 |10 |
|2 |4 |10 |
|3 |3 |10 |
|4 |2 |12 |
|5 |3 |14 |
+------+------+------+
但zipped
仅适用于最多三个序列感谢您指出@Shaido
注意:行数由存在的最短序列决定
转置
Tanspose
将所有序列按原样组合zip
,zipped
但返回列表而不是元组,因此需要进行一些修改
Seq(Seq(1,2,3,4,5), Seq(5,4,3,2,3)).transpose.map{case List(a,b) => (a, b)}.toDF("Field1", "Field2")
+------+------+
|Field1|Field2|
+------+------+
|1 |5 |
|2 |4 |
|3 |3 |
|4 |2 |
|5 |3 |
+------+------+
和
Seq(Seq(1,2,3,4,5), Seq(5,4,3,2,3), Seq(10,10,10,12,14)).transpose.map{case List(a,b,c) => (a, b, c)}.toDF("Field1", "Field2", "Field3")
+------+------+------+
|Field1|Field2|Field3|
+------+------+------+
|1 |5 |10 |
|2 |4 |10 |
|3 |3 |10 |
|4 |2 |12 |
|5 |3 |14 |
+------+------+------+
等等 ...
注意:转置要求所有序列的长度相同
我希望答案有帮助
推荐阅读
- android - Android Kotlin:RecyclerView 中显示错误的图像。我该如何解决?
- c# - Content.ReadAsAsync 不将值反序列化为元组
- python - 打印方法名称时调用 Python 对象时超出最大递归深度
- highcharts - 货币形式 REGEXP,更改符号
- unity3d - 使用 HDRP 的 Unity 场景太暗
- angular - 在 Angular 中将 styles.sass 更改为 styles.scss
- java - ttf android studio中的图标
- c# - C# 控制台应用程序在所有监视器上启动自身的实例
- c# - 无法激活 Java 类型“MvxAppCompatRadioGroup”的 JNI 句柄
- python - 使用 STD 对图像进行平滑处理