我有一个.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"))
或者通过某种分割操作更容易实现这一点?
如果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))