ВСТАВКА ПЕРЕЗАПИСИ не удаляет элементы, не работает

#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.