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

ETL的开发过程[通俗易懂]在生产环境中,使用shell脚本完成一次etl操作1.定义一个etl函数,里面传入json行数据,用json.loads加载行数据,并对行数据进行判断,如果没有行数据,或data字段没有在行数据里,就直接返回空的结果,否则就继续往下执行2.接着获取行里的数据,用for循环判断,如果包含某个值,我就将变量赋值取出,装在集合容器里3.设置sparksession会话,并ena…

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

在生产环境中, 使用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.每小时清洗每日设备分成, 清洗并合并积分流水表信息, 每小时清洗支付宝订单表信息等,

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.net/142667.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ASMM自动管理的功能[通俗易懂]

    ASMM自动管理的功能[通俗易懂]AutomaticSharedMemoryManagement(ASMM)是ORACLE10g另外一个自动管理的功能。[@more@]AutomaticSharedMemoryManagement(ASMM)是ORA…

    2022年5月31日
    54
  • pycharm激活码最新2022.01(JetBrains全家桶)「建议收藏」

    (pycharm激活码最新2022.01)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年4月1日
    207
  • SCTP详解

    SCTP详解转载自:IBM中文官网sctp部分,代码下载地址:http://www.ibm.com/developerworks/apps/download/index.jsp?contentid=163181&filename=l-sctp-msdemo.zip&method=http&locale=zh_CN作者:M.TimJones是一名嵌入式软件工程师,他是 GNU/LinuxAppl

    2022年6月29日
    23
  • 免费网络电话哪个最好_有什么网络电话是免费的

    免费网络电话哪个最好_有什么网络电话是免费的今天试用了,很容易,声音也很好。http://www.vipoo.cn/

    2022年8月1日
    12
  • linux open详解,Linux系统open函数详解[通俗易懂]

    linux open详解,Linux系统open函数详解[通俗易懂]Linux系统中open函数主要作用就是打开和创建文件,可以根据参数来定制我们需要的文件的属性和用户权限等各种参数,下面良许教程网为大家分享一下Linux系统open函数具体使用方法。一、open函数用来干什么open函数在Linux下一般用来打开或者创建一个文件,我们可以根据参数来定制我们需要的文件的属性和用户权限等各种参数。二、open函数的定义和参数我们首先来看下open函数在Linux下的…

    2022年5月26日
    141
  • js 字符串截取substr和substring详解

    js 字符串截取substr和substring详解1.substr 方法返回一个从指定位置开始的指定长度的子字符串。stringObj.substr(start [, length ])参数stringvar:必选项。要提取子字符串的字符串文字或 String 对象。start:必选项。所需的子字符串的起始位置。字符串中的第一个字符的索引为 0。length:选项。在返回的子字符串中应包括

    2022年5月29日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号