获取 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]] 的一列并将其转换为数据集/数据帧的主要内容,如果未能解决你的问题,请参考以下文章