無論如何,我可以隨機移動一列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. Python中Spark Spark RDD上的列操作
- 5. 在Pandas數據框中移動列
- 6. 熊貓數據框到RDD
- 7. 在Spark中使用多列RDD?
- 8. RDD從標籤陣列和數據數組在python/spark
- 9. Scala和Spark,rdd從字典中創建數據框
- 10. 無法轉換到RDD數據框(RDD有數百萬行)
- 11. Spark中是否有方法獲得RDD,RDD是另一個RDD的給定確切大小的隨機子集?
- 12. Spark Spark RDD上的列操作
- 13. Spark數據集或數據框聚合
- 14. 將列表或RDD的列表轉換爲Spark-Scala中的DataFrame
- 15. 添加列到RDD Spark 1.2.1
- 16. 選擇列RDD scala-spark
- 17. Array [Byte] Spark RDD to String Spark RDD
- 18. Pygame中的隨機移動
- 19. DIV隨機移動
- 20. SpriteKit - 隨機移動
- 21. Apache Spark SQL - RDD內存數據傾斜
- 22. Spark Streaming - Kafka- createStream - RDD到數據幀
- 23. 左移或右移陣列表中的對象隨機
- 24. 如何轉換卡夫卡流火花RDD或Spark數據幀
- 25. 星火數據框中用隨機數據
- 26. 其他RDD中的Java Spark RDD?
- 27. Spark RDD問題
- 28. Spark RDD更新
- 29. Spark RDD apend
- 30. 在Java Applet中隨機移動對象
什麼是洗牌的意思? –
我想按隨機順序將條目放在列中 –