LittleQ

爱好:写代码

chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID;组可以是组名或者组ID;文件是以空格分开的要改变权限的文件列表,支持通配符。系统管理员经常使用chown命令,在将文件拷贝到另一个用户的名录下之后,让用户拥有使用该文件的权限。

使用语法

chown [选项]… [所有者][:[组]] 文件…

必要参数:

1
2
3
4
5
6
-c	显示更改的部分的信息
-f 忽略错误信息
-h 修复符号链接
-R 处理指定目录以及其子目录下的所有文件
-v 显示详细的处理信息
-deference 作用于符号链接的指向,而不是链接文件本身

常用的操作就是修改某个文件夹及其子文件夹下所有文件,使其权限为某一个组

1
sudo chown -R test:root temp/

关于UDF的废话也不多讲了,主要讲一下如何开发一个UDF函数以及如何部署到服务器的Hive中使用.

需求背景

有一个Hive表的某个字段是一个collect_set类型,里面是一些数字,类似下面这样:

1
2
3
zhang.san	[2,3]
li.si [0,3]
wang.wu [1,2]

每个数字都代表着对应的特定的名字,假设配置文件code.properties内容如下:

1
2
3
4
0=北京
1=上海
2=深圳
3=香港

你可以假设这是一个统计一个人去过的城市列表,那么[2,3]就代表这个人去过深圳和香港.当然有些时候数据表里会按照代码的方式来记录,到要用的时候再做一个映射即可,现在有个需求就是,我们要把这些代码换成具体的城市,即一个字典映射,来看看我们如何用UDF函数来解决这个问题.

开发UDF函数

以java代码为例,基于maven构建工程.

新建maven工程

怎么新建Maven工程我这里就不详细讲解了,建好了目录如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
➜  hive  tree
.
├── hive.iml
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── UDF
│ │ │ └── BusinessType.java
│ │ └── resources
│ │ └── business_no.properties
│ └── test
│ └── java
│ └── UDF
└── target
├── classes
│ ├── business_no.properties
│ └── UDF
│ └── BusinessType.class
├── generated-sources
│ └── annotations
└── MANIFEST.MF

备注:src/main目录下的java为代码根目录,resources为资源根目录,test目录为测试根目录,target下的classes目录为.class文件输出路径.

开发代码

分为三个地方:

pom.xml文件
BusinessType.java源码文件
business_no.properties为配置文件,即一个映射字典.

BusinessType.java

代码很简单,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package UDF;

import org.apache.hadoop.hive.ql.exec.UDF;

import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Properties;

/**
* @Description hive
* Created by junqiangshen on 15-11-24.
*/
public class BusinessType extends UDF {
private HashMap<Integer, String> sysCodeMapping = new HashMap<Integer, String>();

public BusinessType() throws IOException {
InputStreamReader propFile = new InputStreamReader(getClass().getClassLoader().getResourceAsStream("business_no.properties"), "UTF-8");
Properties prop = new Properties();
prop.load(propFile);
for (Object key : prop.keySet()) {
sysCodeMapping.put(Integer.valueOf((String)key), prop.getProperty(String.valueOf(key)));
}
}

public String evaluate(int business_no) {
return sysCodeMapping.get(business_no) == null ? Integer.valueOf(business_no).toString() : sysCodeMapping.get(business_no);
}

public static void main(String[] args) throws IOException {
BusinessType businessType = new BusinessType();
int list[] = new int[] {0,1,2,3};
for (int i = 0; i < 4; ++i) {
System.out.println(businessType.evaluate(list[i]));
}
}
}

备注: 函数一定要继承UDF类,并且根据你的业务需求重写里面的evaluate()方法,构造函数从资源根目录读取配置文件,把key-value加载到一个集合中,Hive每次调用的其实是evaluate()函数,对于每个传入的为int型的字段,经过我们的处理,在evaluate()函数内部会被当成key去我们的集合中查找,若有,则返回key对应的value;若没有,直接返回数字字符串.主函数是一个简单的测试,别忘了,提交到Hive里运行的时候要把main函数注释掉.

business_no.properties

配置文件即为我们替换的字典文件,格式就是每一行key=value这种格式,部分内容如下:

1
2
3
4
0=北京
1=上海
2=深圳
3=香港

