我想根据scalaMap表示的配置转换Dataframe中的一些列。
我有两个箱子:
接收Map Map[String, Seq[String]]
以及列col1、col2,以转换col3,前提是Map中存在key=col1的实体,并且col2在该实体值列表中。
接收Map Map[String, (Long, Long)
以及col1,col2,如果在一个key=col1的Map中有一个实体,并且col2在longs的元组as(start,end)所描述的范围内,则转换col3。
示例:
案例1有这个表和Map(u1->seq(w1,w11),u2->seq(w2,w22))
+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
| u1 | w1 | v1 |
+------+------+------+
| u2 | w2 | v2 |
+------+------+------+
| u3 | w3 | v3 |
+------+------+------+
我想在col3中添加“x-”前缀,前提是它与术语匹配
+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
| u1 | w1 | x-v1 |
+------+------+------+
| u2 | w2 | x-v2 |
+------+------+------+
| u3 | w3 | v3 |
+------+------+------+
案例2:此表和Map(“u1”->(1,5),u2->(2,4))
+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
| u1 | 2 | v1 |
+------+------+------+
| u1 | 6 | v11 |
+------+------+------+
| u2 | 3 | v3 |
+------+------+------+
| u3 | 4 | v3 |
+------+------+------+
预期输出应为:
+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
| u1 | 2 | x-v1 |
+------+------+------+
| u1 | 6 | v11 |
+------+------+------+
| u2 | 3 | x-v3 |
+------+------+------+
| u3 | 4 | v3 |
+------+------+------+
这可以很容易地由udf来完成,但就性能而言,我不想使用它们。
在spark 2.4.2中,有没有一种方法可以实现它?
谢谢
3条答案
按热度按时间xfb7svmp1#
另一种选择-
import org.apache.spark.sql.functions.typedLit
###案例1案例2
ovfsdjhp2#
cngwdvgl3#
检查以下代码。
注意-
我已将第二个案例的Map值更改为
Map("u1" -> Seq(1,5), u2 -> Seq(2, 4))
将Map值转换为json map
,将jsonMap作为列值添加到dataframe,然后对dataframe应用逻辑。如果可能的话,可以直接在jsonMap中添加值,这样就可以避免将Map转换为jsonMap。
导入所需的库。
案例1逻辑
案例1最终输出
案例2逻辑
案例2最终输出