spark三种清理数据的方式:UDF,自定义函数,spark.sql;Python中的zip()与*zip()函数详解//及python中的*args和**kwargs

本文主要是介绍spark三种清理数据的方式:UDF,自定义函数,spark.sql;Python中的zip()与*zip()函数详解//及python中的*args和**kwargs,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

(1)UDF的方式清理数据

import sysreload(sys)
sys.setdefaultencoding('utf8')import re
import jsonfrom pyspark.sql import SparkSession
from pyspark.sql import Row
from pyspark.sql.functions import udf
from pyspark.sql.types import StringType,StructField,StructType
import copymaster_url = 'spark://sc-bd-10:7077'spark = SparkSession.builder \.master(master_url) \.appName("saic_crawler_huangyu") \.getOrCreate()spark.conf.set("spark.driver.maxResultSize", "4g")
spark.conf.set("spark.sql.broadcastTimeout", 1200)
spark.conf.set("spark.sql.crossJoin.enabled", "true")####重点从这看:
spark.sparkContext.addPyFile("clean_utils.py")
from clean_utils import name_clean, parse_date
parse_name_clean_udf = udf(name_clean, StringType()) #用udf的方式清洗数据(1),先要“注册”!def load_basic_info():basic_info_field_name_list = ["eid", "name", "reg_no", "zczj", "zczjbz", "type", "status", "clrq", "hzrq"]basic_info_schema = StructType([StructField(field_name, StringType(), True) for field_name in basic_info_field_name_list])# basic_info_schema = StructType([StructField(field_name, StringType(), True) for field_name in ["eid", "name", "province", "ent_type", "clrq", "hzrq", "zczj", "zczjbz", "status"]])df_basic_info = spark.read.load("hdfs://sc-bd-10:9000/scdata/huangyu/pre_result/basic_info.csv", format="csv",schema=basic_info_schema, delimiter=',')df_basic_info.createOrReplaceTempView("basic_info")spark.sql("""select eid, name from basic_info """).createOrReplaceTempView("name_eid")def clean_case_shixin():shixin_schema = StructType([StructField(field_name, StringType(), True) for field_name in ["company_name", "sc_data_id", "publish_date"]])df_shixin = spark.read.load("hdfs://sc-bd-10:9000/scdata/huangyu/case/shixin_company.csv", format="csv", schema=shixin_schema, delimiter=',') #不带表头,自动推断;df_shixin = df_shixin.withColumn("company_name", parse_name_clean_udf(df_shixin['company_name'])) #用udf的方式清洗数据(2)df_shixin = df_shixin.withColumn("publish_date", parse_date_udf(df_shixin['publish_date']))df_shixin.createOrReplaceTempView("shixin")df_shixin_diff = spark.sql("""select max(company_name) as company_name, max(sc_data_id) as sc_data_id, max(publish_date) as publish_datefrom shixinGROUP BY company_name, sc_data_id""")df_shixin_diff.createOrReplaceTempView("shixin_diff")

方式2,直接导入函数进行清洗:

    @staticmethoddef clean_row_name(row, raw_zhixing_info_field):row_dict = dict([(k, row[k]) for k in raw_zhixing_info_field])row_dict["company_name"] = name_clean(row_dict["company_name"])return row_dictdef rdd_map_reduce_demo(self):# 注意 rdd 的时候需要将map reduce中的self 去掉clean_row_name = self.clean_row_nameraw_zhixing_info_field = self.raw_zhixing_info_fieldself.df_zhixing_info_sample = self.df_zhixing_info_sample \.rdd \.map(lambda row: Row(**clean_row_name(row, raw_zhixing_info_field))) \.filter(lambda row: len(row["company_name"]) >= 5) \.toDF(self.zhixing_info_schema)self.df_zhixing_info_sample.createOrReplaceTempView("zhixing_info_sample")

方式3,用spark.sql清洗;

python zip与zip*区别:
Python中的zip()与*zip()函数详解
参考:https://blog.csdn.net/u013550000/article/details/80324779

