Поля не переопределяются в Java и подклассах с теми же именами полей, что и родительский класс, т. е. «только» поля родительского класса. Поэтому this.x
относится к x
, определенному в текущем классе: A
. В то время как результат: 5
.
Чтобы быть более точным: метод foo()
наследуется подклассом B
, но это не означает, что поведение унаследованного метода изменится в отношении полей экземпляров, на которые ссылаются, поскольку, поскольку указанные поля не являются overridable: выражение this.x
, которое ссылается на поле A.x
в методе foo()
, ссылается на A.x
.
Это то же самое, что и для двух предыдущих утверждений:
B b = new B();
System.out.println(b.x); // refers B.x -> 6
System.out.println(((A)b).x); // refers A.x -> 5
b.foo(); // refers under the hood A.x -> 5
Очень хороший ответ rgettman показывает, как вы можете преодолеть скрытие поля в подклассе. Альтернатива для преодоления скрытия основывается на создании поля экземпляра private
(который рекомендуется) и предоставления метода, который возвращает значение. Таким образом, вы получаете преимущество от переопределяющего механизма, и скрытие поля больше не является проблемой для клиентов классов:
class A
{
private int x = 5;
int getX(){
return x;
}
void foo()
{
System.out.println(this.getX());
}
}
class B extends A
{
private int x = 6;
int getX(){
return x;
}
}
Предполагая, что комбинации (id |type | date)
уникальны, и ваша единственная цель - поворот, а не агрегация, вы можете использовать first
(или любую другую функцию, не ограниченную числовыми значениями):
from pyspark.sql.functions import first
(df_data
.groupby(df_data.id, df_data.type)
.pivot("date")
.agg(first("ship"))
.show())
## +---+----+------+------+------+
## | id|type|201601|201602|201603|
## +---+----+------+------+------+
## | 2| C| DOCK| null| null|
## | 0| A| DOCK| PORT| PORT|
## | 1| B| PORT| DOCK| null|
## +---+----+------+------+------+
Если эти предположения неверны, вам придется предварительно агрегировать свои данные. Например, для наиболее распространенного значения ship
:
from pyspark.sql.functions import max, struct
(df_data
.groupby("id", "type", "date", "ship")
.count()
.groupby("id", "type")
.pivot("date")
.agg(max(struct("count", "ship")))
.show())
## +---+----+--------+--------+--------+
## | id|type| 201601| 201602| 201603|
## +---+----+--------+--------+--------+
## | 2| C|[1,DOCK]| null| null|
## | 0| A|[1,DOCK]|[1,PORT]|[1,PORT]|
## | 1| B|[1,PORT]|[1,DOCK]| null|
## +---+----+--------+--------+--------+