Spark:在同一 DataSet 行中减去值

5

以下是给定的数据集:

| title | start | end
| bla   | 10    | 30

我希望找到两个数字之间的差(起始数-结束数),并将它们设置为一个新列,使其看起来像这样:

| title | time_spent |
 | bla   | 20 |

数据类型为Dataset<Row>
dataset = dataset.withColumn("millis spent: ", col("end") - col("start")).as("Time spent");
我本来以为这个方法可以用,因为在这个问题中看到过类似的解决方案,但实际上并不能,可能是因为那个帖子讨论的是DataFrames而不是DataSets,或者Scala允许这样做而Java则不行?
1个回答

4
你可以考虑使用静态方法。简而言之:
import static org.apache.spark.sql.functions.expr;
...
df = df
    .withColumn("time_spent", expr("end - start"))
    .drop("start")
    .drop("end");

expr()函数将计算列中的值。

以下是正确的导入完整示例。抱歉,大部分示例涉及创建数据框。

package net.jgp.books.sparkInAction.ch12.lab990Others;

import static org.apache.spark.sql.functions.expr;

import java.util.ArrayList;
import java.util.List;

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;

/**
 * Use of expr().
 * 
 * @author jgp
 */
public class ExprApp {

  /**
   * main() is your entry point to the application.
   * 
   * @param args
   */
  public static void main(String[] args) {
    ExprApp app = new ExprApp();
    app.start();
  }

  /**
   * The processing code.
   */
  private void start() {
    // Creates a session on a local master
    SparkSession spark = SparkSession.builder()
        .appName("All joins!")
        .master("local")
        .getOrCreate();

    StructType schema = DataTypes.createStructType(new StructField[] {
        DataTypes.createStructField(
            "title",
            DataTypes.StringType,
            false),
        DataTypes.createStructField(
            "start",
            DataTypes.IntegerType,
            false),
        DataTypes.createStructField(
            "end",
            DataTypes.IntegerType,
            false) });

    List<Row> rows = new ArrayList<Row>();
    rows.add(RowFactory.create("bla", 10, 30));
    Dataset<Row> df = spark.createDataFrame(rows, schema);
    df.show();

    df = df
        .withColumn("time_spent", expr("end - start"))
        .drop("start")
        .drop("end");
    df.show();

  }
}

1
expr("....") 是我需要的方法,functions.* 包绝对值得深入研究。 - JBoy
1
好的,我要为我的书《Spark实战,第2版》(http://jgp.net/sia)做个不太好的广告,但我正在编写一个完整的附录作为这些棒极了的函数的参考: )。我认为它们被低估了。 - jgp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接