Найти строки с большой разницей во времени и скопировать эти строки в новый столбец - PullRequest
0 голосов
/ 25 октября 2018

У меня есть файл json, как показано ниже:

{"ts": "01/03/2018 15:48:09+0530", "userid": "user1", "eventid":"EnterTripDetail" }
{"ts": "01/03/2018 15:48:09+0530", "userid": "user2", "eventid":"EnterTripDetail" }
{"ts": "01/03/2018 15:48:10+0530", "userid": "user1", "eventid":"ClickToPayTrip" }
{"ts": "01/03/2018 15:48:10+0530", "userid": "user2", "eventid":"ClickToPayTrip" }
{"ts": "01/03/2018 15:48:11+0530", "userid": "user1", "eventid":"SubmitPayment" }

Текущий код:

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;

Dataset<Row> df = spark.read().json("/examples/transaction.json");
df.show();

Теперь я хочу узнать список пользователей, которые не завершили платежи в течение 10 минутв моем случае я хочу знать пользователей, чье время между ClickToPayTrip и SubmitPayment превышает 10 минут или если нет SubmitPayment записи пользователя.

1 Ответ

0 голосов
/ 25 октября 2018

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

// get clicks and payments
Dataset<Row> clickToPayTripDF = df.where(col("eventid").equalTo("ClickToPayTrip"));
Dataset<Row> submitPaymentDF = df.where(col("eventid").equalTo("SubmitPayment"));

// join
Dataset<Row> joined = clickToPayTripDF.alias("click")
    .join(submitPaymentDF.alias("payment"), clickToPayTripDF.col("userid").equalTo(submitPaymentDF.col("userid")), "left");
// filter
Dataset<Row> result = joined
    .withColumn("clickSeconds", to_timestamp(col("click.ts"), "dd/MM/yyyy HH:mm:ss").cast("long"))
    .withColumn("paymentSeconds", to_timestamp(col("payment.ts"), "dd/MM/yyyy HH:mm:ss").cast("long"))
    .where(
        col("payment.eventid").isNull().or(
            expr("paymentSeconds-clickSeconds > 600")
        ))
    .drop("clickSeconds", "paymentSeconds")
    .select("click.userid", "click.ts", "click.eventid");

result.show(false);

Вывод:

+------+------------------------+--------------+
|userid|ts                      |eventid       |
+------+------------------------+--------------+
|user2 |01/03/2018 15:48:10+0530|ClickToPayTrip|
+------+------------------------+--------------+
...