DataFrame 中的 Spark Scala 方法签名 API

Spark Scala Method Signature in DataFrame API

您好,我正在尝试更多地了解 Scala,但我觉得我对这个方法签名有点迷茫。

explode[A <: Product](input: Column*)(f: (Row) ⇒ TraversableOnce[A])(implicit arg0: scala.reflect.api.JavaUniverse.TypeTag[A]): DataFrame

首先,方括号中的“<:”是什么意思? A 和 B 应该是参数类型吗?但是 Column 是参数类型。

其次,看起来它执行了一个从 (Row) 到 Traversable[A] 的 lambda 函数,但我还没有看到至少一次在右侧参数上没有左侧参数的 lambda .

此外,我不是 100% 了解为什么它具有隐式 arg0: piece

提前致谢!

what is the "<:" supposed to mean in the square brackets?

<: 表示 scala 中的子类型,所以这里表示 AProduct 的子类型。它就像一种上限,将可以传递到此处的类型限制为 Product

的子类型

Are A and B supposed to be parameter types? But Column is the argument type

A不是参数类型,它本身就是一个参数,称为类型参数。这有点令人困惑,但基本上它意味着您可以将 product 的子类型的任何类型传递给此位置并在函数内使用类型参数。这使得函数更加通用,因为它可以同时处理不同的类型,而您不必为不同的类型编写单独的函数;

it looks like it does a lambda function from (Row) to Traversable[A]

f: (row) => Traversable[A] 是另一个参数,在本例中是接受 (row) 和 return Traversable[A] 的函数类型。根据这个定义,explode 可以接受一个函数作为参数,在这种情况下是一个 lambda 表达式;

为了说明最后一个案例:

def sum(x: Int, y: Int)(f: Int => Int) = f(x) + f(y)
sum: (x: Int, y: Int)(f: Int => Int)Int

sum(2,3)(x => 2*x)
res2: Int = 10

综上所述,函数explode一共有三个参数,第一个A是类型参数。第二个和第三个是函数的实参,如您所见,InputColumn 类型,f 是函数类型 (row) => Traversable[A] 类型。