我对使用$
引用select
或filter
等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运算符中的$
是什么以及何时/应该如何使用它?
答案 0 :(得分:9)
Implicits是Scala语言的一个主要特性,它采用了很多不同的形式 - 比如implicit
类,我们很快就会看到。它们有不同的目的,它们都有不同程度的辩论,关于它们有多么有用或危险。最终,implicits通常归结为简单地让编译器在将它们带入范围时将一个类转换为另一个类。
为什么这很重要?因为在Spark中有一个名为implicit
的{{1}}类,它赋予StringToColumn
其他功能。尽可能see,StringContext
将StringToColumn
方法添加到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
转化后使用了Column
而implicit
在>
上是operator。< / p>
答案 1 :(得分:4)
$
是一种将字符串转换为具有该名称的列的方法。
select的两个选项最初都是因为select可以接收列或字符串。
当您执行过滤器$"renders" = 265
时,尝试为列分配编号。另一方面,>
是一种比较方法。您应该使用===
代替=
。