关于hive一章5-10的作业,请老师点评一下并解答一个问题。

关于hive一章5-10的作业,请老师点评一下并解答一个问题。

我的解答是这样的:

  1. 建表
create table t_ab (
  event_id string,
  session_id string,
  topic string
)
clustered by (session_id) into 100 buckets;
  1. 分桶插入数据
insert into t_ab (
  select 
  a.event_id event_id,a.session_id session_id,b.topic topic 
  from table_a a left join table_b b 
  on a.session_id=b.session_id
)
  1. 数据采样并统计
select max(session_id) from t_ab 
group by session_id
tablesample(bucket 1 out of 100 on session_id)

请老师点评一下做得怎么样?有需要改进的地方吗?(没有那么多数据,sql也许不正确,可以当做伪代码来看。)
并问一个问题:**要做数据采样的话,分桶的数量有什么讲究吗?**比如我们的table_a和table_b左连接起来应该会有10亿条数据左右,分10个桶的话,一个桶大概1亿条数据;分100个桶,一个桶大概是1千万条数据。算法模型一般要有多少数据量才能运行比较准确,但测试算法模型的效率也不能太低。所以分桶的多少应该会有所讲究。对吗?徐老师,那老师一般怎样确定分桶的多少呢?

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

你写的sql没法获取到session_id的数量,最终是要评估哪些session_id出现的比较多

可以参考一下下面这种写法

select
  session_id,
  count(1) as num
from
  (
    SELECT
      session_id
    FROM
      table_a TABLESAMPLE (BUCKET 1 OUT OF 1000 ON rand())
  ) tmp
group by
  session_id
having
  count(1) > 100000 ;


具体分多少个桶,其实这个也没有一个严格的界定,我们在工作中一般需要抽样的话,会分100~1000个桶左右,取几个数值,例如100,500跑一下结果,对比一下抽样结果


咱们的课堂作业,我后期都会在作业模块点评批改的,目前大家作业提交的比较少,所以我目前是定期去批改回复,建议这些内容放到作业模块中,这样大家的作业回复都在一块,也什么好的想法也便于其他同学一起交流学习,一起成长。

  • 好的,谢谢徐老师。我以后就不在问答区问作业了。

    另外,能问下这个sql中的rand()会导致sql怎么样执行吗?那里不是应该是一个字段吗?

    2021-03-02 10:49:25
  • 徐老师 回复 提问者 他门说这就是人生 #2

    on 后面指定某个字段的话是根据某一个字段进行分桶

    指定rand()的话,rand()是一个随机函数,这样就会根据一个随机数进行分桶,这样可以保证分桶的数据更加随机

    2021-03-02 10:53:13
  • 他门说这就是人生 提问者 回复 徐老师 #3

    哦哦,好的

    2021-03-02 10:55:31
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师