如何在Scala中将rdd对象转换为数据框

Posted

技术标签:

【中文标题】如何在Scala中将rdd对象转换为数据框【英文标题】:How to convert rdd object to dataframe in Scala 【发布时间】:2020-03-30 15:15:12 【问题描述】:

我从 ElasticSearch 读取数据并保存到 RDD。

val es_rdd = sc.esRDD("indexname/typename",query="?q=*")

rdd 有下一个示例数据:

(uniqueId,Map(field -> value))
(uniqueId2,Map(field2 -> value2))

如何将此 RDD(字符串、映射)转换为数据帧(字符串、字符串、字符串)?

【问题讨论】:

您的地图总是包含 1 个键值对? 是的,它将是 1 个键值。 【参考方案1】:

你可以使用explode来实现。

  import spark.implicits._
  import org.apache.spark.sql.functions._

  val rdd = sc.range(1, 10).map(s => (s, Map(s -> s)))
  val ds = spark.createDataset(rdd)
  val df = ds.toDF()
  df.printSchema()
  df.show()

  df.select('_1,explode('_2)).show()

输出:

root
 |-- _1: long (nullable = false)
 |-- _2: map (nullable = true)
 |    |-- key: long
 |    |-- value: long (valueContainsNull = false)

+---+--------+
| _1|      _2|
+---+--------+
|  1|[1 -> 1]|
|  2|[2 -> 2]|
|  3|[3 -> 3]|
|  4|[4 -> 4]|
|  5|[5 -> 5]|
|  6|[6 -> 6]|
|  7|[7 -> 7]|
|  8|[8 -> 8]|
|  9|[9 -> 9]|
+---+--------+

+---+---+-----+
| _1|key|value|
+---+---+-----+
|  1|  1|    1|
|  2|  2|    2|
|  3|  3|    3|
|  4|  4|    4|
|  5|  5|    5|
|  6|  6|    6|
|  7|  7|    7|
|  8|  8|    8|
|  9|  9|    9|
+---+---+-----+

【讨论】:

它适用于生成的 rdd,但与我从 Elastic 收到的 rdd 一起使用它不起作用。 (也许弹性响应使用另一种对象格式)【参考方案2】:

我使用下一次调用 elastic 以 Spark.SQL 格式直接读取:

val df = spark.read.format("org.elasticsearch.spark.sql")
      .option("query", "?q=*")
      .option("pushdown", "true")
      .load("indexname/typename")

【讨论】:

以上是关于如何在Scala中将rdd对象转换为数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark 中将 Avro Schema 对象转换为 StructType

如何在 Scala 中将 RDD 转换为二维数组?

如何在 scala 中将 RDD[(int, string)] 转换为 Dataframe

如何将 RDD [GenericRecord] 转换为 scala 中的数据框?

在scala中将Spark Dataframe转换为RDD

如何在pyspark中将rdd行转换为带有json结构的数据框?