将多个文件解析为SparkRDD

时间:2017-10-30 11:17:36

标签: apache-spark java-8 bigdata rdd

我们有多个文件,其数据结构如下:

file1.txt

idUser: 34 
Name: User1
Activity: 34 
Comments: I like this 

idUser: 45
Name: User43
Activity: 12 
Comments: I don'y like this activity

file2.txt

idUser: 45
Name: User43
Activity: 678
Comments: I like this activity but not much 

我们可以拥有数千个文件和数百万条记录。我们计划在Spark中使用这些文件进行数据分析。

我已经加载了我的文件:

 JavaPairRDD<String, String> files = context.wholeTextFiles(inputPath); 

我想将此数据结构转换为JavaPairRDD<Integer, List<UserActivity>

用户活动是每个文件中的条目。谁知道如何进行这种转变?有没有人知道更快地使用分区,因为我有超过5亿条记录?

2 个答案:

答案 0 :(得分:1)

如果需要将JavaPairRDD数据结构转换为具有不同数据结构的JavaPairRDD,则可以使用.mapToPair()命令进行转换。

例如:

JavaPairRDD<Integer, List<UserActivity>> newStruct = files.mapToPair(new MyConverter());

public class MyConverter implements PairFunction<Tuple2<Tuple2<String, String>, Long>, Integer, List<UserActivity>> {
    public Tuple2<Integer, List<UserActivity>> call(Tuple2<Tuple2<<String, String>, Long> val) {
        return ...
    }
}

其他例子:

https://www.programcreek.com/java-api-examples/index.php?class=org.apache.spark.api.java.JavaRDD&method=mapToPair

<强>更新

问题已更新,所以我更新了答案。使用当前结构,它看起来像:

JavaPairRDD<Integer, List<UserActivity>> newStruct = files.mapToPair(new MyConverter());

public class MyConverter implements PairFunction<Tuple2<String, String>, Integer, List<UserActivity>> {
    public Tuple2<Integer, List<UserActivity>> call(Tuple2<String, String> val) {
        return ...
    }
}

答案 1 :(得分:1)

为什么要JavaPairRDD<Integer, List<UserActivity>>?你不认为JavaPairRDD<Integer, UserActivity>就够了吗?我认为它可以让你避免后来的许多问题。

如果您想在另一个JavaPairRDD中转换JavaPairRDD,您可以使用地图,请参阅this post