集算器协助MongoDB计算之本地化排序

对于本地化语言(例如:中文),MongoDB是按照UNICODE编码排序,而不是根据本地语言的编码排序。用esProc结合MongoDB可以方便的实现本地化语言的排序(例如:中文按照拼音排序)。下面我们以中文为例,来看一下具体做法。

MongoDB中的集合person保存了姓名和性别如下:

>db.person.find()

{"_id" : ObjectId("544e4e070f03ad39eb2bf498"),"name" : "宋江", "gender" : "男"}

{"_id" : ObjectId("544e4e070f03ad39eb2bf499"),"name" : "李逵", "gender" : "男"}

{"_id" : ObjectId("544e4e070f03ad39eb2bf49a"),"name" : "吴用", "gender" : "男"}

{"_id" : ObjectId("544e4e070f03ad39eb2bf49b"),"name" : "晁盖", "gender" : "男"}

{"_id" : ObjectId("544e4e070f03ad39eb2bf49c"),"name" : "公孙胜", "gender" : "男" }

{"_id" : ObjectId("544e4e070f03ad39eb2bf49d"),"name" : "鲁智深", "gender" : "男" }

{"_id" : ObjectId("544e4e070f03ad39eb2bf49e"),"name" : "武松", "gender" : "男"}

{"_id" : ObjectId("544e4e070f03ad39eb2bf49f"),"name" : "阮小二", "gender" : "男" }

{"_id" : ObjectId("544e4e070f03ad39eb2bf4a0"),"name" : "杨志", "gender" : "男"}

{"_id" : ObjectId("544e4e070f03ad39eb2bf4a1"), "name": "孙二娘", "gender" : "女" }

{"_id" : ObjectId("544e4e070f03ad39eb2bf4a2"),"name" : "扈三娘", "gender" : "女" }

{"_id" : ObjectId("544e4e080f03ad39eb2bf4a3"),"name" : "燕青", "gender" : "男"}

直接用MongoDB的sort函数,没有按照拼音排序:

>db.person.find({},{"name":1,"gender":1,"_id":0}).sort({"name":1})

{"name" : "公孙胜", "gender" : "男" }

{"name" : "吴用", "gender" : "男" }

{"name" : "孙二娘", "gender" : "女" }

{"name" : "宋江", "gender" : "男" }

{"name" : "扈三娘", "gender" : "女" }

{"name" : "晁盖", "gender" : "男" }

{"name" : "李逵", "gender" : "男" }

{"name" : "杨志", "gender" : "男" }

{"name" : "武松", "gender" : "男" }

{"name" : "燕青", "gender" : "男" }

{"name" : "阮小二", "gender" : "男" }

{"name" : "鲁智深", "gender" : "男" }

用esProc协助MongoDB的脚本如下:

A1:连接MongoDB,ip和端口号是localhost:27017,数据库是test,用户名和密码都是test。如果需要其他参数的话可以按照mongo://ip:port/db?arg=value&…格式继续写参数。

A2:使用find函数从MongoDB中取数,形成游标。集合是person,过滤条件是空,指定键是name和gender。可以看出find函数和mongdb的find函数类似。esProc的游标是分批读取和处理数据,可以避免数据量过大,内存出现溢出的情况。

A3:因为数据量不大,所以这里fetch出游标的所有记录。

A4:使用sort按照name升序排序。排序所使用的语言是中文。集算器支持的其他本地化语言,见后。

运行的结果是:

需要说明的是:esProc并不包含MongoDB的java驱动包。用esProc来访问MongoDB,必须提前将MongoDB的java驱动包(要求2.12.2或以上版,如mongo-java-driver-2.12.2.jar)放到[esProc安装目录]\common\jdbc中。

esProc协助MongoDB计算的脚本很容易集成到java中,只要增加一行A5,写成result A4即可向java输出resultset形式的结果,具体的代码参考esProc教程。同样,用java调用esProc访问MongoDB也必须将mongdb的java驱动包放到java程序的classpath中。

MongoDB的java驱动包下载地址是:

https://github.com/MongoDB/mongo-java-driver/releases

esProc支持的语言包括:

ja_JP       日文  日本

es_PE     西班牙文  秘鲁

en            英文

ja_JP_JP   日文         日本

es_PA     西班牙文  巴拿马

sr_BA     塞尔维亚文       波斯尼亚和黑山共和国

mk           马其顿文

es_GT    西班牙文  危地马拉

ar_AE     阿拉伯文  阿拉伯联合酋长国

no_NO   挪威文       挪威

sq_AL     阿尔巴尼亚文  阿尔巴尼亚

bg            保加利亚文

ar_IQ      阿拉伯文  伊拉克

ar_YE     阿拉伯文  也门

hu            匈牙利文

pt_PT     葡萄牙文  葡萄牙

el_CY      希腊文       塞浦路斯

ar_QA    阿拉伯文  卡塔尔

mk_MK  马其顿文  马其顿王国

sv            瑞典文

de_CH    德文  瑞士

en_US    英文  美国

fi_FI        芬兰文       芬兰

is             冰岛文

cs            捷克文

en_MT   英文  马耳他

sl_SI        斯洛文尼亚文  斯洛文尼亚

sk_SK      斯洛伐克文       斯洛伐克

it              意大利文

tr_TR      土耳其文  土耳其

zh            中文

th            泰文

ar_SA     阿拉伯文  沙特阿拉伯

no            挪威文

en_GB    英文  英国

sr_CS      塞尔维亚文       塞尔维亚及黑山

lt              立陶宛文

ro            罗马尼亚文

en_NZ    英文  新西兰

no_NO_NY       挪威文     挪威

lt_LT       立陶宛文  立陶宛

es_NI     西班牙文  尼加拉瓜

nl             荷兰文

ga_IE      爱尔兰文  爱尔兰

fr_BE      法文  比利时

es_ES     西班牙文  西班牙

ar_LB     阿拉伯文  黎巴嫩

ko            朝鲜文

fr_CA      法文  加拿大

et_EE     爱沙尼亚文       爱沙尼亚

ar_KW    阿拉伯文  科威特

sr_RS      塞尔维亚文       塞尔维亚

es_US     西班牙文  美国

es_MX   西班牙文  墨西哥

ar_SD     阿拉伯文  苏丹

in_ID      印度尼西亚文  印度尼西亚

ru            俄文

lv             拉托维亚文(列托)

es_UY    西班牙文  乌拉圭

lv_LV       拉托维亚文(列托)    拉脱维亚

iw            希伯来文

pt_BR     葡萄牙文  巴西

ar_SY      阿拉伯文  叙利亚

hr            克罗地亚文

et            爱沙尼亚文

es_DO    西班牙文  多米尼加共和国

fr_CH     法文  瑞士

hi_IN      印地文       印度

es_VE     西班牙文  委内瑞拉

ar_BH    阿拉伯文  巴林

en_PH    英文  菲律宾

ar_TN     阿拉伯文  突尼斯

fi              芬兰文

de_AT     德文  奥地利

es            西班牙文

nl_NL      荷兰文       荷兰

es_EC     西班牙文  厄瓜多尔

zh_TW   中文  台湾地区

ar_JO     阿拉伯文  约旦

be            白俄罗斯文

is_IS        冰岛文       冰岛

es_CO    西班牙文  哥伦比亚

es_CR    西班牙文  哥斯达黎加

es_CL     西班牙文  智利

ar_EG     阿拉伯文  埃及

en_ZA    英文  南非

th_TH     泰文  泰国

el_GR     希腊文       希腊

it_IT        意大利文  意大利

ca            加泰罗尼亚文

hu_HU   匈牙利文  匈牙利

fr             法文

