将Spark SQL DataFrame转换为pojos列表的最有效方法

时间:2015-11-19 16:10:06

标签: java apache-spark apache-spark-sql

假设您从Cassandra中提取了以下Spark DataFrame:

    $.ajax({
        url: 'http://localhost:8080/',
        type: 'GET',
        success: function(data){ 

        },
        error: function(xhr, status, error) {
          var err = eval("(" + xhr.responseText + ")");
          alert(err.Message);
        }
    });

以下

DataFrame df = cassandraSqlContext.sql(query);

我想将此DataFrame转换为如下结构的Java bean列表

+-----------------+------+-----------------+-----------------------------------------------------+
|assetid          |tslice|deviceid         |value                                                |
+-----------------+------+-----------------+-----------------------------------------------------+
|085eb9c6-8a16-...|201509|085eb9c6-8a16-...|Map(xval -> 120000, type -> xsd:double, yval -> 53.0)|
|085eb9c6-8a16-...|201509|085eb9c6-8a16-...|Map(xval -> 120000, type -> xsd:double, yval -> 53.0)|
|085eb9c6-8a16-...|201509|085eb9c6-8a16-...|Map(xval -> 120000, type -> xsd:double, yval -> 53.0)|
    ...

public class DataItem {
    private UUID assetID;
    private int tslice;
    private UUID deviceID;
    private Value value;

    // getters, setters...
}

在性能和简洁性方面,Spark的最佳方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:0)

将其转换为RDD,然后将其映射到您的类中。这将返回这些对象的rdd:

val dataItem = df.rdd.map(line => DataItem(line[0], line[1].toInt ...)
val value = df.rdd.map(line => Value(line[10].toDouble, ... )

答案 1 :(得分:0)

如果您只能访问DataFrame并希望将其转换为列表pojos,则应收集数据帧并迭代org.apache.spark.sql.Row列表以填充pojos列表。

或者

你可以使用spark-cassandra连接器,它包含创建JavaRDD的方法,可以收集这些方法来获取pojos列表。

代码:

SparkContextJavaFunctions functions = CassandraJavaUtil.javaFunctions(sparkContext);
JavaRDD<DataItem> cassandraRowsRDD = functions.cassandraTable("keyspace", "table_name",
                           CassandraJavaUtil.mapRowTo(DataItem.class));
//required list of pojos
List<DataItem> = cassandraRowsRDD.collect();