#sql #hive #amazon-dynamodb #hiveql
Вопрос:
У меня есть внешняя таблица в улье под названием «ddb_betaaccounthistory», которая ссылается на таблицу DynamoDB.
Схема является:
CREATE EXTERNAL TABLE ddb_betaaccounthistory (
customer_id STRING,
date_action_id STRING,
`date` BIGINT,
action STRING,
client STRING,
ddbkmsig BINARY,
action_description BINARY,
reason STRING
time_to_live BIGINT)
STORED BY ...
В некоторых строках time_to_live есть пустые поля, потому что они заполнены не полностью.
Я пытаюсь УДАЛИТЬ все элементы с атрибутом «дата» старше этой отметки времени: 1586551523, что составляет 18 месяцев в прошлом, 10 апреля 2020 года, и сохранить все элементы после этой даты.
Я попробовал этот запрос. Насколько я понимаю, этот запрос hive должен СОХРАНИТЬ элементы, созданные после этой метки времени unix 1586551523, и удалить все остальное:
INSERT OVERWRITE TABLE ddb_betaaccounthistory
SELECT * FROM ddb_betaaccounthistory
WHERE `date` > 1586551523;
Я также пробовал это, и это все еще ничего не удаляет из таблицы.
INSERT OVERWRITE TABLE ddb_betaaccounthistory
SELECT * FROM ddb_betaaccounthistory
WHERE `date` > unix_timestamp() - 47340000;
Date
отформатирован как временная метка unix.
Количество элементов во внешней таблице ddb_betaaccounthistory остается неизменным после выполнения инструкций INSERT OVERWRITE. И в моей таблице DynamoDB нет элементов, удаленных после запроса.
Я проверил, что в моей динамической таблице действительно используются записи, когда я запускаю запрос hive, поэтому я знаю, что он правильно связан с динамической таблицей.
Что-то не так с моим запросом улья? Я понятия не имею, почему ПЕРЕЗАПИСЬ ВСТАВКИ не удаляет элементы из моей таблицы.
Ответ №1:
Не могли бы вы, пожалуйста, попробовать
INSERT OVERWRITE TABLE ddb_betaaccounthistory
SELECT * FROM ddb_betaaccounthistory
WHERE unix_timestamp(`date`)> 1586551523
Я думаю, что дата столбца-это тип данных с меткой времени, и вам нужно преобразовать время в unix для сравнения.
Комментарии:
1. Я получил следующую ошибку, когда запустил это.
Date
это ДЛИННЫЙ тип данных, поэтому он дал мнеWrong arguments `date`. The function UNIX_TIMESTAMP takes only string/timestamp/timestampwltz types
2. У улья нет длинного типа данных. Это
date
большой вопрос? Тогда ваш запрос должен быть в порядке. Но так как он не работает, вы можете преобразовать его в datetime и проверить, используя from_unixtime(date
) > some_date. Возможно, это поле имеет значение null в базе данных.3. Да
date
сопоставляется с БИГИНТОМ в улье. Но по какой-то причине мой запрос все еще не удаляет ни одной строки. Один из атрибутов, который названtime_to_live
в ddb_betaaccounthistory, в некоторых строках равен нулю. Не каждая строка имеетtime_to_live
атрибут. Может ли это быть проблемой?4. Да,null может быть q problem.in значение hive null по сравнению с чем-либо будет равно false.