根据你的需要,你可以换成任何值.

pom文件

开发UDF函数,还需要一些关键的包,这里我们采用Maven来管理我们的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>UDF</groupId>
<artifactId>hive</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>hive</name>
<url>http://maven.apache.org</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>0.13.0</version>
</dependency>
</dependencies>
</project>

打包jar包

在main函数里调试没问题之后,就可以把main函数注释掉,打包成jar包.打包有很多方法,用IDEA自带的工具就可以打包,具体方法如下:

  • File-->Project Structure
  • Artifacts,点中间绿色的+:-->JAR-->From modules with dependencies
  • Name:里填你希望生成的名字,例如BusinessType:jar
  • 输出路径默认就行,不用改.然后一定要勾选上Build on make
  • 依赖的jar包这里可以不用,Hive,Hadoop里都有,除非有其他包你需要加入,全选上,点-号都去掉

回到IDEA主界面,Build-->Make Project.在输出路径就可以找到jar包了
打包设置界面
还有个打包比较简单的,直接用jar命令,以本程序为例

1
2
3
4
5
6
cd target/classes
➜ classes tree
.
├── business_no.properties
└── UDF
└── BusinessType.class

目录结构如上所示,打包命令为:

1
jar cvf BusinessType.jar .

注意:.表示打包当前目录下所有文件,包括子目录,BusinessType.jar是生成的jar包名.

部署到Hive上使用

写了个UDF,最后怎么在Hive里用呢?介绍两种方法,一种是临时使用.

临时方案

如果只是想测试一下,可以使用临时方案,简单方便,只是每次启动Hive客户端之前都要添加,创建函数,退出Hive客户端函数就会自动销毁了.
假设jar包存放在服务器上的/home/tmp/目录下:

  • 添加jar包
1
2
3
hive> add jar /home/tmp/BusinessType.jar;
Added [/home/tmp/BusinessType.jar] to class path
Added resources: [/home/tmp/BusinessType.jar]
  • 创建临时函数
1
2
3
hive> create temporary function business_type_func as 'UDF.BusinessType';
OK
Time taken: 0.015 seconds

**注意:**切记,如果你的类有包名,要添加完整路径,例如我的类在UDF包里面,所以在创建函数的时候天的路径为UDF.BusinessType.

  • 建一张dual表测试

dual表的概念来自oracle,数据库建立时即与数据字典一起初始化,该表只有一个varchar2类型名为dummy的字段,表数据只有一行“X”,用来查询一些系统信息,如:

1
2
3
select sysdate from dual; 
select user from dual;
select seq.nextval from dual

为了能在hive中测试一些时间、数学、聚合函数,可以仿照oracle创建dual表。

1
2
3
4
5
hive> create dual (dummy String);
hive> select (1+2) from dual;
OK
3
Time taken: 0.145 seconds, Fetched: 1 row(s)
  • 测试函数

我们新建的临时函数名为business_type_func,可以这么测试

1
2
3
4
hive> select business_type_func(1) from dual;
OK
上海
Time taken: 0.145 seconds, Fetched: 1 row(s)

持久方案

每次都要执行这个命令,如果确实是需要用的,不用每次都这么麻烦.还有一个原因,我写的这个函数不知道为什么,每次运行都会出问题,但是数据明明都可以跑出来,后来我就采用了下面的方法,就可以了.
我们可以把我们开发的jar包拷贝到Hive的lib目录下,然后如果这个目录在环境变量里,就可以每次启动的时候加载

1
2
3
4
5
# 拷贝jar包到hive的lib目录
sudo cp /home/tmp/BusinessType.jar /home/hive/hive-0.12.0/lib/

# 修改hive配置文件
sudo vim /home/hive/hive-0.12.0/conf/.hiverc

在文件中添加下面两行内容:

1
2
add jar /home/hive/hive-0.12.0/lib/BusinessType.jar;
create temporary function business_type_func as 'UDF.BusinessType';

然后重启就可以了,也不用再创建函数了,这个函数就在Hive启动时就会一起加载到Hive内部.

后记: 如果你也出现了

1
ERROR 1148 (42000) at line 1: The used command is not allowed with this MySQL version

可以尝试采用第二种部署方式,至于原因还不明,有时间再研究.

