2

如果在 Java 中可以使用参数化/泛型类的数据集,我一直在徘徊。更清楚地说,我想要实现的是这样的:

Dataset<MyClass<Integer>> myClassInteger;
Dataset<MyClass<String>> myClassString;

请让我知道这是否可能。如果您也可以告诉我如何实现这一目标,我将不胜感激。谢谢!

4

2 回答 2

1

抱歉,这个问题很老,但我想记下一些注释,因为我能够通过创建一个采用类型参数的泛型类来使用 Java 中的数据集的泛型/参数化类,然后将方法放入该参数化类中。即,class MyClassProcessor<T1>T1 可能是IntegerString

不幸的是,在这种情况下,您将无法享受泛型类型的全部好处,您将不得不执行一些变通方法:

  • 我必须使用Encoders.kryo(),否则泛型类型Object会通过一些操作而无法正确转换为泛型类型。
    • 这引入了一些其他的烦恼,即不能加入。我不得不使用像使用元组这样的技巧来允许一些连接操作。
  • 我没有尝试阅读泛型类型,我的参数化类是稍后使用map. 例如,我阅读TypeA并使用了 Dataset<MyClass>。
  • 我能够在泛型中使用更复杂的自定义类型,而不仅仅是整数、字符串等......
  • 有一些烦人的细节,比如必须传递类文字,即为TypeA.class某些映射函数使用原始类型等......
于 2021-08-25T05:24:52.237 回答
-1

是的,您可以拥有自己班级的数据集。它看起来像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|
+---+-----+

我希望这能让您初步了解如何拥有自己的自定义类的数据集。

于 2020-08-27T17:27:43.233 回答