Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Spark SQL在Java中调用美元登录函数_Java_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

使用Spark SQL在Java中调用美元登录函数

使用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

我有以下代码(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函数)


你能对此提供一个可靠的解释吗?

答案可以在这里找到-

运算符是方法 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        ║
╚═══════════════════╩══════════════╝