Vim有个命令还是挺好用的,就是大小写转换,因为我把键盘上的Caps Lock键改成了Esc键,所以有时候如果直接写一个大写字母还好,可以用Shift键,但是如果写一个大写的单词那就比较麻烦了,这个时候大写转换命令就派上大用场了。

1
2
gu	# 转小写
gU # 转大写

当然对于Vim这么强大的工具来说,这个命令远远不止这么点作用,这个命令的强大之处在于可以配合光标移动命令达到各种效果:

1
2
3
4
5
6
7
8
9
10
~		# 将光标下的字母改变大小写
3~ # 将光标位置开始的3个字母改变其大小写
g~~ # 改变当前行字母的大小写
U # 将可视模式下选择的字母全改写成大写字母
u # 将可视模式下选择的字母全改成小写字母
gUU # 将当前行的字母改成大写
guu # 将当前行的字母改成小写
3gUU # 将从光标开始到下面3行字母改成大写
gUw # 将那个光标下的单词改成大写
guw # 将光标下的单词改成小写

想做几个数据测试,于是把服务器上的mysql数据查询结果导入到服务器本地一个文件中,然后下载到本地机器想直接导入到自己机器的mysql表中:
假设我的MySQL用户名和密码分别为:root root123456,对应的库为test,表为user

1
2
3
4
5
6
7
8
# 下载的文件为result.txt,目录为当前用户根目录,即~/result.txt

# 进入mysql
$ mysql -uroot -proot123456

# 执行导入命令
mysql> use test;
mysql> load data local infile '~/result.txt' into table user;

结果报错,信息如下:

1
ERROR 1148 (42000): The used command is not allowed with this MySQL version

**备注:**网上查了一下:如果指定local关键词,则表明从客户主机读文件。如果local没指定,文件必须位于服务器上。既然是在本地机器上测试,那么我们也是服务器,所以我们可以去掉这个local参数,直接导入,结果又报新的错误:

1
2
mysql> load data infile '~/result.txt' into table user;
ERROR 13 (HY000): Can't get stat of '/var/lib/mysql/test/result.txt' (Errcode: 2)

在我们指定的路径处var/lib/mysql/test/result.txt没有找到这个文件,原来默认是在*当前数据库(此处为我们的test库)目录下载入文件。我的文件放在当前用户的根目录下,当然会找不到,于是我把文件拷贝到这个目录下:

1
$ sudo cp ~/result.txt /var/lib/mysql/test

这回应该可以导入了吧,再次执行导入:

1
2
mysql> load data infile '~/result.txt' into table user;
ERROR 13 (HY000): Can't get stat of '/var/lib/mysql/user/result.txt' (Errcode: 2)

还是报错,奇怪了,难道文件没有拷贝到我们指定的目录?为了一探究竟,我决定去这个目录下看看

1
2
$ cd /var/lib/mysql
cd: permission denied: /var/lib/mysql

访问权限受限了,这个简单,加上就行:

1
2
$ sudo chmod 777 mysql
$ cd mysql

没问题了,然后进入test目录,果然还是一样没权限,同样处理,然后进入test目录,居然有我们的result.txt文件。然后重新在mysql里执行导入命令:

1
2
3
mysql> load data infile '~/result.txt' into table user;
Query OK, 44173 rows affected (0.22 sec)
Records: 44173 Deleted: 0 Skipped: 0 Warnings: 0

我擦,居然成功了,看来果然是权限的问题,虽然有点儿麻烦,但是可以导入数据就行。有时间再研究一下加local的用法。

其实不用这么麻烦,主要要先赋权限,然后再加一个参数就可以了:

1
2
3
4
5
$ sudo chown -R zhangsan:zhangsan /var/lib/mysql 
$ sudo chown -R mysql:mysql /var/lib/mysql
$ sudo mysql -uroot --local-infile=1 -proot123456
mysql> use test;
mysql> LOAD DATA LOCAL INFILE '/home/zhangsan/result.txt' REPLACE INTO TABLE oc_daily_order_cheche FIELDS TERMINATED BY '\t';

所以其实主要问题在一个--local-infile=1以及一个权限问题。