en_IE      英文  爱尔兰

uk_UA    乌克兰文  乌克兰

pl_PL      波兰文       波兰

fr_LU      法文  卢森堡

nl_BE      荷兰文       比利时

en_IN     英文  印度

ca_ES     加泰罗尼亚文  西班牙

ar_MA   阿拉伯文  摩洛哥

es_BO    西班牙文  玻利维亚

en_AU    英文  澳大利亚

sr             塞尔维亚文

zh_SG     中文  新加坡

pt            葡萄牙文

uk            乌克兰文

es_SV     西班牙文  萨尔瓦多

ru_RU    俄文  俄罗斯

ko_KR     朝鲜文       韩国

vi             越南文

ar_DZ     阿拉伯文  阿尔及利亚

vi_VN     越南文       越南

sr_ME    塞尔维亚文       黑山

sq            阿尔巴尼亚文

ar_LY      阿拉伯文  利比亚

ar            阿拉伯文

zh_CN    中文  中国

be_BY    白俄罗斯文       白俄罗斯

zh_HK    中文  香港

ja             日文

iw_IL      希伯来文  以色列

bg_BG    保加利亚文       保加利亚

in             印度尼西亚文

mt_MT  马耳他文  马耳他

es_PY     西班牙文  巴拉圭

sl             斯洛文尼亚文

fr_FR      法文  法国

cs_CZ     捷克文       捷克共和国

it_CH      意大利文  瑞士

ro_RO    罗马尼亚文       罗马尼亚

es_PR     西班牙文  波多黎哥

en_CA    英文  加拿大

de_DE    德文  德国

ga            爱尔兰文

de_LU    德文  卢森堡

de            德文

es_AR    西班牙文  阿根廷

sk            斯洛伐克文

ms_MY  马来文       马来西亚

hr_HR    克罗地亚文       克罗地亚

en_SG    英文  新加坡

da            丹麦文

mt           马耳他文

pl             波兰文

ar_OM   阿拉伯文  阿曼

tr             土耳其文

th_TH_TH         泰文         泰国

el             希腊文

ms           马来文

sv_SE      瑞典文       瑞典

da_DK    丹麦文       丹麦

es_HN    西班牙文  洪都拉斯

时间: 2024-08-29 19:33:06

集算器协助MongoDB计算之本地化排序的相关文章

集算器协助MongoDB计算之数位比较

