我有一個像這樣的資料型別:case class Data(col: String, ...) 和一個 Dataset[Data] ds。有些行的列填充了值“a”,而其他行的列填充了值“b”,等等。
我想分別處理帶有“a”的所有資料和帶有“b”的所有資料。但我還需要在同一個磁區中擁有所有的“a”。
問題一:
如果我做 :
ds.repartition(col("col")).mapPartition(data => ???)
默認情況下是否保證我將在一個磁區中擁有所有“a”,并且在這個磁區中沒有“b”與它混合?
我也可以這樣做來強制磁區數:
val nbDistinct = ds.select("col").distinct.count
ds.repartition(nbDistinct , col("col")).mapPartition(data => ???)
但它增加了在某些情況下可能代價高昂的操作。
問題2:有沒有什么好的方法可以保證?
謝謝!
uj5u.com熱心網友回復:
所有的 'a' 都將在同一個磁區中,但 'a' 和 'b' 可以混合使用。
即使使用 nbDistinct,也不足以保證資料集被拆分為唯一的磁區,因此代碼應該是:
val nbDistinct = ds.select("col").distinct.count
ds.repartition(col("col")).mapPartition{ data =>
// split mixed values in a single partition with group by :
data.groupBy(_.col).flatMap { case (col, rows) => ??? }
}
其他選項是使用 groupBy / groupByKey
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494573.html
標籤:阿帕奇火花
