Jag har ett problem som gäller Hive där jag försöker stoppa in en massa events i en ORC tabell. Traditionellt så går det ju inte att göra det direkt, utan man får köra "insert overwrite" och lägga till en ny partition eller något i tabellen.
Men, naiv som jag var så fick jag för mig att jag skulle använda transaktioner, och då kan man faktiskt göra en riktig insert.
Det som jag stoppar in är events, men egentligen så vill jag bara bara spara dom senaste om har samma user_id. Därför vill jag egentligen göra en INSERT ... ON DUPLICATE KEY UPDATE ..., men det finns ju inte i Hive.
Så det jag har gjort är att jag stoppar in allting i en partition i en tabell1, och sedan använder jag en group_by för att plocka över allting till en annan partition i en annan tabell2, och där gör jag group_by på user_id, så alla dupplikerade rader försvinner.
Problemet är nu att det inte går att göra INSERT OVERWRITE när man har transaktioner påslagna. Dom så kallade transaktionerna supportar heller inte begin och commit, utan är alltid autocomit efter varje statement. Det går inte att använda explicita LOCKS när man använder transaktioner.
Jag insåg efter att ha prövat detta att det inte finns något sätt att kunna uppdatera tabell2 som är atomiskt annat än att köra UPDATE, och update är för långsamt. Droppar jag den gammla partitionen och gör insert så blir det gitchigt för eventuella klienter som vill procka ut aggreat frånt tabellen.
Det bästa jag har kommit på är att först stoppa in group_byen i en temp tabell, och sedan göra drop på senaste partitionen i tabell2 vartefter jag kör ALTER TABLE EXCHANGE PARTITION(...) WITH TABLE TEMP; men det är ändå en dålig lösning, och eftersom jag inte kan låsa tabellen så är det ändå glitchigt.
Är det någon som vet någonting om detta, och har någon idé, så skulle jag uppskatta det.
En ide jag har själv är att skita i Hive och köra Hbase. Tänker mig då att man bara skulle kunna använda user_id som key och att den då skriver över alla dupplikater automatiskt. Jag vet dock inte hur bra Hbase är när det kommer till att göra aggregat.
Men, naiv som jag var så fick jag för mig att jag skulle använda transaktioner, och då kan man faktiskt göra en riktig insert.
Det som jag stoppar in är events, men egentligen så vill jag bara bara spara dom senaste om har samma user_id. Därför vill jag egentligen göra en INSERT ... ON DUPLICATE KEY UPDATE ..., men det finns ju inte i Hive.
Så det jag har gjort är att jag stoppar in allting i en partition i en tabell1, och sedan använder jag en group_by för att plocka över allting till en annan partition i en annan tabell2, och där gör jag group_by på user_id, så alla dupplikerade rader försvinner.
Problemet är nu att det inte går att göra INSERT OVERWRITE när man har transaktioner påslagna. Dom så kallade transaktionerna supportar heller inte begin och commit, utan är alltid autocomit efter varje statement. Det går inte att använda explicita LOCKS när man använder transaktioner.
Jag insåg efter att ha prövat detta att det inte finns något sätt att kunna uppdatera tabell2 som är atomiskt annat än att köra UPDATE, och update är för långsamt. Droppar jag den gammla partitionen och gör insert så blir det gitchigt för eventuella klienter som vill procka ut aggreat frånt tabellen.
Det bästa jag har kommit på är att först stoppa in group_byen i en temp tabell, och sedan göra drop på senaste partitionen i tabell2 vartefter jag kör ALTER TABLE EXCHANGE PARTITION(...) WITH TABLE TEMP; men det är ändå en dålig lösning, och eftersom jag inte kan låsa tabellen så är det ändå glitchigt.
Är det någon som vet någonting om detta, och har någon idé, så skulle jag uppskatta det.
En ide jag har själv är att skita i Hive och köra Hbase. Tänker mig då att man bara skulle kunna använda user_id som key och att den då skriver över alla dupplikater automatiskt. Jag vet dock inte hur bra Hbase är när det kommer till att göra aggregat.