如何使用spark java创建Dataframe

rnmwe5a2  于 2021-05-17  发布在  Spark
关注(0)|答案(2)|浏览(1137)

我需要在测试中创建一个Dataframe。我尝试了以下代码:

StructType structType = new StructType();
structType = structType.add("A", DataTypes.StringType, false);
structType = structType.add("B", DataTypes.StringType, false);

List<String> nums = new ArrayList<String>();
nums.add("value1");
nums.add("value2");

Dataset<Row> df = spark.createDataFrame(nums, structType);

预期结果是:

+------+------+
 |A     |B     |
 +------+------+
 |value1|value2|
 +------+------+

但不被接受。如何启动Dataframe/数据集?

eit6fx6z

eit6fx6z1#

对于spark 3.0及之前的版本, SparkSession 示例没有从对象列表和 StructType .
但是,有一种方法可以从行列表和 StructType . 因此,要使代码正常工作,必须更改 nums 从键入 ArrayList<String>ArrayList<Row> . 您可以使用rowfactory执行此操作:

// imports
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;

// code
StructType structType = new StructType();
structType = structType.add("A", DataTypes.StringType, false);
structType = structType.add("B", DataTypes.StringType, false);

List<Row> nums = new ArrayList<Row>();
nums.add(RowFactory.create("value1", "value2"));

Dataset<Row> df = spark.createDataFrame(nums, structType);

// result
// +------+------+
// |A     |B     |
// +------+------+
// |value1|value2|
// +------+------+

如果要向Dataframe中添加更多行,只需添加其他行:

// code
...

List<Row> nums = new ArrayList<Row>();
nums.add(RowFactory.create("value1", "value2"));
nums.add(RowFactory.create("value3", "value4"));

Dataset<Row> df = spark.createDataFrame(nums, structType);

// result
// +------+------+
// |A     |B     |
// +------+------+
// |value1|value2|
// |value3|value4|
// +------+------+
9lowa7mx

9lowa7mx2#

所以这是更干净的做事方式。
步骤1:为自定义类创建bean类。确保有public getter、setter和all args构造函数,并且类应该实现serializable

public class StringWrapper implements Serializable {
  private String key;
  private String value;

  public StringWrapper(String key, String value) {
    this.key = key;
    this.value = value;
  }

  public String getKey() {
    return key;
  }

  public void setKey(String key) {
    this.key = key;
  }

  public String getValue() {
    return value;
  }

  public void setValue(String value) {
    this.value = value;
  }
}

步骤2:生成数据

List<StringWrapper> nums = new ArrayList<>();
nums.add(new StringWrapper("value1", "value2"));

步骤3:将其转换为rdd

JavaRDD<StringWrapper> rdd = javaSparkContext.parallelize(nums);

步骤4:将其转换为数据集

sparkSession.createDataFrame(rdd, StringWrapper.class).show(false);

步骤5:查看结果

+------+------+
|key   |value |
+------+------+
|value1|value2|
+------+------+

相关问题