2016-05-17 20 views
4

無論如何,我可以隨機移動一列RDD或數據框,以使該列中的條目以隨機順序出現?我不確定我可以使用哪些API來完成這樣的任務。在Spark RDD或數據框中隨機移動列

+0

什麼是洗牌的意思? –

+0

我想按隨機順序將條目放在列中 –

回答

2

雖然不能只是直接洗牌一個列 - 可以通過RandomRDDs排列RDD中的記錄。 https://spark.apache.org/docs/latest/api/java/org/apache/spark/mllib/random/RandomRDDs.html

的潛在方法只具有置換可能是單個列:

  • 使用mapPartitions做對每個勞工任務
  • 一些安裝/拆卸吸所有記錄到內存中。即iterator.toList請確保您有許多(/小)分區的數據使用Row對象重寫所有回來了,只是在給定列
  • 的mapPartitions內原以避免OOME
  • 創建一個內存中排序列表
  • 用於期望列拖放其值在一個單獨的收集和隨機抽樣的集合從mapPartitions
替換每個記錄的條目
  • 返回其結果作爲list.toIterator
  • 1

    您可以添加一個隨機生成的附加列,然後根據此隨機生成的列對記錄進行排序。通過這種方式,你隨機洗牌你的目標列。

    這樣,您不需要在內存中擁有所有數據,這很容易導致OOM。如果有必要,Spark會照料到磁盤分類和內存限制問題。

    如果您不想要額外的列,可以在排序後將其刪除。

    0

    如果您不需要對數據進行全局洗牌,則可以使用mapPartitions方法在分區內洗牌。

    rdd.mapPartitions(Random.shuffle(_)); 
    

    對於PairRDDRDD[(K, V)]類型的RDDS),如果有興趣在洗牌鍵 - 值映射(映射的任意鍵的任意值):

    pairRDD.mapPartitions(iterator => { 
        val (keySequence, valueSequence) = iterator.toSeq.unzip 
        val shuffledValueSequence = Random.shuffle(valueSequence) 
        keySequence.zip(shuffledValueSequence).toIterator 
    }, true) 
    

    在布爾標誌結束表示該操作保留了分區(鍵未更改),以便下游操作(例如, reduceByKey可以優化(避免洗牌)。

    1

    如何選擇列進行隨機播放,orderBy(rand)列和zip it by index to the existing dataframe

    import org.apache.spark.sql.functions.rand 
    
    def addIndex(df: DataFrame) = spark.createDataFrame(
        // Add index 
        df.rdd.zipWithIndex.map{case (r, i) => Row.fromSeq(r.toSeq :+ i)}, 
        // Create schema 
        StructType(df.schema.fields :+ StructField("_index", LongType, false)) 
    ) 
    
    case class Entry(name: String, salary: Double) 
    
    val r1 = Entry("Max", 2001.21) 
    val r2 = Entry("Zhang", 3111.32) 
    val r3 = Entry("Bob", 1919.21) 
    val r4 = Entry("Paul", 3001.5) 
    
    val df = addIndex(spark.createDataFrame(Seq(r1, r2, r3, r4))) 
    val df_shuffled = addIndex(df 
        .select(col("salary").as("salary_shuffled")) 
        .orderBy(rand)) 
    
    df.join(df_shuffled, Seq("_index")) 
        .drop("_index") 
        .show(false) 
    
    +-----+-------+---------------+ 
    |name |salary |salary_shuffled| 
    +-----+-------+---------------+ 
    |Max |2001.21|3001.5   | 
    |Zhang|3111.32|3111.32  | 
    |Paul |3001.5 |2001.21  | 
    |Bob |1919.21|1919.21  | 
    +-----+-------+---------------+