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

4

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

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

例如,假设我有一个如下所示的数据框:

+-------+-------+
|  foo  |  bar  |
+-------+-------+
| 12345 | fnord |
|    42 |   baz |
+-------+-------+

我需要获取

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

或者类似的简单迭代和编程处理方式。感谢您的提前帮助,对于这个很新手的问题,我很抱歉。

我突然想到一个更简单的表达这个问题的方式,可能是“如何将数据框转换为包括每列数据类型的2D数组?” - yoel
3
你看过schema方法吗?另外,你可能不想或不需要为每行的每列构建一个新元组。 - Joe Pallas
1个回答

3
如果我理解你的问题正确,那么以下将是你的解决方案。
  val df = Seq(
    (12345, "fnord"),
    (42, "baz"))
    .toDF("foo", "bar")

这将创建一个数据框,你已经拥有它。
+-----+-----+
|  foo|  bar|
+-----+-----+
|12345|fnord|
|   42|  baz|
+-----+-----+

下一步是从dataFrameschema中提取dataType并创建一个iterator
val fieldTypesList = df.schema.map(struct => struct.dataType)

下一步是将数据框中的行转换为RDD列表,并将每个值从上面创建的列表中映射到dataType。
  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)

它会提供什么?
List((12345,IntegerType), (fnord,StringType))
List((42,IntegerType), (baz,StringType))

您可以迭代并以编程方式处理的内容


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接