将字符串数组转换为java中字符串数组的sparkDataframe

cu6pst1q  于 2021-05-22  发布在  Spark
关注(0)|答案(1)|浏览(790)

我想把一个 string[][] 变成一个 Dataset<Row> 柱由 string[] . 我已经在网上浏览了文档和可用的例子,但找不到类似的东西。我不知道这是否可能,因为我对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();
lzfw57am

lzfw57am1#

代码的问题是您试图使用一个方法( spark.createDataFrame(List<Row>, StructType) )这需要一份 Row 物体。但是你可以把它和数组列表一起使用。
有几种方法可以克服它:
创建 Row 从每个数组中,然后应用您一直使用的方法。
使用bean编码器创建字符串数组的数据集,然后将其转换为 Row 使用行编码器。
使用javabean创建dataframe。
我认为最后一种方法是最简单的,所以这里是你如何做到这一点。您必须定义一个小的javabean,它的唯一示例变量是一个字符串数组。

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;
    }
}

确保javabean有一个接受字符串数组的构造函数。
然后,要创建dataframe,首先要创建 ArrayWrapper (您的javabean),然后使用 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();

列的名称由javabean中示例变量的名称决定。

相关问题