Java 使用自定义对象作为ApacheSpark中数据帧的键进行映射

Java 使用自定义对象作为ApacheSpark中数据帧的键进行映射,java,apache-spark,spark-dataframe,Java,Apache Spark,Spark Dataframe,我无法从RDD创建数据帧 首先,我使用Spark创建我正在使用的数据(通过对workers的模拟),作为回报,我得到了报告对象 这些报表对象由两个HashMap组成,其中映射和定制之间的键几乎相同,值为整数/双精度。值得注意的是,我目前需要这些关键点和贴图,以便在模拟过程中有效地添加和更新值,因此将其更改为“平面”对象可能会损失很多效率 public class Key implements Serializable, Comparable<Key> { private f

我无法从RDD创建数据帧

首先,我使用Spark创建我正在使用的数据(通过对workers的模拟),作为回报,我得到了报告对象

这些报表对象由两个HashMap组成,其中映射和定制之间的键几乎相同,值为整数/双精度。值得注意的是,我目前需要这些关键点和贴图,以便在模拟过程中有效地添加和更新值,因此将其更改为“平面”对象可能会损失很多效率

public class Key implements Serializable, Comparable<Key> {

    private final States states;
    private final String event;
    private final double age;

    ...
}
使用getter和setter,但是有没有一种方法可以直接使用Tuple2(或类似的东西)来创建数据帧?这甚至可以给我一个很好的数据库结构

我试过像这样使用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, ????);
JavaRDD reports=dataSet.map(新的模拟函数(每个工作者的复制)).cache();
javarddevents=reports.flatMap(新的flatMap函数(){
@凌驾
公共Iterable调用(Report t)引发异常{
List List=newarraylist(t.getEvents().size());
对于(条目:t.getEvents().entrySet()){
添加(新的Tuple2(entry.getKey(),entry.getValue());
}
退货清单;
}
});
DataFrame schemaEvents=sqlContext.createDataFrame(事件);
但我不知道该把什么放在问号的地方


希望我已经说得够清楚了,你能对此有所了解。提前谢谢你

正如zero323所说,我不可能做我想做的事。从现在起,我只吃豆子。

这行不通。如果您想在
数据帧中使用自定义数据,您必须实现一个UDT,并映射到基本SQL类型。@zero323:哦,好的。我有点想这是行不通的,但我必须确定。那我就继续用豆子吧!谢谢
public class Event implements Serializable {

    private String stateOne;
    private String stateTwo;

    private String event;
    private Double age;

    private Integer value;

    ...
}
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, ????);