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

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

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

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

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

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

我需要得到

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

或类似简单的迭代并以编程方式使用的东西。

提前致谢,我敢肯定,这是一个非常菜鸟的问题。

最佳答案

如果我理解你的问题是正确的,那么下面就是你的解决方案。

  val df = Seq(
    (12345, "fnord"),
    (42, "baz"))
    .toDF("foo", "bar")

这会创建您已有的数据框。

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

下一步是提取dataType来自 schemadataFrame并创建一个 iterator .

val fieldTypesList = df.schema.map(struct => struct.dataType)

下一步是转换 dataframe rows进入rdd列表和 map每个valuedataType来自 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)

它会给

List((12345,IntegerType), (fnord,StringType))
List((42,IntegerType), (baz,StringType))

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

关于scala - 如何获取数据框中每一行每一列的值和类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43665365/

相关文章:

python - 如何使用先前的滚动平均值填充 pandas 数据框中的后续空值?

python - 多个数据帧的每一列的平均值到一个数据帧 - Python pandas

scala - 初始化 SparkContext : A master URL must be set in your configuration 时出错

java - ZMQ 丢失事件在 jeromq scala 中传播

scala - 何时使用 scala 三重插入符 (^^^) 与双重插入符 (^^) 和 into 方法 (>>)

java - Spark java代码在spark_core v2.2中运行但在spark_core v2.3中失败

java - SPARK:java.lang.IllegalStateException:找不到任何构建目录

json - Play Framework : How to convert JSON to List[Int]

scala - 展平 RDD 中的 Scala 映射

json - 使用 Pyspark 在 Row 中访问 Dataframe 的 Row(嵌套 JSON)