如何使用spark java创建数据帧

如何使用spark java创建数据帧,java,dataframe,apache-spark,dataset,Java,Dataframe,Apache Spark,Dataset,我需要在测试中创建一个数据帧。 我尝试了下面的代码: StructType StructType=new StructType(); structType=structType.add(“A”,DataTypes.StringType,false); structType=structType.add(“B”,DataTypes.StringType,false); List nums=new ArrayList(); 增加(“价值1”); 增加(“价值2”); 数据集df=spark.crea

我需要在测试中创建一个数据帧。 我尝试了下面的代码:

StructType StructType=new StructType();
structType=structType.add(“A”,DataTypes.StringType,false);
structType=structType.add(“B”,DataTypes.StringType,false);
List nums=new ArrayList();
增加(“价值1”);
增加(“价值2”);
数据集df=spark.createDataFrame(nums,structType);
预期结果是:

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

但这是不被接受的。如何启动数据帧/数据集?

因此这是一种更干净的方法

步骤1:为自定义类创建bean类。确保您有公共getter、setter和所有args构造函数,并且该类应该实现可序列化

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"));
步骤5:查看结果

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

对于Spark 3.0及之前的版本,
SparkSession
实例没有从对象列表和
StructType
创建数据帧的方法

但是,有一种方法可以从行列表和
StructType
构建数据帧。因此,要使代码正常工作,必须将
nums
类型从
ArrayList
更改为
ArrayList
。您可以使用以下方法完成此操作:

//导入
导入org.apache.spark.sql.Row;
导入org.apache.spark.sql.RowFactory;
//代码
StructType StructType=新StructType();
structType=structType.add(“A”,DataTypes.StringType,false);
structType=structType.add(“B”,DataTypes.StringType,false);
List nums=new ArrayList();
nums.add(RowFactory.create(“value1”、“value2”);
数据集df=spark.createDataFrame(nums,structType);
//结果
// +------+------+
//| A | B|
// +------+------+
//|值1 |值2|
// +------+------+
如果要向数据帧添加更多行,只需添加其他行:

//代码
...
List nums=new ArrayList();
nums.add(RowFactory.create(“value1”、“value2”);
nums.add(RowFactory.create(“value3”、“value4”);
数据集df=spark.createDataFrame(nums,structType);
//结果
// +------+------+
//| A | B|
// +------+------+
//|值1 |值2|
//|值3 |值4|
// +------+------+

谢谢你,但我必须在没有其他课程的情况下启动df,请不要有其他解决方案?(我用预期结果编辑了我的帖子)更新了答案。。。您要么创建一个bean类,要么创建一个自定义结构。。。我觉得bean类要干净得多
sparkSession.createDataFrame(rdd, StringWrapper.class).show(false);
+------+------+
|key   |value |
+------+------+
|value1|value2|
+------+------+