数据集运算符(如select或filter)中“$”的含义是什么?

时间:2017-04-08 11:10:23

标签: scala apache-spark apache-spark-sql

我对使用$引用selectfilter等DataFrame运算符中的列感到困惑。

以下陈述有效:

df.select("app", "renders").show
df.select($"app", $"renders").show

但是,只有下面的第一个声明有效:

df.filter("renders = 265").show // <-- this works
df.filter($"renders" = 265).show // <-- this does not work (!) Why?!

但是,这又有效:

df.filter($"renders" > 265).show

基本上,DataFrame运算符中的$是什么以及何时/应该如何使用它?

2 个答案:

答案 0 :(得分:9)

Implicits是Scala语言的一个主要特性,它采用了很多不同的形式 - 比如implicit类,我们很快就会看到。它们有不同的目的,它们都有不同程度的辩论,关于它们有多么有用或危险。最终,implicits通常归结为简单地让编译器在将它们带入范围时将一个类转换为另一个类。

为什么这很重要?因为在Spark中有一个名为implicit的{​​{1}}类,它赋予StringToColumn其他功能。尽可能seeStringContextStringToColumn方法添加到Scala类$。此方法生成StringContext,扩展ColumnName

所有这一切的最终结果是,Column方法允许您处理列的名称,表示为$,就好像它是String本身一样。明智地使用Implicits可以产生这样的方便转换,使开发更容易。

所以让我们用它来了解你发现了什么:

Column - 成功,因为df.select("app","renders").show需要多个select s

String - 成功,因为df.select($"app",$"renders").show在应用select次转换后获得了多个Columns个结果

implicit - 成功,因为Spark支持类似SQL的过滤器

df.filter("renders = 265").show - 失败,因为转化df.filter($"renders" = 265).show$"renders"类型为Column,而implicit使用自定义Column {{ 3}}表示相等(与SQL中的情况不同)。

=== - 成功,因为您在df.filter($"renders" > 265).show转化后使用了Columnimplicit>上是operator。< / p>

答案 1 :(得分:4)

$是一种将字符串转换为具有该名称的列的方法。 select的两个选项最初都是因为select可以接收列或字符串。 当您执行过滤器$"renders" = 265时,尝试为列分配编号。另一方面,>是一种比较方法。您应该使用===代替=