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|
+-------+-----------+
再创建一个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])
【讨论】:
感谢 Manoj 使用 DataFrame 似乎是最好的解决方案。以上是关于scala过滤操作过滤CSV文件的主要内容,如果未能解决你的问题,请参考以下文章
Kettle使用_31 CSV文件输入跳过第一(首)行之过滤记录
Kettle使用_31 CSV文件输入跳过前几(首)行之过滤记录