[英]Specify subset of elements in Spark RDD (Scala)
我的數據集是一個包含140多列的RDD[Array[String]]
。 如何在不對列號進行硬編碼的情況下選擇列的子集(.map(x => (x(0),x(3),x(6)...))
?
這是我迄今為止嘗試過的(成功):
val peopleTups = people.map(x => x.split(",")).map(i => (i(0),i(1)))
但是,我需要多個列,並且希望避免對它們進行硬編碼。
這是我到目前為止所嘗試的(我認為會更好,但失敗了):
// Attempt 1
val colIndices = [0,3,6,10,13]
val peopleTups = people.map(x => x.split(",")).map(i => i(colIndices))
// Error output from attempt 1:
<console>:28: error: type mismatch;
found : List[Int]
required: Int
val peopleTups = people.map(x => x.split(",")).map(i => i(colIndices))
// Attempt 2
colIndices map peopleTups.lift
// Attempt 3
colIndices map peopleTups
// Attempt 4
colIndices.map(index => peopleTups.apply(index))
我找到了這個問題並試了一下,但因為我正在查看RDD而不是數組,所以它不起作用: 如何使用Scala和Spark從數組中選擇非順序子集元素?
您應該映射RDD
而不是索引。
val list = List.fill(2)(Array.range(1, 6))
// List(Array(1, 2, 3, 4, 5), Array(1, 2, 3, 4, 5))
val rdd = sc.parallelize(list) // RDD[Array[Int]]
val indices = Array(0, 2, 3)
val selectedColumns = rdd.map(array => indices.map(array)) // RDD[Array[Int]]
selectedColumns.collect()
// Array[Array[Int]] = Array(Array(1, 3, 4), Array(1, 3, 4))
那這個呢?
val data = sc.parallelize(List("a,b,c,d,e", "f,g,h,i,j"))
val indices = List(0,3,4)
data.map(_.split(",")).map(ss => indices.map(ss(_))).collect
這應該給
res1: Array[List[String]] = Array(List(a, d, e), List(f, i, j))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.