为什么有些运算符返回DataFrame而另一些运算符返回?

时间:2018-08-20 20:35:15

标签: apache-spark apache-spark-sql

我正在寻找SPARK 2.3.1下的原因。如我所料,这将返回DF:

val df = Seq(
 Person(0, "AgataZ", 0),
 Person(1, "Iweta", 0),
 Person(71, "Gloria", 222), 
 Person(3333, "Maksym", 0)).toDF("k","n","p")

df:org.apache.spark.sql.DataFrame = [k: integer, n: string ... 1 more fields]

但这会返回一个DS:

val rdd  = sc.parallelize(scala.util.Random.shuffle(1 to 1000000))
val df = rdd.map(x => (randomInt1toLarge, randomInt1toVeryLarge, x))
        .toDF("time_asc", "device", "trip_init").persist

df: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [time_asc: int, device: int ... 1 more field]

DS,DF可互换,可能微不足道,但仍然很奇怪。我看不到Spark做出决定的确切原因。

1 个答案:

答案 0 :(得分:0)

tl; dr 查看签名。

toDF属于DatasetHolder,签名如下:

toDF(colNames: String*): DataFrame

Dataset.persist如下所示:

persist(): Dataset.this.type

“为什么?”你问。由于具有性能优势(例如,无需对诸如订购之类的内容进行反序列化),DataFrame始终是处理大型数据集的首选方法,而Dataset因其类型安全性而对于Scala开发人员而言更为愉快。

为了弄清楚,这全都与使用的编码器有关,Dataset是类型构造函数,其中DataFrame是RowEncoder的Dataset[Row]的类型别名。

还要注意,Dataset API分为5个组,其中有类型化转换未类型化转换