DB中有一份数据,有|time|sum|的两列数据,ES查询出来的json格式结果,也是包含time与sum两个结果。现需要对比二者的数据中time-sum是否能一一匹配,因为数据量较大,不适合人工一条条的去对,所以需要使用一些工具来实现。
数据举例,
DB:
time | sum |
---|---|
121212121212 | 333 |
121212121213 | 666 |
ES:
{
"took": 12558,
"timed_out": false,
"_shards": {
"total": 2090,
"successful": 2090,
"skipped": 1940,
"failed": 0
},
"hits": {
"total": 5582253,
"max_score": 0,
"hits": []
},
"aggregations": {
"appId": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "kkkkkkk",
"doc_count": 5582253,
"count": {
"buckets": [
{
"key_as_string": "2019-08-29 13:45:00",
"key": 1567086300000,
"doc_count": 8405,
"rc": {
"value": 8405
}
},
{
"key_as_string": "2019-08-29 13:46:00",
"key": 1567086360000,
"doc_count": 7687,
"rc": {
"value": 7687
}
}
...
ps:可以看到aggregations->appId->buckets[0]->count->buckets[0]下的key为time,doc_count为sum,除了这些还有许多无用的数据。
es,直接采用将查询结果保存到本地的方式
db,写一个sql,导出CSV格式的数据
select UNIX_TIMESTAMP(STR_TO_DATE(convert(c_time,char),"%y%m%d%H%i")) * 1000, sum(c_count) from table where c_app_id = "kkkkkkkkk" and c_type = 0 and c_time >= 1908292145 and c_time < 1908300945 group by c_app_id, c_time
首先将c_time从int convert成字符串,然后使用str_to_date函数,将字符串解析成日期类型,然后使用unix_timestamp转成时间戳。
这里介绍一下MySQL中几个时间函数
unix时间戳是一种时间表示方式,定义为从格林尼治时间1970年01月01日00时00分00秒起至现在的总秒数
from_unixtime(unix_timestamp,format)
unix_timestamp([date])
timestamp(expression, interval)
发现db的CSV还算干净,所以需要着重去清洗es跟db的格式一致。
以下是es数据的清洗过程
使用vim的全局替换功能
语法为:%s/ //g
解释:语法为:%s/old/new/g,其中s代表替换模式,old代表要替换的字符串,new代表新的字符串,因为他是一行一行处理的,g代表global,对一行的所有都替换,不带g则只对一行中搜到的第一个old进行替换的。%处可以填行号,代表对某一行进行修改,%代表对所有行修改。
全局替换文章传送点此处
####将"key":1567129260000,“doc_count”:8233,搞到同一行
也是使用vim的全局替换功能
命令为:%s/,\n"doc_count/,"doc_count/g
其中\n为换行符。
关于换行符在不同系统中的表示
这里使用grep管道抽取数据后放到一个新文件中
所以命令为grep “\“doc_count\”” > tmp.log.es.clean
还是使用vim的全局替换功能
将数据清洗成这样的
1567086300000,8405
1567086300000,8406
...
diff file1 file2
diff命令用于比较文件的差异。
diff以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。
如果没有返回数据则证明两个文件一样,对比成功了。