Hive Query для выбора строк, соответствующих нескольким критериям - PullRequest
0 голосов
/ 26 января 2019

У меня есть таблица, которая выглядит примерно так (столбец 1 - это URL, столбец 2 - идентификатор действия, а столбец 3 - идентификатор пользователя):

1    2    3   
=========== 
d    x    a   
d    q    a 
e    y    a
f    z    a
f    z    b
d    i    b
e    x    b
d    i    c
g    q    c
o    q    c
f    q    c

Я пытаюсь проверитьи посмотрите, есть ли строки, где col1 = 'f'.

Если col1 = 'f', мне нужно получить userID из col3, а затем проверить все строки, где col3 = userID, чтобы увидеть, есть ли строки, где col2 = 'x'.

Если есть какие-либо userID, у которых есть строка с col1 = 'f' и строка с col2 = 'x', верните все строки с userID в col3

Я улей/ sql noob, но вот некоторый код на python, который, я думаю, достиг бы того, что я пытаюсь сделать ...

df = pd.DataFrame(table)
df2 = df[df['1'].str.contains('f')]
df2['check'] = df2['2'].str.contains('x')
ids = df2[df2['check']]
df = df[df['3'].isin(ids)]

Результат моего желаемого запроса вернет

1    2    3   
=========== 
d    x    a   
d    q    a 
e    y    a
f    z    a
f    z    b
d    i    b
e    x    b

На данный момент самое близкое, что я получил, это:

SELECT * FROM log AS a
WHERE a.3 in

(
   SELECT DISTINCT 3
   FROM log
   WHERE ((to_date(log_date)) >= (date_sub(current_date, 1)))
   AND 1 = 'f'
)

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

Есть ли способ сделать это, используя только Hive / Spark?Я действительно не хочу загружать этот файл и запускать на нем скрипт Python, так как он занимает несколько ГБ, а мой офисный Wi-Fi работает медленно: (

1 Ответ

0 голосов
/ 26 января 2019

Получить все идентификаторы пользователя, где url = 'f'. Это даст вам (a,b) Используйте это, чтобы проверить ID пользователя для actionid='x '. Это даст вам (a,b) Наконец, получите все строки с идентификатором пользователя из приведенного выше.

select * from log where userid in
(
    select distinct userid from log 
    where 
            actionid ='x' and 
            userid in (select distinct userid from log where URL='f')
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...