我有这样的数据集:
结果categoricF1 categoricF2 categoricF3
N red a apple
P green b banana
...
然后我将每列中的每个元素转换为位表示 例如:red为10000,green为01000,然后我将在BigInteger数组中存储10000。我将对数据集
中的每个元素执行相同的过程此案例加载数据的最佳方法是什么? (数据框,数据集,RDD)
我需要Java代码。非常感谢您的帮助
答案 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();
}
}