Как получить запись в запросе искры и улья для случая ниже - PullRequest
0 голосов
/ 05 сентября 2018

Мои данные:

User id     product_id    action

1                apple             incart
1                 apple            purchased 
1                 banana         incart
2                 banana         incart
2                 banana         purchased
3                 carrot            incart

Мне нужны выходные данные как user_id и product_id, действие которых имеет только incart, а не куплено.

Ответы [ 4 ]

0 голосов
/ 06 сентября 2018

Использование простого агрегирования + case:

SELECT t.userid, t.product_id
FROM
(
SELECT t.userid, t.product_id, 
       max(case when t.action = 'purchased' then 1 else 0 end) has_purchased,
       max(case when t.action = 'incart'    then 1 else 0 end) has_incart
FROM table t
GROUP BY t.userid, t.product_id
) s
WHERE has_purchased=0 and has_incart=1;
0 голосов
/ 05 сентября 2018

Предполагая, что у вас есть DF как это:

+-------+----------+----------+
|User_id|product_id|    action|
+-------+----------+----------+
|      1|     apple|    incart|
|      1|     apple|purchased |
|      1|    banana|    incart|
|      2|    banana|    incart|
|      2|    banana| purchased|
|      3|    carrot|    incart|
+-------+----------+----------+

подход может быть применен groupBy для создания нового поля, содержащего все действия, а затем отфильтровать по вашим желаемым условиям.

val output = df.groupBy("User_id","product_id").agg(collect_list("action").as("set"))

Затем выберите желаемое условие. В этом случае:

output.where(array_contains($"set", "incart").and(!array_contains($"set", "purchased"))).select("User_id","product_id").show()

даст ожидаемый результат:

+-------+----------+
|User_id|product_id|
+-------+----------+
|      3|    carrot|
|      1|    banana|
+-------+----------+
0 голосов
/ 05 сентября 2018

Вы можете использовать NOT EXISTS в HIVE:

SELECT t.userid, t.product_id 
FROM table t
WHERE action = 'incart' AND
      NOT EXISTS (SELECT 1 
                  FROM table t1 
                  WHERE t1.userid = t.userid and 
                        t1.product_id = t.product_id and 
                        t1.action = 'purchased'
                 );
0 голосов
/ 05 сентября 2018
val df1 = df.filter(col("action") === "purchased")
val df2 = df.filter(col("action") === "incart")
df2.join(df1,df2.col("User_id") === df1.col("User_id") && df2.col("product_id") === df1.col("product_id"),"leftanti").drop("action").show
...