You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala从DataFrame两列生成嵌套列表并计算乘客无UK最长飞行段

实现方案

默认你使用Scala Spark环境,代码可直接在spark-shell或Spark作业中运行。

步骤1:数据预处理

首先将逗号拼接的path字段拆分为独立国家数组,同时统一转为大写避免UK匹配出错:

import org.apache.spark.sql.functions._
import org.apache.spark.sql.Row

// 替换为你自己的原始DataFrame变量名
val processedDf = df
  .withColumn("path_arr", split(upper(col("path")), ","))

需求1:生成目标嵌套列表

如果需要将String类型的passengerId转为数字,可使用如下代码:

val data = processedDf
  .select(col("passengerId").cast("int"), col("path_arr"))
  .collect()
  .map {
    case Row(id: Int, path: Seq[String]) => (id, path.toList)
  }
  .toList

如果需要保留passengerId的String格式,调整为以下版本即可:

val data = processedDf
  .select(col("passengerId"), col("path_arr"))
  .collect()
  .map {
    case Row(id: String, path: Seq[String]) => (id, path.toList)
  }
  .toList

需求2:计算未途经UK的最长飞行段长度

思路为将全路径按UK分割为多个独立段,取所有段的最大长度:

// 定义计算逻辑UDF
val maxNoUkLengthUdf = udf((path: Seq[String]) => {
  val segments = path.foldLeft(List(List.empty[String])) { (acc, country) =>
    if (country == "UK") acc :+ List.empty[String]
    else acc.init :+ (acc.last :+ country)
  }
  segments.map(_.length).maxOption.getOrElse(0)
})

// 生成结果表
val resultDf = processedDf
  .withColumn("max_no_uk_length", maxNoUkLengthUdf(col("path_arr")))
  .select("passengerId", "path", "max_no_uk_length")

// 查看结果
resultDf.show()

内容的提问来源于stack exchange,提问作者idiotsavant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:54:03