我想将一个星火数据转换成一个具有不同字段名的POJO数据集。我有一个字段的数据格式:name,date_of_birth,其中它们的类型是StringType,DateType。
和一个POJO:
public class Person implements Serializable {
private String name;
private Date dateOfBirth;
}我使用以下代码成功地将其转换为dataset:
Encoder<Person> personEncoder = Encoders.bean(Person.class);
Dataset<Person> personDS = result.as(personEncoder);
List<Person> personList = personDS.collectAsList();只有当我将dataframe的列名在此之前更改为Person POJO的列名时。有没有办法让斯派克从POJO那边在田野之间映射?
我想过Gson的@SerializedName(“date_of_birth”),但它没有影响任何事情。
发布于 2021-11-02 11:22:07
如果您有一个名称映射(比如在Map中),您可以使用它在将dataframe转换为dataset之前重命名这些列。
它可以写成这样:
// I create the map, but it could be read from a config file for instance
Map<String, String> nameMapping = new java.util.HashMap<>();
nameMapping.put("id", "name");
nameMapping.put("date", "dateOfBirth");
Column[] renamedColumns = nameMapping
.entrySet()
.stream()
.map(x -> col(x.getKey()).alias(x.getValue()))
.collect(Collectors.toList())
.toArray(new Column[0]);
result.select(renamedColumns).as(personEncoder)发布于 2021-11-02 19:50:07
我不知道具体的注释。然而,这是我解决它的方法。
我会用我想要的形状创建一个特定的dataframe,然后导出它。
看起来应该是:
Dataset<Row> exportDf = df
.withColumn("dateOfBirth",
col("date_of_birth").cast(DataTypes.StringType))
.drop("date_of_birth");我编写的完整示例可以在这里找到:https://github.com/jgperrin/net.jgp.labs.spark/tree/master/src/main/java/net/jgp/labs/spark/l999_scrapbook/l002。
备注:
我假设代码中的Dataset<Row>.
result对于将日期转换为POJO中的字符串有点敏感。如果您在这个问题上需要帮助,请创建另一个这样的问题,我将很高兴地查看它。https://stackoverflow.com/questions/69802146
复制相似问题