2014-07-21 22 views
8

Làm cách nào tôi có thể lấy một mảng tia lửa, và chia thành hai lần ngẫu nhiên để mỗi rdd sẽ bao gồm một phần dữ liệu (cho phép nói 97% và 3 %).Spark - scala: trộn RDD/chia RDD thành hai phần ngẫu nhiên ngẫu nhiên

Tôi nghĩ để shuffle danh sách và sau đó shuffledList.take((0.97*rddList.count).toInt)

Nhưng làm thế nào tôi có thể shuffle RDD?

Hoặc có cách nào tốt hơn để tách danh sách không?

+0

Tất cả các mặt hàng độc đáo Chỉ cần tự hỏi nếu bạn có thể sử dụng 'takeSample (tức là không có bản sao?)() 'và sau đó lọc mẫu ra khỏi danh sách gốc. – DNA

+0

Có thể trùng lặp, nhưng tại sao nó lại quan trọng, bạn sẽ có thể làm gì nếu chúng là duy nhất? –

+0

OK, tôi không nghĩ phương pháp takeSample sẽ hoạt động với các bản sao. – DNA

Trả lời

19

Tôi đã tìm thấy một cách đơn giản và nhanh chóng để phân chia các mảng:

val Array(f1,f2) = data.randomSplit(Array(0.97, 0.03)) 

Nó sẽ chia dữ liệu bằng cách sử dụng trọng lượng được cung cấp.

6

Bạn nên sử dụng randomSplit phương pháp:

def randomSplit(weights: Array[Double], seed: Long = Utils.random.nextLong): Array[RDD[T]] 

// Randomly splits this RDD with the provided weights. 
// weights for splits, will be normalized if they don't sum to 1 
// returns split RDDs in an array 

Đây là nó implementation trong spark 1.0:

def randomSplit(weights: Array[Double], seed: Long = Utils.random.nextLong): Array[RDD[T]] = { 
    val sum = weights.sum 
    val normalizedCumWeights = weights.map(_/sum).scanLeft(0.0d)(_ + _) 
    normalizedCumWeights.sliding(2).map { x => 
     new PartitionwiseSampledRDD[T, T](this, new BernoulliSampler[T](x(0), x(1)),seed) 
    }.toArray 
} 
+0

@Boern Bạn có thể hy vọng thấy câu trả lời khác đã được chỉnh sửa sau. Nếu câu trả lời này đã lỗi thời, hãy chỉnh sửa nó. –

Các vấn đề liên quan