Spark:返回每个数据集行的所有正则表达式匹配项

问题描述 投票:0回答:1

我有一个.csv文件加载的数据集(由ds在这里模仿),其中包含2行:一行包含文章的发布日期(publishDate),另一行包含提到的名称及其在文章中的字符偏移量(allNames)。

我正在尝试计算每天提到名称的次数,我认为最好先通过映射正则表达式操作来删除allNames中的字符偏移量。看看代码:

import org.apache.spark.sql._
import org.apache.spark.sql.types._

case class Data(publishDate: String, allNames: String)

val ds = Seq(Data("01-01-2018", "Channel One,628;Channel One,755;Channel One,1449;Channel One"),
             Data("01-02-2018", "Waite Park,125;City Food,233;Adobe Flash Player,348;Charter Channel,554")).toDS()

val pattern = """([^\;\,]+),\d+""".r

val processed_ds = ds.map(data => (data.publishDate, (for (m <- pattern.findAllMatchIn(data.allNames)) yield m.group(1)).toList))

当我调用processed_ds.collect().foreach(println)时,它给出了一个完整的错误列表。

这里出了什么问题?

注意:我是Scala的新手。

编辑:

processed_ds.collect().foreach(println)的预期产量将是:

("01-01-2018", List("Channel One", "Channel One", "Channel One", "Channel One"))
("01-02-2018", List("Waite Park", "City Food", "Adobe Flash Player", "Charter Channel"))

或者通过某种分割操作更容易实现这一点?

regex scala apache-spark apache-spark-sql
1个回答
0
投票

如果regexp不是强制性的,可以使用“split”功能解决:

val result = ds.map(v => (v.publishDate, v.allNames.split(";").map(p => p.split(",")(0)).toList))
result.collect().foreach(println)

输出:

(01-01-2018,List(Channel One, Channel One, Channel One, Channel One))
(01-02-2018,List(Waite Park, City Food, Adobe Flash Player, Charter Channel))
© www.soinside.com 2019 - 2024. All rights reserved.