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

相关文章

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

Python3.6连接MySQL的详细步骤

《Python3.6连接MySQL的详细步骤》在现代Web开发和数据处理中,Python与数据库的交互是必不可少的一部分,MySQL作为最流行的开源关系型数据库管理系统之一,与Python的结合可以实... 目录环境准备安装python 3.6安装mysql安装pymysql库连接到MySQL建立连接执行S

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将