Scala Spark shell-如何根据时间段或两个给定日期或两年之间的时间段从数据集中检索行

Scala Spark shell-如何根据时间段或两个给定日期或两年之间的时间段从数据集中检索行,scala,shell,apache-spark,Scala,Shell,Apache Spark,我最近从spark开始。我正在spark shell上练习 我有一个数据集“movies.dat”,格式如下: 电影ID、片名、类型 样本记录:- 2,Jumanji (1995),Adventure|Children|Fantasy 我想列出1985年至1995年间发行的“恐怖”电影 这是我的方法 scala> val movies_data = sc.textFile("file:///home/cloudera/cs/movies.dat") scala> val tags

我最近从spark开始。我正在spark shell上练习

我有一个数据集“movies.dat”,格式如下:

电影ID、片名、类型

样本记录:-

2,Jumanji (1995),Adventure|Children|Fantasy
我想列出1985年至1995年间发行的“恐怖”电影

这是我的方法

scala> val movies_data = sc.textFile("file:///home/cloudera/cs/movies.dat")

scala> val tags=movies_data.map(line=>line.split(","))

scala> tags.take(5)
res3: Array[Array[String]] = Array(Array(1, Toy Story (1995), Adventure|Animation|Children|Comedy|Fantasy), Array(2, Jumanji (1995), Adventure|Children|Fantasy), Array(3, Grumpier Old Men (1995), Comedy|Romance), Array(4, Waiting to Exhale (1995), Comedy|Drama|Romance), Array(5, Father of the Bride Part II (1995), Comedy))

scala> val horrorMovies = tags.filter(genre=>genre.contains("Horror"))

scala> horrorMovies.take(5)
res4: Array[Array[String]] = Array(Array(177, Lord of Illusions (1995), Horror), Array(220, Castle Freak (1995), Horror), Array(841, Eyes Without a Face (Les Yeux sans visage) (1959), Horror), Array(1105, Children of the Corn IV: The Gathering (1996), Horror), Array(1322, Amityville 1992: It's About Time (1992), Horror))
我只想使用Spark Shell检索数据。我能够检索所有“恐怖”类型的电影。
现在,有没有办法过滤掉这些电影,只得到发行年份在1985年到1995年之间的电影?

您可以编写逻辑,从分割线(数组)的第二个元素中提取年份,并与下面的范围进行比较

scala> val movies_data = sc.textFile("file:///home/cloudera/cs/movies.dat")
movies_data: org.apache.spark.rdd.RDD[String] = file:///home/cloudera/cs/movies.dat MapPartitionsRDD[5] at textFile at <console>:25

scala> val tags=movies_data.map(line=>line.split(","))
tags: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[6] at map at <console>:27

scala> val horrorMovies = tags.filter(genre => {
     | val date = genre(1).substring(genre(1).lastIndexOf("(")+1, genre(1).lastIndexOf(")")).toInt
     | date >= 1985 && date <= 1995 && genre(2).contains("Horror")
     | })
horrorMovies: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[7] at filter at <console>:29

scala> horrorMovies.take(3)
res1: Array[Array[String]] = Array(Array(177, " Lord of Illusions (1995)", " Horror"), Array(220, " Castle Freak (1995)", " Horror"), Array(1322, " Amityville 1992: It's About Time (1992)", " Horror"))
其余代码与上述代码相同


我希望答案是有用的

当我们执行这一行时scala>val horrorMovies=tags.filter(类型=>{val date=genre(1).子字符串(类型(1).lastIndexOf(“(”)+1,类型(1).lastIndexOf(“)).toInt | date>=1985&&date您的数据中是否有没有年份的行?我的意思是没有
(1995)
format?虽然我没有分析整个数据集,但我认为这是数据集本身的问题。当我将一些记录提取到文本文件中,然后应用相同的逻辑时,它会起作用。因此所有记录可能都不相似。谢谢。你也可以使用regex:)你的问题解决了吗?逻辑是正确的,只处理一小部分数据。我还尝试使用“indexOf”而不是“lastIndexOf”由于数据不一致,我们需要第一个圆括号。lastIndexOf muft将给出最后一个圆括号,该圆括号一定产生了错误。请您解释一下如何在shell中继续使用regexs进行相同的操作:
scala> val horrorMovies = tags.filter(genre => {
     | val str = """(\d+)""".r findAllIn genre(1) mkString
     | val date = if(str.length == 4) str.toInt else 0
     | date >= 1985 && date <= 1995 && genre(2).contains("Horror")
     | })
warning: there was one feature warning; re-run with -feature for details
horrorMovies: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[7] at filter at <console>:33