如何使用Scala过滤器操作仅过滤包含2009年和2010年的记录/行。
基本上,我想使用Scala Filter操作过滤csv文件,因此请选择日期列以下的所有行。
07/01/2008
07/01/2009
我正在通过读取csv中的数据来创建和编写rdd,现在我想过滤2009年,2010年的数据
val data = spark.read.csv("D:\\data.csv").rdd
感谢您的帮助。
答案 0 :(得分:1)
您无需创建RDD
。您可以使用dataframe
本身过滤数据。
你有低于df
+-------+-----------+
|country| year|
+-------+-----------+
| India| 07-01-2009|
| USA| 07-01-2010|
| USA| 01-01-2008|
| India| 07-01-2010|
| Canada| 07-01-2009|
| Canada| 02-03-2018|
+-------+-----------+
再创建一个column
filter_year
val newdf=df.withColumn("filter_year",substring(df.col("year"),8,10))
+-------+-----------+-----------+
|country| year|filter_year|
+-------+-----------+-----------+
| India| 07-01-2009| 2009|
| USA| 07-01-2010| 2010|
| USA| 01-01-2008| 2008|
| India| 07-01-2010| 2010|
| Canada| 07-01-2009| 2009|
| Canada| 02-03-2018| 2018|
+-------+-----------+-----------+
现在应用filter
条件和drop
新添加的column
val ans=newdf.filter("filter_year in (2009,2010)").drop("filter_year")
+-------+-----------+
|country| year|
+-------+-----------+
| India| 07-01-2009|
| USA| 07-01-2010|
| India| 07-01-2010|
| Canada| 07-01-2009|
+-------+-----------+
如果您有RDD
个给定数据,那么您可以执行以下操作
val rdd=spark.read.format("csv").option("header","true").option("delimiter",",").load("C:\\spark\\programs\\temp.csv").rdd
RDD将如下所示
Array[org.apache.spark.sql.Row] = Array([India, 07-01-2009], [USA, 07-01-2010], [USA, 01-01-2008], [India, 07-01-2010], [Canada, 07-01-2009], [Canada, 02-03-2018])
您只需要为数据集仔细编写以下代码行
val yearList=List(2009,2010)
rdd.filter(Row=>yearList.contains(Row(1).toString.trim.split("-")(2).toInt)).collect
您将得到如下所示的欲望输出
Array[org.apache.spark.sql.Row] = Array([India, 07-01-2009], [USA, 07-01-2010], [India, 07-01-2010], [Canada, 07-01-2009])