IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> hive递归尝试失败,使用python脚本解决的尝试 -> 正文阅读

[大数据]hive递归尝试失败,使用python脚本解决的尝试

在一张hive表中 存储了自身关联自身两键值 即: 当前id(newid) 和 原先id (oldid);
每一个 newid 和 oldid 两id有可能 关联本表中 其他的id

现有需求找到 最后newid 和 最早oldid 使其一一对应
网上有sqlserver 等关系型数据库的递归说明大抵就是利用with as 建立子表 自身调用自身实现递归,但是hive中不支持这种方式,
后来想使用datax 提交代码到sqlserver运行,运行即结果直接传输到建立的hive表中, 测试后发现,这种递归方式只能找到最初的 oldid;
发现表中存有 oolevel 第几个关联层级字段,这样就简单很多
最后选用python脚本+hsql的模式:

首先在hive中创建表

create  table zltest.cycle_table(
ooOutputorderid string comment 'newid',
listid  string comment '中间关联的id',
ooOperateorderid  string comment 'oldid'
)row format delimited FIELDS TERMINATED BY '\u0001' 
NULL DEFINED AS '' STORED AS Parquet;

这里后面面要到impala执行 最好使用 Parquet 格式


```python


# -*- coding:utf-8 -*-
from impala.dbapi import connect
import impala
from bitarray._bitarray import _bitarray, bitdiff, bits2bytes, _sysinfo


sql1="""
insert overwrite table zltest.cycle_table
select ooOutputorderid,
concat_ws(',',ooOperateorderid )listid,ooOperateorderid 
from ods.oc_ocorderoperation
where oolevel =%s
group by ooOutputorderid,concat_ws(',',ooOperateorderid ),ooOperateorderid ;
"""


sql2="""
insert into table zltest.cycle_table
select d.ooOutputorderid, concat_ws(',',d.listid,b.ooOperateorderid)listid,b.ooOperateorderid 
from zltest.cycle_table as d
inner join (select * from ods.oc_ocorderoperation where oolevel=%s) as b
on d.ooOperateorderid = b.ooOutputorderid
group by d.ooOutputorderid, concat_ws(',',d.listid,b.ooOperateorderid),b.ooOperateorderid


"""



sql3="""
insert into table zltest.cycle_table
select a.ooOutputorderid,
concat_ws(',',ooOperateorderid )listid,ooOperateorderid
from ods.oc_ocorderoperation a
inner join (
        select a.ooOutputorderid
        from ods.oc_ocorderoperation as a 
        left join ods.oc_ocorderoperation as b on a.ooOutputorderid = b.ooOperateorderid 
        where b.ooOperateorderid is null and a.oolevel=%s
) b on a.ooOutputorderid = b.ooOutputorderid
where a.oolevel =%s and b.ooOutputorderid is not null
group by a.ooOutputorderid,concat_ws(',',ooOperateorderid ),ooOperateorderid ;
"""




sql4="""
insert overwrite table zltest.cycle_table
select ooOutputorderid,listid, ooOperateorderid 
from(
        select *,
        row_number()over(partition by ooOutputorderid  order by length(listid) desc) row_num
        from zltest.cycle_table
) as d where row_num =1;
"""




##先查出最大的层级 select max(oolevel)num from ods.oc_ocorderoperation;
def connImpala():
    conn = connect(host='XX.XX.XX.XX', port=21050)
    cur = conn.cursor()
    cur.execute("select max(oolevel)num from ods.oc_ocorderoperation;")
    data_list=cur.fetchall()
    for i in  data_list:
        data=int(i)
    t=data
    while(t>=0):
        if(t==data):
            print('首次插入数据')
            cur.execute(sql1%(t))
        else:
            print('%s次插入有上层跳转数据'%(t))
            cur.execute(sql2%(t))
            print('%s次插入无上层跳转数据'%(t))
            cur.execute(sql3%(t,t))
        t-=1
    cur.execute(sql4)
    conn.close()

if __name__ == '__main__':
    connImpala()

运行完成

当然,部分有时侯不有层级数
也可以这样处理
先执行一次:

insert overwrite table zltest.cycle_table
select t1.ooOutputorderid,concat_ws(',',t1.ooOperateorderid )listid,t2.ooOperateorderid 
from(
        select a.ooOutputorderid,a.ooOperateorderid 
        from ods.oc_ocorderoperation as a 
        left join ods.oc_ocorderoperation as b on a.ooOutputorderid = b.ooOperateorderid 
        where b.ooOperateorderid is null 
) as t1 
left join ods.oc_ocorderoperation t2 on t1.ooOperateorderid = t2.ooOutputorderid;

python循环
查看还有没有 有链式未关联完的

select count(t1.ooOperateorderid)num
from zltest.cycle_table t1 
left join ods.oc_ocorderoperation t2 on t1.ooOperateorderid = t2.ooOutputorderid
where t2.ooOutputorderid is null;

python 脚本中判断在num值为0以前都要循环

insert into table zltest.cycle_table
select a.ooOutputorderid,concat_ws(',',a.listid,a.ooOperateorderid )listid,b.ooOperateorderid 
from zltest.cycle_table a
inner join (
    select t3.ooOperateorderid ,t3.ooOutputorderid
    from ods.oc_ocorderoperation t3
    left join (
        select t1.ooOperateorderid
        from zltest.cycle_table t1 
        left join ods.oc_ocorderoperation t2 on t1.ooOperateorderid = t2.ooOutputorderid
        where t2.ooOutputorderid is null            ---找出已经完全找到所有id的
    ) as t4 on t3.ooOperateorderid = t4.ooOperateorderid
    where t4.ooOperateorderid is null               ---去除已经完全找到所有id的
) as d on a.ooOperateorderid = d.ooOutputorderid;
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 22:44:58  更:2021-07-30 22:45:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 2:54:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码