这里写代码片
zip()函数的定义从参数中的多个迭代器取元素组合成一个新的迭代器;返回:返回一个zip对象,其内部元素为元组;可以转化为列表或元组;传入参数:元组、列表、字典等迭代器。zip()函数的用法当zip()函数中只有一个参数时zip(iterable)从iterable中依次取一个元组,组成一个元组。示例:## zip()函数单个参数list1 = [1, 2, 3, 4]tuple1 = zip(list1)# 打印zip函数的返回类型print("zip()函数的返回类型:\n", type(tuple1))# 将zip对象转化为列表print("zip对象转化为列表:\n", list(tuple1))输出:zip()函数的返回类型:<class 'zip'>zip对象转化为列表:[(1,), (2,), (3,), (4,)]当zip()函数有两个参数时zip(a,b)zip()函数分别从a和b依次各取出一个元素组成元组,再将依次组成的元组组合成一个新的迭代器--新的zip类型数据。注意:要求a与b的维数相同,当两者具有相同的行数与列数时,正常组合对应位置元素即可;当a与b的行数或列数不同时,取两者结构中最小的行数和列数,依照最小的行数和列数将对应位置的元素进行组合;这时相当于调用itertools.zip_longest(*iterables)函数。举例:m = [[1,2,3], [4,5,6], [7,8,9]]n = [[2,2,2], [3,3,3], [4,4,4]]p = [[2,2,2], [3,3,3,]*zip函数:
*zip()函数是zip()函数的逆过程,将zip对象变成原先组合前的数据。代码示例:## *zip()函数print('=*'*10 + "*zip()函数" + '=*'*10)m = [[1, 2, 3],  [4, 5, 6],  [7, 8, 9]]n = [[2, 2, 2],  [3, 3, 3],  [4, 4, 4]]print("*zip(m, n)返回:\n", *zip(m, n))m2, n2 = zip(*zip(m, n))# 若相等,返回True;说明*zip为zip的逆过程print(m == list(m2) and n == list(n2))输出:*zip(m, n)返回:([1, 2, 3], [2, 2, 2]) ([4, 5, 6], [3, 3, 3]) ([7, 8, 9], [4, 4, 4])True

(4)python中的*args和**kwargs

先来看一个例子:
复制代码1 >>> def foo(*args, **kwargs):2     print 'args =', args3     print 'kwargs = ', kwargs4     print '-----------------------'5 6     7 >>> if __name__ == '__main__':8     foo(1, 2, 3, 4)9     foo(a=1, b=2, c=3)
10     foo(1,2,3,4, a=1, b=2, c=3)
11     foo('a', 1, None, a=1, b='2', c=3)复制代码其输出结果如下:
复制代码1 args = (1, 2, 3, 4)2 kwargs =  {}3 -----------------------4 args = ()5 kwargs =  {'a': 1, 'c': 3, 'b': 2}6 -----------------------7 args = (1, 2, 3, 4)8 kwargs =  {'a': 1, 'c': 3, 'b': 2}9 -----------------------
10 args = ('a', 1, None)
11 kwargs =  {'a': 1, 'c': 3, 'b': '2'}
12 -----------------------复制代码从以上例子可以看出,这两个是python中的可变参数。*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个 dict。并且同时使用*args**kwargs时,*args参数列必须要在**kwargs前,像foo(a=1, b='2', c=3, a', 1, None, )这样调用的话,会提示语法错误“SyntaxError: non-keyword arg after keyword arg”。如同所示:

这篇关于spark三种清理数据的方式:UDF,自定义函数,spark.sql;Python中的zip()与*zip()函数详解//及python中的*args和**kwargs的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/517859

相关文章

Mysql数据库聚簇索引与非聚簇索引举例详解

《Mysql数据库聚簇索引与非聚簇索引举例详解》在MySQL中聚簇索引和非聚簇索引是两种常见的索引结构,它们的主要区别在于数据的存储方式和索引的组织方式,:本文主要介绍Mysql数据库聚簇索引与非... 目录前言一、核心概念与本质区别二、聚簇索引(Clustered Index)1. 实现原理(以 Inno

sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符

《sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符》:本文主要介绍sqlserver、mysql、oracle、pgsql、sqlite五大... 目录一、转义符1.1 oracle1.2 sqlserver1.3 PostgreSQL1.4 SQLi

使用python生成固定格式序号的方法详解

《使用python生成固定格式序号的方法详解》这篇文章主要为大家详细介绍了如何使用python生成固定格式序号,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录生成结果验证完整生成代码扩展说明1. 保存到文本文件2. 转换为jsON格式3. 处理特殊序号格式(如带圈数字)4

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV