From 8f38d1bbac915874a47d5dc12f0c9e8bec9cb800 Mon Sep 17 00:00:00 2001 From: Alexander Tran Date: Mon, 29 Feb 2016 22:23:38 -0800 Subject: [PATCH 1/3] able to pull daa from MongoDB to MySQL --- MongoDBtoMySQL.py | 64 +++++++++++++++++++++++ db/.DS_Store | Bin 0 -> 6148 bytes db/__init__.py | 33 ++++++++++++ db/__init__.pyc | Bin 0 -> 1715 bytes db/__pycache__/__init__.cpython-34.pyc | Bin 0 -> 1411 bytes db/__pycache__/config.cpython-34.pyc | Bin 0 -> 762 bytes db/__pycache__/models.cpython-34.pyc | Bin 0 -> 2588 bytes db/config.py | 19 +++++++ db/config.pyc | Bin 0 -> 896 bytes db/models.py | 67 +++++++++++++++++++++++++ db/models.pyc | Bin 0 -> 3279 bytes preprocessor.py | 31 ++++++------ 12 files changed, 199 insertions(+), 15 deletions(-) create mode 100644 MongoDBtoMySQL.py create mode 100644 db/.DS_Store create mode 100644 db/__init__.py create mode 100644 db/__init__.pyc create mode 100644 db/__pycache__/__init__.cpython-34.pyc create mode 100644 db/__pycache__/config.cpython-34.pyc create mode 100644 db/__pycache__/models.cpython-34.pyc create mode 100644 db/config.py create mode 100644 db/config.pyc create mode 100644 db/models.py create mode 100644 db/models.pyc diff --git a/MongoDBtoMySQL.py b/MongoDBtoMySQL.py new file mode 100644 index 0000000..1ff8350 --- /dev/null +++ b/MongoDBtoMySQL.py @@ -0,0 +1,64 @@ +"Loads MongoDB to MySQL for queries" + + +from db import MySQL, MySQLConfig +from db import MySQLObject +from pymongo import MongoClient + +class MongoDBLoader: + def __init__(self): + """Set up connection.""" + print("Setting up connection...") + settings = {'MONGODB_SERVER': "localhost", + 'MONGODB_PORT': 27017, + 'MONGODB_DB': "ecosystem_mapping", + 'MONGODB_FILTERED_COLLECTION': "filtered_collection", + 'MONGODB_LINK_COLLECTION': "link_collection"} + connection = MongoClient( + settings['MONGODB_SERVER'], + settings['MONGODB_PORT'] + ) + self.db = connection[settings['MONGODB_DB']] + self.link_collection = self.db[settings['MONGODB_LINK_COLLECTION']] + self.filtered_collection = self.db[settings['MONGODB_FILTERED_COLLECTION']] + + def load_save(self): + """Loads in from MongoDB and saves to MySQL.""" + mysql = MySQL(config=MySQLConfig) + urls = list() + base_urls = self.link_collection.distinct("base_url") + for base_url in base_urls: + for data in self.link_collection.find({"base_url": base_url}): + src_url = data['src_url'] + dst_url = data['dst_url'] + urls.append(data) + MySQLObject(base_url=bytes(base_url, 'utf-8'), + src_url=bytes(src_url, 'utf-8'), + links = str(dst_url)).save() + print("adding %s to MySQL" % base_url) + +MongoDBLoader().load_save() + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/db/.DS_Store b/db/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c3ef63eda043dbc5b76109081b795b1ac9771216 GIT binary patch literal 6148 zcmeHKy-ve05Wa&BmAaIT(T_miz^cL%bYlr9L3AKW20F0$8F>$8R=)e8ZPZjkLP7}L zN%nWP@6MM`itQsJUhmo!(UOSfXo4)tgvj*d(uEt(fUGeZdZ323^hotYpuadJxi64y zO#{6m_e1{m^V4e6^xa@-Uwxdn?E0!|cP|am+xuOs_Ge;tefv$zVSBv$jU^F%Fc1s` z1HnKr@N))mXN$}ihS3KD!9XyuXF$$}geI6Bi=iGJ=(Gd?$}?I8y3`WllN_^SF~kal z%@t^_>?H=9JLZ$yWyfM@?!;bvul=6^}!T}M1R3DKlRF%S!R$>cCo7Ao!!MhcNG!m%% zH17NuegMpjowOGugo=|L&(4m=-#kA1Ki4{6zyEj_LVfvo-^XQ7QAGF`kOI7^HG!H3 zkq@Z{eIIJQ0m%~doAYf8`pXbCz_ei~AXi#y=8n~EKu}F zI1-QJUw9q4CDacm$FE;4P}1oEE_)k=0qEm)Bp6#jg0Vd~M+MXNS!qy`WLcslNoiu9jSB(i z0ICIU8Im?jP8^L%3mru5utIKb71SEZWF3+Xs?WkrM6J3k_7)Qj&Uq3G=$JN@5U|(Gr-Z zXnGaPihNZ31Ir#^kVAU*<-uR`jAny*b{Cb3XT%{7YJMQk1QLM9?2iOEs)|WY*n6s5 z&2FAGNrTD}g-|I-T%Z!-aqz|RZrmkH9$PyV?6#GV z%AY~}6V9A+<Ic5s-R2nv8RDvo0<>~|rUjAK?0ck4C1XR{a2pU!XD zX)~3z97>}$M^#y>QJq!grW~4DOKXp4f4XRna6H0cJ|NTp6U@b6g1Hn{UeMaQ^?Ewa#m(_ zCi85*SpNK8F*67G-RaEE+evbCXp}Bxp-#4srqY;ql}=A~j^0$JK1q%`22Pr=i)+Fz ztnnzS3A-Tf4YM-c8>}^sk$icim8_LeVc|LF&&!~LA@v(vX+4vLa zRm}I}LGlU@ZIXw%dY@=Dt&(AunnaGrT8(90X}exnro%)CB28uI6MU1camK(?T?n5Ji<9=48i0930BLeG&+fRwE(w1>Dt^y8vtC z^AP$t3>h)=9qajT;aBCjn%{m#)8pNLl0M1bO8+Vv=h7!xJJ3oNrO!~4&R;aSH}D## zP&{bgGOGzq)D9fIjFVm=pw69xWr66qj>FiO&_TMX@ErG=m2 zOZWjQx9Rf%shC+O(G^#)mY-(cc<1fB^=-PJy!i9?>o*VJ2Da7+<9GPlIf4XW03W0W z(uZG|`|#5T<{>o#88|9%ln-(Y7qjsCO>(B2RavZ!=t|v8S7oK9D{ZDybYdy2n&!G` zR8B>kL-=XMfF|Vu79R-Z8x@4HLpe6mQAsk#eK|qBWlHY zpKxAlxvnTqIlo+s>b??jE_IG{ytc{^*~hK0_J=mI4_x#3!Ghml_Hjf9cPH5w++efQ zN?m0}wK`jt(q^J4j4DK@jmx)Exy**?4%&?&&&K%L1R?c8KlJEv{BCn!XMWDdaj)&14yO@oJHZ;9sb~WhZli{x3(%Ec)5c(RcPI90fIdPhB)>94!L?$JNpUiV$>#YyAlagC5|USWers!gXZ z$quyG;ajawszH-3oswO~VLdG4kiaenq*55w$0C}Pjxm~_}z3D}spe5&*qJRtMj0zU|w zmA4-owYa0z(Ja*}SJTq;pB1_vXIZ}(PSmJ0BY}hY$NzcU$1pvJlGx#2U{C<1v)D56 zOLexbpHBOSSv*n$;NBb*<)i#Cvj$Z1wbq4(+A}J9_B&}GXZ?F`_eZ0&+5IY0$Gch` z7Q4eVF}v}2tkpO!3vHjTJSM~4yhv1Lb`Iw_3Z^>@jN?JhqQ#Ewu=fAs@8L96o_he` z+QV7+$277iYth7G<<~E-V}5S4V{O*@LFiXO6iwq?MN!p`B4C|mJnu%)(Jao+R+>?i z6r(880o!OT8{)udwx(SOo)}hjh3|G7R<}e2M!Ux^D=iG_4FQEgU)( z0!#V{tBjxrK4X>~VhN~1+evW9v3+*2X<}}X{knK+&Q*;poxU)y69AIIbe3iDFjEf)?}%kDijclc)xAaE#4de{ zxB3UAPN(B4;M_(tooVKa^!6V=*#{T(h;`C?s*X#2hj(2D(#~u&-^T)9GKSM=qv_ld z+d{K`DUL1_dl=?ph_~aI;=-`E(r5LZbPzVsJ&NhL;A&fJ+UbM+rT!sW8G#OFkujh?G~zLTVJ#`k?qjrXpsfE7E5Lhb3e zL_?J>6tc6VF>zA0FSl6gRh^vug@fr-Y34%Z*Ph#}ORirzA!1_MinMf+!GmHntaK6Mc2KtcK7y;*6rXwn4J>) literal 0 HcmV?d00001 diff --git a/db/config.py b/db/config.py new file mode 100644 index 0000000..c2274d0 --- /dev/null +++ b/db/config.py @@ -0,0 +1,19 @@ +""" +Configuration file for database connections +""" + +class MySQLConfig: + """configuration for MySQL""" + + username = 'root' + password = 'Cindylam1002' + host = 'localhost' + database = 'ecosystem_mapping' + + +class MongoConfig: + """configuration for MongoDB""" + + host = 'localhost' + port = '27017' + database = 'dbsamples' diff --git a/db/config.pyc b/db/config.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8cf3e1f14cacd747a79913f319ec33589a3aa88 GIT binary patch literal 896 zcmbtS%TC)s6uog011V+G1!CtF@}_lQ!v<9px-3YY2&8&rO*|80$?;e-6Va^8&+sMv z3cjL0z`2tGSpXYs&GCKCJ##$$e;-HpcYm)+`v3ItJ;8EgfFjC)JyJ2Lh;E7g5dF&G z_epJ#8a#y}QbU@go80*sFgi2stgaST`r5R~tZsBNGd5Au%c*oaDNWnzl9O)aKcM4$ zIr;fx)%8TChxjRPxew4FgULV)>roC05#Q*fqIX@VW5B(MbjVWbwZJZCDnmRe}8tu{zutgfUt zHu!671bcZJnVo3+VO$FDT5Le?Jv`i##(p zJQ^Py3GPT^fZ&)27V9OLU(lp8)(gG{&oTt-{aWx}-obL4fJZGZ*2XYb5!k>W!S!od Xj=h^ixC6(ltMZlSIaVZ&K5ab!{jS9L literal 0 HcmV?d00001 diff --git a/db/models.py b/db/models.py new file mode 100644 index 0000000..a617db1 --- /dev/null +++ b/db/models.py @@ -0,0 +1,67 @@ +from sqlalchemy.dialects import mysql +import sqlalchemy.ext.declarative as sad +import sqlalchemy as sa +import mongoengine as me + + +class Base(object): + """requirements for all objects""" + + + def save(self): + """save object in place""" + raise NotImplementedError() + + + def delete(self): + """delete object""" + raise NotImplementedError() + + +class MySQLBase(sad.declarative_base(), object): + """MySQL base object""" + + __abstract__ = True + db = None + + id = sa.Column(sa.Integer, primary_key=True) + + @classmethod + def objects(cls, give_query=False, **data): + query = cls.query().filter_by(**data) + return query if give_query else query.all() + + @classmethod + def query(cls): + """Returns query object""" + return cls.db.session.query(cls) + + def save(self): + """save object to database""" + self.db.session.add(self) + self.db.session.commit() + return self + + +class MySQLObject(MySQLBase): + """sample MySQL object""" + + __tablename__ = 'links' + + base_url = sa.Column(sa.String(100)) + src_url = sa.Column(mysql.BLOB()) + links = sa.Column(sa.Text, nullable = False) + +class MongoBase(me.Document): + """MongoDB base object""" + + meta = { + 'abstract': True + } + + +class MongoObject(MongoBase): + """sample MongoDB object""" + + name = me.StringField(maxlength=100) + email = me.StringField(maxlength=50, unique=True) diff --git a/db/models.pyc b/db/models.pyc new file mode 100644 index 0000000000000000000000000000000000000000..913eb87555ae0dd99f386d81ced482e245583148 GIT binary patch literal 3279 zcmcIm-EJF26h7m196L>#w56rxFBUf#Ate$Qz(vK6TZ$@LS8M>O7Lv8zow)1ndXt@T zRZHQ9a?AVlF?b6efCqr@J8L^`dV^GBd1mML%=ymw&Y21R-r0Kj*PlPfGXDkmevRT@ zqDt^Ll8NL-`bG@qFG;c? zc0~p#%Nn<&^Bgv-N9o^Jij$W3eCAKBwU7grkPV7l?N$j4EZZAi#P{E_l4wO&- z!LMV`@*Ak~nLEvTzK&)$a&`%r3%V$-jmipf0%jko8A|O3l*mS1!lMq&;CJDsZ?6`xkXytCBb@-FBr91p4v(FDpdr}+@)5IM{qfu!` zkuOT^uXK~)VO}IQa|b6gH4gQ;MA_6(YX2DvAwrJz3p5pokYZHhkhWW=wvFY9duYw| z?afW#`L!YuCm+8P=gWa?{Eac2g0(8 z=+XG=?~=S!#a&q_(HLBqhkDikK#T?btW=a5|53X)#MM6 zUjsQaQtr!HAV(yE;VIgQGpDW^rO)i3 z+QGRb@=-|j&Rz88M5kxw!TLU$jt5EYx>>TFxHWPagB5Oo20XN3*b1S>Z)p9roVd1X zJU3^BoHCN3^37T2(qdBKAT`3vsMd%`C4UH+RTu=X1NjJ(uLCjXL!cD07W#8=Z&TVz za`Hu+z94JVY2j5Y2x*_nmr3GDu(-(c)c-FLui;7@8dOrdX7)_4!{85ja!9X+O;no5 zek`ZfZ=*LDL__DxDE5ecdb(FktZMJ+A{VLNcZzJ9Pt;rYC*F>1sk3RKu@PsHbGh|T zibNTGFUp(^8B1z;)$H7z+InM_hRhe&sUaaEhtybZ)&jFz-`!BPG@CrqTPMaE{Sjdo z#XUx~nop27aGTk>jByR4ZZL0v%=qK>o{u+W+#(S;i1e~ttXT!AhG}Pq$%Mx^df!F7 zpW3R*BAqa$X6fXqOB1v-9Z#lN77a7oA@eW#iy5(IoR^5_nI)`&UtDYFjNgDPcW!&w)lBdb;1)KG%yI{%i1{NrIkTqI6 zWD5KoWpS&4ixm&4>IEK>0}A*HG*$uQ^1|a0fJr|wctxI%;I&m3+rW4YoCM7%#c2@C zX*M@XmA%#0dGs8#8Tltlw)9i%P|{2%DUx!BCc9uIjcgc**GfgLd#TM5wHx_YS&>KE zJW8{*oADD!{t9Jj#;c~oZ0a?hPO~VBpV)kMkfc$@2W7=|Mg!iki%F3CAhAeHW#n;X zY7)kng1R{FqD1f3^X(d7x;CdpVZRhfk#ttuRp!-KjA!;)5jbE3YHkV{0UDHdi+IYX na7a^ygtu;+=`pvfN8FdZK{YAvnX6{oYzH?k@87!7y4Cy_%-Ol= literal 0 HcmV?d00001 diff --git a/preprocessor.py b/preprocessor.py index 6e45ab7..01318f4 100644 --- a/preprocessor.py +++ b/preprocessor.py @@ -39,8 +39,8 @@ def load_save(self): print("Processing URL: %s" % base_url) for data in self.html_collection.find({"base_url": base_url}): - source = data['src_url'] - # source = data['url'] + # source = data['src_url'] + source = data['url'] text = self.clean(data['body']) tier = data['tier'] time = data['timestamp'] @@ -90,19 +90,20 @@ def clean(self, text): return text def remove_named_entity(self, text): - _text = list() - for idx, sent in enumerate(nltk.sent_tokenize(text)): - for chunk in nltk.ne_chunk(nltk.pos_tag(nltk.word_tokenize(sent)), binary = True): - #if hasattr(chunk, 'lab'): - if type(chunk) is not nltk.Tree: - word, pos = chunk - # if pos == " " for further removal - _text.append(word) - else: - #ne = ' '.join(c[0] for c in chunk.leaves()) - #self.named_entities.append(ne) - continue - return ' '.join(_text) + # _text = list() + # for idx, sent in enumerate(nltk.sent_tokenize(text)): + # for chunk in nltk.ne_chunk(nltk.pos_tag(nltk.word_tokenize(sent)), binary = True): + # #if hasattr(chunk, 'lab'): + # if type(chunk) is not nltk.Tree: + # word, pos = chunk + # # if pos == " " for further removal + # _text.append(word) + # else: + # #ne = ' '.join(c[0] for c in chunk.leaves()) + # #self.named_entities.append(ne) + # continue + # return ' '.join(_text) + return text def remove_boilerplate(self, text): jtext = justext.justext(text, justext.get_stoplist("English")) From c53b08b9897fa0584e8f1157d376de612747fc60 Mon Sep 17 00:00:00 2001 From: Alexander Tran Date: Mon, 29 Feb 2016 22:25:36 -0800 Subject: [PATCH 2/3] able to pull data from MongoDB to MySQL --- db/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/config.py b/db/config.py index c2274d0..29dd81c 100644 --- a/db/config.py +++ b/db/config.py @@ -6,7 +6,7 @@ class MySQLConfig: """configuration for MySQL""" username = 'root' - password = 'Cindylam1002' + password = 'root' host = 'localhost' database = 'ecosystem_mapping' From 5573ae853f578d977dd38801166907c06c91a1e8 Mon Sep 17 00:00:00 2001 From: Don Han Date: Mon, 29 Feb 2016 23:59:58 -0800 Subject: [PATCH 3/3] delete DS store, pyc and pycache --- db/.DS_Store | Bin 6148 -> 0 bytes db/__init__.pyc | Bin 1715 -> 0 bytes db/__pycache__/__init__.cpython-34.pyc | Bin 1411 -> 0 bytes db/__pycache__/config.cpython-34.pyc | Bin 762 -> 0 bytes db/__pycache__/models.cpython-34.pyc | Bin 2588 -> 0 bytes db/config.pyc | Bin 896 -> 0 bytes db/models.pyc | Bin 3279 -> 0 bytes 7 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 db/.DS_Store delete mode 100644 db/__init__.pyc delete mode 100644 db/__pycache__/__init__.cpython-34.pyc delete mode 100644 db/__pycache__/config.cpython-34.pyc delete mode 100644 db/__pycache__/models.cpython-34.pyc delete mode 100644 db/config.pyc delete mode 100644 db/models.pyc diff --git a/db/.DS_Store b/db/.DS_Store deleted file mode 100644 index c3ef63eda043dbc5b76109081b795b1ac9771216..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 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 diff --git a/db/config.pyc b/db/config.pyc deleted file mode 100644 index c8cf3e1f14cacd747a79913f319ec33589a3aa88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 896 zcmbtS%TC)s6uog011V+G1!CtF@}_lQ!v<9px-3YY2&8&rO*|80$?;e-6Va^8&+sMv z3cjL0z`2tGSpXYs&GCKCJ##$$e;-HpcYm)+`v3ItJ;8EgfFjC)JyJ2Lh;E7g5dF&G z_epJ#8a#y}QbU@go80*sFgi2stgaST`r5R~tZsBNGd5Au%c*oaDNWnzl9O)aKcM4$ zIr;fx)%8TChxjRPxew4FgULV)>roC05#Q*fqIX@VW5B(MbjVWbwZJZCDnmRe}8tu{zutgfUt zHu!671bcZJnVo3+VO$FDT5Le?Jv`i##(p zJQ^Py3GPT^fZ&)27V9OLU(lp8)(gG{&oTt-{aWx}-obL4fJZGZ*2XYb5!k>W!S!od Xj=h^ixC6(ltMZlSIaVZ&K5ab!{jS9L diff --git a/db/models.pyc b/db/models.pyc deleted file mode 100644 index 913eb87555ae0dd99f386d81ced482e245583148..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3279 zcmcIm-EJF26h7m196L>#w56rxFBUf#Ate$Qz(vK6TZ$@LS8M>O7Lv8zow)1ndXt@T zRZHQ9a?AVlF?b6efCqr@J8L^`dV^GBd1mML%=ymw&Y21R-r0Kj*PlPfGXDkmevRT@ zqDt^Ll8NL-`bG@qFG;c? zc0~p#%Nn<&^Bgv-N9o^Jij$W3eCAKBwU7grkPV7l?N$j4EZZAi#P{E_l4wO&- z!LMV`@*Ak~nLEvTzK&)$a&`%r3%V$-jmipf0%jko8A|O3l*mS1!lMq&;CJDsZ?6`xkXytCBb@-FBr91p4v(FDpdr}+@)5IM{qfu!` zkuOT^uXK~)VO}IQa|b6gH4gQ;MA_6(YX2DvAwrJz3p5pokYZHhkhWW=wvFY9duYw| z?afW#`L!YuCm+8P=gWa?{Eac2g0(8 z=+XG=?~=S!#a&q_(HLBqhkDikK#T?btW=a5|53X)#MM6 zUjsQaQtr!HAV(yE;VIgQGpDW^rO)i3 z+QGRb@=-|j&Rz88M5kxw!TLU$jt5EYx>>TFxHWPagB5Oo20XN3*b1S>Z)p9roVd1X zJU3^BoHCN3^37T2(qdBKAT`3vsMd%`C4UH+RTu=X1NjJ(uLCjXL!cD07W#8=Z&TVz za`Hu+z94JVY2j5Y2x*_nmr3GDu(-(c)c-FLui;7@8dOrdX7)_4!{85ja!9X+O;no5 zek`ZfZ=*LDL__DxDE5ecdb(FktZMJ+A{VLNcZzJ9Pt;rYC*F>1sk3RKu@PsHbGh|T zibNTGFUp(^8B1z;)$H7z+InM_hRhe&sUaaEhtybZ)&jFz-`!BPG@CrqTPMaE{Sjdo z#XUx~nop27aGTk>jByR4ZZL0v%=qK>o{u+W+#(S;i1e~ttXT!AhG}Pq$%Mx^df!F7 zpW3R*BAqa$X6fXqOB1v-9Z#lN77a7oA@eW#iy5(IoR^5_nI)`&UtDYFjNgDPcW!&w)lBdb;1)KG%yI{%i1{NrIkTqI6 zWD5KoWpS&4ixm&4>IEK>0}A*HG*$uQ^1|a0fJr|wctxI%;I&m3+rW4YoCM7%#c2@C zX*M@XmA%#0dGs8#8Tltlw)9i%P|{2%DUx!BCc9uIjcgc**GfgLd#TM5wHx_YS&>KE zJW8{*oADD!{t9Jj#;c~oZ0a?hPO~VBpV)kMkfc$@2W7=|Mg!iki%F3CAhAeHW#n;X zY7)kng1R{FqD1f3^X(d7x;CdpVZRhfk#ttuRp!-KjA!;)5jbE3YHkV{0UDHdi+IYX na7a^ygtu;+=`pvfN8FdZK{YAvnX6{oYzH?k@87!7y4Cy_%-Ol=