Hive: получение строк из таблицы путем сопоставления строк из другой таблицы, не имеющей общих столбцов - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть две таблицы.

Таблица 1:

метка времени

Таблица 2:

timestamp_lower_bound, timestamp_upper_bound

Я хочу чтобы выбрать строки из таблицы 1, если временная метка находится между нижней границей и верхней границей в таблице 2 в улье.

Я попробовал следующий код.

SELECT *
FROM Table1
where from_unixtime(unix_timestamp(timestamp, 'yyyy-MM-dd HH:mm:ss.SSS'),'yyyy-MM-dd HH:mm') 
BETWEEN (select from_unixtime(unix_timestamp(timestamp_lower_bound, 'yyyy-MM-dd HH:mm:ss.SSS'),'yyyy-MM-dd HH:mm') from Table2) 
AND (select from_unixtime(unix_timestamp(timestamp_upper_bound, 'yyyy-MM-dd HH:mm:ss.SSS'),'yyyy-MM-dd HH:mm') from Table2) 

И это выдает ошибку ниже.

DAG did not succeed due to VERTEX_FAILURE. failedVertices:1 killedVertices:1

Я также следовал инструкциям здесь для stackoverflow и вот код. Это также не удалось из-за сбоя вершины.

SELECT a.*
FROM Table1 AS a
WHERE EXISTS
    (SELECT 1
     FROM Table2 AS b
     WHERE a.timestamp BETWEEN from_unixtime(unix_timestamp(b.timestamp_lb, 'yyyy-MM-dd HH:mm:ss.SSS'),'yyyy-MM-dd HH:mm') 
     AND from_unixtime(unix_timestamp(b.timestamp_ub, 'yyyy-MM-dd HH:mm:ss.SSS'),'yyyy-MM-dd HH:mm') )

Есть идеи, как это сделать? Не обязательно делать это в Hive, Spark тоже работает. Есть идеи?

EIDT

Вот игрушечный пример.

Предположим, что в таблице 1 есть временная метка, у меня есть следующее.

|---------------------|
|    Timestamp        |  
|---------------------|
|  2018-01-15 17:56   | 
|---------------------|
|  2019-04-29 08:43   | 
|---------------------|
|  2018-10-23 23:43   | 
|---------------------|
|  2018-08-21 04:54   | 
|---------------------|
|  2019-12-06 14:09   | 
|---------------------|

В Таблице 2 у меня есть следующие верхние и нижние границы.

|----------------------|------------------------|
|timestamp_lower_bound |timestamp_upper_bound   |
|----------------------|------------------------|
|  2018-04-15 12:37    |  2018-04-15 12:57      |
|----------------------|------------------------|
|  2018-10-23 23:38    |  2018-10-23 23:58      |
|----------------------|------------------------|
|  2018-08-21 04:50    |  2018-08-21 05:10      |
|----------------------|------------------------|

В этом случае следует выбирать только третью и четвертую запись в Таблице 1. Как мне этого добиться?

1 Ответ

0 голосов
/ 06 февраля 2020

В соответствии с приведенным выше примером, он четко указывает, что «Таблица2» содержит одинаковые данные в обоих столбцах (timestamp_lower_bound и timestamp_upper_bound), т. Е. Дата, можно изменить только «ЧЧ: ММ» или изменить только «ММ».

нет необходимости сканировать оба столбца, если мы сканируем только один столбец, этого будет достаточно.

Например:

create table table1
(TTimestamp string);

insert into table1 values('2018-01-15 17:56');
insert into table1 values('2019-04-29 08:43');
insert into table1 values('2018-10-23 23:43');
insert into table1 values('2018-08-21 04:54');
insert into table1 values('2019-12-06 14:09');

create table table2
(timestamp_lower_bound string,
timestamp_upper_bound  string);

insert into table2 values('2018-04-15 12:37','2018-04-15 12:57');
insert into table2 values('2018-10-23 23:43','2018-10-23 23:58');
insert into table2 values('2018-08-21 04:54','2018-08-21 05:10');
select TTimestamp from table1 where TTimestamp in(select timestamp_lower_bound from table2);

TTimestamp
2018-08-21 04:54
2018-10-23 23:43

Здесь я взял тип данных в виде строки и вставил запись как есть. В вашем случае вы можете использовать запрос ниже.

select TTimestamp from table1 where from_unixtime(unix_timestamp(timestamp, 'yyyy-MM-dd HH:mm:ss.SSS'),'yyyy-MM-dd HH:mm') in(select from_unixtime(unix_timestamp(timestamp_lower_bound, 'yyyy-MM-dd HH:mm:ss.SSS'),'yyyy-MM-dd HH:mm') from table2); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...