Después de mirar en varios repositorios y sitios de internet al concluir nos hemos encontrado la respuesta que te mostraremos ahora.
A partir de la versión Hive 0.14.0: INSERTAR… VALORES, ACTUALIZAR y ELIMINAR ahora están disponibles con soporte ACID completo.
INSERTAR … VALORES Sintaxis:
INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...]
Donde fila_valores es: ( valor [, value …] ) donde un valor es null o cualquier literal SQL válido
ACTUALIZAR Sintaxis:
UPDATE tablename SET column = value [, column = value ...] [WHERE expression]
ELIMINAR Sintaxis:
DELETE FROM tablename [WHERE expression]
Además, del documento Hive Transactions:
Si se va a usar una tabla en escrituras ACID (insertar, actualizar, eliminar), entonces la propiedad de tabla “transaccional” debe establecerse en esa tabla, comenzando con Hive 0.14.0. Sin este valor, las inserciones se realizarán al estilo antiguo; Se prohibirán las actualizaciones y eliminaciones.
Referencia de colmena DML:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML
Referencia de transacciones de Hive:
https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions
No debe pensar en Hive como un RDBMS regular, Hive es más adecuado para el procesamiento por lotes en conjuntos muy grandes de datos inmutables.
Lo siguiente se aplica a las versiones anteriores a Hive 0.14, consulte la respuesta de ashtonium para versiones posteriores.
No se admite ninguna operación para eliminar o actualizar un registro en particular o un conjunto de registros en particular, y para mí esto es más una señal de un esquema deficiente.
Esto es lo que puede encontrar en la documentación oficial:
Hadoop is a batch processing system and Hadoop jobs tend to have high latency and
incur substantial overheads in job submission and scheduling. As a result -
latency for Hive queries is generally very high (minutes) even when data sets
involved are very small (say a few hundred megabytes). As a result it cannot be
compared with systems such as Oracle where analyses are conducted on a
significantly smaller amount of data but the analyses proceed much more
iteratively with the response times between iterations being less than a few
minutes. Hive aims to provide acceptable (but not optimal) latency for
interactive data browsing, queries over small data sets or test queries.
Hive is not designed for online transaction processing and does not offer
real-time queries and row level updates. It is best used for batch jobs over
large sets of immutable data (like web logs).
Una forma de evitar esta limitación es usar particiones: No sé lo que identificación corresponde, pero si obtiene diferentes lotes de ID por separado, puede rediseñar su tabla para que esté dividida por ID, y luego podrá eliminar fácilmente las particiones para las ID de las que desea deshacerse.
Sí, bien dicho. Hive no admite la opción ACTUALIZAR. Pero se podría utilizar la siguiente alternativa para lograr el resultado:
Actualizar registros en un partitioned Hive table
:
- Se supone que la mesa principal está dividida por algunos key.
- Cargue los datos incrementales (los datos que se actualizarán) en una tabla de etapas particionada con el mismo keys como mesa principal.
-
Une las dos mesas (mesas principales y provisionales) usando un
LEFT OUTER JOIN
operación de la siguiente manera:insert overwrite table main_table partition (c,d)
select t2.a, t2.b, t2.c,t2.d from staging_table t2 left outer join main_table t1 on t1.a=t2.a;
En el ejemplo anterior, el main_table
& el staging_table
se dividen usando el (c,d)
keys. Las mesas se unen a través de un LEFT OUTER JOIN
y el resultado se utiliza para OVERWRITE
las particiones en el main_table
.
Se podría utilizar un enfoque similar en el caso de un-partitioned Hive table
UPDATE
operaciones también.
Si sostienes algún reparo o capacidad de regenerar nuestro tutorial puedes realizar una anotación y con placer lo estudiaremos.