無論如何,我可以隨機移動一列RDD或數據框,以使該列中的條目以隨機順序出現?我不確定我可以使用哪些API來完成這樣的任務。在Spark RDD或數據框中隨機移動列
4
A
回答
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(_));
對於PairRDD
(RDD[(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 |
+-----+-------+---------------+
相關問題
- 1. 從數據框中隨機選擇列
- 2. Spark從RDD創建對象的數據框,列順序
- 3. Hbase Spark RDD JSON列
- 4. 在Pandas數據框中移動列
- 5. RDD從標籤陣列和數據數組在python/spark
- 6. 在Spark中使用多列RDD?
- 7. Scala和Spark,rdd從字典中創建數據框
- 8. Pygame中的隨機移動
- 9. Spark中是否有方法獲得RDD,RDD是另一個RDD的給定確切大小的隨機子集?
- 10. Spark數據集或數據框聚合
- 11. SpriteKit - 隨機移動
- 12. 將列表或RDD的列表轉換爲Spark-Scala中的DataFrame
- 13. 添加列到RDD Spark 1.2.1
- 14. 選擇列RDD scala-spark
- 15. Spark Streaming - Kafka- createStream - RDD到數據幀
- 16. 在HighChart(Scattar)中添加動態數據時,現有數據會隨機移除
- 17. 隨機化或隨機的陣列
- 18. 其他RDD中的Java Spark RDD?
- 19. Spark RDD apend
- 20. 敵人隨機移動
- 21. 隨機移動/湍流 - SWIFT
- 22. 隨機移動一個球
- 23. RDD [矢量]到數據框
- 24. Spark Spark RDD中的字符串替換
- 25. 手動將密鑰/索引分配給Spark中的RDD列(pyspark)
- 26. RDD在SPARK的聯盟
- 27. Apache Spark Rdd持續存在
- 28. 如何根據基於Spark中另一個RDD的函數過濾RDD?
- 29. 在屏幕上隨機移動兩個或多個對象
- 30. 如何將二進制文件更改爲RDD或數據框?
什麼是洗牌的意思? –
我想按隨機順序將條目放在列中 –