我想將 Spark 資料幀轉換為具有不同欄位名稱的 POJO 資料集。我有一個欄位的資料框:name, date_of_birth,它們的型別是IntegerType, DateType。
還有一個 POJO:
public class Person implements Serializable {
private Integer name;
private Date dateOfBirth;
}
我使用以下代碼成功將其轉換為資料集:
Encoder<Person> personEncoder = Encoders.bean(Person.class);
Dataset<Person> personDS = result.as(personEncoder);
List<Person> personList = personDS.collectAsList();
僅當我在此之前將資料框的列名稱更改為 Person POJO 的列名稱。有沒有辦法告訴 Spark 在 POJO 端的欄位之間進行映射?
我想到了 Gson 的,@SerializedName(“date_of_birth”)但它沒有影響任何事情。
uj5u.com熱心網友回復:
如果您有名稱映射,例如在 Map 中,您可以使用它在將資料框轉換為資料集之前重命名列。
可以這樣寫:
// 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)
uj5u.com熱心網友回復:
我不知道具體的注釋。但是,這是我解決它的方法。
我會用我想要的形狀創建一個特定的資料框,然后匯出它。
它看起來像:
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。
筆記:
- 我假設
result在您的代碼中是一個Dataset<Row>. - 我使用 String 作為您的日期,因為 Spark 在將日期轉換為 POJO 中的字串時有點棘手。如果您需要專門針對此問題的幫助,請創建另一個 SO 問題,我會很高興地查看它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/347529.html
標籤:爪哇 阿帕奇火花 apache-spark-sql 波乔 apache-spark-数据集
