将自定义对象映射为 Apache Spark 中 DataFrame 的键

Map with custom object as key to DataFrame in Apache Spark

我在从 RDD 创建 DataFrame 时遇到了问题。

首先,我使用 Spark 创建我正在使用的数据(通过对工作人员的模拟),然后在 return 中我得到了 Report 对象。

这些 Report 对象由两个 HashMap 组成,其中键在映射和定制之间几乎相同,并且值为 Integer / Double。值得注意的是,我目前需要这些键和映射来在模拟过程中有效地添加和更新值,因此将其更改为 "flat" 对象可能会降低很多效率。

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;

    ...
}

状态曾经是枚举,但事实证明,DataFrame 不喜欢那样。 (字符串仍然从枚举中设置以确保值正确。)

问题是我想将这些地图转换为数据帧,以便我可以使用 SQL 等 manipulate/filter 数据。

我可以像这样创建一个 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?哪个甚至可以给我一个很好的数据库结构?

我试过这样使用 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, ????);

但我不知道问号所在的地方该放什么。

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

正如 zero323 所说,我无法做到我想做的事情。从现在开始我就坚持吃豆子。