Spark数据集API - 加入

mas*_*tro 20 scala apache-spark apache-spark-sql apache-spark-dataset

我正在尝试使用Spark 数据集 API但我在进行简单连接时遇到了一些问题.

假设我有两个带有字段的数据集:date | value,然后在DataFrame我的连接的情况下看起来像:

val dfA : DataFrame
val dfB : DataFrame

dfA.join(dfB, dfB("date") === dfA("date") )
Run Code Online (Sandbox Code Playgroud)

但是,Dataset.joinWith方法,但相同的方法不起作用:

val dfA : Dataset
val dfB : Dataset

dfA.joinWith(dfB, ? )
Run Code Online (Sandbox Code Playgroud)

需要什么论点.joinWith

Dav*_*fin 31

首先要使用joinWith你创建一个DataSet,而且很可能是两个.要创建一个DataSet,你需要创建你的模式相匹配的情况下类并调用DataFrame.as[T]哪里T是你的案件类.所以:

case class KeyValue(key: Int, value: String)
val df = Seq((1,"asdf"),(2,"34234")).toDF("key", "value")
val ds = df.as[KeyValue]
// org.apache.spark.sql.Dataset[KeyValue] = [key: int, value: string]
Run Code Online (Sandbox Code Playgroud)

您还可以跳过案例类并使用元组:

val tupDs = df.as[(Int,String)]
// org.apache.spark.sql.Dataset[(Int, String)] = [_1: int, _2: string]
Run Code Online (Sandbox Code Playgroud)

然后,如果你有另一个案例类/ DF,像这样说:

case class Nums(key: Int, num1: Double, num2: Long)
val df2 = Seq((1,7.7,101L),(2,1.2,10L)).toDF("key","num1","num2")
val ds2 = df2.as[Nums]
// org.apache.spark.sql.Dataset[Nums] = [key: int, num1: double, num2: bigint]
Run Code Online (Sandbox Code Playgroud)

然后,在语法joinjoinWith相似,结果是不同的:

df.join(df2, df.col("key") === df2.col("key")).show
// +---+-----+---+----+----+
// |key|value|key|num1|num2|
// +---+-----+---+----+----+
// |  1| asdf|  1| 7.7| 101|
// |  2|34234|  2| 1.2|  10|
// +---+-----+---+----+----+

ds.joinWith(ds2, df.col("key") === df2.col("key")).show
// +---------+-----------+
// |       _1|         _2|
// +---------+-----------+
// | [1,asdf]|[1,7.7,101]|
// |[2,34234]| [2,1.2,10]|
// +---------+-----------+
Run Code Online (Sandbox Code Playgroud)

如您所见,joinWith将对象保留为元组的一部分,同时join将列展平为单个命名空间.(这会导致上述情况出现问题,因为重复了列名"key".)

奇怪的是,我必须使用df.col("key"),并df2.col("key")为加盟创造了条件dsds2-如果你只使用col("key")在任何一方不工作,ds.col(...)不存在.df.col("key")然而,使用原件可以解决问题.

  • 我完全同意,基于这种语法,创建数据集没有用处,那么好处在哪里呢?我无法克服这样一个事实:没有任何类型的选择......真可惜! (8认同)
  • 详细解释.只是一个混乱.是否有更好的方法来编写类型化连接条件.例如,对于df.col("key"),我们可以使用更安全的类型来解决编译时"key"的正确性问题. (4认同)