我正在寻找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做出决定的确切原因。
答案 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个组,其中有类型化转换和未类型化转换。