web-dev-qa-db-ja.com

データセットを使用してグループ化する方法

そのために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でデータセットを使用するにはどうすればよいですか?

カスタム関数を使う方法はありますが、感じがとても複雑で、単純なポイント法はありませんか?

5
monkeysjourney

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に戻すことができます

5
Ramesh Maharjan

データセットを作成するには、まず次のようにクラスの外部にケースクラスを定義します。

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

お役に立てれば!

1
koiralo

まず、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バージョンではありません。ご不明な点がございましたら、お気軽にお問い合わせください。

0
András Nagy