jenkins-bot has submitted this change and it was merged.

Change subject: Data loader for sending hive data to ES
......................................................................


Data loader for sending hive data to ES

Run with:
spark-submit --master yarn transferToES.py -s /tmp/source.parquet -u 
http://my.elastic/
Bug: T113440
Change-Id: Id4df5bffca445b396c875329bce005327110ddab
---
A all.dblist
A hostmap.json
A makeHostnames.py
M setup.cfg
A transferToES.py
5 files changed, 1,907 insertions(+), 1 deletion(-)

Approvals:
  EBernhardson: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/all.dblist b/all.dblist
new file mode 100644
index 0000000..71f3eba
--- /dev/null
+++ b/all.dblist
@@ -0,0 +1,892 @@
+aawiki
+aawikibooks
+aawiktionary
+abwiki
+abwiktionary
+acewiki
+advisorywiki
+afwiki
+afwikibooks
+afwikiquote
+afwiktionary
+akwiki
+akwikibooks
+akwiktionary
+alswiki
+alswikibooks
+alswikiquote
+alswiktionary
+amwiki
+amwikiquote
+amwiktionary
+angwiki
+angwikibooks
+angwikiquote
+angwikisource
+angwiktionary
+anwiki
+anwiktionary
+arbcom_dewiki
+arbcom_enwiki
+arbcom_fiwiki
+arbcom_nlwiki
+arcwiki
+arwiki
+arwikibooks
+arwikimedia
+arwikinews
+arwikiquote
+arwikisource
+arwikiversity
+arwiktionary
+arzwiki
+astwiki
+astwikibooks
+astwikiquote
+astwiktionary
+aswiki
+aswikibooks
+aswikisource
+aswiktionary
+auditcomwiki
+avwiki
+avwiktionary
+aywiki
+aywikibooks
+aywiktionary
+azwiki
+azwikibooks
+azwikiquote
+azwikisource
+azwiktionary
+azbwiki
+barwiki
+bat_smgwiki
+bawiki
+bawikibooks
+bclwiki
+bdwikimedia
+be_x_oldwiki
+betawikiversity
+bewiki
+bewikibooks
+bewikimedia
+bewikiquote
+bewikisource
+bewiktionary
+bgwiki
+bgwikibooks
+bgwikinews
+bgwikiquote
+bgwikisource
+bgwiktionary
+bhwiki
+bhwiktionary
+biwiki
+biwikibooks
+biwiktionary
+bjnwiki
+bmwiki
+bmwikibooks
+bmwikiquote
+bmwiktionary
+bnwiki
+bnwikibooks
+bnwikisource
+bnwiktionary
+boardgovcomwiki
+boardwiki
+bowiki
+bowikibooks
+bowiktionary
+bpywiki
+brwiki
+brwikimedia
+brwikiquote
+brwikisource
+brwiktionary
+bswiki
+bswikibooks
+bswikinews
+bswikiquote
+bswikisource
+bswiktionary
+bugwiki
+bxrwiki
+cawiki
+cawikibooks
+cawikimedia
+cawikinews
+cawikiquote
+cawikisource
+cawiktionary
+cbk_zamwiki
+cdowiki
+cebwiki
+cewiki
+chairwiki
+chapcomwiki
+checkuserwiki
+chowiki
+chrwiki
+chrwiktionary
+chwiki
+chwikibooks
+chwiktionary
+chywiki
+ckbwiki
+cnwikimedia
+collabwiki
+commonswiki
+cowiki
+cowikibooks
+cowikimedia
+cowikiquote
+cowiktionary
+crhwiki
+crwiki
+crwikiquote
+crwiktionary
+csbwiki
+csbwiktionary
+cswiki
+cswikibooks
+cswikinews
+cswikiquote
+cswikisource
+cswikiversity
+cswiktionary
+cuwiki
+cvwiki
+cvwikibooks
+cywiki
+cywikibooks
+cywikiquote
+cywikisource
+cywiktionary
+dawiki
+dawikibooks
+dawikiquote
+dawikisource
+dawiktionary
+dewiki
+dewikibooks
+dewikinews
+dewikiquote
+dewikisource
+dewikiversity
+dewikivoyage
+dewiktionary
+diqwiki
+dkwikimedia
+donatewiki
+dsbwiki
+dvwiki
+dvwiktionary
+dzwiki
+dzwiktionary
+eewiki
+elwiki
+elwikibooks
+elwikinews
+elwikiquote
+elwikisource
+elwikiversity
+elwikivoyage
+elwiktionary
+emlwiki
+enwiki
+enwikibooks
+enwikinews
+enwikiquote
+enwikisource
+enwikiversity
+enwikivoyage
+enwiktionary
+eowiki
+eowikibooks
+eowikinews
+eowikiquote
+eowikisource
+eowiktionary
+eswiki
+eswikibooks
+eswikinews
+eswikiquote
+eswikisource
+eswikiversity
+eswikivoyage
+eswiktionary
+etwiki
+etwikibooks
+etwikimedia
+etwikiquote
+etwikisource
+etwiktionary
+euwiki
+euwikibooks
+euwikiquote
+euwiktionary
+execwiki
+extwiki
+fawiki
+fawikibooks
+fawikinews
+fawikiquote
+fawikisource
+fawikivoyage
+fawiktionary
+fdcwiki
+ffwiki
+fiu_vrowiki
+fiwiki
+fiwikibooks
+fiwikimedia
+fiwikinews
+fiwikiquote
+fiwikisource
+fiwikiversity
+fiwiktionary
+fjwiki
+fjwiktionary
+foundationwiki
+fowiki
+fowikisource
+fowiktionary
+frpwiki
+frrwiki
+frwiki
+frwikibooks
+frwikinews
+frwikiquote
+frwikisource
+frwikiversity
+frwikivoyage
+frwiktionary
+furwiki
+fywiki
+fywikibooks
+fywiktionary
+gagwiki
+ganwiki
+gawiki
+gawikibooks
+gawikiquote
+gawiktionary
+gdwiki
+gdwiktionary
+glkwiki
+glwiki
+glwikibooks
+glwikiquote
+glwikisource
+glwiktionary
+gnwiki
+gnwikibooks
+gnwiktionary
+gomwiki
+gotwiki
+gotwikibooks
+grantswiki
+guwiki
+guwikibooks
+guwikiquote
+guwikisource
+guwiktionary
+gvwiki
+gvwiktionary
+hakwiki
+hawiki
+hawiktionary
+hawwiki
+hewiki
+hewikibooks
+hewikinews
+hewikiquote
+hewikisource
+hewikivoyage
+hewiktionary
+hifwiki
+hiwiki
+hiwikibooks
+hiwikiquote
+hiwiktionary
+howiki
+hrwiki
+hrwikibooks
+hrwikiquote
+hrwikisource
+hrwiktionary
+hsbwiki
+hsbwiktionary
+htwiki
+htwikisource
+huwiki
+huwikibooks
+huwikinews
+huwikiquote
+huwikisource
+huwiktionary
+hywiki
+hywikibooks
+hywikiquote
+hywikisource
+hywiktionary
+hzwiki
+iawiki
+iawikibooks
+iawiktionary
+idwiki
+idwikibooks
+idwikiquote
+idwikisource
+idwiktionary
+iegcomwiki
+iewiki
+iewikibooks
+iewiktionary
+igwiki
+iiwiki
+ikwiki
+ikwiktionary
+ilowiki
+ilwikimedia
+incubatorwiki
+internalwiki
+iowiki
+iowiktionary
+iswiki
+iswikibooks
+iswikiquote
+iswikisource
+iswiktionary
+itwiki
+itwikibooks
+itwikinews
+itwikiquote
+itwikisource
+itwikiversity
+itwikivoyage
+itwiktionary
+iuwiki
+iuwiktionary
+jawiki
+jawikibooks
+jawikinews
+jawikiquote
+jawikisource
+jawikiversity
+jawiktionary
+jbowiki
+jbowiktionary
+jvwiki
+jvwiktionary
+kaawiki
+kabwiki
+kawiki
+kawikibooks
+kawikiquote
+kawiktionary
+kbdwiki
+kgwiki
+kiwiki
+kjwiki
+kkwiki
+kkwikibooks
+kkwikiquote
+kkwiktionary
+klwiki
+klwiktionary
+kmwiki
+kmwikibooks
+kmwiktionary
+knwiki
+knwikibooks
+knwikiquote
+knwikisource
+knwiktionary
+koiwiki
+kowiki
+kowikibooks
+kowikinews
+kowikiquote
+kowikisource
+kowikiversity
+kowiktionary
+krcwiki
+krwiki
+krwikiquote
+kshwiki
+kswiki
+kswikibooks
+kswikiquote
+kswiktionary
+kuwiki
+kuwikibooks
+kuwikiquote
+kuwiktionary
+kvwiki
+kwwiki
+kwwikiquote
+kwwiktionary
+kywiki
+kywikibooks
+kywikiquote
+kywiktionary
+labswiki
+ladwiki
+lawiki
+lawikibooks
+lawikiquote
+lawikisource
+lawiktionary
+lbewiki
+lbwiki
+lbwikibooks
+lbwikiquote
+lbwiktionary
+legalteamwiki
+lezwiki
+lgwiki
+lijwiki
+liwiki
+liwikibooks
+liwikiquote
+liwikisource
+liwiktionary
+lmowiki
+lnwiki
+lnwikibooks
+lnwiktionary
+loginwiki
+lowiki
+lowiktionary
+lrcwiki
+ltgwiki
+ltwiki
+ltwikibooks
+ltwikiquote
+ltwikisource
+ltwiktionary
+lvwiki
+lvwikibooks
+lvwiktionary
+maiwiki
+map_bmswiki
+mdfwiki
+mediawikiwiki
+metawiki
+mgwiki
+mgwikibooks
+mgwiktionary
+mhrwiki
+mhwiki
+mhwiktionary
+minwiki
+miwiki
+miwikibooks
+miwiktionary
+mkwiki
+mkwikibooks
+mkwikimedia
+mkwikisource
+mkwiktionary
+mlwiki
+mlwikibooks
+mlwikiquote
+mlwikisource
+mlwiktionary
+mnwiki
+mnwikibooks
+mnwiktionary
+movementroleswiki
+mowiki
+mowiktionary
+mrjwiki
+mrwiki
+mrwikibooks
+mrwikiquote
+mrwikisource
+mrwiktionary
+mswiki
+mswikibooks
+mswiktionary
+mtwiki
+mtwiktionary
+muswiki
+mwlwiki
+mxwikimedia
+myvwiki
+mywiki
+mywikibooks
+mywiktionary
+mznwiki
+nahwiki
+nahwikibooks
+nahwiktionary
+napwiki
+nawiki
+nawikibooks
+nawikiquote
+nawiktionary
+nds_nlwiki
+ndswiki
+ndswikibooks
+ndswikiquote
+ndswiktionary
+newiki
+newikibooks
+newiktionary
+newwiki
+ngwiki
+nlwiki
+nlwikibooks
+nlwikimedia
+nlwikinews
+nlwikiquote
+nlwikisource
+nlwikivoyage
+nlwiktionary
+nnwiki
+nnwikiquote
+nnwiktionary
+noboard_chapterswikimedia
+nostalgiawiki
+novwiki
+nowiki
+nowikibooks
+nowikimedia
+nowikinews
+nowikiquote
+nowikisource
+nowiktionary
+nrmwiki
+nsowiki
+nvwiki
+nycwikimedia
+nywiki
+nzwikimedia
+ocwiki
+ocwikibooks
+ocwiktionary
+officewiki
+ombudsmenwiki
+omwiki
+omwiktionary
+orwiki
+orwikisource
+orwiktionary
+oswiki
+otrs_wikiwiki
+outreachwiki
+pa_uswikimedia
+pagwiki
+pamwiki
+papwiki
+pawiki
+pawikibooks
+pawiktionary
+pcdwiki
+pdcwiki
+pflwiki
+pihwiki
+piwiki
+piwiktionary
+plwiki
+plwikibooks
+plwikimedia
+plwikinews
+plwikiquote
+plwikisource
+plwikivoyage
+plwiktionary
+pmswiki
+pnbwiki
+pnbwiktionary
+pntwiki
+pswiki
+pswikibooks
+pswiktionary
+ptwiki
+ptwikibooks
+ptwikinews
+ptwikiquote
+ptwikisource
+ptwikiversity
+ptwikivoyage
+ptwiktionary
+qualitywiki
+quwiki
+quwikibooks
+quwikiquote
+quwiktionary
+rmwiki
+rmwikibooks
+rmwiktionary
+rmywiki
+rnwiki
+rnwiktionary
+roa_rupwiki
+roa_rupwiktionary
+roa_tarawiki
+rowiki
+rowikibooks
+rowikinews
+rowikiquote
+rowikisource
+rowikivoyage
+rowiktionary
+rswikimedia
+ruewiki
+ruwiki
+ruwikibooks
+ruwikimedia
+ruwikinews
+ruwikiquote
+ruwikisource
+ruwikiversity
+ruwikivoyage
+ruwiktionary
+rwwiki
+rwwiktionary
+sahwiki
+sahwikisource
+sawiki
+sawikibooks
+sawikiquote
+sawikisource
+sawiktionary
+scnwiki
+scnwiktionary
+scowiki
+scwiki
+scwiktionary
+sdwiki
+sdwikinews
+sdwiktionary
+searchcomwiki
+sewiki
+sewikibooks
+sewikimedia
+sgwiki
+sgwiktionary
+shwiki
+shwiktionary
+simplewiki
+simplewikibooks
+simplewikiquote
+simplewiktionary
+siwiki
+siwikibooks
+siwiktionary
+skwiki
+skwikibooks
+skwikiquote
+skwikisource
+skwiktionary
+slwiki
+slwikibooks
+slwikiquote
+slwikisource
+slwikiversity
+slwiktionary
+smwiki
+smwiktionary
+snwiki
+snwiktionary
+sourceswiki
+sowiki
+sowiktionary
+spcomwiki
+specieswiki
+sqwiki
+sqwikibooks
+sqwikinews
+sqwikiquote
+sqwiktionary
+srnwiki
+srwiki
+srwikibooks
+srwikinews
+srwikiquote
+srwikisource
+srwiktionary
+sswiki
+sswiktionary
+stewardwiki
+stqwiki
+strategywiki
+stwiki
+stwiktionary
+suwiki
+suwikibooks
+suwikiquote
+suwiktionary
+svwiki
+svwikibooks
+svwikinews
+svwikiquote
+svwikisource
+svwikiversity
+svwikivoyage
+svwiktionary
+swwiki
+swwikibooks
+swwiktionary
+szlwiki
+tawiki
+tawikibooks
+tawikinews
+tawikiquote
+tawikisource
+tawiktionary
+tenwiki
+test2wiki
+testwiki
+testwikidatawiki
+tetwiki
+tewiki
+tewikibooks
+tewikiquote
+tewikisource
+tewiktionary
+tgwiki
+tgwikibooks
+tgwiktionary
+thwiki
+thwikibooks
+thwikinews
+thwikiquote
+thwikisource
+thwiktionary
+tiwiki
+tiwiktionary
+tkwiki
+tkwikibooks
+tkwikiquote
+tkwiktionary
+tlwiki
+tlwikibooks
+tlwiktionary
+tnwiki
+tnwiktionary
+towiki
+towiktionary
+tpiwiki
+tpiwiktionary
+transitionteamwiki
+trwiki
+trwikibooks
+trwikimedia
+trwikinews
+trwikiquote
+trwikisource
+trwiktionary
+tswiki
+tswiktionary
+ttwiki
+ttwikibooks
+ttwikiquote
+ttwiktionary
+tumwiki
+twwiki
+twwiktionary
+tyvwiki
+tywiki
+uawikimedia
+udmwiki
+ugwiki
+ugwikibooks
+ugwikiquote
+ugwiktionary
+ukwiki
+ukwikibooks
+ukwikimedia
+ukwikinews
+ukwikiquote
+ukwikisource
+ukwikivoyage
+ukwiktionary
+urwiki
+urwikibooks
+urwikiquote
+urwiktionary
+usabilitywiki
+uzwiki
+uzwikibooks
+uzwikiquote
+uzwiktionary
+vecwiki
+vecwikisource
+vecwiktionary
+vepwiki
+vewiki
+viwiki
+viwikibooks
+viwikiquote
+viwikisource
+viwikivoyage
+viwiktionary
+vlswiki
+votewiki
+vowiki
+vowikibooks
+vowikiquote
+vowiktionary
+warwiki
+wawiki
+wawikibooks
+wawiktionary
+wg_enwiki
+wikidatawiki
+wikimania2005wiki
+wikimania2006wiki
+wikimania2007wiki
+wikimania2008wiki
+wikimania2009wiki
+wikimania2010wiki
+wikimania2011wiki
+wikimania2012wiki
+wikimania2013wiki
+wikimania2014wiki
+wikimania2015wiki
+wikimania2016wiki
+wikimaniateamwiki
+wowiki
+wowikiquote
+wowiktionary
+wuuwiki
+xalwiki
+xhwiki
+xhwikibooks
+xhwiktionary
+xmfwiki
+yiwiki
+yiwikisource
+yiwiktionary
+yowiki
+yowikibooks
+yowiktionary
+zawiki
+zawikibooks
+zawikiquote
+zawiktionary
+zeawiki
+zerowiki
+zh_classicalwiki
+zh_min_nanwiki
+zh_min_nanwikibooks
+zh_min_nanwikiquote
+zh_min_nanwikisource
+zh_min_nanwiktionary
+zh_yuewiki
+zhwiki
+zhwikibooks
+zhwikinews
+zhwikiquote
+zhwikisource
+zhwikivoyage
+zhwiktionary
+zuwiki
+zuwikibooks
+zuwiktionary
diff --git a/hostmap.json b/hostmap.json
new file mode 100644
index 0000000..16ba2fd
--- /dev/null
+++ b/hostmap.json
@@ -0,0 +1,817 @@
+{
+ "aa.wikibooks": "aawikibooks", 
+ "aa.wikipedia": "aawiki", 
+ "aa.wiktionary": "aawiktionary", 
+ "ab.wikipedia": "abwiki", 
+ "ab.wiktionary": "abwiktionary", 
+ "ace.wikipedia": "acewiki", 
+ "af.wikibooks": "afwikibooks", 
+ "af.wikipedia": "afwiki", 
+ "af.wikiquote": "afwikiquote", 
+ "af.wiktionary": "afwiktionary", 
+ "ak.wikibooks": "akwikibooks", 
+ "ak.wikipedia": "akwiki", 
+ "ak.wiktionary": "akwiktionary", 
+ "als.wikibooks": "alswikibooks", 
+ "als.wikipedia": "alswiki", 
+ "als.wikiquote": "alswikiquote", 
+ "als.wiktionary": "alswiktionary", 
+ "am.wikipedia": "amwiki", 
+ "am.wikiquote": "amwikiquote", 
+ "am.wiktionary": "amwiktionary", 
+ "an.wikipedia": "anwiki", 
+ "an.wiktionary": "anwiktionary", 
+ "ang.wikibooks": "angwikibooks", 
+ "ang.wikipedia": "angwiki", 
+ "ang.wikiquote": "angwikiquote", 
+ "ang.wikisource": "angwikisource", 
+ "ang.wiktionary": "angwiktionary", 
+ "ar.wikibooks": "arwikibooks", 
+ "ar.wikinews": "arwikinews", 
+ "ar.wikipedia": "arwiki", 
+ "ar.wikiquote": "arwikiquote", 
+ "ar.wikisource": "arwikisource", 
+ "ar.wikiversity": "arwikiversity", 
+ "ar.wiktionary": "arwiktionary", 
+ "arc.wikipedia": "arcwiki", 
+ "arz.wikipedia": "arzwiki", 
+ "as.wikibooks": "aswikibooks", 
+ "as.wikipedia": "aswiki", 
+ "as.wikisource": "aswikisource", 
+ "as.wiktionary": "aswiktionary", 
+ "ast.wikibooks": "astwikibooks", 
+ "ast.wikipedia": "astwiki", 
+ "ast.wikiquote": "astwikiquote", 
+ "ast.wiktionary": "astwiktionary", 
+ "av.wikipedia": "avwiki", 
+ "av.wiktionary": "avwiktionary", 
+ "ay.wikibooks": "aywikibooks", 
+ "ay.wikipedia": "aywiki", 
+ "ay.wiktionary": "aywiktionary", 
+ "az.wikibooks": "azwikibooks", 
+ "az.wikipedia": "azwiki", 
+ "az.wikiquote": "azwikiquote", 
+ "az.wikisource": "azwikisource", 
+ "az.wiktionary": "azwiktionary", 
+ "azb.wikipedia": "azbwiki", 
+ "ba.wikibooks": "bawikibooks", 
+ "ba.wikipedia": "bawiki", 
+ "bar.wikipedia": "barwiki", 
+ "bat-smg.wikipedia": "bat_smgwiki", 
+ "bcl.wikipedia": "bclwiki", 
+ "be-tarask.wikipedia": "be_x_oldwiki", 
+ "be.wikibooks": "bewikibooks", 
+ "be.wikipedia": "bewiki", 
+ "be.wikiquote": "bewikiquote", 
+ "be.wikisource": "bewikisource", 
+ "be.wiktionary": "bewiktionary", 
+ "beta.wikiversity": "betawikiversity", 
+ "bg.wikibooks": "bgwikibooks", 
+ "bg.wikinews": "bgwikinews", 
+ "bg.wikipedia": "bgwiki", 
+ "bg.wikiquote": "bgwikiquote", 
+ "bg.wikisource": "bgwikisource", 
+ "bg.wiktionary": "bgwiktionary", 
+ "bh.wikipedia": "bhwiki", 
+ "bh.wiktionary": "bhwiktionary", 
+ "bi.wikibooks": "biwikibooks", 
+ "bi.wikipedia": "biwiki", 
+ "bi.wiktionary": "biwiktionary", 
+ "bjn.wikipedia": "bjnwiki", 
+ "bm.wikibooks": "bmwikibooks", 
+ "bm.wikipedia": "bmwiki", 
+ "bm.wikiquote": "bmwikiquote", 
+ "bm.wiktionary": "bmwiktionary", 
+ "bn.wikibooks": "bnwikibooks", 
+ "bn.wikipedia": "bnwiki", 
+ "bn.wikisource": "bnwikisource", 
+ "bn.wiktionary": "bnwiktionary", 
+ "bo.wikibooks": "bowikibooks", 
+ "bo.wikipedia": "bowiki", 
+ "bo.wiktionary": "bowiktionary", 
+ "bpy.wikipedia": "bpywiki", 
+ "br.wikipedia": "brwiki", 
+ "br.wikiquote": "brwikiquote", 
+ "br.wikisource": "brwikisource", 
+ "br.wiktionary": "brwiktionary", 
+ "bs.wikibooks": "bswikibooks", 
+ "bs.wikinews": "bswikinews", 
+ "bs.wikipedia": "bswiki", 
+ "bs.wikiquote": "bswikiquote", 
+ "bs.wikisource": "bswikisource", 
+ "bs.wiktionary": "bswiktionary", 
+ "bug.wikipedia": "bugwiki", 
+ "bxr.wikipedia": "bxrwiki", 
+ "ca.wikibooks": "cawikibooks", 
+ "ca.wikinews": "cawikinews", 
+ "ca.wikipedia": "cawiki", 
+ "ca.wikiquote": "cawikiquote", 
+ "ca.wikisource": "cawikisource", 
+ "ca.wiktionary": "cawiktionary", 
+ "cbk-zam.wikipedia": "cbk_zamwiki", 
+ "cdo.wikipedia": "cdowiki", 
+ "ce.wikipedia": "cewiki", 
+ "ceb.wikipedia": "cebwiki", 
+ "ch.wikibooks": "chwikibooks", 
+ "ch.wikipedia": "chwiki", 
+ "ch.wiktionary": "chwiktionary", 
+ "cho.wikipedia": "chowiki", 
+ "chr.wikipedia": "chrwiki", 
+ "chr.wiktionary": "chrwiktionary", 
+ "chy.wikipedia": "chywiki", 
+ "ckb.wikipedia": "ckbwiki", 
+ "co.wikibooks": "cowikibooks", 
+ "co.wikipedia": "cowiki", 
+ "co.wikiquote": "cowikiquote", 
+ "co.wiktionary": "cowiktionary", 
+ "commons.wikimedia": "commonswiki", 
+ "cr.wikipedia": "crwiki", 
+ "cr.wikiquote": "crwikiquote", 
+ "cr.wiktionary": "crwiktionary", 
+ "crh.wikipedia": "crhwiki", 
+ "cs.wikibooks": "cswikibooks", 
+ "cs.wikinews": "cswikinews", 
+ "cs.wikipedia": "cswiki", 
+ "cs.wikiquote": "cswikiquote", 
+ "cs.wikisource": "cswikisource", 
+ "cs.wikiversity": "cswikiversity", 
+ "cs.wiktionary": "cswiktionary", 
+ "csb.wikipedia": "csbwiki", 
+ "csb.wiktionary": "csbwiktionary", 
+ "cu.wikipedia": "cuwiki", 
+ "cv.wikibooks": "cvwikibooks", 
+ "cv.wikipedia": "cvwiki", 
+ "cy.wikibooks": "cywikibooks", 
+ "cy.wikipedia": "cywiki", 
+ "cy.wikiquote": "cywikiquote", 
+ "cy.wikisource": "cywikisource", 
+ "cy.wiktionary": "cywiktionary", 
+ "da.wikibooks": "dawikibooks", 
+ "da.wikipedia": "dawiki", 
+ "da.wikiquote": "dawikiquote", 
+ "da.wikisource": "dawikisource", 
+ "da.wiktionary": "dawiktionary", 
+ "de.wikibooks": "dewikibooks", 
+ "de.wikinews": "dewikinews", 
+ "de.wikipedia": "dewiki", 
+ "de.wikiquote": "dewikiquote", 
+ "de.wikisource": "dewikisource", 
+ "de.wikiversity": "dewikiversity", 
+ "de.wikivoyage": "dewikivoyage", 
+ "de.wiktionary": "dewiktionary", 
+ "diq.wikipedia": "diqwiki", 
+ "dsb.wikipedia": "dsbwiki", 
+ "dv.wikipedia": "dvwiki", 
+ "dv.wiktionary": "dvwiktionary", 
+ "dz.wikipedia": "dzwiki", 
+ "dz.wiktionary": "dzwiktionary", 
+ "ee.wikipedia": "eewiki", 
+ "el.wikibooks": "elwikibooks", 
+ "el.wikinews": "elwikinews", 
+ "el.wikipedia": "elwiki", 
+ "el.wikiquote": "elwikiquote", 
+ "el.wikisource": "elwikisource", 
+ "el.wikiversity": "elwikiversity", 
+ "el.wikivoyage": "elwikivoyage", 
+ "el.wiktionary": "elwiktionary", 
+ "eml.wikipedia": "emlwiki", 
+ "en.wikibooks": "enwikibooks", 
+ "en.wikinews": "enwikinews", 
+ "en.wikipedia": "enwiki", 
+ "en.wikiquote": "enwikiquote", 
+ "en.wikisource": "enwikisource", 
+ "en.wikiversity": "enwikiversity", 
+ "en.wikivoyage": "enwikivoyage", 
+ "en.wiktionary": "enwiktionary", 
+ "eo.wikibooks": "eowikibooks", 
+ "eo.wikinews": "eowikinews", 
+ "eo.wikipedia": "eowiki", 
+ "eo.wikiquote": "eowikiquote", 
+ "eo.wikisource": "eowikisource", 
+ "eo.wiktionary": "eowiktionary", 
+ "es.wikibooks": "eswikibooks", 
+ "es.wikinews": "eswikinews", 
+ "es.wikipedia": "eswiki", 
+ "es.wikiquote": "eswikiquote", 
+ "es.wikisource": "eswikisource", 
+ "es.wikiversity": "eswikiversity", 
+ "es.wikivoyage": "eswikivoyage", 
+ "es.wiktionary": "eswiktionary", 
+ "et.wikibooks": "etwikibooks", 
+ "et.wikipedia": "etwiki", 
+ "et.wikiquote": "etwikiquote", 
+ "et.wikisource": "etwikisource", 
+ "et.wiktionary": "etwiktionary", 
+ "eu.wikibooks": "euwikibooks", 
+ "eu.wikipedia": "euwiki", 
+ "eu.wikiquote": "euwikiquote", 
+ "eu.wiktionary": "euwiktionary", 
+ "ext.wikipedia": "extwiki", 
+ "fa.wikibooks": "fawikibooks", 
+ "fa.wikinews": "fawikinews", 
+ "fa.wikipedia": "fawiki", 
+ "fa.wikiquote": "fawikiquote", 
+ "fa.wikisource": "fawikisource", 
+ "fa.wikivoyage": "fawikivoyage", 
+ "fa.wiktionary": "fawiktionary", 
+ "ff.wikipedia": "ffwiki", 
+ "fi.wikibooks": "fiwikibooks", 
+ "fi.wikinews": "fiwikinews", 
+ "fi.wikipedia": "fiwiki", 
+ "fi.wikiquote": "fiwikiquote", 
+ "fi.wikisource": "fiwikisource", 
+ "fi.wikiversity": "fiwikiversity", 
+ "fi.wiktionary": "fiwiktionary", 
+ "fiu-vro.wikipedia": "fiu_vrowiki", 
+ "fj.wikipedia": "fjwiki", 
+ "fj.wiktionary": "fjwiktionary", 
+ "fo.wikipedia": "fowiki", 
+ "fo.wikisource": "fowikisource", 
+ "fo.wiktionary": "fowiktionary", 
+ "fr.wikibooks": "frwikibooks", 
+ "fr.wikinews": "frwikinews", 
+ "fr.wikipedia": "frwiki", 
+ "fr.wikiquote": "frwikiquote", 
+ "fr.wikisource": "frwikisource", 
+ "fr.wikiversity": "frwikiversity", 
+ "fr.wikivoyage": "frwikivoyage", 
+ "fr.wiktionary": "frwiktionary", 
+ "frp.wikipedia": "frpwiki", 
+ "frr.wikipedia": "frrwiki", 
+ "fur.wikipedia": "furwiki", 
+ "fy.wikibooks": "fywikibooks", 
+ "fy.wikipedia": "fywiki", 
+ "fy.wiktionary": "fywiktionary", 
+ "ga.wikibooks": "gawikibooks", 
+ "ga.wikipedia": "gawiki", 
+ "ga.wikiquote": "gawikiquote", 
+ "ga.wiktionary": "gawiktionary", 
+ "gag.wikipedia": "gagwiki", 
+ "gan.wikipedia": "ganwiki", 
+ "gd.wikipedia": "gdwiki", 
+ "gd.wiktionary": "gdwiktionary", 
+ "gl.wikibooks": "glwikibooks", 
+ "gl.wikipedia": "glwiki", 
+ "gl.wikiquote": "glwikiquote", 
+ "gl.wikisource": "glwikisource", 
+ "gl.wiktionary": "glwiktionary", 
+ "glk.wikipedia": "glkwiki", 
+ "gn.wikibooks": "gnwikibooks", 
+ "gn.wikipedia": "gnwiki", 
+ "gn.wiktionary": "gnwiktionary", 
+ "gom.wikipedia": "gomwiki", 
+ "got.wikibooks": "gotwikibooks", 
+ "got.wikipedia": "gotwiki", 
+ "gu.wikibooks": "guwikibooks", 
+ "gu.wikipedia": "guwiki", 
+ "gu.wikiquote": "guwikiquote", 
+ "gu.wikisource": "guwikisource", 
+ "gu.wiktionary": "guwiktionary", 
+ "gv.wikipedia": "gvwiki", 
+ "gv.wiktionary": "gvwiktionary", 
+ "ha.wikipedia": "hawiki", 
+ "ha.wiktionary": "hawiktionary", 
+ "hak.wikipedia": "hakwiki", 
+ "haw.wikipedia": "hawwiki", 
+ "he.wikibooks": "hewikibooks", 
+ "he.wikinews": "hewikinews", 
+ "he.wikipedia": "hewiki", 
+ "he.wikiquote": "hewikiquote", 
+ "he.wikisource": "hewikisource", 
+ "he.wikivoyage": "hewikivoyage", 
+ "he.wiktionary": "hewiktionary", 
+ "hi.wikibooks": "hiwikibooks", 
+ "hi.wikipedia": "hiwiki", 
+ "hi.wikiquote": "hiwikiquote", 
+ "hi.wiktionary": "hiwiktionary", 
+ "hif.wikipedia": "hifwiki", 
+ "ho.wikipedia": "howiki", 
+ "hr.wikibooks": "hrwikibooks", 
+ "hr.wikipedia": "hrwiki", 
+ "hr.wikiquote": "hrwikiquote", 
+ "hr.wikisource": "hrwikisource", 
+ "hr.wiktionary": "hrwiktionary", 
+ "hsb.wikipedia": "hsbwiki", 
+ "hsb.wiktionary": "hsbwiktionary", 
+ "ht.wikipedia": "htwiki", 
+ "ht.wikisource": "htwikisource", 
+ "hu.wikibooks": "huwikibooks", 
+ "hu.wikinews": "huwikinews", 
+ "hu.wikipedia": "huwiki", 
+ "hu.wikiquote": "huwikiquote", 
+ "hu.wikisource": "huwikisource", 
+ "hu.wiktionary": "huwiktionary", 
+ "hy.wikibooks": "hywikibooks", 
+ "hy.wikipedia": "hywiki", 
+ "hy.wikiquote": "hywikiquote", 
+ "hy.wikisource": "hywikisource", 
+ "hy.wiktionary": "hywiktionary", 
+ "hz.wikipedia": "hzwiki", 
+ "ia.wikibooks": "iawikibooks", 
+ "ia.wikipedia": "iawiki", 
+ "ia.wiktionary": "iawiktionary", 
+ "id.wikibooks": "idwikibooks", 
+ "id.wikipedia": "idwiki", 
+ "id.wikiquote": "idwikiquote", 
+ "id.wikisource": "idwikisource", 
+ "id.wiktionary": "idwiktionary", 
+ "ie.wikibooks": "iewikibooks", 
+ "ie.wikipedia": "iewiki", 
+ "ie.wiktionary": "iewiktionary", 
+ "ig.wikipedia": "igwiki", 
+ "ii.wikipedia": "iiwiki", 
+ "ik.wikipedia": "ikwiki", 
+ "ik.wiktionary": "ikwiktionary", 
+ "ilo.wikipedia": "ilowiki", 
+ "incubator.wikimedia": "incubatorwiki", 
+ "io.wikipedia": "iowiki", 
+ "io.wiktionary": "iowiktionary", 
+ "is.wikibooks": "iswikibooks", 
+ "is.wikipedia": "iswiki", 
+ "is.wikiquote": "iswikiquote", 
+ "is.wikisource": "iswikisource", 
+ "is.wiktionary": "iswiktionary", 
+ "it.wikibooks": "itwikibooks", 
+ "it.wikinews": "itwikinews", 
+ "it.wikipedia": "itwiki", 
+ "it.wikiquote": "itwikiquote", 
+ "it.wikisource": "itwikisource", 
+ "it.wikiversity": "itwikiversity", 
+ "it.wikivoyage": "itwikivoyage", 
+ "it.wiktionary": "itwiktionary", 
+ "iu.wikipedia": "iuwiki", 
+ "iu.wiktionary": "iuwiktionary", 
+ "ja.wikibooks": "jawikibooks", 
+ "ja.wikinews": "jawikinews", 
+ "ja.wikipedia": "jawiki", 
+ "ja.wikiquote": "jawikiquote", 
+ "ja.wikisource": "jawikisource", 
+ "ja.wikiversity": "jawikiversity", 
+ "ja.wiktionary": "jawiktionary", 
+ "jbo.wikipedia": "jbowiki", 
+ "jbo.wiktionary": "jbowiktionary", 
+ "jv.wikipedia": "jvwiki", 
+ "jv.wiktionary": "jvwiktionary", 
+ "ka.wikibooks": "kawikibooks", 
+ "ka.wikipedia": "kawiki", 
+ "ka.wikiquote": "kawikiquote", 
+ "ka.wiktionary": "kawiktionary", 
+ "kaa.wikipedia": "kaawiki", 
+ "kab.wikipedia": "kabwiki", 
+ "kbd.wikipedia": "kbdwiki", 
+ "kg.wikipedia": "kgwiki", 
+ "ki.wikipedia": "kiwiki", 
+ "kj.wikipedia": "kjwiki", 
+ "kk.wikibooks": "kkwikibooks", 
+ "kk.wikipedia": "kkwiki", 
+ "kk.wikiquote": "kkwikiquote", 
+ "kk.wiktionary": "kkwiktionary", 
+ "kl.wikipedia": "klwiki", 
+ "kl.wiktionary": "klwiktionary", 
+ "km.wikibooks": "kmwikibooks", 
+ "km.wikipedia": "kmwiki", 
+ "km.wiktionary": "kmwiktionary", 
+ "kn.wikibooks": "knwikibooks", 
+ "kn.wikipedia": "knwiki", 
+ "kn.wikiquote": "knwikiquote", 
+ "kn.wikisource": "knwikisource", 
+ "kn.wiktionary": "knwiktionary", 
+ "ko.wikibooks": "kowikibooks", 
+ "ko.wikinews": "kowikinews", 
+ "ko.wikipedia": "kowiki", 
+ "ko.wikiquote": "kowikiquote", 
+ "ko.wikisource": "kowikisource", 
+ "ko.wikiversity": "kowikiversity", 
+ "ko.wiktionary": "kowiktionary", 
+ "koi.wikipedia": "koiwiki", 
+ "kr.wikipedia": "krwiki", 
+ "kr.wikiquote": "krwikiquote", 
+ "krc.wikipedia": "krcwiki", 
+ "ks.wikibooks": "kswikibooks", 
+ "ks.wikipedia": "kswiki", 
+ "ks.wikiquote": "kswikiquote", 
+ "ks.wiktionary": "kswiktionary", 
+ "ksh.wikipedia": "kshwiki", 
+ "ku.wikibooks": "kuwikibooks", 
+ "ku.wikipedia": "kuwiki", 
+ "ku.wikiquote": "kuwikiquote", 
+ "ku.wiktionary": "kuwiktionary", 
+ "kv.wikipedia": "kvwiki", 
+ "kw.wikipedia": "kwwiki", 
+ "kw.wikiquote": "kwwikiquote", 
+ "kw.wiktionary": "kwwiktionary", 
+ "ky.wikibooks": "kywikibooks", 
+ "ky.wikipedia": "kywiki", 
+ "ky.wikiquote": "kywikiquote", 
+ "ky.wiktionary": "kywiktionary", 
+ "la.wikibooks": "lawikibooks", 
+ "la.wikipedia": "lawiki", 
+ "la.wikiquote": "lawikiquote", 
+ "la.wikisource": "lawikisource", 
+ "la.wiktionary": "lawiktionary", 
+ "lad.wikipedia": "ladwiki", 
+ "lb.wikibooks": "lbwikibooks", 
+ "lb.wikipedia": "lbwiki", 
+ "lb.wikiquote": "lbwikiquote", 
+ "lb.wiktionary": "lbwiktionary", 
+ "lbe.wikipedia": "lbewiki", 
+ "lez.wikipedia": "lezwiki", 
+ "lg.wikipedia": "lgwiki", 
+ "li.wikibooks": "liwikibooks", 
+ "li.wikipedia": "liwiki", 
+ "li.wikiquote": "liwikiquote", 
+ "li.wikisource": "liwikisource", 
+ "li.wiktionary": "liwiktionary", 
+ "lij.wikipedia": "lijwiki", 
+ "lmo.wikipedia": "lmowiki", 
+ "ln.wikibooks": "lnwikibooks", 
+ "ln.wikipedia": "lnwiki", 
+ "ln.wiktionary": "lnwiktionary", 
+ "lo.wikipedia": "lowiki", 
+ "lo.wiktionary": "lowiktionary", 
+ "lrc.wikipedia": "lrcwiki", 
+ "lt.wikibooks": "ltwikibooks", 
+ "lt.wikipedia": "ltwiki", 
+ "lt.wikiquote": "ltwikiquote", 
+ "lt.wikisource": "ltwikisource", 
+ "lt.wiktionary": "ltwiktionary", 
+ "ltg.wikipedia": "ltgwiki", 
+ "lv.wikibooks": "lvwikibooks", 
+ "lv.wikipedia": "lvwiki", 
+ "lv.wiktionary": "lvwiktionary", 
+ "mai.wikipedia": "maiwiki", 
+ "map-bms.wikipedia": "map_bmswiki", 
+ "mdf.wikipedia": "mdfwiki", 
+ "mediawiki": "mediawikiwiki", 
+ "meta.wikimedia": "metawiki", 
+ "mg.wikibooks": "mgwikibooks", 
+ "mg.wikipedia": "mgwiki", 
+ "mg.wiktionary": "mgwiktionary", 
+ "mh.wikipedia": "mhwiki", 
+ "mh.wiktionary": "mhwiktionary", 
+ "mhr.wikipedia": "mhrwiki", 
+ "mi.wikibooks": "miwikibooks", 
+ "mi.wikipedia": "miwiki", 
+ "mi.wiktionary": "miwiktionary", 
+ "min.wikipedia": "minwiki", 
+ "mk.wikibooks": "mkwikibooks", 
+ "mk.wikipedia": "mkwiki", 
+ "mk.wikisource": "mkwikisource", 
+ "mk.wiktionary": "mkwiktionary", 
+ "ml.wikibooks": "mlwikibooks", 
+ "ml.wikipedia": "mlwiki", 
+ "ml.wikiquote": "mlwikiquote", 
+ "ml.wikisource": "mlwikisource", 
+ "ml.wiktionary": "mlwiktionary", 
+ "mn.wikibooks": "mnwikibooks", 
+ "mn.wikipedia": "mnwiki", 
+ "mn.wiktionary": "mnwiktionary", 
+ "mo.wikipedia": "mowiki", 
+ "mo.wiktionary": "mowiktionary", 
+ "mr.wikibooks": "mrwikibooks", 
+ "mr.wikipedia": "mrwiki", 
+ "mr.wikiquote": "mrwikiquote", 
+ "mr.wikisource": "mrwikisource", 
+ "mr.wiktionary": "mrwiktionary", 
+ "mrj.wikipedia": "mrjwiki", 
+ "ms.wikibooks": "mswikibooks", 
+ "ms.wikipedia": "mswiki", 
+ "ms.wiktionary": "mswiktionary", 
+ "mt.wikipedia": "mtwiki", 
+ "mt.wiktionary": "mtwiktionary", 
+ "mus.wikipedia": "muswiki", 
+ "mwl.wikipedia": "mwlwiki", 
+ "my.wikibooks": "mywikibooks", 
+ "my.wikipedia": "mywiki", 
+ "my.wiktionary": "mywiktionary", 
+ "myv.wikipedia": "myvwiki", 
+ "mzn.wikipedia": "mznwiki", 
+ "na.wikibooks": "nawikibooks", 
+ "na.wikipedia": "nawiki", 
+ "na.wikiquote": "nawikiquote", 
+ "na.wiktionary": "nawiktionary", 
+ "nah.wikibooks": "nahwikibooks", 
+ "nah.wikipedia": "nahwiki", 
+ "nah.wiktionary": "nahwiktionary", 
+ "nap.wikipedia": "napwiki", 
+ "nds-nl.wikipedia": "nds_nlwiki", 
+ "nds.wikibooks": "ndswikibooks", 
+ "nds.wikipedia": "ndswiki", 
+ "nds.wikiquote": "ndswikiquote", 
+ "nds.wiktionary": "ndswiktionary", 
+ "ne.wikibooks": "newikibooks", 
+ "ne.wikipedia": "newiki", 
+ "ne.wiktionary": "newiktionary", 
+ "new.wikipedia": "newwiki", 
+ "ng.wikipedia": "ngwiki", 
+ "nl.wikibooks": "nlwikibooks", 
+ "nl.wikinews": "nlwikinews", 
+ "nl.wikipedia": "nlwiki", 
+ "nl.wikiquote": "nlwikiquote", 
+ "nl.wikisource": "nlwikisource", 
+ "nl.wikivoyage": "nlwikivoyage", 
+ "nl.wiktionary": "nlwiktionary", 
+ "nn.wikipedia": "nnwiki", 
+ "nn.wikiquote": "nnwikiquote", 
+ "nn.wiktionary": "nnwiktionary", 
+ "no.wikibooks": "nowikibooks", 
+ "no.wikinews": "nowikinews", 
+ "no.wikipedia": "nowiki", 
+ "no.wikiquote": "nowikiquote", 
+ "no.wikisource": "nowikisource", 
+ "no.wiktionary": "nowiktionary", 
+ "nostalgia.wikipedia": "nostalgiawiki", 
+ "nov.wikipedia": "novwiki", 
+ "nrm.wikipedia": "nrmwiki", 
+ "nso.wikipedia": "nsowiki", 
+ "nv.wikipedia": "nvwiki", 
+ "ny.wikipedia": "nywiki", 
+ "oc.wikibooks": "ocwikibooks", 
+ "oc.wikipedia": "ocwiki", 
+ "oc.wiktionary": "ocwiktionary", 
+ "om.wikipedia": "omwiki", 
+ "om.wiktionary": "omwiktionary", 
+ "or.wikipedia": "orwiki", 
+ "or.wikisource": "orwikisource", 
+ "or.wiktionary": "orwiktionary", 
+ "os.wikipedia": "oswiki", 
+ "pa.wikibooks": "pawikibooks", 
+ "pa.wikipedia": "pawiki", 
+ "pa.wiktionary": "pawiktionary", 
+ "pag.wikipedia": "pagwiki", 
+ "pam.wikipedia": "pamwiki", 
+ "pap.wikipedia": "papwiki", 
+ "pcd.wikipedia": "pcdwiki", 
+ "pdc.wikipedia": "pdcwiki", 
+ "pfl.wikipedia": "pflwiki", 
+ "pi.wikipedia": "piwiki", 
+ "pi.wiktionary": "piwiktionary", 
+ "pih.wikipedia": "pihwiki", 
+ "pl.wikibooks": "plwikibooks", 
+ "pl.wikinews": "plwikinews", 
+ "pl.wikipedia": "plwiki", 
+ "pl.wikiquote": "plwikiquote", 
+ "pl.wikisource": "plwikisource", 
+ "pl.wikivoyage": "plwikivoyage", 
+ "pl.wiktionary": "plwiktionary", 
+ "pms.wikipedia": "pmswiki", 
+ "pnb.wikipedia": "pnbwiki", 
+ "pnb.wiktionary": "pnbwiktionary", 
+ "pnt.wikipedia": "pntwiki", 
+ "ps.wikibooks": "pswikibooks", 
+ "ps.wikipedia": "pswiki", 
+ "ps.wiktionary": "pswiktionary", 
+ "pt.wikibooks": "ptwikibooks", 
+ "pt.wikinews": "ptwikinews", 
+ "pt.wikipedia": "ptwiki", 
+ "pt.wikiquote": "ptwikiquote", 
+ "pt.wikisource": "ptwikisource", 
+ "pt.wikiversity": "ptwikiversity", 
+ "pt.wikivoyage": "ptwikivoyage", 
+ "pt.wiktionary": "ptwiktionary", 
+ "qu.wikibooks": "quwikibooks", 
+ "qu.wikipedia": "quwiki", 
+ "qu.wikiquote": "quwikiquote", 
+ "qu.wiktionary": "quwiktionary", 
+ "rm.wikibooks": "rmwikibooks", 
+ "rm.wikipedia": "rmwiki", 
+ "rm.wiktionary": "rmwiktionary", 
+ "rmy.wikipedia": "rmywiki", 
+ "rn.wikipedia": "rnwiki", 
+ "rn.wiktionary": "rnwiktionary", 
+ "ro.wikibooks": "rowikibooks", 
+ "ro.wikinews": "rowikinews", 
+ "ro.wikipedia": "rowiki", 
+ "ro.wikiquote": "rowikiquote", 
+ "ro.wikisource": "rowikisource", 
+ "ro.wikivoyage": "rowikivoyage", 
+ "ro.wiktionary": "rowiktionary", 
+ "roa-rup.wikipedia": "roa_rupwiki", 
+ "roa-rup.wiktionary": "roa_rupwiktionary", 
+ "roa-tara.wikipedia": "roa_tarawiki", 
+ "ru.wikibooks": "ruwikibooks", 
+ "ru.wikinews": "ruwikinews", 
+ "ru.wikipedia": "ruwiki", 
+ "ru.wikiquote": "ruwikiquote", 
+ "ru.wikisource": "ruwikisource", 
+ "ru.wikiversity": "ruwikiversity", 
+ "ru.wikivoyage": "ruwikivoyage", 
+ "ru.wiktionary": "ruwiktionary", 
+ "rue.wikipedia": "ruewiki", 
+ "rw.wikipedia": "rwwiki", 
+ "rw.wiktionary": "rwwiktionary", 
+ "sa.wikibooks": "sawikibooks", 
+ "sa.wikipedia": "sawiki", 
+ "sa.wikiquote": "sawikiquote", 
+ "sa.wikisource": "sawikisource", 
+ "sa.wiktionary": "sawiktionary", 
+ "sah.wikipedia": "sahwiki", 
+ "sah.wikisource": "sahwikisource", 
+ "sc.wikipedia": "scwiki", 
+ "sc.wiktionary": "scwiktionary", 
+ "scn.wikipedia": "scnwiki", 
+ "scn.wiktionary": "scnwiktionary", 
+ "sco.wikipedia": "scowiki", 
+ "sd.wikinews": "sdwikinews", 
+ "sd.wikipedia": "sdwiki", 
+ "sd.wiktionary": "sdwiktionary", 
+ "se.wikibooks": "sewikibooks", 
+ "se.wikipedia": "sewiki", 
+ "sg.wikipedia": "sgwiki", 
+ "sg.wiktionary": "sgwiktionary", 
+ "sh.wikipedia": "shwiki", 
+ "sh.wiktionary": "shwiktionary", 
+ "si.wikibooks": "siwikibooks", 
+ "si.wikipedia": "siwiki", 
+ "si.wiktionary": "siwiktionary", 
+ "simple.wikibooks": "simplewikibooks", 
+ "simple.wikipedia": "simplewiki", 
+ "simple.wikiquote": "simplewikiquote", 
+ "simple.wiktionary": "simplewiktionary", 
+ "sk.wikibooks": "skwikibooks", 
+ "sk.wikipedia": "skwiki", 
+ "sk.wikiquote": "skwikiquote", 
+ "sk.wikisource": "skwikisource", 
+ "sk.wiktionary": "skwiktionary", 
+ "sl.wikibooks": "slwikibooks", 
+ "sl.wikipedia": "slwiki", 
+ "sl.wikiquote": "slwikiquote", 
+ "sl.wikisource": "slwikisource", 
+ "sl.wikiversity": "slwikiversity", 
+ "sl.wiktionary": "slwiktionary", 
+ "sm.wikipedia": "smwiki", 
+ "sm.wiktionary": "smwiktionary", 
+ "sn.wikipedia": "snwiki", 
+ "sn.wiktionary": "snwiktionary", 
+ "so.wikipedia": "sowiki", 
+ "so.wiktionary": "sowiktionary", 
+ "species.wikimedia": "specieswiki", 
+ "sq.wikibooks": "sqwikibooks", 
+ "sq.wikinews": "sqwikinews", 
+ "sq.wikipedia": "sqwiki", 
+ "sq.wikiquote": "sqwikiquote", 
+ "sq.wiktionary": "sqwiktionary", 
+ "sr.wikibooks": "srwikibooks", 
+ "sr.wikinews": "srwikinews", 
+ "sr.wikipedia": "srwiki", 
+ "sr.wikiquote": "srwikiquote", 
+ "sr.wikisource": "srwikisource", 
+ "sr.wiktionary": "srwiktionary", 
+ "srn.wikipedia": "srnwiki", 
+ "ss.wikipedia": "sswiki", 
+ "ss.wiktionary": "sswiktionary", 
+ "st.wikipedia": "stwiki", 
+ "st.wiktionary": "stwiktionary", 
+ "stq.wikipedia": "stqwiki", 
+ "su.wikibooks": "suwikibooks", 
+ "su.wikipedia": "suwiki", 
+ "su.wikiquote": "suwikiquote", 
+ "su.wiktionary": "suwiktionary", 
+ "sv.wikibooks": "svwikibooks", 
+ "sv.wikinews": "svwikinews", 
+ "sv.wikipedia": "svwiki", 
+ "sv.wikiquote": "svwikiquote", 
+ "sv.wikisource": "svwikisource", 
+ "sv.wikiversity": "svwikiversity", 
+ "sv.wikivoyage": "svwikivoyage", 
+ "sv.wiktionary": "svwiktionary", 
+ "sw.wikibooks": "swwikibooks", 
+ "sw.wikipedia": "swwiki", 
+ "sw.wiktionary": "swwiktionary", 
+ "szl.wikipedia": "szlwiki", 
+ "ta.wikibooks": "tawikibooks", 
+ "ta.wikinews": "tawikinews", 
+ "ta.wikipedia": "tawiki", 
+ "ta.wikiquote": "tawikiquote", 
+ "ta.wikisource": "tawikisource", 
+ "ta.wiktionary": "tawiktionary", 
+ "te.wikibooks": "tewikibooks", 
+ "te.wikipedia": "tewiki", 
+ "te.wikiquote": "tewikiquote", 
+ "te.wikisource": "tewikisource", 
+ "te.wiktionary": "tewiktionary", 
+ "ten.wikipedia": "tenwiki", 
+ "tet.wikipedia": "tetwiki", 
+ "tg.wikibooks": "tgwikibooks", 
+ "tg.wikipedia": "tgwiki", 
+ "tg.wiktionary": "tgwiktionary", 
+ "th.wikibooks": "thwikibooks", 
+ "th.wikinews": "thwikinews", 
+ "th.wikipedia": "thwiki", 
+ "th.wikiquote": "thwikiquote", 
+ "th.wikisource": "thwikisource", 
+ "th.wiktionary": "thwiktionary", 
+ "ti.wikipedia": "tiwiki", 
+ "ti.wiktionary": "tiwiktionary", 
+ "tk.wikibooks": "tkwikibooks", 
+ "tk.wikipedia": "tkwiki", 
+ "tk.wikiquote": "tkwikiquote", 
+ "tk.wiktionary": "tkwiktionary", 
+ "tl.wikibooks": "tlwikibooks", 
+ "tl.wikipedia": "tlwiki", 
+ "tl.wiktionary": "tlwiktionary", 
+ "tn.wikipedia": "tnwiki", 
+ "tn.wiktionary": "tnwiktionary", 
+ "to.wikipedia": "towiki", 
+ "to.wiktionary": "towiktionary", 
+ "tpi.wikipedia": "tpiwiki", 
+ "tpi.wiktionary": "tpiwiktionary", 
+ "tr.wikibooks": "trwikibooks", 
+ "tr.wikinews": "trwikinews", 
+ "tr.wikipedia": "trwiki", 
+ "tr.wikiquote": "trwikiquote", 
+ "tr.wikisource": "trwikisource", 
+ "tr.wiktionary": "trwiktionary", 
+ "ts.wikipedia": "tswiki", 
+ "ts.wiktionary": "tswiktionary", 
+ "tt.wikibooks": "ttwikibooks", 
+ "tt.wikipedia": "ttwiki", 
+ "tt.wikiquote": "ttwikiquote", 
+ "tt.wiktionary": "ttwiktionary", 
+ "tum.wikipedia": "tumwiki", 
+ "tw.wikipedia": "twwiki", 
+ "tw.wiktionary": "twwiktionary", 
+ "ty.wikipedia": "tywiki", 
+ "tyv.wikipedia": "tyvwiki", 
+ "udm.wikipedia": "udmwiki", 
+ "ug.wikibooks": "ugwikibooks", 
+ "ug.wikipedia": "ugwiki", 
+ "ug.wikiquote": "ugwikiquote", 
+ "ug.wiktionary": "ugwiktionary", 
+ "uk.wikibooks": "ukwikibooks", 
+ "uk.wikinews": "ukwikinews", 
+ "uk.wikipedia": "ukwiki", 
+ "uk.wikiquote": "ukwikiquote", 
+ "uk.wikisource": "ukwikisource", 
+ "uk.wikivoyage": "ukwikivoyage", 
+ "uk.wiktionary": "ukwiktionary", 
+ "ur.wikibooks": "urwikibooks", 
+ "ur.wikipedia": "urwiki", 
+ "ur.wikiquote": "urwikiquote", 
+ "ur.wiktionary": "urwiktionary", 
+ "uz.wikibooks": "uzwikibooks", 
+ "uz.wikipedia": "uzwiki", 
+ "uz.wikiquote": "uzwikiquote", 
+ "uz.wiktionary": "uzwiktionary", 
+ "ve.wikipedia": "vewiki", 
+ "vec.wikipedia": "vecwiki", 
+ "vec.wikisource": "vecwikisource", 
+ "vec.wiktionary": "vecwiktionary", 
+ "vep.wikipedia": "vepwiki", 
+ "vi.wikibooks": "viwikibooks", 
+ "vi.wikipedia": "viwiki", 
+ "vi.wikiquote": "viwikiquote", 
+ "vi.wikisource": "viwikisource", 
+ "vi.wikivoyage": "viwikivoyage", 
+ "vi.wiktionary": "viwiktionary", 
+ "vls.wikipedia": "vlswiki", 
+ "vo.wikibooks": "vowikibooks", 
+ "vo.wikipedia": "vowiki", 
+ "vo.wikiquote": "vowikiquote", 
+ "vo.wiktionary": "vowiktionary", 
+ "wa.wikibooks": "wawikibooks", 
+ "wa.wikipedia": "wawiki", 
+ "wa.wiktionary": "wawiktionary", 
+ "war.wikipedia": "warwiki", 
+ "wg-en.wikipedia": "wg_enwiki", 
+ "wikidata": "wikidatawiki", 
+ "wikimediafoundation": "foundationwiki", 
+ "wikisource": "sourceswiki", 
+ "wo.wikipedia": "wowiki", 
+ "wo.wikiquote": "wowikiquote", 
+ "wo.wiktionary": "wowiktionary", 
+ "wuu.wikipedia": "wuuwiki", 
+ "xal.wikipedia": "xalwiki", 
+ "xh.wikibooks": "xhwikibooks", 
+ "xh.wikipedia": "xhwiki", 
+ "xh.wiktionary": "xhwiktionary", 
+ "xmf.wikipedia": "xmfwiki", 
+ "yi.wikipedia": "yiwiki", 
+ "yi.wikisource": "yiwikisource", 
+ "yi.wiktionary": "yiwiktionary", 
+ "yo.wikibooks": "yowikibooks", 
+ "yo.wikipedia": "yowiki", 
+ "yo.wiktionary": "yowiktionary", 
+ "za.wikibooks": "zawikibooks", 
+ "za.wikipedia": "zawiki", 
+ "za.wikiquote": "zawikiquote", 
+ "za.wiktionary": "zawiktionary", 
+ "zea.wikipedia": "zeawiki", 
+ "zh-classical.wikipedia": "zh_classicalwiki", 
+ "zh-min-nan.wikibooks": "zh_min_nanwikibooks", 
+ "zh-min-nan.wikipedia": "zh_min_nanwiki", 
+ "zh-min-nan.wikiquote": "zh_min_nanwikiquote", 
+ "zh-min-nan.wikisource": "zh_min_nanwikisource", 
+ "zh-min-nan.wiktionary": "zh_min_nanwiktionary", 
+ "zh-yue.wikipedia": "zh_yuewiki", 
+ "zh.wikibooks": "zhwikibooks", 
+ "zh.wikinews": "zhwikinews", 
+ "zh.wikipedia": "zhwiki", 
+ "zh.wikiquote": "zhwikiquote", 
+ "zh.wikisource": "zhwikisource", 
+ "zh.wikivoyage": "zhwikivoyage", 
+ "zh.wiktionary": "zhwiktionary", 
+ "zu.wikibooks": "zuwikibooks", 
+ "zu.wikipedia": "zuwiki", 
+ "zu.wiktionary": "zuwiktionary"
+}
diff --git a/makeHostnames.py b/makeHostnames.py
new file mode 100644
index 0000000..c54772a
--- /dev/null
+++ b/makeHostnames.py
@@ -0,0 +1,63 @@
+from __future__ import print_function
+import subprocess
+import re
+import json
+import sys
+import datetime
+
+# This script produces the JSON map from hostnames - as stored in hive - to 
wiki dbnames
+
+# Get the list of hostnames
+now = datetime.datetime.now()
+mon = now.month - 1
+year = now.year
+if mon == 0:
+    mon = 12
+    year -= 1
+# This uses last months' data, since this month may be just beginning and not 
have good data yet
+hostnames = subprocess.check_output(["hive", "-S", "-e",
+    'select distinct project from wmf.discovery_popularity_score \
+        where year=%d AND month=%d;' % (year, mon)]).split("\n")
+names = {}
+# The source file should be updated from:
+# 
https://raw.githubusercontent.com/wikimedia/operations-mediawiki-config/master/dblists/all.dblist
+dblist = set(open("all.dblist").read().split())
+# The following abomination comes from:
+# 
https://github.com/wikimedia/operations-mediawiki-config/blob/master/multiversion/MWMultiVersion.php#L134
+# And should be updated when that changes.
+# No, I have no idea how to ensure it's up to date. That's why one shouldn't 
hardcode such things.
+staticMap = {
+    'wikimediafoundation': 'foundation',
+    'mediawiki': 'mediawiki',
+    'wikidata': 'wikidata',
+    'wikisource': 'sources',
+    'be-tarask.wikipedia': 'be_x_old',
+}
+chapters = set(['ar', 'bd', 'be', 'br', 'ca', 'cn', 'co', 'dk', 'et', 'fi', 
'il', 'mk', 'mx', 'nl',
+    'noboard-chapters', 'no', 'nyc', 'nz', 'pa-us', 'pl', 'rs', 'ru', 'se', 
'tr', 'ua', 'uk', 've'])
+hostmatch = re.compile('^(.*)\.([a-z]+)$')
+for hostname in hostnames:
+    if hostname == 'project' or len(hostname) == 0:
+        # skip this hive artifact
+        continue
+    site = "wikipedia"
+    if hostname in staticMap:
+        lang = staticMap[hostname]
+    else:
+        m = hostmatch.match(hostname)
+        if not m:
+            print("BAD HOSTNAME: " + hostname, file=sys.stderr)
+            continue
+        lang = m.group(1)
+        if m.group(2) != 'wikimedia' or lang in chapters:
+            site = m.group(2)
+    if site == 'wikipedia':
+        site = 'wiki'
+
+    dbname = (lang + site).replace("-", "_")
+    if dbname not in dblist:
+        print("UNKNOWN DBNAME: " + dbname, file=sys.stderr)
+        continue
+    names[hostname] = dbname
+
+print(json.dumps(names, sort_keys=True, indent=1))
diff --git a/setup.cfg b/setup.cfg
index df07bdd..b7b70a3 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,4 +1,5 @@
 # configuration for flake8
 [flake8]
 # Raise the default 79 limit
