如果在 Java 中可以使用参数化/泛型类的数据集,我一直在徘徊。更清楚地说,我想要实现的是这样的:
Dataset<MyClass<Integer>> myClassInteger;
Dataset<MyClass<String>> myClassString;
请让我知道这是否可能。如果您也可以告诉我如何实现这一目标,我将不胜感激。谢谢!
如果在 Java 中可以使用参数化/泛型类的数据集,我一直在徘徊。更清楚地说,我想要实现的是这样的:
Dataset<MyClass<Integer>> myClassInteger;
Dataset<MyClass<String>> myClassString;
请让我知道这是否可能。如果您也可以告诉我如何实现这一目标,我将不胜感激。谢谢!
抱歉,这个问题很老,但我想记下一些注释,因为我能够通过创建一个采用类型参数的泛型类来使用 Java 中的数据集的泛型/参数化类,然后将方法放入该参数化类中。即,class MyClassProcessor<T1>
T1 可能是Integer
或String
。
不幸的是,在这种情况下,您将无法享受泛型类型的全部好处,您将不得不执行一些变通方法:
Encoders.kryo()
,否则泛型类型Object
会通过一些操作而无法正确转换为泛型类型。
map
. 例如,我阅读TypeA
并使用了 Dataset<MyClass>。TypeA.class
某些映射函数使用原始类型等......是的,您可以拥有自己班级的数据集。它看起来像Dataset<MyOwnClass>
在下面的代码中,我尝试读取文件内容并将其放入我们创建的类的数据集中。请检查下面的片段。
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.io.Serializable;
public class FileDataset {
public static class Employee implements Serializable {
public int key;
public int value;
}
public static void main(String[] args) {
// configure spark
SparkSession spark = SparkSession
.builder()
.appName("Reading JSON File into DataSet")
.master("local[2]")
.getOrCreate();
final Encoder<Employee> employeeEncoder = Encoders.bean(Employee.class);
final String jsonPath = "/Users/ajaychoudhary/Documents/student.txt";
// read JSON file to Dataset
Dataset<Employee> ds = spark.read()
.json(jsonPath)
.as(employeeEncoder);
ds.show();
}
}
我的student.txt
文件内容是
{ "key": 1, "value": 2 }
{ "key": 3, "value": 4 }
{ "key": 5, "value": 6 }
它在控制台上产生以下输出:
+---+-----+
|key|value|
+---+-----+
| 1| 2|
| 3| 4|
| 5| 6|
+---+-----+
我希望这能让您初步了解如何拥有自己的自定义类的数据集。