我们有多个文件,其数据结构如下:
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亿条记录?
答案 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 ...
}
}
其他例子:
<强>更新强>
问题已更新,所以我更新了答案。使用当前结构,它看起来像:
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