В таблице сортировки группы объедините другую таблицу, используя first func - PullRequest
0 голосов
/ 30 мая 2019

Сначала я использую оконную функцию, сортирую мою таблицу t1 по charge_time и ставлю t1 объединение с t2 на user_id. Я хочу получить первую запись, если t1 имеет более одной записи. Я использую first func для реализации этого

    _df = ss.sql("""
                    SELECT 
                        t1.user_id,
                        t1.pay_id,
                        t1.sku_mode,
                        t1.charge_time,
                        t1.exchange_type_t01,
                        ROW_NUMBER() OVER(PARTITION BY t1.user_id ORDER BY t1.charge_time)
                    FROM 
                        {} t1 
                    WHERE 
                        t1.refund_state = 0
                """.format(exchange_info_table))
    _df.createOrReplaceTempView('d_exchange_info')

    df = ss.sql("""
            SELECT 
                first(t1.sku_mode) AS sku_mode,
                first(t1.exchange_type_t01) AS exchange_type_t01,
                first(t1.user_id) AS user_id,
                first(t1.pay_id) AS pay_id,
                first(t1.charge_time) AS charge_time,
                first(t2.has_yxs_payment) AS has_yxs_payment,
                first(t2.has_sxy_payment) AS has_sxy_payment,
                first(t2.has_cxy_payment) AS has_cxy_payment,
                first(t2.has_sxy19_payment) AS has_sxy19_payment,
                first(t2.sxy19_join_time) AS sxy19_join_time,
                first(t2.yxs_join_time) AS yxs_join_time
            FROM
                d_exchange_info t1
            JOIN
                analytics_db.md_day_dump_users t2
            ON 
                t2.the_day = '{}'
                AND t1.user_id = t2.user_id
            GROUP BY
                t1.user_id
    """.format(st))

Я использую first func, но получу нестабильную запись по виду с записью charge_time. Если записей больше одного, иногда я получаю один, иногда - другой

Почему это происходит и как это исправить? Это проблема sparksql или у моего sql есть какая-то проблема?

PS: я уже знаю, как это исправить другим способом, но я хочу знать, почему первый функционал неэффективен.

Спасибо!

1 Ответ

1 голос
/ 30 мая 2019

Я не знаю много о искре, но из документации:

The function is non-deterministic because its results depends on order of rows 
which may be non-deterministic after a shuffle.

Кажется, ваша оконная функция производит row_number, но вы нигде не используете его.

Вам нужно либо отсортировать набор результатов, либо, если вы хотите использовать сгенерированный номер строки, добавьте where row_number=1. Вы также должны назвать свой столбец row_number, если это не сделано явно в spark.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...