我的理解:如果我有一個擴展第二個模型類的模型類,我應該無法訪問子類中父類的私有成員(除非我使用反射)。
擴展這一點,我希望當 Spark 資料幀被編碼為子模型類的資料集時,它不應該包含包含父模型類的私有成員的列。(但這不是我觀察到的。)
更具體地說,我的父類:
public class Foo {
private int one;
protected String two;
protected double three;
}
子類:
public class Bar extends Foo {
private int four;
protected String five;
}
我有幾個Bar用于創建 Spark 資料框的物件,Dataset<Row>例如:
Dataset<Row> barDF = session.createDataframe(barList, Bar.class);
稍后,當我想將其編碼為資料集時,
Dataset<Bar> barDS = barDF.as(Encoders.bean(Bar.class));
我希望barDS有四列(不包括one的私有成員Foo)。但結果barDS.show()卻是:
------ ------ ----- ------- -----
| five | four | one | three | two |
------ ------ ----- ------- -----
| 9 | 9 | 0 | 3.0 | 3 |
| 16 | 16 | 0 | 4.0 | 4 |
------ ------ ----- ------- -----
我期望one不存在于資料集中缺少什么?另外,我可以使用什么編碼來代替 bean 編碼,以便遵守 Java 的繼承規則?
uj5u.com熱心網友回復:
正如@Ivo Beckers評論幫助澄清的那樣,Spark必須使用反射。但看起來它使用 getter 和 setter 來實際訪問這些欄位。one因此,如果我為as宣告 getter/setter protected,一切都會按預期作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/479839.html