最近家里的台式机Ubuntu 14.04 64bit升级了内核之后,重启之后鼠标键盘全都失灵了,连登陆系统输密码的地方都输入不了,鼠标键盘都失效连重启都没办法,只能强行按电源键关机。
网上查了各种资料,都有说在系统里修复啥的,但是我压根就连系统也进不去,如果要修复就只能用启动盘了。开始怀疑是USB接口的问题,但是进Windows 10一点问题都没有,鼠标键盘都是好的。看来是Ubuntu系统升级的问题,可能是升级之后驱动的不兼容,后来一想,既然在Grub启动菜单那里键盘鼠标还可以用,于是试了一下其他的几个启动项,发现在高级选项里可以选择使用其他内核驱动,抱着试一试的态度,试了倒数第二个,恢复模式,结果进去之后,貌似要重置系统,不敢点,于是退出来,选了上一个版本的内核,但是这回是选择正常启动,结果居然好使了。看来就是系统内核的问题,可能主板的驱动不兼容吧,暂时就这么用了吧。顺便说一下,Ubuntu的升级真是他妈的坑爹,老是碰到升级卡死,然后强行关机,然后就启动不了了,这回升级倒是可以,结果升级内核之后居然还不好使。
具体的操作记录在下面了,首先开机进入Grub菜单:

  • Grub 开机启动菜单
    正常情况下是选第一项的,但是现在系统挂了,我们想用以前的内核启动,选第二项:Advanced options for Ubuntu Kylin GUN/Linux
  • Grub 启动内核版本选择
    内核版本从上到下版本号一次递减,选正常模式,一般选倒数第二新的版本即可,如果不行,那就再选更旧的版本。家里的电脑是升级到-68代号的内核出问题的,后来在台式机上选倒数第二新的内核就可以进去了,记住不要选recovery mode

最近在家里电脑的电脑上git pull的时候,报错。电脑系统是Ubuntu 14.04 64bit,发现项目无法更新,之前都可以把项目拉取下来,现在更新却不行了,具体报错如下:

1
2
3
4
Permission denied (publickey). 
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

网上的说法是SSH key的缘故,但是我之前在gitcafe上都可以clone下来,后来也没改东西,突然就没权限了。没办法,把gitcafe上的SSH key删掉了,又重新生成了一遍,传上去,结果还是不行。后来我重新在另一个目录下拉取项目,发现可以,于是突然想到,会不会是目录的权限问题。于是给项目的目录赋上了最高权限

1
2
# 给docment目录赋最高权限
sudo chmod 777 docment/

然后重新更新项目,果然好使了。

但是后来电脑又出现了一个问题,突然就又连不上了,最后折腾了好久才搞定,这次是深入搞明白了,为啥会出现这个问题了,其实,说白了就是秘钥不对,但是网上的说法都太模糊,很多人其实都把密钥上传到了网站上,一开始是可以用的,后来确不行了,所以这里面应该不是密钥没上传导致的,而是本地的密钥出了问题,下面来看看具体的问题解决步骤。
一般报错信息是:

1
2
3
4
5
6
Cloning into '******'...
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

  这个时候多半是你的密钥出了问题,而且出现这种问题一般是你使用了多个代码托管账户造成的,这个比较常见,现在很多公司都会搭建自己的代码托管仓库,例如gitlab,然后就是大名鼎鼎的github,作为程序员这个账户肯定是有的,然后呢,有时候吧,由于国内你懂得一些原因,github访问不是很稳定,所以会选择国内的一些代码托管仓库,例如oschina或者gitcafe。这么多账户一起使用,密钥的问题就来了。再加上我在家里还有个台式机,而且有时候为了能登公司的服务器,还要使用Window系统,这样下来,密钥一堆,所以密钥特别乱,慢慢的就产生了这个问题,偶尔就出现了上面这个问题。
首先要看看**~/.ssh下面有些啥:一般就是会有一个id_rsa**,id_rsa.pub,config这写文件,简单介绍一下这三个文件都是干啥的:
id_rsa是私钥,同理id_rsa.pub就是公钥,公钥是要传到服务器上的,每次你连接代码托管服务器,都是用服务器上的公钥去校验你本地的私钥,系统默认会读取你的~/.ssh/目录下的私钥文件,如果读取不到,或者读取到的私钥是错的,就会出现上面的问题,即Permission denied (publickey).
这就要说道第三个文件
config
的作用了,先看看他长啥样吧:

