如何将数据帧转换为包含每列数据类型的元组?
我有许多不同大小和类型的数据帧。我需要能够确定给定数据帧的每个列和行的类型和值,以便我可以执行一些与类型相关的操作。
例如,假设我有一个类似于:
的数据框+-------+-------+
| foo | bar |
+-------+-------+
| 12345 | fnord |
| 42 | baz |
+-------+-------+
我需要
Seq(
(("12345", "Integer"), ("fnord", "String")),
(("42", "Integer"), ("baz", "String"))
)
或类似的简单迭代和以编程方式工作的东西。
提前致谢,对不起,我确定,这是一个非常无聊的问题。
答案 0 :(得分:3)
如果我理解你的问题是正确的,那么以下是你的解决方案。
val df = Seq(
(12345, "fnord"),
(42, "baz"))
.toDF("foo", "bar")
这会创建您已拥有的数据框。
+-----+-----+
| foo| bar|
+-----+-----+
|12345|fnord|
| 42| baz|
+-----+-----+
下一步是从dataType
的{{1}}中提取schema
并创建dataFrame
。
iterator
下一步是将val fieldTypesList = df.schema.map(struct => struct.dataType)
dataframe
转换为rows
列表,将每个rdd
map
转换为value
dataType
上面创建的
list
现在,如果我们打印它
val dfList = df.rdd.map(row => row.toString().replace("[","").replace("]","").split(",").toList)
val tuples = dfList.map(list => list.map(value => (value, fieldTypesList(list.indexOf(value)))))
它会给出
tuples.foreach(println)
您可以迭代并以编程方式使用