web-dev-qa-db-ja.com

Spark DataFrameを使用して列の個別の値を取得する

Spark 1.6.1バージョンを使用して、列の個別の値を取得し、その上で特定の変換を実行する必要があります。列には5,000万を超えるレコードが含まれ、大きくなる可能性があります。
distinct.collect()を実行すると、ドライバープログラムに呼び出しが戻されることを理解しています。現在、以下のようにこのタスクを実行していますが、より良いアプローチはありますか?

 import sqlContext.implicits._
 preProcessedData.persist(StorageLevel.MEMORY_AND_DISK_2)

 preProcessedData.select(ApplicationId).distinct.collect().foreach(x => {
   val applicationId = x.getAs[String](ApplicationId)
   val selectedApplicationData = preProcessedData.filter($"$ApplicationId" === applicationId)
   // DO SOME TASK PER applicationId
 })

 preProcessedData.unpersist()  
28
Kazhiyur

Dataframeのすべての異なる値を取得するには、 distinct を使用できます。ドキュメントでわかるように、このメソッドは別のDataFrameを返します。その後、各レコードをtransformするためにUDFを作成できます。

例えば:

val df = sc.parallelize(Array((1, 2), (3, 4), (1, 6))).toDF("age", "salary")

// I obtain all different values. If you show you must see only {1, 3}
val distinctValuesDF = df.select(df("age")).distinct

// Define your udf. In this case I defined a simple function, but they can get complicated.
val myTransformationUDF = udf(value => value / 10)

// Run that transformation "over" your DataFrame
val afterTransformationDF = distinctValuesDF.select(myTransformationUDF(col("age")))
44