【问题标题】:Iterating rows of a Spark Dataset and applying operations in Java API迭代 Spark 数据集的行并在 Java API 中应用操作
【发布时间】:2020-07-21 04:26:19
【问题描述】:

Spark (2.4.x) 新手并使用 Java API(不是 Scala!!!)

我有一个Dataset,我已从 CSV 文件中读取它。它有一个架构(命名列),如下所示:

id (integer)  |  name (string)  |  color (string)  |  price (double)  |  enabled (boolean)

示例行:

23 | "hotmeatballsoup" | "blue" | 3.95 | true

数据集中有许多(数万)行。我想使用正确的 Java/Spark API 编写一个表达式,它会滚动每一行并对每一行应用以下两个操作:

  1. 如果价格为null,则默认为0.00;然后
  2. 如果颜色列值为“红色”,则在价格中添加2.55

由于我对 Spark 还很陌生,我什至不知道从哪里开始!到目前为止,我的最佳尝试肯定是错误的,但我猜这至少是一个起点:

Dataset csvData = sparkSession.read()
    .format("csv")
    .load(fileToLoad.getAbsolutePath());

// ??? get rows somehow
Seq<Seq<String>> csvRows = csvData.getRows(???, ???);

// now how to loop through rows???
for (Seq<String> row : csvRows) {
    // how apply two operations specified above???
    if (row["price"] == null) {
        row["price"] = 0.00;
    }

    if (row["color"].equals("red")) {
        row["price"] = row["price"] + 2.55;
    }
}

有人可以在这里帮助我朝着正确的方向前进吗?

【问题讨论】:

    标签: java apache-spark apache-spark-dataset


    【解决方案1】:

    您可以使用 spark sql api 来实现它。空值也可以替换为使用来自DataFrameNaFunctions.fill() 的值。否则,您可以将 Dataframe 转换为 Dataset 并在.map 中执行这些步骤,但在这种情况下 sql api 更好更高效。

    +---+---------------+-----+-----+-------+
    | id|           name|color|price|enabled|
    +---+---------------+-----+-----+-------+
    | 23|hotmeatballsoup| blue| 3.95|   true|
    | 24|            abc|  red|  1.0|   true|
    | 24|            abc|  red| null|   true|
    +---+---------------+-----+-----+-------+
    

    在类声明之前导入 sql 函数:

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

    sql 接口:

    df.select(
            col("id"), col("name"), col("color"),
            when(col("color").equalTo("red").and(col("price").isNotNull()), col("price").plus(2.55))
            .when(col("color").equalTo("red").and(col("price").isNull()), 2.55)
            .otherwise(col("price")).as("price")
            ,col("enabled")
    ).show();
    

    或使用临时视图和 sql 查询:

    df.createOrReplaceTempView("df");
    spark.sql("select id,name,color, case when color = 'red' and price is not null then (price + 2.55) when color = 'red' and price is null then 2.55 else price end as price, enabled from df").show();
    

    输出:

    +---+---------------+-----+-----+-------+
    | id|           name|color|price|enabled|
    +---+---------------+-----+-----+-------+
    | 23|hotmeatballsoup| blue| 3.95|   true|
    | 24|            abc|  red| 3.55|   true|
    | 24|            abc|  red| 2.55|   true|
    +---+---------------+-----+-----+-------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 2019-07-22
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      相关资源
      最近更新 更多