使用 Spark 2.x 和 Scala 2.11
我想了 3 种可能的方法将特定列的值转换为列表。
所有方法的通用代码sn-ps
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder.getOrCreate
import spark.implicits._ // for .toDF() method
val df = Seq(
("first", 2.0),
("test", 1.5),
("choose", 8.0)
).toDF("id", "val")
方法 1
df.select("id").collect().map(_(0)).toList
// res9: List[Any] = List(one, two, three)
现在会发生什么?我们正在使用 collect() 向 Driver 收集数据,并从每条记录中挑选元素零。
这不是一个很好的方法,让我们用下一个方法改进它。
方法2
df.select("id").rdd.map(r => r(0)).collect.toList
//res10: List[Any] = List(one, two, three)
如何更好?我们在工作人员之间分配地图转换负载,而不是单个驱动程序。
我知道rdd.map(r => r(0)) 看起来并不优雅。所以,让我们在下一个方法中解决它。
方法 3
df.select("id").map(r => r.getString(0)).collect.toList
//res11: List[String] = List(one, two, three)
这里我们没有将 DataFrame 转换为 RDD。查看map,由于DataFrame 中的编码器问题,它不会接受r => r(0)(或_(0))作为以前的方法。所以最终使用r => r.getString(0),它将在下一版本的 Spark 中解决。
结论
所有选项都提供相同的输出,但 2 和 3 有效,最后第 3 个有效且优雅(我认为)。
Databricks notebook