阿里云 opds SQL如何安装
答案:2 悬赏:10 手机版
解决时间 2021-03-11 18:42
- 提问者网友:一抹荒凉废墟
- 2021-03-10 19:13
阿里云 opds SQL如何安装
最佳答案
- 五星知识达人网友:山君与见山
- 2021-03-10 19:47
这里的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 111,222
111,111,222,222 111,222,222,333
运行TestCountHits.java后,在TestCountHits.out文件中得到测试结果(样例):
2
0
2
在确认 UDF 没有问题后,准备上传。将Package chanvee.udf打成 jar 包,命名为chanvee_udf.jar,置于C:/TOOLS下,执行以下命令:
create resource jar C:/TOOLS/chanvee_udf.jar
create function count_hits chanvee.udf.CountHits jark-udf.jar
上述命令作用分别是将用户 jar 包上传到 ODPS 和在 ODPS 上注册函数并命名为count_hits。现在使用ls functions命令就能看到我们刚刚注册的函数了。
现在,我们就能像调用一般内建函数一样调用我们自己的count_hits函数了。计算推荐集和验证集中的重复条数,有下面代码:
select sum(count_hits(a.brand,b.brand)) hits from t_tmall_add_user_brand_predict_dh a
join validate_set b on a.user_id = b.user_id;
上面演示了一般 UDF 的创建使用过程,其他类似的 UDF 都可以参考以上过程构建。UDF 是 SQL 的一大工具 ,很多规则算法都可以用过 UDF 方便地实现。
计算评估值
我们知道准确率的计算公式:precision=hitspnums, 其中 pnum 代表推荐的条数。
召回率的计算公式:recall=hitsrnums, 其中 rnum 为验证的条数。
F1:
F1=2∗hitspnum+rnum
为了计算方便,我们用full outer join连接验证集和推荐集,并将计算出的 hits、pnums、rnums 放到临时表里:
select sum(count_hits(p.brand,r.brand) hits,
sum(regexp_count(p.brand,',')+1) pnums,
sum(regexp_count(r.brand,',')+1) rnums
from t_tmall_add_user_brand_predict_dh p
full outer join validate_set r on p.user_id = r.user_id
有了这三个值后,就可以用上面的公式轻松计算出评测值了。
select (hits/pnums) precision, (hits/rnums) recall,(2*hits/(pnums+rnums)) F1
from (
select hits , pnums , rnums
from ...
)a;
综合一下,有如下代码:
create table evaluation as
select (hits/pnums) precision , (hits/rnums) recall , (2*hits/(pnums+rnums)) F1 ,
hits , pnums , rnums , getdate() eval_time
from (
select sum(count_hits(p.brand,v.brand) hits,
sum(regexp_count(p.brand,',')+1) pnums,
sum(regexp_count(v.brand,',')+1) rnums
from t_tmall_add_user_brand_predict_dh p
full outer join validate_set r on p.user_id = r.user_id
)a;
我们将评测值写到了evaluation表中,可供组员查看分析。运行一次上面代码后,若以后再进行评测,可以将第一行改成insert into/overwrite table evaluation后直接运行,这样可以与上次的结果进行比较。
现在已有的模型算法就可以在本地测试调优后,再上传到线上进行评估了。
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
Set
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 111,222
111,111,222,222 111,222,222,333
运行TestCountHits.java后,在TestCountHits.out文件中得到测试结果(样例):
2
0
2
在确认 UDF 没有问题后,准备上传。将Package chanvee.udf打成 jar 包,命名为chanvee_udf.jar,置于C:/TOOLS下,执行以下命令:
create resource jar C:/TOOLS/chanvee_udf.jar
create function count_hits chanvee.udf.CountHits jark-udf.jar
上述命令作用分别是将用户 jar 包上传到 ODPS 和在 ODPS 上注册函数并命名为count_hits。现在使用ls functions命令就能看到我们刚刚注册的函数了。
现在,我们就能像调用一般内建函数一样调用我们自己的count_hits函数了。计算推荐集和验证集中的重复条数,有下面代码:
select sum(count_hits(a.brand,b.brand)) hits from t_tmall_add_user_brand_predict_dh a
join validate_set b on a.user_id = b.user_id;
上面演示了一般 UDF 的创建使用过程,其他类似的 UDF 都可以参考以上过程构建。UDF 是 SQL 的一大工具 ,很多规则算法都可以用过 UDF 方便地实现。
计算评估值
我们知道准确率的计算公式:precision=hitspnums, 其中 pnum 代表推荐的条数。
召回率的计算公式:recall=hitsrnums, 其中 rnum 为验证的条数。
F1:
F1=2∗hitspnum+rnum
为了计算方便,我们用full outer join连接验证集和推荐集,并将计算出的 hits、pnums、rnums 放到临时表里:
select sum(count_hits(p.brand,r.brand) hits,
sum(regexp_count(p.brand,',')+1) pnums,
sum(regexp_count(r.brand,',')+1) rnums
from t_tmall_add_user_brand_predict_dh p
full outer join validate_set r on p.user_id = r.user_id
有了这三个值后,就可以用上面的公式轻松计算出评测值了。
select (hits/pnums) precision, (hits/rnums) recall,(2*hits/(pnums+rnums)) F1
from (
select hits , pnums , rnums
from ...
)a;
综合一下,有如下代码:
create table evaluation as
select (hits/pnums) precision , (hits/rnums) recall , (2*hits/(pnums+rnums)) F1 ,
hits , pnums , rnums , getdate() eval_time
from (
select sum(count_hits(p.brand,v.brand) hits,
sum(regexp_count(p.brand,',')+1) pnums,
sum(regexp_count(v.brand,',')+1) rnums
from t_tmall_add_user_brand_predict_dh p
full outer join validate_set r on p.user_id = r.user_id
)a;
我们将评测值写到了evaluation表中,可供组员查看分析。运行一次上面代码后,若以后再进行评测,可以将第一行改成insert into/overwrite table evaluation后直接运行,这样可以与上次的结果进行比较。
现在已有的模型算法就可以在本地测试调优后,再上传到线上进行评估了。
全部回答
- 1楼网友:罪歌
- 2021-03-10 20:38
没看懂什么意思?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