次の形式の2列のデータフレームがあります
col1 col2
k1 'a'
k2 'b'
k1 'a'
k1 'c'
k2 'c'
k1 'b'
k1 'b'
k2 'c'
k1 'b'
出力を
k1 ['b', 'a', 'c']
k2 ['c', 'b']
したがって、各エントリが発生した回数でソートされた一意のエントリのセット(降順)。上記の例では、「b」はk1に3回、「a」は2回、「c」は1回関連付けられています。
どうすればこれを行うことができますか?
groupBy($"col1").count()
エントリがcol1
発生する回数だけを調べますが、それは私が探しているものではありません。
次のことができます。
そのように(Scalaで):
import scala.collection.mutable
import org.apache.spark.sql.{Row}
val sort_by_count_udf = udf {
arr: mutable.WrappedArray[Row] =>
arr.map {
case Row(count: Long, col2: String) => (count, col2)
}.sortBy(-_._1).map { case (count, col2) => col2 }
}
val df = List(("k1", "a"),
("k1", "a"), ("k1", "c"), ("k1", "b"),
("k2", "b"), ("k2", "c"), ("k2", "c"),
("k1", "b"), ("k1", "b"))
.toDF("col1", "col2")
val grouped = df
.groupBy("col1", "col2")
.count()
.groupBy("col1")
.agg(collect_list(struct("count", "col2")).as("list"))
grouped.withColumn("list_ordered", sort_by_count_udf(col("list"))).show
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加