获取 RDD[Array[String]] 的一列并将其转换为数据集/数据帧

Posted

技术标签:

【中文标题】获取 RDD[Array[String]] 的一列并将其转换为数据集/数据帧【英文标题】:Obtaining one column of a RDD[Array[String]] and converting it to dataset/dataframe 【发布时间】:2017-12-04 10:17:24 【问题描述】:

我有一个读入 RDD 的 .csv 文件:

val dataH = sc.textFile(filepath).map(line => line.split(",").map(elem => elem.trim))

我想按顺序迭代这个 RDD 并比较相邻元素,这个比较只依赖于数据结构的一列。不可能迭代 RDD,因此,想法是首先将 RDD 的列转换为 Dataset 或 Dataframe。

您可以将 RDD 转换为这样的数据集(如果我的结构是 RDD[Array[String]],这将不起作用:

val sc = new SparkContext(conf)  
val sqc = new SQLContext(sc)
import sqc.implicits._
val lines = sqc.createDataset(dataH)

如何从dataH 获取我感兴趣的一列,然后仅从中创建数据集?

我使用的是 Spark 1.6.0。

【问题讨论】:

您使用的是哪个 spark 版本? Spark 1.6,忘了说,抱歉! 不清楚你在问什么,你能举个例子(输入,预期输出)吗? 我有一个包含几列的 .csv 文件。我将其映射到由 Array[String] 组成的 RDD,其中 RDD 中的每个元素都是 csv 表中的一行。我想遍历表,但是因为我只需要考虑一列,我想将 RDD [Array [String]] 的一列转换为 Dataset [String]。 (或 Dataframe,如果它更容易/更好) 【参考方案1】:

您可以将您的 Array 映射到所需的索引,例如:

dataH.map(arr => arr(0)).toDF("col1")

或者更安全(避免索引超出范围的异常):

dataH.map(arr => arr.lift(0).orElse(None)).toDF("col1") 

【讨论】:

谢谢,这很好用!猜猜我将使用 Dataframe 而不是 Dataset @osk 你也可以创建一个数据集(只使用toDS而不是toDF("col1")),但是数据集在Spark 2之前只是实验性的

以上是关于获取 RDD[Array[String]] 的一列并将其转换为数据集/数据帧的主要内容,如果未能解决你的问题,请参考以下文章

DataFrame:将列内的数组转换为 RDD[Array[String]]

RDD依赖关系

在火花对 RDD 中按值排序

基于Scala中另一列的值映射RDD列

将rdd行转换为一列

如何使用swift 3仅获取Core Data中的一列数据