一个多月对Elasticsearch的探索,现将其中的坑列出来,以免后面再忘记。
首先在这里申明数据量:
记录数:1914531
用户量:62749
可以看到数据量还是很小的。数据是一个用户在某个时间确证的疾病的编码,然后我们利用该数据去计算OR。
对于OR的计算介绍如下:
给定疾病A与疾病B,得到表格:
疾病B存在 | 疾病B不存在 | |
疾病A存在 | N11 | N10 |
疾病A不存在 | N01 | N00 |
其中:
//tow exits!
val sf1 = new SingleColumnValueFilter(Bytes.toBytes(colFamily),Bytes.toBytes(icdname.apply(i).apply(0).toString),CompareFilter.CompareOp.EQUAL,Bytes.toBytes("1"))
val sf2 = new SingleColumnValueFilter(Bytes.toBytes(colFamily),Bytes.toBytes(icdname.apply(j).apply(0).toString),CompareFilter.CompareOp.EQUAL,Bytes.toBytes("1"))
sf1.setFilterIfMissing(true)
sf2.setFilterIfMissing(true)
val filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL)
filterList.addFilter(sf1)
filterList.addFilter(sf2)
scan1.setFilter(filterList)
val scanner1 = table.getScanner(scan1)
val doubleexit = scanner1.iterator().asScala.length其他的情况跟上面的代码相似。
if(doubleexit*oneexit1*oneexit2*noexit!=0){
val or:Float = (doubleexit*oneexit1)/(oneexit2*noexit).toFloat
val se:Float = math.sqrt((1.toFloat/doubleexit)+(1.toFloat/oneexit1)+(1.toFloat/oneexit2)+(1.toFloat/noexit)).toFloat
val m = math.log(or)/math.log(math.E)-(1.96*se)
val n = math.log(or)/math.log(math.E)+(1.96*se)
val disease1 = icdname.apply(i).apply(0)
val disease2 = icdname.apply(j).apply(0)
out.println(s"$disease1 $disease2 $or $se $m $n")
out.flush()
}
然后使用公式计算出相应的OR已经置信区间。
TransportClient
that connects to a cluster.在这里,
这次,任务终于在四分钟跑完了。26个小时到4分钟。
所以,最终的建议就是使用client端去处理数据,不要使用esDF,检索数据太慢了。