为什么人们更喜欢隐式而不是继承来丰富数据框?

时间:2019-07-19 10:08:40

标签: scala apache-spark

如果我有一个数据框df1,我想通过添加列(其值是从原始列的组合中推导出)来丰富到df2的,那么我会看到4个选项:

df2 = Enricher.enrich(df1)

我了解到实用程序类太冗长,因此以下(更实用的方式)也没有太大吸引力:

df2 = df1.map(Enricher.enrich(_))

我觉得语法的黄金国看起来更像这样:

df2 = df1.enrich

我看到两种方法可以做到这一点:

  • 继承:CustomerInfos extends Dataframe,在其中我创建方法enrich,该方法具有使df1df2实例成为自定义类CustomerInfos的效果
  • 隐含:基本上import Enricher.implicits._使我的enrich方法神奇地出现在df1

我什至可以想象以下内容,这些内容我主要用于DTO类:

df1 = CustomerInfosDf("path/to/df")
df2 = df1(enrich=true)

为什么我发现的每个实例都避免像黑色瘟疫那样避免继承?为什么在将浓缩器仅用于一个特定数据帧上的一个用例的情况下,隐含隐含内容直到范围的尽头?这是我不了解的性能问题,还是只是炫耀疯狂的火花技能?

1 个答案:

答案 0 :(得分:1)

请查看以下几点对您有帮助-

  • 您自己的代码和的库之间存在根本差异 其他人:您可以根据需要更改或扩展自己的代码,但是如果 您想使用别人的图书馆,通常必须将它们当作 他们是。例如,String类是JDK的一部分,并且已被声明为“最终”,因此无法继承/自定义。如果您想丰富它-继承无济于事,只有“隐式”构造可以。

  • 我也相信-隐式避免混乱和模棱两可。例如-如果您要将RDD保留为cassandra,则无需查看 用于其他任何特定版本的“ RDD”类。您可以简单地调用rdd.saveToCassandra。这可以极大地帮助API的最终用户。

隐含性是scala语言的构造,而不是spark框架的构造。但是,Spark社区在很大程度上利用了它。