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
相关产品推荐
相关产品推荐

