Spark是在java语言中加载数据集的最佳方式

时间:2017-05-09 19:42:47

标签: java apache-spark spark-dataframe

我有这样的数据集:

结果categoricF1 categoricF2 categoricF3

N red a apple

P green b banana

...

然后我将每列中的每个元素转换为位表示 例如:red为10000,green为01000,然后我将在BigInteger数组中存储10000。我将对数据集

中的每个元素执行相同的过程

此案例加载数据的最佳方法是什么? (数据框,数据集,RDD)

我需要Java代码。非常感谢您的帮助

1 个答案:

答案 0 :(得分:0)

Spark数据集与RDD类似,但是,它们使用专门的编码器来序列化对象以便通过网络进行处理或传输,而不是使用Java序列化或Kryo。虽然编码器和标准序列化都负责将对象转换为字节,但编码器是动态生成的代码,并使用一种格式,允许Spark执行许多操作,如过滤,排序和散列,而无需将字节反序列化回对象。

例如,您有一个类ClassName,其中包含数据中所需的所有参数。

import java.io.Serializable;

public class ClassName implements Serializable {
    private String result;
    private String categoricF1;
    private String categoricF2;
    private String categoricF3;

    public String getResult() {
        return result;
    }

    public String getCategoricF1() {
        return categoricF1;
    }

    public String getCategoricF2() {
        return categoricF2;
    }

    public String getCategoricF3() {
        return categoricF3;
    }

    public void setResult(String result) {
        this.result = result;
    }

    public void setCategoricF1(String categoricF1) {
        this.categoricF1 = categoricF1;
    }

    public void setCategoricF2(String categoricF2) {
        this.categoricF2 = categoricF2;
    }

    public void setCategoricF3(String categoricF3) {
        this.categoricF3 = categoricF3;
    }
}

然后要创建所需数据的数据集,您可以这样编码:

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Encoder;
import org.apache.spark.sql.Encoders;
import org.apache.spark.sql.SparkSession;

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        SparkSession spark = SparkSession
                .builder()
                .appName("Java Spark SQL basic example")
                .master("local")
                .getOrCreate();

// Create an instance of a Bean class
        ClassName elem1 = new ClassName();
        elem1.setResult("N");
        elem1.setCategoricF1("red");
        elem1.setCategoricF2("a");
        elem1.setCategoricF3("apple");

        ClassName elem2 = new ClassName();
        elem2.setResult("P");
        elem2.setCategoricF1("green");
        elem2.setCategoricF2("b");
        elem2.setCategoricF3("banana");

        List<ClassName> obj = new ArrayList<>();
        obj.add(elem1);
        obj.add(elem2);

// Encoders are created for Java beans
        Encoder<ClassName> classNameEncoder = Encoders.bean(ClassName.class);
        Dataset<ClassName> javaBeanDS = spark.createDataset(obj, personEncoder);
        javaBeanDS.show();
    }
}