vae*_*r-k 2 scala apache-spark apache-spark-dataset apache-spark-encoders
我有两个数据集:Dataset[User]和Dataset[Book]其中两个User和Book区分类别。我像这样加入他们:
val joinDS = ds1.join(ds2, "userid")
如果我尝试map遍历 中的每个元素joinDS,编译器会抱怨缺少编码器:
not enough arguments for method map: (implicit evidence$46: org.apache.spark.sql.Encoder[Unit])org.apache.spark.sql.Dataset[Unit].
Unspecified value parameter evidence$46.
Unable to find encoder for type stored in a Dataset.
但是如果我使用foreach而不是map. 为什么也不foreach需要编码器?我已经从 spark 会话中导入了所有隐式,那么map当数据集是连接包含案例类的两个数据集的结果时,为什么根本需要编码器)?另外,我从那个连接中得到什么类型的数据集?它是一个Dataset[Row],还是别的什么?
TL;DR Encoder需要将结果转换为内部 Spark SQL 格式,并且在foreach(或任何其他接收器)的情况下不需要。
只看签名。map是
def map[U](func: (T) ? U)(implicit arg0: Encoder[U]): Dataset[U]
Run Code Online (Sandbox Code Playgroud)
因此,简单来说,它会将记录从Tto转换为U,然后使用EncoderofU将结果转换为内部表示。
foreach 另一方面,是
def foreach(f: (T) ? Unit): Unit
Run Code Online (Sandbox Code Playgroud)
换句话说,它不期望任何结果。由于没有要存储的结果,Encoder因此已过时。
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |