HIVE/PRASE PŘIPOJIT na Základě PODŘETĚZEC

0

Otázka

Mám požadavek, kde musím PŘIPOJIT tweety stůl s osoby jména, jako je filtrování tweetů pokud obsahuje nějaké jméno osoby. Mám následující data:

Tweety Tabulce: (70 milionů záznamů uložených jako ÚL Tabulka)

id tweet
1 Cristiano Ronaldo, největší všech dob
2 Brad Pitt filmy
3 Náhodné tweet bez jakékoliv jméno osoby

Jména osob: (1,6 milionu jmen uložených v HDFS jako .tsv soubor)

id person_name
1 Cristiano Ronaldo
2 Brad Pitt
3 Angelina Jolie

Očekávaný Výsledek:

id tweet person_name
1 Cristiano Ronaldo, největší všech dob Cristiano Ronaldo
2 Brad Pitt filmy Brad Pitt

Co jsem se snažil tak daleko:

Obrátila jsem se na jména osob .tsv soubor do ÚLU stolu, jak dobře a pak se pokusil spojit 2 tabulky s následující HIVE dotaz:

SELECT * FROM tweets t INNER JOIN people p WHERE instr(t.tweet, p.person_name) > 0;

Snažil se s ukázkových dat a funguje to v pohodě. Ale když se snažím spustit na celou údaje (70m tweety PŘIPOJIT s 1,6 m Osoby Jména), to trvá celou věčnost. Rozhodně to nevypadá velmi efektivní.

Chtěl jsem zkusit PŘIPOJIT s PRASE (stejně jako je to považováno za něco více efektivní než ROJ PŘIPOJIT), kde mohu přímo PŘIPOJIT jména osob .tsv soubor tweety ÚLU Stůl, ale nejste si jisti, jak se PŘIPOJIT na základě podřetězec v PRASE.

Může mi někdo prosím sdílejte PRASE PŘIPOJIT syntaxi pro tento problém, pokud máte nějaký nápad? Také, prosím, navrhnout nějaké alternativy, které mohu použít?

apache-pig bigdata hadoop hive
2021-11-17 19:05:30
2

Nejlepší odpověď

1

Záměrem je vytvořit lopaty tak, že se nebudeme muset srovnávat se mnoho záznamů. Budeme zvýšit počet záznamů / připojí použít více uzlů, aby se dělat práci, místo velké crossjoin.--> WHERE instr(t.tweet, p.person_name) > 0;

  1. Já bych navrhnout rozdělení tweety na jednotlivá slova. Ano znásobení počtu záznamů cestu nahoru.
  2. Filtrování 'stopwords' nebo jiné seznam slov, které se vešly do paměti.
  3. Rozdělení jmen do (firstnames) a "příjmení"
  4. Připojit tweetů a jména na "lastname" a instr(t.tweet, p.person_name) To by mělo výrazně snížit velikost dat, která budete porovnávat pomocí funkce. To bude běžet rychleji.

Pokud se chystáte dělat to pravidelně, zvažte vytvoření tabulky s druh/kbelík, aby se opravdu dělat věci, které prskání. (Aby to rychleji, jak to může snad být Nějak Sloučit, Připojit připraven.)

2021-11-18 15:59:36

Mohl byste, prosím, providemore detaily, co by mělo být výsledkem tohoto kroku: "rozdělení tweety do jednotlivých slov" například tweet 1 bude stát 6 a stop slov může být jako ", vše, čas" a možná největší a také filtrování bude mít ve dvou řadách Cristiano a Ronaldo? jo?
leftjoin

Četl, že tam nejsou tak mnoho příjmení. Například existuje asi 6000 Čínské příjmení v celkem. Hmm... to dává smysl rozdělit. +
leftjoin

Například tweet 1 bude stát 6 --> Ano. Stop slova -> jsou dobře známy slova, která nemám opravdu přidat význam. To by byl dobrý začátek, ale mohl by být přidán. (Pravděpodobně dobrý zdroj slova, která nechtěl bych' být použit jako název.) filtrování bude mít ve dvou řadách Cristiano a Ronaldo? - >žádné, pouze 1 řádek, opravdu můžete použít křestní jména, pokud jste chtěli, tak se chci jen ujistit, tento tweet "by mohla" mít zápas. (Takže buď jméno bude fungovat.) Evropské a americké kultuře obecně znovu použít křestní jména ve vyšší míře, než příjmení.
Matt Andruff

@MattAndruff Zní jako dobrý přístup. Ale dostat celeb příjmení samo o sobě je složité. Neexistuje žádný ideální způsob, jak extrahovat. Takže, já jsem jen přemýšlel, místo rozdělení tweet jednotlivé slovo a připojit se na základě celeb příjmení, Je tam nějaký způsob, jak v ÚLU rozdělit tweety na bi-gramů a tri-gramů (protože plná jména mohou být obvykle 2-3 slova), tak, že lze přímo PŘIPOJIT seznam celeb plná jména? Jako například pro tweet "christiano ronaldo věku", n-g by být "christiano ronaldo", "ronaldo věku", "christiano ronaldo věku".
CM1

Nemusíte se starat o používání příjmení. První jméno. Náhodně vybrat jakoukoliv část názvu. To není bod. Jde o to, že se snižuje počet potenciálních kandidátů. (Už je to plné stoly skenování pro potenciální zápasů). Používáte připojit snížit srovnání pro potenciální cíle, které mají alespoň nějakou šanci, že odpovídající.
Matt Andruff

Díky, tento přístup pracoval pro mě. To může potřebovat nějaké další zpracování na základě individuální případ použití, ale jinak to byl velmi efektivní.
CM1

Pokud jste našli to fungovalo pro vás a budete cítit pohodlně dělat tak můžeš označit odpověď jako odpověď?
Matt Andruff
1

Stojí za to se snaží Mapě-Připojte se. Osoba, stůl je malý a připojit se s ním mohou být převedeny na Mapě-Připojte se provozovatele, pokud se vejde do paměti. Tabulka bude vložen do každého mapper paměti.

Podívejte se VYSVĚTLIT výstup. Pokud se říká, že Common Join operator je na Reduktoru vrchol, pak zkuste zvýšit mapper kontejner paměť a upravit mapě-připojte se k nastavení převést na Mapě Připojit.

Nastavení zodpovědný za Mapu Připojit (předpokládám, že Lidé, tabulka <2,5 Gb) Snažte se narazit mapjoin tabulka velikosti 2,5 Gb (skutečná velikost) a spustit znovu vysvětlit.

 set hive.auto.convert.join=true; --this enables map-join
 set hive.auto.convert.join.noconditionaltask = true;
 set hive.mapjoin.smalltable.filesize=2500000000; --size of table to fit in memory
 set hive.auto.convert.join.noconditionaltask.size=2500000000;

Také velikost nádoby by měla být zvýšena, aby se zabránilo OOM (pokud jste na Tez):

set hive.tez.container.size=8192;  --container size in megabytes
set hive.tez.java.opts=-Xmx6144m;  --set this 80% of hive.tez.container.size

Čísla jsou jen příklad. Zkuste nastavit a zkontrolovat VYSVĚTLIT znovu, pokud to ukazuje Mapa-Join operátor, pak zkontrolujte, zda spuštění znovu, to by mělo běžet mnohem rychleji.

2021-11-18 16:24:25

Myslím, že je to solidní odpověď, pokud se to vejde do paměti.
Matt Andruff

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................