如何使用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|
+------+------+