簡體   English   中英

將字符串數組數組轉換為java中字符串數組的火花數據幀

[英]Convert array of array of strings to a spark dataframe of array of strings in java

我正在嘗試將string[][]轉換為由string[]組成的Dataset<Row>列。 我已經瀏覽了在線文檔和可用示例,但找不到與此類似的內容。 我不知道這是否可能,因為我是 Spark 的完全初學者。

樣本輸入:
String[][] test = {{"test1"}, {"test2", "test3"}, {"test4", "test5"}};
示例輸出:

Dataset<Row> test_df
test_df.show()
+-------------+
|          foo|
+-------------+
|      [test1]|
|[test2,test3]|
|[test4,test5]|
+-------------+

我可能為 string[][] 定義了錯誤的 structType,我也嘗試過不同的方法。 這是我想要做的:


    String[][] test = {{"test1"}, {"test2", "test3"}, {"test4", "test5"}};
    
    List<String[]> test1 = Arrays.asList(test);
    
    StructType structType = DataTypes.createStructType(
        DataTypes.createStructField(
                   "foo", 
                   DataTypes.createArrayType(DataTypes.StringType), 
                   true));
    
    Dataset<Row> t = spark.createDataFrame(test1, structType);
    t.show();

您的代碼的問題在於您正在嘗試使用一種方法( spark.createDataFrame(List<Row>, StructType) ),該方法采用Row對象列表。 但是您將它與數組列表一起使用。

有幾種方法可以克服它:

  • 從每個數組創建一個Row ,然后應用您一直使用的方法。
  • 使用 bean 編碼器創建字符串數組的數據集,然后使用行編碼器將其轉換為Row的數據集。
  • 使用 Java Bean 創建數據幀。

我認為最后一種方法是最簡單的,所以這里是你的方法。 您必須定義一個小的 Java bean,它的唯一實例變量是一個 String 數組。

public static class ArrayWrapper {
    private String[] foo;

    public ArrayWrapper(String[] foo) {
        this.foo = foo;
    }

    public String[] getFoo() {
        return foo;
    }

    public void setFoo(String[] foo) {
        this.foo = foo;
    }
}

確保 Java Bean 具有接受 String 數組的構造函數。

然后,要創建數據幀,首先從數組數組創建一個ArrayWrapper (您的 Java Bean)列表,然后使用createDataFrame(List<?>,Class<?>)方法創建一個數據幀。

String[][] test = {{"test1"}, {"test2", "test3"}, {"test4", "test5"}};
List<ArrayWrapper> list = Arrays.stream(test).map(ArrayWrapper::new).collect(Collectors.toList());
Dataset<Row> testDF = spark.createDataFrame(list,ArrayWrapper.class);
testDF.show();

列的名稱由 Java Bean 中實例變量的名稱決定。

暫無
暫無

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

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