Spark RDD地图1到很多

时间:2015-11-29 09:32:08

标签: apache-spark rdd spark-cassandra-connector

我是新手,我有一个问题。我正在处理使用textFile()生成的RDD,这是一个csv文件。对于每一行,我想要将多行返回到新的RDD(单个行不是多个行)。这是我的代码:

JavaRDD<LinearAccelerationEvent> linearAccelerationEventJavaRDD = csvFile.filter(
            new Function<String, Boolean>() {
                public Boolean call(String line) {
                    return line.contains("LinearAccelerationEvent");
                }
            }).map(
            new Function<String, LinearAccelerationEvent>() {
                public LinearAccelerationEvent call(String line) throws Exception {
                    String[] fields = line.split(",");
                    LinearAccelerationEvent linearAccelerationEvent = new LinearAccelerationEvent(Long.valueOf(fields[4]), Float.valueOf(fields[1]), Float.valueOf(fields[2]), Float.valueOf(fields[3]));
                    return linearAccelerationEvent;
                }
            }).cache();

我在这里做的是过滤初始csv以仅获取LinearAccelerationEvent,然后我想将这些对象映射到LinearAccelerationEvent类并生成一个新的LinearAccelerationEvent对象RDD。对于初始csv文件的每一行,我必须生成多个LinearAccelerometerEvent对象,但我不知道该怎么做。我想要这样做的原因是,以后这个RDD将被推送到像这样的cassandra:

javaFunctions(linearAccelerationEventJavaRDD).writerBuilder("d300ea832fe462598f473f76939452283de495a1", "linearaccelerationevent", mapToRow(LinearAccelerationEvent.class)).saveToCassandra();

所以理想的解决方案就是:

JavaRDD<LinearAccelerationEvent> linearAccelerationEventJavaRDD = csvFile.filter(
                new Function<String, Boolean>() {
                    public Boolean call(String line) {
                        return line.contains("LinearAccelerationEvent");
                    }
                }).map(
                new Function<String, LinearAccelerationEvent>() {
                    public LinearAccelerationEvent call(String line) throws Exception {
                        String[] fields = line.split(",");
                        for() {
                           LinearAccelerationEvent linearAccelerationEvent = new LinearAccelerationEvent(Long.valueOf(fields[4]), Float.valueOf(fields[1]), Float.valueOf(fields[2]), Float.valueOf(fields[3]));
                           return linearAccelerationEvent;
                        }
                }
            }).cache();

我可以使用foreachPartition()函数并将for循环的每个事件推送到Cassandra但我看到这种方法要慢得多。有可能不是用户foreach做我想做的事情吗?谢谢

1 个答案:

答案 0 :(得分:1)

如果我正确理解您,请返回flatMap的集合(例如列表)并致电map而不是{{1}}。这将在每个加速事件的结果RDD中生成一个值。

flatMap与调用map后面的flatten相同。如果您熟悉Hive,它类似于使用HiveQL中提供的爆炸式DTF。