簡體   English   中英

Apache Spark 在 Java 中具有參數化/通用類的數據集

[英]Apache Spark having Dataset of a parameterised/generic class in Java

如果在 Java 中可以使用參數化/通用類的數據集,我總是徘徊。 更清楚地說,我希望實現的是這樣的:

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

請讓我知道這是否可行。 如果您還可以向我展示如何實現這一目標,我將不勝感激。 謝謝!

抱歉,這個問題很舊,但我想記下一些筆記,因為我能夠通過創建一個帶有類型參數的泛型類,然后將方法放入該參數化類中,從而在 Java 中使用泛型/參數化類來處理數據集。 即, class MyClassProcessor<T1>其中 T1 可以是IntegerString

不幸的是,在這種情況下,您將無法享受泛型類型的全部好處,您必須執行一些變通方法:

  • 我必須使用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|
+---+-----+

我希望這能讓您初步了解如何擁有自己的自定義類的數據集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM