在使用Spark(Scala)时,有时我偶然会忘记$
。最小示例:
提供一些数据:
val foo = Seq((1, "Chicago"), (2, "Berlin")).toDF("b", "city")
val bar = Seq((1, "USA"), (2, "Germany")).toDF("a", "country")
我写以下内容:
foo.join(bar, $"a" === "b").show
其行为等同于:
foo.join(bar, $"a" === lit("b")).show
但是我真正想写的是:
foo.join(bar, $"a" === $"b").show
是否有一种方法可以防止语言/类型系统/ Spark Shell接受既不使用$
也不使用lit
的表达式?
答案 0 :(得分:3)
问题是struct Boundary {
std::array<int, 4> coordinates;
int& top() { return coordinates[0]; }
const int& top() const { return coordinates[0]; }
// ...
}
Boundary sum{};
for (auto b : boundaries) {
for (auto i = 0; i < 4; ++i) {
sum.coordinates[i] += b.coordinates[i];
}
}
上的===
接受Column
(源代码):
Any
所以她没有神奇的隐式转换...
您可以使用Pimp-My-Library模式,但是很遗憾,您无法覆盖现有的 def === (other: Any): Column = withExpr {
val right = lit(other).expr
if (this.expr == right) {
logWarning(
s"Constructing trivially true equals predicate, '${this.expr} = $right'. " +
"Perhaps you need to use aliases.")
}
EqualTo(expr, right)
}
(AFAIK),但是可以实现===
,该方法只能针对{{1 }}
====
然后,Columns
将不会编译