1
2
3
4
5
6
7
8
9
Host github.com
Hostname github.com
IdentityFile ~/.ssh/id_rsa
User github_username

Host gitcafe.com
Hostname gitcafe.com
IdentityFile ~/.ssh/id_rsa.gitcafe
User gitcafe_username

看到这个文件我想你们大概应该明白了,

  1. Host后面的名字相当于一个别名,真正的Host是Hostname的值,也即你可以使用别名来访问你托管代码的网站,
  2. IdentityFile就是你访问这个网站是,网站上的公钥会校验你的本地私钥的文件位置,这个填错了就无法正确校验了,所以会出错,
  3. User就是你在代码托管网站上的用户名

另外说一个调试技巧,就是当你出问题,没权限pull/push代码的时候,如何确定是密钥出问题了呢?可以打开调试模式看看是用哪一个私钥文件在校验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
ssh -vT git@gitcafe.com

OpenSSH_6.6.1, OpenSSL 1.0.2d 9 Jul 2015
debug1: Reading configuration data /home/zhangsan/.ssh/config
debug1: /home/zhangsan/.ssh/config line 6: Applying options for gitcafe.com
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to gitcafe.com [124.42.117.218] port 22.
debug1: identity file /home/zhangsan/.ssh/id_rsa.gitcafe type 1
debug1: identity file /home/zhangsan/.ssh/id_rsa.gitcafe-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.3
debug1: Host 'gitcafe.com' is known and matches the RSA host key.
debug1: Found key in /home/zhangsan/.ssh/known_hosts:1
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/zhangsan/.ssh/id_rsa.gitcafe
debug1: Offering RSA public key: zhang.san@163.com
debug1: Authentications that can continue: publickey
debug1: Offering RSA public key: zhang.san@gmail.com
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug1: Authentication succeeded (publickey).
Authenticated to gitcafe.com ([124.42.117.218]:22).
Hi zhangsan! You've successfully authenticated, but GitCafe does not provide shell access.
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype eow@openssh.com reply 0
debug1: channel 0: free: client-session, nchannels 1
Transferred: sent 4632, received 3656 bytes, in 1.0 seconds
Bytes per second: sent 4642.3, received 3664.1
debug1: Exit status 1

这里输出了很多,看第4行,告诉我们加载配置文件的地方就是前面提到的config文件,然后第9行,他从配置文件里加载私钥文件,所以你想看你的git是加载的哪个文件,看这个就可以了,如果不对,那么按照上面的配置重新配置一下就OK了。

备注: 注意,如果在使用sudo git ...的时候仍然提示**Permission denied (publickey).**。记得去掉sudo,或者更改对应的私钥文件的权限。

在Hive中复制表数据,把一个表的查询结果存储起来放到一个完整的表中,用到了

1
create table table1_name as select filed1[,field2][,field3...] from table2_name;

根据上面的语法,我想直接把一个表的查询结果作为table2_name,看看我的写法:

1
2
3
4
5
6
create table table1_name
select * from (
select substr(login_time,0,10) as day,count(user_name) as empty_user
from table2_name
where user_name='' or user_name is null
group by substr(login_time,0,10));

备注:table2_name表存放的是每天有登陆记录的用户,上面的语句其实是想统计每天用户名为空或者没有用户名的用户.
出现了报错信息:

1
FAILED: ParseException line 6:34 cannot recognize input near '<EOF>' '<EOF>' '<EOF>' in subquery source

意思是子查询的语法不对,语句的结尾不正确,后来仔细想了一下,想到别名这个sql里常用的语法,虽然表的别名本身并没有什么大用,但是在子查询中经常用到,而且没有别名没有时还会报错,于是把后面加了一个表别名,改为如下:

1
2
3
4
5
6
create table table1_name
select * from (
select substr(login_time,0,10) as day,count(user_name) as empty_user
from table2_name
where user_name='' or user_name is null
group by substr(login_time,0,10)) p1;

然后就好了.

