如果我有一个数据框df1
,我想通过添加列(其值是从原始列的组合中推导出)来丰富到df2
的,那么我会看到4个选项:
df2 = Enricher.enrich(df1)
我了解到实用程序类太冗长,因此以下(更实用的方式)也没有太大吸引力:
df2 = df1.map(Enricher.enrich(_))
我觉得语法的黄金国看起来更像这样:
df2 = df1.enrich
我看到两种方法可以做到这一点:
CustomerInfos extends Dataframe
,在其中我创建方法enrich
,该方法具有使df1
和df2
实例成为自定义类CustomerInfos
的效果import Enricher.implicits._
使我的enrich
方法神奇地出现在df1
我什至可以想象以下内容,这些内容我主要用于DTO类:
df1 = CustomerInfosDf("path/to/df")
df2 = df1(enrich=true)
为什么我发现的每个实例都避免像黑色瘟疫那样避免继承?为什么在将浓缩器仅用于一个特定数据帧上的一个用例的情况下,隐含隐含内容直到范围的尽头?这是我不了解的性能问题,还是只是炫耀疯狂的火花技能?
答案 0 :(得分:1)
请查看以下几点对您有帮助-
您自己的代码和的库之间存在根本差异 其他人:您可以根据需要更改或扩展自己的代码,但是如果 您想使用别人的图书馆,通常必须将它们当作 他们是。例如,String类是JDK的一部分,并且已被声明为“最终”,因此无法继承/自定义。如果您想丰富它-继承无济于事,只有“隐式”构造可以。
我也相信-隐式避免混乱和模棱两可。例如-如果您要将RDD保留为cassandra,则无需查看 用于其他任何特定版本的“ RDD”类。您可以简单地调用rdd.saveToCassandra。这可以极大地帮助API的最终用户。
隐含性是scala语言的构造,而不是spark框架的构造。但是,Spark社区在很大程度上利用了它。