前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ETL的开发过程[通俗易懂]

ETL的开发过程[通俗易懂]

作者头像
全栈程序员站长
发布2022-08-31 19:02:15
9800
发布2022-08-31 19:02:15
举报

大家好,又见面了,我是你们的朋友全栈君。

在生产环境中, 使用shell脚本完成一次etl操作

1.定义一个etl函数, 里面传入json行数据, 用json.loads加载行数据,并对行数据进行判断,如果没有行数据,或data字段没有在行数据里, 就直接返回空的结果, 否则就继续往下执行

2.接着获取行里的数据, 用for循环判断, 如果包含某个值, 我就将变量赋值取出, 装在集合容器里

3.设置sparksession会话, 并enableHiveSupport, 我用的是hiveonspark模式,

4.初始化rdd, 从大数据emr集群中(也可能是从实时系统kafka读取数据)加载数据到rdd , 然后用自己自定义的etl解析过滤

5.将rdd转为df, createDateFream()要传两个参数,一个是rdd,一个是schema信息

6.将df创建临时表 createOrReplaceTemView()

7.将临时表表的数据加载到hive表中, 完成整个ETL操作

ETL常用场景:

1.清洗nginx日志信息, 预处理日志文件(每小时将上报的日志拉取到本机,hdfs命令上传集群),并清洗存入hive

2.每小时清洗用户表信息,

3.后处理清洗商户信息,

4.清洗并合并设备状态信息,

5.每小时清洗每日设备分成, 清洗并合并积分流水表信息, 每小时清洗支付宝订单表信息等,

代码语言:javascript
复制
def etl(row_str):
	result = []
	try:
		row = json.loads(row_str)
		if(not row) or ('data' not in row):
		return result
		
		获取行
		base = { 
   }
		for r_k in row:
			r_v = row[r_k]
			if r_k != 'data':
				r_k=r_k.lower()
				base[r_k]=r_k
				print(base)
		获取data
		for data in row['data']:
			base_data = base.copy()
			if data:
				for d_k in data:
					d_v = data[d_k]
					if d_k != 'list':
						d_k = d_k.lower()
						base_data[d_k] = d_v
						print(base_data)
		获取list
		 for list_ in data['list']:
                    if list_:
                        # print(list_)
                        list_data = base_data.copy()
                        # list_data.update(list_)
                        for l_k in list_:
                            l_v = list_[l_k]
                            l_k = l_k.lower()
                            list_data[l_k] = l_v
                        # print(list_data)
                        result += [list_data]
                        # print(result)
      except Exception as e:
      	print(e)
      	pass
      retuen result
      
  设置会话
  spark = SparkSession.builder.appName("程序名" % statdate分区日期)
  .enableHiveSupport()
  .getOrCreate()
  
  初始化rdd
  rawLogRDD = spark.sparkContext.textfile("hdfs://emr-cluster/ld_log")
  
  etl解析
  etllogRDD = rawLogRDD.flatMap(etl)
  可以进行测试打印
  for record in etlLogRDD.collect():
  	print(record)
  	
  	将rdd 转为df
  	sampleDF = spark.sql("select * from dept limit 1")
  	etlLogSchema = sampleDF.schema
  	etlLogSchema.__dict__['fields'] = etlLogSchema.__dict__['fields'][:-1]
etlLogSchema.__dict__['names'] = etlLogSchema.__dict__['names'][:-1]
etlLogDF = spark.createDataFrame(etlLogRDD,etlLogSchema)
测试:etlLogDF.printSchema()
etlLogDF.show()
exit()
创建临时表
etl.LogDF.createOrReplaceTmpView("etl_log")
写入分区表
spark.sql("alter table dept drop if exist partition(statdate='%s')" ) % statdate)
spark.sql("insert overwrite table dept partition(statdate='%s') select * from etl_log " % statdate)

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142667.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档