每次想拷贝Vim里的内容到其他地方,开始都是用鼠标的,但是后来发现,如果要复制大片内容,终端里没有显示出来就没辙了,所以网上搜了怎么把Vim里的内容复制到剪贴板.
网上搜了一下如何把Vim里的内容复制到系统剪贴板,大部分都是建议安装vim-gnome这个插件,仅针对于Ubuntu桌面环境,其他的我没有测试过:

1
sudo apt-get install vim-gnome

结果报错了,报错信息如下:

1
2
3
4
5
6
7
8
9
10
11
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
vim-gnome : Depends: vim-gui-common (= 2:7.4.052-1ubuntu3) but it is not going to be installed
Depends: vim-common (= 2:7.4.052-1ubuntu3) but 2:7.4.826-1 is to be installed
Depends: vim-runtime (= 2:7.4.052-1ubuntu3) but 2:7.4.826-1 is to be installed
E: Unable to correct problems, you have held broken packages.

看上面的意思是这个插件依赖的几个库没有安装,手动安装一下:

1
sudo apt-get install vim-gui-common

然后再试试可不可以安装vim-gnome:

1
sudo apt-get install vim-gnome

果不其然又报错了:

1
2
The following packages have unmet dependencies:
vim-gnome : Depends: vim-runtime (= 2:7.4.052-1ubuntu3) but 2:7.4.826-1 is to be installed

这个意思就是说依赖的vim-runtime是一个老的版本,但是安装的是一个更加新的版本.那我们来手动装一下:

1
sudo apt-get install vim-runtime

看看提示信息:

1
2
3
4
5
6
7
vim-runtime is already the newest version.
The following packages were automatically installed and are no longer required:
g++-4.8 libstdc++-4.8-dev linux-headers-3.13.0-32
linux-headers-3.13.0-32-generic linux-image-3.13.0-32-generic
linux-image-extra-3.13.0-32-generic
Use 'apt-get autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 16 not upgraded.

好了,找到问题的关键所在了,我之前升级了gcc 4.9.2,我们需要把这些老的包移除掉,不要漏掉了,也可以逐一卸载:

1
sudo apt-get autoremove g++-4.8 libstdc++-4.8-dev linux-headers-3.13.0-32 linux-headers-3.13.0-32-generic linux-image-extra-3.13.0-32-generic

然后强制安装一下:

1
sudo apt-get install vim-runtime

好了,然后在Vim里的非INSERT模式下使用"+y就可以把Vim里的内容复制到系统剪贴板了,注意记得重启Vim才能生效.

在Hive表里同时用group byorder by的时候,出现了错误:

1
FAILED: SemanticException [Error 10025]: Line 1:7 Expression not in GROUP BY key 'sys_code'

具体的SQL语句如下:

1
2
3
4
select sys_code,status, count(*) as total from ap_user_order_his
where link_end_date='2099-12-31' and sys_code in (1000,1001,1003,1004)
group by status
order by total desc;

后来上网查了一下,这个主要问题还是,sys_code也有多个种类,如果只是对status进行group by。那么sys_code没有办法分类,不知道该如何排序,所以解决办法有两种:

  • 既然按某一个字段分类,那么其他字段也只能有一种情况,所以可以使用集合,针对上面的这个语句就是:

    1
    2
    3
    4
    select collect_set(sys_code),status, count(*) as total from ap_user_order_his
    where link_end_date='2099-12-31' and sys_code in (1000,1001,1003,1004)
    group by status
    order by total desc;

    或者可以只取一个值:

    1
    2
    3
    4
    select collect_set(sys_code)[0],status, count(*) as total from ap_user_order_his
    where link_end_date='2099-12-31' and sys_code in (1000,1001,1003,1004)
    group by status
    order by total desc;
  • 第二种就比较简单了,直接报错的字段也加到GROUP BY选项里即可。

在做多表联合查询时,报错:

Every derived table must have its own alias

意思就是每个派生出来的表都必须有一个自己的别名,这个错误一般多出现在多表查询的时候。
之所以在多表查询的时候会出现这个问题,是因为多表在做联合查询的时候,有嵌套查询。子查询出来的结果是作为一个派生表来进行上一级的查询,所以子查询的结果必须要有一个别名,按照下面类似的改法:

1
2
select count(*) from (
select * from table_name) as t2;

也就是为每个子查询一个别名,其实加一个简写,也方便多个表作联合查询条件来作联合。

0%