scala - 使用FlatMap使用Spark和Scala将列名称附加到元素

标签 scala apache-spark flatmap

对于给定的表

+--+--+
| A| B|
+--+--+
|aa|bb|
|cc|dd|
+--+--+


我想得到一个像这样的数据框:

+---+---+
|._1|._2|
+---+---+
|aa | A |
|bb | B |
|cc | A |
|dd | B |
+---+---+


使用Apache Spark和Scala。因此,基本上我想要元组在索引0处具有原始值,在索引1处具有列名称。这应该适用于任何任意模式。这意味着列数是事先未知的,据我所知,因此无法转换为数据集。
这是我尝试解决的方法:

val df = spark.read
          .option("header", "true")
          .option("sep",";")
          .csv(path + "/tpch_nation.csv")
val cells = df.flatMap(tuple => {
          tuple.toSeq.asInstanceOf[Seq[String]].zip(df.columns.toList)
        })
cells.show()


但是,这会在flatMap函数内部生成一个java.lang.NullPointerException。我很困惑哪个对象指向Null,以及如何解决该问题。

最佳答案

不要在闭包中使用df。单独使用列

val columns = df.columns 

val cells = df.flatMap(row => {
  row.toSeq.map(_.toString).zip(columns)
})


或完全不使用:

val cells = df.flatMap(row => {
  row.toSeq.map(_.toString).zip(row.schema.fieldNames)
})


也:


Transpose column to row with Spark
unpivot in spark-sql/pyspark
Spark DataFrame column names not passed to slave nodes?

关于scala - 使用FlatMap使用Spark和Scala将列名称附加到元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48465784/

相关文章:

compiler-construction - 是否可以将Scala程序编译为可在任何JVM上运行,而无需在给定机器上安装Scala?

Java 的 "forEach"到 Scala

apache-spark - spark SQL中的递归cte

android - 我是否正确使用 flatMap 来合并来自多个 API 调用的结果?

scala - SPARK-5063 RDD 转换和操作只能由驱动程序调用

scala - ZIO:如何加入 Fibers 以实现永久运行的流程

java - Spark 采样 - 比使用完整的 RDD/DataFrame 快多少

apache-spark - 将日志与 Apache Spark 分开

java - 如何将其返回到 double 组或列表中

java - 在 RxJava 2.x 中使用 flatMap