Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用隐式功能实现蛋糕模式_Scala_Apache Spark - Fatal编程技术网

Scala 使用隐式功能实现蛋糕模式

Scala 使用隐式功能实现蛋糕模式,scala,apache-spark,Scala,Apache Spark,我有一个场景,我想实现蛋糕模式的一个变体,但向类(Spark数据帧)添加隐式功能 因此,基本上,我希望能够运行如下代码: 特征变换器{ 这个:ColumnAdder=> def转换(输入:数据帧):数据帧={ input.addColumn(“newCol”) } } val input=sqlContext.range(0,5) val transformer=带StringColumnAdder的新变压器 val输出=变压器。变换(输入) output.show 并得出如下结果: +---

我有一个场景,我想实现蛋糕模式的一个变体,但向类(Spark数据帧)添加隐式功能

因此,基本上,我希望能够运行如下代码:

特征变换器{
这个:ColumnAdder=>
def转换(输入:数据帧):数据帧={
input.addColumn(“newCol”)
}
}
val input=sqlContext.range(0,5)
val transformer=带StringColumnAdder的新变压器
val输出=变压器。变换(输入)
output.show
并得出如下结果:

+---+------+
|id | newCol|
+---+------+
|0 |新科|
|1 |纽科尔|
|2 |纽科尔|
|3 |纽科尔|
|4 |纽科尔|
+---+------+
我的第一个想法是仅在基本特征中定义隐式类:

trait列加法器{
受保护的def_addColumn(df:DataFrame,colName:String):DataFrame
隐式类ColumnAdderricDataFrame(df:DataFrame){
def addColumn(colName:String):数据帧=_addColumn(df,colName)
}
}
StringColumnAdder扩展了ColumnAdder{
受保护的def_addColumn(df:DataFrame,colName:String):DataFrame={
df.withColumn(colName,lit(colName))
}
}
它是有效的,但我对这种方法并不完全满意,因为函数签名是重复的。因此我想到了另一种方法,使用(不推荐的?
隐式def
策略:

trait列加法器{
受保护的隐式def columnAdderImplicits(df:DataFrame):ColumnAdderDataFrame
抽象类ColumnAdderDataFrame(df:DataFrame){
def addColumn(colName:String):数据帧
}
}
StringColumnAdder扩展了ColumnAdder{
受保护的隐式def columnAdderImplicits(df:DataFrame):ColumnAdderDataFrame=新StringColumnAdderDataFrame(df)
StringColumnAdderDataFrame(df:DataFrame)类扩展了ColumnAdderDataFrame(df){
def addColumn(colName:String):数据帧={
df.withColumn(colName,lit(colName))
}
}
}
(可以找到完整的可复制代码,包括额外的特征模块)


因此,我想问哪种方法是最好的,是否还有其他更好的方法来实现我的目标。

只有两条捷径,但没有什么令人惊讶的:

如果您愿意启用
-语言:ReflectVeCalls
(请注意其含义),那么您还可以编写:

trait列加法器{
受保护的隐式def COLUMNADERIMPLICITS(df:DataFrame):{
def addColumn(colName:String):数据帧
}
}
StringColumnAdder扩展了ColumnAdder{
覆盖def COLUMNADERIMPLICITS(df:DataFrame)=新建{
def addColumn(colName:String):数据帧=
df.withColumn(colName,lit(colName))
}
}
trait ColumnAdder {
  protected implicit def columnAdderImplicits(df: DataFrame): ColumnAdderDataFrame
  abstract class ColumnAdderDataFrame {
    def addColumn(colName: String): DataFrame
  }
}

trait StringColumnAdder extends ColumnAdder {
  override def columnAdderImplicits(df: DataFrame) =
    new ColumnAdderDataFrame {
      def addColumn(colName: String): DataFrame =
        df.withColumn(colName, lit(colName))
    }
}