数据库中的一张表没有建索引的情况下,数据量越大对数据的插入的影响是不是也越大?
答案:2 悬赏:0 手机版
解决时间 2021-03-11 14:49
- 提问者网友:温柔港
- 2021-03-10 15:52
比如同样的表结构,没有建立索引的情况下,一张表里面有100万数据,另一张表只有1万数据,现在要插入100条数据,效率是否一样?
最佳答案
- 五星知识达人网友:蓝房子
- 2021-03-10 17:04
如果不计算寻找空闲块的时间,应该一样。
全部回答
- 1楼网友:封刀令
- 2021-03-10 17:34
这里的distinct表示去重,也可以用group by实现, 两者的区别在于distinct会读取所有的记录,而group by是在分组之后每组只返回一条记录,也就是说后者读取的条数要少很多,效率会更高一些,因此可以将上述代码改为:
create table validate_set as
select
user_id,
wm_concat(',',brand_id) as brand
from(
select user_id,brand_id
from t_alibaba_bigdata_user_brand_total_1
where type = '1' and visit_datetime > '07-15'
group by user_id,brand_id
)a
group by user_id;
训练集和测试集建立好之后,我们可以通过以下命令来计算测试集的推荐数目:
select sum(regexp_count(brand,',')+1) from t_tmall_add_user_brand_predict_dh;
其中regexp_count是odps的一个自建函数,它的用法如下:
bigint regexp_count(string source, string pattern[, bigint start_position])
表示计算 source 中从 start_position 开始,匹配指定模式pattern 的子串的次数。比如我们有一条输出结果是:100 1,2,3,4,通过计算其中的,数(3)+1=4就计算出推荐的个数了。
udf计算重复条数
udf(user-defined function)(用户定义函数),是用户根据实际应用的需要而自行开发的函数。在 eclipse 中的项目下新建 udf。填入 package 名称为:chanvee.udf,和 udf 类名:counthits,点击确认。插件会自动帮我们生成chanvee.udf包用于写 udf 代码,和test.chanvee.udf包用于本地测试。
编辑counthits.java文件,注意下文的long不能替换为long类型,否则在odps上运行会报method not found错误:
package chanvee.udf
import java.util.arrays;
import java.util.hashset;
import java.util.set;
public class counthits extends udf {
public long evaluate (string a,string b){
if(a == null || b == null) {
return 0l; //异常值
}
set set1 = new hashset();
set set2 = new hashset();
set1.addall(arrays.aslist(a.split(",")));
set2.addall(arrays.aslist(b.split(",")));
long hits = 0l;
for(string s : set2){
if( set1.contains(s) )
hits++;
}
return hits;
}
}
本段函数的主要工作是在a串和b串去重后,计算它们中重复元素的个数。接下来在本地测试下 udf 。在test.jark.udf包中有两个文件testcounthits.java和testudfbase.java。由于如果 udf 的输入参数是多个的话,本地测试默认的分隔符是逗号,与我们brand中的逗号冲突了。所以修改下testudfbase.java文件的第15行的分隔符为空格(当然也可以其他符号):
private final static string odps_separator = " ";
同时修改第72行,去掉(string),原因是long型不能强制转换成string:
return callmeth.invoke(udfclass, input_parameter.toarray()) + "\n";
在testcounthits.in文件中输入测试样例:
123456,444,555,666 123456,666,777,888
888,999
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