如何在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[(int, string)] 转换为 Dataframe