scala - 如何将多个字符串值减少为列中的预定义类别
问题描述
我想根据预定义的模式匹配类别减少数据框中特定列的值。
例子:
val df = spark.createDataFrame(Seq(
(1, "apple"),
(2, "banana"),
(3, "avocado"),
(4, "potato"))).toDF("Id", "category")
Id category
1 apple
2 banana
3 avocado
4 potato
期望的输出:
val df_reduced = spark.createDataFrame(Seq(
(1, "fruit"),
(2, "fruit"),
(3, "vegetable"),
(4, "vegetable"))).toDF("Id", "category")
Id category
1 fruit
2 fruit
3 vegetable
4 vegetable
这是我想出的解决方案:
df.withColumn("category", when(col("category") === "apple", regexp_replace(col("category"), "apple", "fruit"))
.otherwise(when(col("category") === "banana", regexp_replace(col("category"), "banana", "fruit"))
.otherwise(when(col("category") === "avocado", regexp_replace(col("category"), "avocado", "vegetable"))
.otherwise(when(col("category") === "potato", regexp_replace(col("category"), "potato", "vegetable"))
))))
.show
我不太喜欢这种嵌套的 when-otherwise 方法,所以我想知道:对于这项任务是否有更好、更惯用的解决方案?
解决方案
map
我想,你应该在udf
下面寻求帮助
import org.apache.spark.sql.functions._
val map=Map("Apple"->"fruit","Mango"->"fruit","potato"->"vegetable","avocado"->"vegetable","Banana"->"fruit")
val replaceUDF=udf((name:String)=>map.getOrElse(name, name))
val outputdf=df.withColumn("new_category", replaceUDF(col("category"))
样本输出:
+---+--------+------------+
| Id|category|new_category|
+---+--------+------------+
| 1| Apple| fruit|
| 2| Banana| fruit|
| 3| potato| vegetable|
| 4| avocado| vegetable|
| 5| Mango| fruit|
+---+--------+------------+
推荐阅读
- javascript - Hyperpay - COPYandPAY api
- mongodb - 如何传入条件值以在 MongoDB 中查询?
- c++ - UE4 从 C++ 创建纹理
- python - TypeError:“张量”对象不能解释为整数,张量流扫描
- c - 打印字母表中未使用的字符
- react-native - 在不同堆栈之间反应原生导航
- azure-sdk-python - Azure Forms Recognizer - 保存输出结果 SDK Python
- ajax - 如果购物车总数小于 woocommerce 购物车页面中的特定数量,如何动态隐藏按钮
- python - Folium - 提取 mxm 米的 nxn 图像
- sql - 每组所需的最大行数