使用Spark SQL在Java中调用美元登录函数
我有以下代码(Java和Spark SQL)——使用Spark SQL在Java中调用美元登录函数,java,scala,apache-spark,apache-spark-sql,Java,Scala,Apache Spark,Apache Spark Sql,我有以下代码(Java和Spark SQL)—— import static org.apache.spark.sql.functions.col; ... System.out.println(“==筛选平均年龄大于20岁的记录==”; 数据集结果=df.filter(col(“年龄”).$less(20)); 我从未在Java中遇到过一个以一美元开头的函数调用。 我试过用谷歌搜索它,但到目前为止我最好的猜测是,这是Java调用Scala代码的结果(但在Scala源代码中,没有一个$less
import static org.apache.spark.sql.functions.col;
...
System.out.println(“==筛选平均年龄大于20岁的记录==”;
数据集结果=df.filter(col(“年龄”).$less(20));
我从未在Java中遇到过一个以一美元开头的函数调用。
我试过用谷歌搜索它,但到目前为止我最好的猜测是,这是Java调用Scala代码的结果(但在Scala源代码中,没有一个$less函数)
你能对此提供一个可靠的解释吗?答案可以在这里找到- 运算符是方法 Java和Scala之间最明显的区别之一是 Scala支持运算符重载。事实上,Scala支持 运算符重载的一种变体,它比任何东西都强大 由C++、C语言或Ruby提供。除了极少数例外,任何符号 可用于定义自定义运算符。这提供了巨大的帮助 DSL的灵活性,甚至您的平均每日API(如
列表
和地图
)
显然,这一特定的语言功能无法翻译
很好地将其转换为Java。Java不支持运算符重载
在任何种类中,更不用说Scala定义的über强大形式了。
因此,Scala运算符必须编译成完全非符号的
表单位于字节码级别,否则Java互操作将是
不可修复的损坏,JVM本身将无法吞下
结果
决定这种翻译的一个好的起点是
在Scala:as方法中声明哪些运算符。每一个斯卡拉
运算符(包括一元运算符,如!
)被定义为方法
在一个类中:
抽象类列表[+A]{
定义::[B>:A](e:B)=。。。
def+[B>:A](e:B)=。。。
}
因为Scala类变成了Java类,Scala方法变成了Java
方法中,最明显的转换是采用每个运算符
方法生成相应的Java方法,并使用
大量翻译的名字。事实上,这正是Scala所做的。
上述类将编译成与此Java代码等效的代码:
公共抽象类列表{
公共列表$colon$colon(BE){…}
公开名单$plus(BE){…}
}
Scala方法语法中每个允许的符号都有一个对应的
格式“$trans
”的翻译。支持的
翻译是您需要的文档之一
希望能在Scala网站上找到。但是,唉,它是不存在的。
下表列出了我所熟悉的所有翻译
意识到:
┌────────────────┬─────────────┐
│ Scala算子│ 编译成│
├────────────────┼─────────────┤
│ = │ $情商│
├────────────────┼─────────────┤
│ > │ $更大的│
├────────────────┼─────────────┤
│ < │ $较少的│
├────────────────┼─────────────┤
│ + │ $加上│
├────────────────┼─────────────┤
│ - │ $减│
├────────────────┼─────────────┤
│ * │ $时代│
├────────────────┼─────────────┤
│ / │ div│
├────────────────┼─────────────┤
│ ! │ $猛敲│
├────────────────┼─────────────┤
│ @ │ $在│
├────────────────┼─────────────┤
│ # │ $搞砸│
├────────────────┼─────────────┤
│ % │ $百分比│
├────────────────┼─────────────┤
│ ^ │ $向上的│
├────────────────┼─────────────┤
│ & │ $放大器│
├────────────────┼─────────────┤
│ ~ │ $瓷砖│
├────────────────┼─────────────┤
│ ? │ $克马克│
├────────────────┼─────────────┤
│ | │ $酒吧│
├────────────────┼─────────────┤
│ \ │ $鞭子│
├────────────────┼─────────────┤
│ : │ $结肠│
└────────────────┴─────────────┘
使用此表,您应该能够导出任何
Scala操作符,允许在Java中使用它
理想的解决方案是,如果Java实际上支持运算符重载
可以直接使用Scala的操作符,但不知怎的,我对此表示怀疑
很快就会发生
****这个答案是由某人发布的,但由于某种原因被删除了(如果答案的原始所有者能够重新发布它,我会很高兴)因为Scala方法syn中允许的每个符号
import static org.apache.spark.sql.functions.col;
...
System.out.println("=== Filtering records with average age more than 20 ===");
Dataset<Row> result = df.filter(col("age").$less(20));
╔═══════════════════╦══════════════╗
║ Scala Operator ║ Compiles To ║
╠═══════════════════╬══════════════╣
║= ║$eq ║
║> ║$greater ║
║< ║$less ║
║+ ║$plus ║
║- ║$minus ║
║* ║$times ║
║/ ║$div ║
║! ║$bang ║
║@ ║$at ║
║# ║$hash ║
║% ║$percent ║
║^ ║$up ║
║& ║$amp ║
║~ ║$tilde ║
║? ║$qmark ║
║║ ║$bar ║
║\ ║$bslash ║
║: ║$colon ║
╚═══════════════════╩══════════════╝