使用RDD从CSV文件过滤数据

时间:2018-10-12 07:21:12

标签: csv apache-spark

我是Spark的新手,正在尝试一种方法来弄清楚如何在具有多种条件的RDD中使用过滤器并获取记录数。场景如下:

  • 有一个CSV文件,具有多个列标题,例如ID,Date,Description,Type,Year等。

如果我想找出YEAR = 2018和TYPE =喜剧片有多少条记录。

我不需要使用DataSet / DataFrame的解决方案,而只需使用带有地图和过滤器的RDD。

任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

input=sc.textFile("<<path>>");



input_filtered=input.filter(lambda row : return (row.split(",")[3]=="comedy" and row.split(",")[5]=="2018")  )


input_filetered.count()

另一种选择是将foreach与一个累加器一起使用。希望它会有所帮助。

答案 1 :(得分:0)

因此,如果您有RDD [Row]并且每一列都是StringType,那么

myRdd.filter(r => r.getAs("YEAR") == "2018" && r.getAs("TYPE") == "COMEDY")

这实际上取决于您如何读取数据。

这是您以RDD [Row]格式读取文件的方法。

val myRdd = spark.read.format("com.databricks.spark.csv").option("header","true").load("myFile.csv").rdd

答案 2 :(得分:0)

我不确定您的期望如下。

ilike_search_string = SearchHelpers.to_ilike_search_string("test data")

query = from p in Post,
  where: ilike(p.content, ^ilike_search_string)

results = Repo.all(query)

输入文件

JavaRDD<String> lines = sc.textFile("readcsvyear.csv");
            JavaRDD<String> filtered = lines.filter(line -> {
                String[] list = line.split(",");
                if(list.length >= 5 && list[4].equalsIgnoreCase("2018")) {
                    return true;
                }
                return false;
            });
            System.out.println(filtered);

            for(String line:filtered.collect()){
                System.out.println("filtered "+line);
            }

输出

1,Date,desc,type,2018
2,Date,desc,type,2018
3,Date,desc,type,2018
4,Date,desc,type,2018
5,Date,desc,type,2018
6,Date,desc,type,2017
7,Date,desc,type,2017
8,Date,desc,type,2017