我在从RDD创建DataFrame时遇到了问题。
首先,我使用Spark创建我使用的数据(通过模拟工作人员),作为回报,我获得了Report对象。
这些Report对象由两个HashMaps组成,其中键在地图和自定义之间几乎相同,值为Integer / Double。值得注意的是,我目前需要这些键和映射来在模拟过程中有效地添加和更新值,因此将其更改为“平坦”和“#34;对象可能会失去很多效率。
public class Key implements Serializable, Comparable<Key> {
private final States states;
private final String event;
private final double age;
...
}
美国是
public class States implements Serializable, Comparable<States> {
private String stateOne;
private String stateTwo;
...
}
状态曾经是Enums,但事实证明,DataFrame并不是那样的。 (字符串仍然是从Enums设置的,以确保值正确。)
问题是我想将这些映射转换为DataFrames,以便我可以使用SQL等来操作/过滤数据。
我可以通过像这样创建一个Bean来创建DataFrames
public class Event implements Serializable {
private String stateOne;
private String stateTwo;
private String event;
private Double age;
private Integer value;
...
}
使用getter和setter,但有没有办法让我可以使用Tuple2(或类似的东西)来创建我的DataFrame?哪个甚至可以给我一个很好的db结构?
我尝试过像这样使用Tuple2
JavaRDD<Report> reports = dataSet.map(new SimulationFunction(REPLICATIONS_PER_WORKER)).cache();
JavaRDD<Tuple2<Key, Integer>> events = reports.flatMap(new FlatMapFunction<Report, Tuple2<Key, Integer>>() {
@Override
public Iterable<Tuple2<Key, Integer>> call(Report t) throws Exception {
List<Tuple2<Key, Integer>> list = new ArrayList<>(t.getEvents().size());
for(Entry<Key, Integer> entry : t.getEvents().entrySet()) {
list.add(new Tuple2<>(entry.getKey(), entry.getValue()));
}
return list;
}
});
DataFrame schemaEvents = sqlContext.createDataFrame(events, ????);
但我不知道在问号所在的地方放什么。
希望我已经让自己足够清楚,并且你能够对此有所了解。提前谢谢!
答案 0 :(得分:0)
正如零323所说,我不可能做我想做的事情。从现在开始,我只会坚持使用豆子。