Сначала я использую функцию окна, сортирую таблицу 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: я уже знаю, как исправить это другим способом, но я хочу знать, почему первая функция не эффективна.
Спасибо!
Я мало что знаю об искре, но из документации:
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, если это не сделано явно искрой.
Doc был стандартными страницами документации Apache. Это ссылка: spark.apache.org/docs/latest/api/java/org/apache/spark/sql/…
да. Точно я использую этот способ, чтобы исправить это. Где этот документ вы нашли? Я только что нашел документ func, подобный этому """Агрегатная функция: возвращает первое значение в группе. Функция по умолчанию возвращает первые значения, которые она видит. Она вернет первое ненулевое значение, которое она видит, когда для ignoreNulls установлено значение true. Если все значения равны нулю, то значение null возвращается """ из искрового документа.