-max-line-length = 100
+max-line-length = 120
+ignore = E128
diff --git a/transferToES.py b/transferToES.py
new file mode 100644
index 0000000..89218e0
--- /dev/null
+++ b/transferToES.py
@@ -0,0 +1,133 @@
+# A very primitive script to transfer from hive data files
+# to ElasticSearch HTTP endpoint
+from pyspark import SparkContext
+from pyspark.sql import SQLContext
+from optparse import OptionParser
+import requests
+import json
+import logging
+
+oparser = OptionParser()
+oparser.add_option("-s", "--source", dest="source", help="source for the 
data", metavar="SOURCE")
+oparser.add_option("-u", "--url", dest="url", help="URL to send the data to", 
metavar="URL")
+oparser.add_option("-m", "--hostmap", dest="hostmap", help="Hostnames map in 
JSON",
+    metavar="FILE", default="hostmap.json")
+oparser.add_option("-b", "--batch", dest="batch", help="Items per batch to 
load into ES", metavar="NUM", default="10")
+
+(options, args) = oparser.parse_args()
+
+ITEMS_PER_BATCH = int(options.batch)
+SOURCE = options.source
+TARGET = options.url
+hostMap = json.load(open(options.hostmap))
+
+print "Transferring from %s to %s" % (SOURCE, TARGET)
+
+if __name__ == "__main__":
+    sc = SparkContext(appName="Send To ES")
+    sqlContext = SQLContext(sc)
+    broardcastMap = sc.broadcast(hostMap)
+    documentCounter = sc.accumulator(0)
+    updateCounter = sc.accumulator(0)
+    errorCounter = sc.accumulator(0)
+    failedDocumentCounter = sc.accumulator(0)
+
+    def documentData(document):
+        """
+        Create textual representation of the document data for one document
+        """
+        updateData = {"update": {"_id": document.page_id}}
+        updateDoc = {"doc": {"score": document.score}}
+        return json.dumps(updateData) + "\n" + json.dumps(updateDoc) + "\n"
+
+    def getTargetURL(wikihost):
+        """
+        Get ES URL from wiki hostname
+        """
+        if wikihost in broardcastMap.value:
+            wiki = broardcastMap.value[wikihost]
+            return TARGET + "/" + wiki + "_content" + "/page/_bulk"
+        return None
+
+    def sendDataToES(data, url):
+        """
+        Send data to ES server
+        """
+        if len(data) < 1:
+            return
+        try:
+            r = requests.put(url, data=data)
+        except requests.exceptions.RequestException, e:
+            errorCounter.add(1)
+            logging.error("Failed to send update: " + str(e))
+            return False
+        if r.status_code != 200:
+            errorCounter.add(1)
+            r.close()
+            return False
+        parseResponse(r)
+        updateCounter.add(1)
+        return True
+
+    def parseResponse(resp):
+        respData = resp.json()
+        for item in respData.get('items', default={}):
+            if 'update' not in item:
+                continue
+            if 'status' not in item['update']:
+                continue
+            if item['update']['status'] != 200:
+                if 'error' in item['update'] and item['update']['error'][0:24] 
== 'DocumentMissingException':
+                    continue
+                failedDocumentCounter.add(1)
+
+    def sendDocumentsToES(documents):
+        """
+        Send a set of documents to ES
+        """
+        if len(documents) < 1:
+            return
+        url = getTargetURL(documents[0].project)
+        if not url:
+            return
+        data = ""
+        for document in documents:
+            data += documentData(document)
+        documentCounter.add(len(documents))
+        if not sendDataToES(data, url):
+            failedDocumentCounter.add(len(documents))
+
+    def addToList(listNow, element):
+        """
+        Add element to list, will send the data out once batch is full
+        """
+        if len(listNow) < ITEMS_PER_BATCH:
+            return listNow + [element]
+        # Treshold reached, send the list out
+        sendDocumentsToES(listNow)
+        return [element]
+
+    def mergeLists(listOne, listTwo):
+        """
+        Merge two lists, will send the data out once batch is full
+        """
+        newList = listOne + listTwo
+        if len(newList) < ITEMS_PER_BATCH:
+            return newList
+        sendDocumentsToES(newList)
+        return []
+
+    def sendCombined(data):
+        """
+        Send data for the key (hostname) to ES
+        """
+        sendDocumentsToES(data[1])
+
+    data = sqlContext.load(SOURCE)
+    # print "Count: %d\n" % data.count()
+    # Here's what is going on here: we combine the data by project,
+    # and when the list of projects reaches ITEMS_PER_BATCH we send them out
+    # The foreach() part will send out the ones that remained
+    data.map(lambda x: (x.project, x)).combineByKey(lambda x: [x], addToList, 
mergeLists).foreach(sendCombined)
+    print "%d documents processed, %d failed." % (documentCounter.value, 
failedDocumentCounter.value,)
+    print "%d requests successful, %d requests failed." % 
(updateCounter.value, errorCounter.value)

-- 
To view, visit https://gerrit.wikimedia.org/r/248564
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Id4df5bffca445b396c875329bce005327110ddab
Gerrit-PatchSet: 16
Gerrit-Project: wikimedia/discovery/analytics
Gerrit-Branch: master
Gerrit-Owner: Smalyshev <[email protected]>
Gerrit-Reviewer: DCausse <[email protected]>
Gerrit-Reviewer: EBernhardson <[email protected]>
Gerrit-Reviewer: Smalyshev <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to