scala - spark数据框中列的模式匹配字符串
问题描述
我在 spark 数据框中有一列,我需要只使用包含“xyz”的字符串搜索数据并将其存储在新列中。
Input (need the only field from column having xyz )
col A colB
A bid:76563,bid:76589,bid:76591,ms:ms15-097,xyz:3089656
B xyz:4462915,xyz:4462917,xyz:4462918
Required Output
col A colB colC
A bid:76563,bid:76589,bid:76591,ms:ms15-097,xyz:3089656 xyz:3089656
B xyz:4462915,xyz:4462917,xyz:4462918 xyz:4462915,xyz:4462917,xyz:4462918
我有 100k 行,无法使用 collect_list 在 colA 上使用 groupby,请您获取所需的输出。
解决方案
If you are using Spark 2.4+ then you can split
the colB
with comma ,
and use built in functions as expressions
import org.apache.spark.sql.functions._
import spark.implicits._
val df = Seq(
("A", "bid:76563,bid:76589,bid:76591,ms:ms15-097,xyz:3089656"),
("B", "xyz:4462915,xyz:4462917,xyz:4462918")
).toDF("colA", "colB")
val newDF = df.withColumn("split", split($"colB", ","))
.selectExpr("*", "filter(split, x -> x LIKE 'xyz%' ) filteredB")
.withColumn("colC", concat_ws(",", $"filteredB"))
.drop("split", "filteredB")
newDF.show(false)
Output:
+----+-----------------------------------------------------+-----------------------------------+
|colA|colB |colC |
+----+-----------------------------------------------------+-----------------------------------+
|A |bid:76563,bid:76589,bid:76591,ms:ms15-097,xyz:3089656|xyz:3089656 |
|B |xyz:4462915,xyz:4462917,xyz:4462918 |xyz:4462915,xyz:4462917,xyz:4462918|
+----+-----------------------------------------------------+-----------------------------------+
推荐阅读
- flutter - 如何创建一个浮动在主屏幕或任何其他应用程序顶部的按钮
- codeigniter-3 - 通过 echo 基本 URL 将两个变量传递给我的控制器。我想将开始和结束日期传递给我的控制器以创建要打印的 PDF
- mysql - 如何在 Mysql 8 中的 JSON 内的嵌套数组中搜索值?
- apache-nifi - Nifi API:是否可以删除流文件队列中的一个特定元素?
- image - 从文本输入创建透明背景图像
- c# - 将 SQL 表中的值与文本框中的条目进行比较
- scala - 如何将 DataFrame 中的行分组为由分隔符 Scala Spark 分隔的单行?
- javascript - 使用javascript聚焦时更改contenteditable div元素的边框
- python - 如何编写查询以从 url 获取 xml 文件并在现有数据库中创建 sql 表
- php - 在 Woocommerce 块中编辑标签