转载自:http://www.geeklab.info/2012/11/mysql-how-to-get-top-n-rows-for-each-group/
We have the following table and data:
CREATE TEMPORARY TABLE girls(
name text,
haircolor text,
score INT
);
INSERT INTO girls VALUES ('M[......]
转载自:http://www.geeklab.info/2012/11/mysql-how-to-get-top-n-rows-for-each-group/
We have the following table and data:
CREATE TEMPORARY TABLE girls(
name text,
haircolor text,
score INT
);
INSERT INTO girls VALUES ('M[......]
在昨天的文章 TimSort in Java 7 中,我们讨论了升级到JDK 7后,Collection的sort方法,出现兼容性问题的原因。
究其根本,还是我们写的compare函数不够严谨。
本文主要针对Hadoop、Hive,从系统的部署、配置层面提出一些解法。
1、Hive
在执行前,指定JVM选项。
set mapreduce.map.java.opts=-Xmx2000m -Djava.util.Arrays.useLegacyMergeSort=true[......]
1. 为什么写这篇文章
这篇文章的根源是在产品中发现了一个诡异的bug:只能在产品环境下重现,在我的本地开发环境无法重现,而双方的代码没有任何区别。最后用remote debug的方法找到异常所在:
Exception in thread "main" java.lang.IllegalArgumentException: Comparison
method violates its general contrac[......]
之前多少次都是错的。
这才是正确的,假设对列1按照字母序,2按照数值序。
sort -k 1,1 -k2,2n
2014.05.12更新:
-g, --general-numeric-sort compare according to general numerical value
-n, --numeric-sort compare according to string numerical value
如果数据中有科学计数法,形如"8.0177[......]
像排序这种事情,用C/C++可以写,但很麻烦,交给sort就好了,功能很强大的。
1、按照多个列排序(列间空格分开):
测试数据:
先按照第1列排序,再第2列的命令:
2011-11-20补充:必须加-s选项,表示stable sort,即两列排序互相不打扰。
$ cat ./test
1 x
5 8
1 a
$ sort -s -k 1 -k 2 ./test
1 a
1 x
5 [......]