そのためにrddを使用するように要求します:
val test = Seq(("New York", "Jack"),
("Los Angeles", "Tom"),
("Chicago", "David"),
("Houston", "John"),
("Detroit", "Michael"),
("Chicago", "Andrew"),
("Detroit", "Peter"),
("Detroit", "George")
)
sc.parallelize(test).groupByKey().mapValues(_.toList).foreach(println)
結果は:
(ニューヨーク、リスト(ジャック))
(デトロイト、リスト(マイケル、ピーター、ジョージ))
(ロサンゼルス、リスト(トム))
(ヒューストン、リスト(ジョン))
(シカゴ、リスト(デビッド、アンドリュー))
Spark2.0でデータセットを使用するにはどうすればよいですか?
カスタム関数を使う方法はありますが、感じがとても複雑で、単純なポイント法はありませんか?
case class
の作成から始めることをお勧めします
case class Monkey(city: String, firstName: String)
このcase class
は、メインクラスの外部で定義する必要があります。次に、toDS
関数を使用して、以下のようにcollect_list
と呼ばれるgroupBy
およびaggregation
関数を使用できます。
import sqlContext.implicits._
import org.Apache.spark.sql.functions._
val test = Seq(("New York", "Jack"),
("Los Angeles", "Tom"),
("Chicago", "David"),
("Houston", "John"),
("Detroit", "Michael"),
("Chicago", "Andrew"),
("Detroit", "Peter"),
("Detroit", "George")
)
sc.parallelize(test)
.map(row => Monkey(row._1, row._2))
.toDS()
.groupBy("city")
.agg(collect_list("firstName") as "list")
.show(false)
次のように出力されます
+-----------+------------------------+
|city |list |
+-----------+------------------------+
|Los Angeles|[Tom] |
|Detroit |[Michael, Peter, George]|
|Chicago |[David, Andrew] |
|Houston |[John] |
|New York |[Jack] |
+-----------+------------------------+
.rdd
関数を呼び出すだけで、いつでもRDD
に戻すことができます
データセットを作成するには、まず次のようにクラスの外部にケースクラスを定義します。
case class Employee(city: String, name: String)
次に、リストを次のようにデータセットに変換できます。
val spark =
SparkSession.builder().master("local").appName("test").getOrCreate()
import spark.implicits._
val test = Seq(("New York", "Jack"),
("Los Angeles", "Tom"),
("Chicago", "David"),
("Houston", "John"),
("Detroit", "Michael"),
("Chicago", "Andrew"),
("Detroit", "Peter"),
("Detroit", "George")
).toDF("city", "name")
val data = test.as[Employee]
または
import spark.implicits._
val test = Seq(("New York", "Jack"),
("Los Angeles", "Tom"),
("Chicago", "David"),
("Houston", "John"),
("Detroit", "Michael"),
("Chicago", "Andrew"),
("Detroit", "Peter"),
("Detroit", "George")
)
val data = test.map(r => Employee(r._1, r._2)).toDS()
これでgroupby
を実行し、次のように集計を実行できます
data.groupBy("city").count().show
data.groupBy("city").agg(collect_list("name")).show
お役に立てれば!
まず、RDDをDataSetに変換します。
val spark: org.Apache.spark.sql.SparkSession = ???
import spark.implicits._
val testDs = test.toDS()
testDs.schema.fields.foreach(x => println(x))
最終的には、groupByを使用するだけで済みます。
testDs.groupBy("City?", "Name?")
RDD-sは実際には2.0バージョンではありません。ご不明な点がございましたら、お気軽にお問い合わせください。