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

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

我想把一个 string[][] 变成一个 Dataset<Row> 柱由 string[] . 我已经在网上浏览了文档和可用的例子,但找不到类似的东西。我不知道这是否可能,因为我对spark完全是个初学者。
样本输入: String[][] test = {{"test1"}, {"test2", "test3"}, {"test4", "test5"}}; 样本输出:

  1. Dataset<Row> test_df
  2. test_df.show()
  3. +-------------+
  4. | foo|
  5. +-------------+
  6. | [test1]|
  7. |[test2,test3]|
  8. |[test4,test5]|
  9. +-------------+

我可能对string[][]定义了structtype错误,我也尝试了不同的方法。我想做的是:

  1. String[][] test = {{"test1"}, {"test2", "test3"}, {"test4", "test5"}};
  2. List<String[]> test1 = Arrays.asList(test);
  3. StructType structType = DataTypes.createStructType(
  4. DataTypes.createStructField(
  5. "foo",
  6. DataTypes.createArrayType(DataTypes.StringType),
  7. true));
  8. Dataset<Row> t = spark.createDataFrame(test1, structType);
  9. t.show();
lzfw57am

lzfw57am1#

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

  1. public static class ArrayWrapper {
  2. private String[] foo;
  3. public ArrayWrapper(String[] foo) {
  4. this.foo = foo;
  5. }
  6. public String[] getFoo() {
  7. return foo;
  8. }
  9. public void setFoo(String[] foo) {
  10. this.foo = foo;
  11. }
  12. }

确保javabean有一个接受字符串数组的构造函数。
然后,要创建dataframe,首先要创建 ArrayWrapper (您的javabean),然后使用 createDataFrame(List<?>,Class<?>) 方法。

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

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

展开查看全部

相关问题