如何获取数据框中每行的每列的值和类型?

时间:2017-04-27 18:25:32

标签: scala apache-spark dataframe apache-spark-sql

如何将数据帧转换为包含每列数据类型的元组?

我有许多不同大小和类型的数据帧。我需要能够确定给定数据帧的每个列和行的类型和值,以便我可以执行一些与类型相关的操作。

例如,假设我有一个类似于:

的数据框
+-------+-------+
|  foo  |  bar  |
+-------+-------+
| 12345 | fnord |
|    42 |   baz |
+-------+-------+

我需要

Seq(
  (("12345", "Integer"), ("fnord", "String")),
  (("42", "Integer"), ("baz", "String"))
)

或类似的简单迭代和以编程方式工作的东西。

提前致谢,对不起,我确定,这是一个非常无聊的问题。

1 个答案:

答案 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)

您可以迭代并以编程方式使用