为了账号安全,请及时绑定邮箱和手机立即绑定

Spark:减去同一数据集行中的值

Spark:减去同一数据集行中的值

眼眸繁星 2022-06-04 16:16:50
给定以下数据集:| 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 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

您可以考虑静态方法。简而言之:


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();


  }

}


查看完整回答
反对 回复 2022-06-04
  • 1 回答
  • 0 关注
  • 152 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号