【问题标题】:Spark Scala Method Signature in DataFrame APIDataFrame API 中的 Spark Scala 方法签名
【发布时间】:2016-06-16 00:59:52
【问题描述】:

您好,我想更多地了解 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

提前致谢!

【问题讨论】:

    标签: scala apache-spark syntax dataframe spark-dataframe


    【解决方案1】:

    方括号中的“<:>

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

    A 和 B 应该是参数类型吗?但列是论据 输入

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

    看起来它做了一个从 (Row) 到 Traversable[A] 的 lambda 函数

    f: (row) =&gt; Traversable[A] 是另一个参数,在这种情况下是一个接受(row) 并返回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) =&gt; Traversable[A] 类型,这是一个函数类型。

    【讨论】:

    • 在定义“常规”类型的参数和函数类型的参数时,函数 f 是否总是需要在不同的括号中?它会看起来像 (a: Int, b:Int, f: (Int) => Int) 还是看起来像 (a: Int, b:Int, (f:(Int) => (Int) ))?感谢和抱歉令人困惑的“B”哈哈
    • 它不必像在 scala REPL 中测试那样。 (a: Int, b:Int, f: Int =&gt; Int)(a: Int, b:Int)(f: Int =&gt; Int) 都可以工作,但您必须以与定义它们相同的方式调用它们。后者允许您分两步传递参数,这有时会给您带来优势。
    猜你喜欢
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 2016-02-27
    • 2022-11-02
    • 2020-02-13
    • 1970-01-01
    相关资源
    最近更新 更多