Mongodb脚本解决复杂问题的计算能力有限,直接使用时较为吃力.很多情况下需要将数据读出后在主程序中进一步完成运算,而在Java等高级语言中编写这类集合式运算也比较麻烦.这时可以用集算器esProc来辅助,本文通过例子来说明使用方法. Mongodb中有一个test集合如下: >db.test.find({},{"_id":0}) {"value" : NumberLong(112937552) } {"value" : NumberLo

集算器协助MongoDB计算之交叉汇总

MongoDB实现交叉汇总比较困难,如果将数据取出,用Java等高级语言来汇总的话,也相当复杂.因此,可以考虑用集算器esProc辅助MongoDB完成交叉汇总.下面我们通过一个例子来看一下具体做法. Student集合如下: db.student.insert  ( {school:'school1', sname : 'Sean' , sub1:4, sub2 :5 }) db.student.insert  ( {school:'school1', sname : 'chris' , su

集算器协助java处理多样性数据源之MongoDB

MongoDB不支持join,其官网上推荐的unity jdbc可以把数据取出来进行二次计算实现join运算,但这些join.group.函数.表达式等高级功能都是收费版才有,而且即使是收费版本,对子查询.窗口函数等复杂SQL运算仍不支持.其他免费的jdbc drive就只能支持最基本的SQL语句了. 用免费的esProc配合MongoDB,可以实现上述结构化(半结构化)复杂计算.这里以join为例说明一下具体作法. MongoDB中的文档orders保存了订单数据,employee保存了员工数

集算器协助java处理多样性数据源之HDFS

Java通过Hadoop提供的API访问HDFS不算困难,但针对其上文件的计算就比较麻烦.比如分组.过滤.排序等计算,用java来实现都比较复杂.集算器esproc能很好地协助java解决计算问题,同时也封装了HDFS的访问,借助esproc可以让java加强HDFS上文件的计算能力,结构化半结构化数据计算都可以轻松完成.下面我们通过例子来看一下具体作法. HDFS中的文本文件employee.gz中保存了员工数据.我们要读取员工信息,从中找出1981年1月1日(含)之后出生的女员工.文本文件在

集算器协助Java处理结构化文本之分组汇总

直接用Java实现文体文件分组汇总会有如下的麻烦: 1.文件不是数据库,不能用SQL访问.当分组.汇总表达式变化时,只能改写代码.而要实现灵活表达式的话,需要自己实现动态表达式解析和求值,编程工作量非常大. 2.遍历过程中记录分组结果,结果小了还可以存在内存中,如果分组结果太大时要将中间结果缓存进临时文件再归并,实现过程非常复杂. 使用集算器辅助Java编程,这些问题都有现成的类库可以解决.下面,我们通过例子来看一下具体作法. 文本文件employee.txt中保存有员工信息,我们要按照DEPT

集算器协助Java处理结构化文本之条件过滤

直接用Java实现文本文件中数据按条件过滤会有如下的麻烦: 1.文件不是数据库,不能用SQL访问.当过滤条件变化时需要改写代码.如果要实现象SQL那样灵活的条件过滤,则需要自己实现动态表达式解析和求值,编程工作量非常大. 2.文件太大时不能一次性装入内存处理,而采用逐步读入方式在考虑到性能时又会涉及到文件缓冲区管理.拆行计算等复杂编程. 使用集算器来辅助Java编程,这些问题都不需要自己写代码解决.下面我们通过例子来看一下具体作法. 文本文件employee.txt中保存了员工数据.我们要读取员

用集算器协助Java读入文本

JAVA提供了最基本的文件处理函数,可以简单无结构的方式读入小文本文件,如果遇到需要结构化.格式多样.要求特殊的文件或内存装不下的大文件,相应的代码就会很复杂,可读性和复用性也很难保障. 使用免费的集算器可以弥补这一不足.集算器封装了丰富的结构化文件读写和计算函数,并提供JDBC接口.JAVA应用程序可以将集算器脚本文件当做数据库存储过程执行,传入参数并用JDBC获得返回结果.详情参考集算器用作Java计算类库的应用结构. 下面说明JAVA读入文本的常见案例,以及集算器对应的解法. 读入指定列 

集算器协助Java处理多样性数据源之Hive

Java使用jdbc连接Hive比较简单,但是Hive的计算能力相对于其它数据库的SQL而言较弱,要完成非常规的计算需要将数据取出后用Java进一步计算,编程比较麻烦. 使用集算器配合Java编程,可以减少Java使用Hive时要进行复杂计算工作量.下面我们通过例子来看一下具体作法:Hive中的orders表中保存了订单的明细数据,需要计算同期比和比上期.数据如下: ORDERID CLIENT SELLERID AMOUNT ORDERDATE    1 UJRNP 17 392 2008/1

集算器协助java处理多样性数据源之JSON

Java的json开源包一般只能解析json数据,没有运算功能.程序员自己写通用的程序来实现分组.排序.过滤.连接这些计算,相当麻烦.例如:用java写json文件条件过滤程序时,当条件表达式发生变化时就需要改写代码.如果要实现象SQL那样灵活的条件过滤,则需要自己实现动态表达式解析和求值,编程工作量非常大. 集算器是支持动态表达式的,可以嵌入到Java中写出通用的json计算程序.下面我们通过例子来看一下具体作法.待处理字符串是json格式的员工信息,包含EID.NAME.SURNAME.GE