hive模糊匹配两张表里的字符串,有比笛卡尔积更高效的方法吗?

sprays 2017-08-24 02:38:57
已了解的知识是:
以前SQL server在on里写between...and...或like等不等式判断都是可以的。hive只支持等值连接,于是相当于不写连接词,让两张表笛卡尔积,再把不等值的判断写在where里。
为了跑笛卡尔积还需要设置一下nonstrict。

我遇到的场景是一张主表里有10w行产品数据。另有一张黑名单的表也有10w行黑名单。需检查每个产品名称,若包含任何一个黑名单字符串,就抓出来。基于我了解的知识写如下HQL:

set hive.mapred.mode = nonstrict;
select a.ProductName,b.Keyword
from 产品表 a
left outer join 待匹配字符串的清单表 b on 1=1
where instr(a.ProductName,b.Keyword) > 0

问题是这种跑法几个小时都跑不好,比SQL server慢多了。请问大神有什么更好的做法吗?

一种做法是自己写HDF函数,我写不来java,有大神写过类似的函数能分享一下吗?

还有一个思路,我找到HIVE 2.0多了这个函数:
in_file(string str, string filename)
Returns true if the string str appears as an entire line in filename..
如果文件名为filename的文件中有一行数据与字符串str匹配成功就返回true。

尝试过速度不错,不过它的“匹配”只是判两个字符串完全相等,不知道有没有更进一步的官方函数能做到模糊匹配。或者大神基于in_file()改进出模糊匹配的功能?


...全文
3497 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
碧水幽幽泉 2017-09-15
  • 打赏
  • 举报
回复
1.分隔符
创建普通的表:create table test_table (id int,name string,no int) row format delimited fields terminated by ',' stored as textfile;
//指定了字段的分隔符为逗号,所以load数据的时候,load的文本也要为逗号,否则加载后为NULL。hive只支持单个字符的分隔符,hive默认的分隔符是\001

2.加载表
load data local inpath '/home/zhangxin/hive/test_hive.txt' overwrite into table test_part partition (dt='2012-03-05');
//local是本地文件,注意不是你电脑上的文件,是hadoop所在的本地文件
//如果是在hdfs里的文件,则不需要local。 overwrite into是覆盖表分区,仅仅是这个分区的数据内容,如果是追加,则不需要overwrite

3.复制表结构
创建与已知表相同结构的表:只复制表的结构,而不复制表的内容。
create table table2 like table1;

4.Limit可以限制查询的记录数
select * from test limit 5; --查询5条数据
select * from test sort by amount desc limit 5; --查询金额最大的5条数据

5.Hive不支持的地方
5.1不支持EXIST ,NOT EXIST
5.2不支持所有非等值的连接(支持等连接和外连接),因为非等值连接非常难转化到 map/reduce任务
5.3不支持UPDATE, DELETE操作
5.4不适合用于联机online)事务处理,也不提供实时查询功能。
Hive中由于没有索引,需要扫描整个表,因此延迟较高。Hive不适合在线数据查询。
由于Hive建立在集群上并可以利用 MapReduce 进行并行计算,因此可以支持很大规模的数据
5.5不支持having
5.6不支持窗口函数
5.7不允许在同一个查询内有多个distinct 表达式。


6.导出查询结果到指定目录
将查询数据输出至目录:
insert overwrite directory '/tmp/hdfs_out' select a.* from table_name a where a.dt='${date}';

将查询结果输出至本地目录:
insert overwrite local directory '/tmp/local_out' select a.* from table_name a;

7.left semi join
select * from table1 left semi join table2 on (table1.id=table2.id);
相当于"select * from table1 where table1.id in (table2.id)" --相当于inner join

8.修改表结构
显示所有表:show tables;
模糊查询表: show tables '*字符串*'

修改表名: alter table table_name rename to new_table_name
表添加一列:alter table table_name add columns (new_col int);
添加一列并增加列字段注释: alter table table_name add columns (new_col int comment 'a comment');
更新列:alter table table_name replace columns (col_name data_type [comment col_comment], ...) --replace表示替换表中所有字段。

修改列的名字/类型/位置/注释:
alter table table_name change [column] col_old_name col_new_name column_type [comment col_comment] [first|after column_name]

获取建表语句: show create table table_name
删除表: drop table [if exists] table_name

9.使用Hive执行hive命令输出到本地文件
hive -e "select * from test1222;" > test.txt

10.hive 默认的字段分隔符为ascii码的控制符\001,建表的时候用fields terminated by '\001'
如果要测试的话,造数据在vi打开文件里面,用ctrl+v然后再ctrl+a可以输入这个控制符\001。按顺序\002的输入方式为ctrl+v,ctrl+b。

11.中文别名应加上反印号(反印号在ESC键下面)
select 1001 as `代码` from dual;

12.什么是MapReduce
概念"Map(映射)"和"Reduce(化简)"

13.删除部分数据和清空数据:
删除部分数据: insert overwrite table table_name select * from table_name where 条件;
清空表数据: insert overwrite table table_name select * from table_name where 1 = 0;
truncate table table_name
truncate table table_name partition (dt='日期');

14.Hive 的数据存储
首先,Hive没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织 Hive 中的表,
只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。
其次,Hive中所有的数据都存储在HDFS中,Hive中包含以下数据模型:Table,External Table,Partition,Bucket。
Hive中的Table和数据库中的 Table 在概念上是类似的,每一个 Table 在 Hive 中都有一个相应的目录存储数据
例如,一个表 pvs,它在 HDFS 中的路径为:/wh/pvs,其中,wh 是在hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的数据仓库的目录,
所有的 Table 数据(不包括 External Table)都保存在这个目录中。
15.CLI
$HIVE_HOME/bin/hive是一个shell工具,它可以用来运行于交互或批处理方式配置单元查询。
16.DROP
删除一个内部表的同时会同时删除表的元数据和数据。删除一个外部表,只删除元数据而保留数据。
17.如何查看当前的hive的版本
方法1: hive> set hive.hwi.war.file;
方法2: 找到hive所在目录,然后查看jar包的版本号

20,808

社区成员

发帖
与我相关
我的任务
社区描述
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
社区管理员
  • 分布式计算/Hadoop社区
  • 涤生大数据
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