scala过滤器操作以过滤CSV文件

时间:2018-06-16 06:17:46

标签: scala

如何使用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

感谢您的帮助。

1 个答案:

答案 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])