Scala 使用隐式功能实现蛋糕模式
我有一个场景,我想实现蛋糕模式的一个变体,但向类(Spark数据帧)添加隐式功能 因此,基本上,我希望能够运行如下代码: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 并得出如下结果: +---
特征变换器{
这个: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))
}
}