scala过滤操作过滤CSV文件

Posted

技术标签:

【中文标题】scala过滤操作过滤CSV文件【英文标题】:scala filter operation to filter the CSV file 【发布时间】:2018-06-16 06:17:45 【问题描述】:

如何使用 Scala 过滤操作仅过滤包含 2009 年和 2010 年的记录/行。

基本上,我想使用 Scala 过滤器操作过滤 csv 文件,因此选择日期列以下的所有行。

07/01/2008
07/01/2009

我正在通过从 csv 读取数据来创建和 rdd,现在我想过滤 2009 年、2010 年的数据

val data = spark.read.csv("D:\\data.csv").rdd

感谢您的帮助。

【问题讨论】:

你在网上看到过过滤功能的例子吗?几乎每个教程都展示了如何使用过滤器。 Filtering a spark dataframe based on date的可能重复 【参考方案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|
+-------+-----------+

再创建一个columnfilter_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])

【讨论】:

感谢 Manoj 使用 DataFrame 似乎是最好的解决方案。

以上是关于scala过滤操作过滤CSV文件的主要内容,如果未能解决你的问题,请参考以下文章

过滤多个 CSV 文本并创建新文件

使用 Java 从 CSV 文件中过滤掉数字

Kettle使用_31 CSV文件输入跳过第一(首)行之过滤记录

Kettle使用_31 CSV文件输入跳过前几(首)行之过滤记录

按创建日期过滤多个 csv 文件并连接成一个 pandas DataFrame

Plupload .csv 问题