Spark 2.x 및 Scala 2.11 사용
특정 열의 값을 List로 변환하는 세 가지 가능한 방법을 생각합니다.
모든 접근 방식에 대한 공통 코드 조각
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder.getOrCreate
import spark.implicits._
val df = Seq(
("first", 2.0),
("test", 1.5),
("choose", 8.0)
).toDF("id", "val")
접근 방식 1
df.select("id").collect().map(_(0)).toList
지금 벌어지는 일은? Driver에 데이터를 수집 collect()
하고 각 레코드에서 요소 0을 선택합니다.
이것은 훌륭한 방법이 될 수 없습니다. 다음 접근 방식으로 개선합시다.
접근 방식 2
df.select("id").rdd.map(r => r(0)).collect.toList
어떻게 더 낫습니까? 단일 드라이버가 아닌 작업자간에 맵 변환로드를 분산했습니다.
I의 노하우는 rdd.map(r => r(0))
없습니다 당신이 우아한 보인다 않습니다. 따라서 다음 접근 방식에서 해결하겠습니다.
접근 3
df.select("id").map(r => r.getString(0)).collect.toList
여기서는 DataFrame을 RDD로 변환하지 않습니다. 에서 봐 map
그것을 수락하지 않습니다 r => r(0)
(또는 _(0)
인해 DataFrame에서 인코더 문제 이전의 방식으로). 따라서 결국 사용 r => r.getString(0)
하고 Spark의 다음 버전에서 해결 될 것입니다.
결론
모든 옵션은 동일한 출력을 제공하지만 2와 3은 효과적이며 마지막으로 세 번째 옵션은 효과적이고 우아합니다 (내 생각에는).
Databricks 노트북