数据标签

标签

对同一个用户,可以打上很多个标签。所以标签不同于传统意义上的分类,它也被称为“开放分类”。而且同一个用户身上的标签数量,会随着时间的推移而持续不断的被增加。标签数据越多,最后得到的用户受众画像信息会越来越完整。

用户画像就是贴标签 在数据挖掘领域称为标签化

hive-mysql整合

mysql权限

1
2
3
4
--mysql user
CREATE USER 'hive'@'%' IDENTIFIED BY 'hive';
GRANT all on *.* to 'hive'@'%' identified by 'hive';
flush privileges;

mysql 驱动

maven 库上找即可

把MySQL的JDBC驱动包复制到Hive的lib目录下

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>

hadoop 准备工作

1
2
3
4
5
6
7
# 建立数据仓库的目录
hdfs dfs -mkdir -p /user/hive/warehouse
hdfs dfs -mkdir -p /tmp/hive
# 保证有写的权限
hdfs dfs -chmod 777 /user/hive/warehouse
hdfs dfs -chmod 777 /tmp/hive
hdfs dfs -chmod 777 /tmp

hive-site.xml 中与mysql相关的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
<description>metadata is stored in a MySQL server</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>MySQL JDBC driver class</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>user name for connecting to mysql server</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
<description>password for connecting to mysql server</description>
</property>
</configuration>

hive-site.xml 与hadoop相关配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/usr/hive/warehouse</value>
</property>
<property>
<name>hive.exec.scratchdir</name>
<value>/usr/hive/tmp</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/usr/hive/log</value>
</property>

hive 以mysql保存元数据模式初始化

hive 默认是采用derby来保存元数据的,如果第一次采用了derby方式,需要先把源数据删除才行

1
schematool -dbType mysql -initSchema

初始化只需要执行一次,第二次执行会报错

1
2
3
Error: Duplicate key name 'PCS_STATS_IDX' (state=42000,code=1061)
org.apache.hadoop.hive.metastore.HiveMetaException: Schema initialization FAILED! Metastore state would be inconsistent !!
*** schemaTool failed ***

进入MySQL,删掉metastore数据库再重新创建metastore数据库即可

参考链接

常见错误

ls: 无法访问’/data/spark/spark-2.2.0-bin-hadoop2.6/lib/spark-assembly-*.jar’:

没有那个文件或目录其主要的原因是:在hive.sh的文件中,发现了这样的命令,原来初始当spark存在的时候,进行spark中相关的JAR包的加载。而自从spark升级到2.0.0之后,原有的lib的整个大JAR包已经被分散的小JAR包的替代,所以肯定没有办法找到这个spark-assembly的JAR包。这就是问题所在。

1
2
3
4
5
# add Spark assembly jar to the classpath
if [[ -n "$SPARK_HOME" ]]
then
sparkAssemblyPath=`ls ${SPARK_HOME}/lib/spark-assembly-*.jar`
CLASSPATH="${CLASSPATH}:${sparkAssemblyPath}"

将这个spark-assembly-.jar`替换成jars/.jar,就不会出现这样的问题。

参考链接

shell版wordcount

测试数据 hello.txt

1
2
3
4
5
6
7
8
9
10
hello hadoop
hello hbase
hello hive
hello zookeeper
hello flume
hello kafka
hello storm
hello spark
hello spark sql
hello spark core

shell wordcount

1
cat hello.txt | tr ' ' '\n' | sort -k 1 | uniq -c | awk '{print $2"\t"$1}' |sort -k2 -nr |head -n 5

步骤详解

按分割符处理成行

tr ‘ ‘ ‘\n’ #将空格换成换行符,linux很多工具都是针对行的

替换指定的字符
tr [options] string1 string2

tr通常带有两个参数:string1 和 string2 ,当tr发现与string1中有匹配的字符时,它将使用string2中对应的字符来替换输入中的字符

选项 说明
-c 对string1取反,使得tr匹配除了在string1中出现的所有字符
-d 删除与string1中制定的字符匹配的字符

示例:

1
2
3
4
$ echo abcdef | tr 'abcdef' 'xyzabd'
xyzabd
$ echo abcdef | tr 'a-f' 'x-za-c'
xyzabc

分割之后排序(这一步是必须的,uniq是根据连续重复的行统计的)

sort -k 1 #根据第一列内容排序

统计并显示次数

uniq [选项] 文件
uniq -c
说明:这个命令读取输入文件,并比较相邻的行。在正常情况下,第二个及以后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的。该命令加工后的结果写到输出文件中。输入文件和输出文件必须不同。如果输入文件用“- ”表示,则从标准输入读取。

选项 说明
-c 显示输出中,在每行行首加上本行在文件中出现的次数。它可取代- u和- d选项
-d 只显示重复行
-u 只显示文件中不重复的各行

调换列的位置

awk ‘{print $2”\t”$1}’ # 调换列的位置并以tab键分割显示

根据频率逆序排列

sort -k2 -nr
sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

选项 说明
-u 在输出行中去除重复行。
-r sort默认的排序方式是升序,如果想改成降序,就加个-r就搞定了。
-o 由于sort默认是把结果输出到标准输出,如果你想把排序结果输出到原文件中,用-o
-n 使用-n选项,来告诉sort,“要以数值来排序” 避免出现 10 在 2的前面这种情况
-t 指定了间隔符
-k 指定了间隔符之后,就可以用-k来指定列数了。

显示前N行

head -n N

补充tr与sed之间的关系

通过使用 tr,您可以非常容易地实现 sed 的许多最基本功能。您可以将 tr 看作为 sed 的(极其)简化的变体:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符。您也可以用它来除去重复字符。这就是所有 tr 所能够做的。

去除空行

1
cat hello.txt | tr ' ' '\n' | sed '/^$/d'|sort -k 1 | uniq -c | awk '{print $2"\t"$1}' |sort -k2 -nr |head

参考资源

  1. shell编写wordcount

  2. 简明Linux命令行笔记:tr

  3. linux sort 命令详解