Spark-将Map转换为单行DataFrame

Dan*_*nov 3 scala dataframe apache-spark

在我的应用程序中,我需要从Map创建一个单行DataFrame。

这样的地图就像

("col1" -> 5, "col2" -> 10, "col3" -> 6)
Run Code Online (Sandbox Code Playgroud)

将被转换为具有单行的DataFrame,并且映射键将成为列的名称。

col1 | col2 | col3
5    | 10   | 6
Run Code Online (Sandbox Code Playgroud)

如果您想知道为什么要这样做-我只需要使用MongoSpark连接器将包含一些统计信息的单个文档保存到MongoDB中,该连接器就可以保存DF和RDD。

And*_*kin 7

我认为对列名称进行排序不会有任何伤害。

  import org.apache.spark.sql.types._
  val map = Map("col1" -> 5, "col2" -> 6, "col3" -> 10)
  val (keys, values) = map.toList.sortBy(_._1).unzip
  val rows = spark.sparkContext.parallelize(Seq(Row(values: _*)))
  val schema = StructType(keys.map(
    k => StructField(k, IntegerType, nullable = false)))
  val df = spark.createDataFrame(rows, schema)
  df.show()
Run Code Online (Sandbox Code Playgroud)

给出:

+----+----+----+
|col1|col2|col3|
+----+----+----+
|   5|   6|  10|
+----+----+----+
Run Code Online (Sandbox Code Playgroud)

这个想法很简单:将映射转换为元组列表,解压缩,将键转换为模式,将值转换为单行RDD,从这两部分构建数据框(那里的接口createDataFrame有点奇怪,接受java.util.Lists和厨房水槽,但List由于某些原因不接受通常的标量)。