我有一个这样的数据集:

结果categoricF1 categoricF2 categoricF3

N红苹果

P绿b香蕉

....

然后我将每列中的每个元素转换为位表示形式
例如:红色将是10000,绿色将是01000,然后将10000存储在BigInteger数组中。我将对数据集中的每个元素执行相同的过程

这种情况下加载数据的最佳方法是什么? (数据帧,数据集,RDD)

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

最佳答案

Spark数据集与RDD相似,但是,它们不使用Java序列化或Kryo,而是使用专用的Encoder对对象进行序列化以进行网络处理或传输。虽然编码器和标准序列化都负责将对象转换为字节,但是编码器是动态生成的代码,并使用一种格式,该格式允许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();
    }
}

关于java - 激发以Java语言加载数据集的最佳方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43878602/

10-11 01:33
查看更多