Как использовать pivot в & ldquo; SPARKSQL & rdquo; для типа столбца String [duplicate]

Поля не переопределяются в 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;
    }
}
12
задан zero323 28 May 2016 в 10:37
поделиться

1 ответ

Предполагая, что комбинации (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|
## +---+----+--------+--------+--------+
18
ответ дан zero323 27 August 2018 в 08:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: