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实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

MySQL8 密码强度评估与配置详解

《MySQL8密码强度评估与配置详解》MySQL8默认启用密码强度插件,实施MEDIUM策略(长度8、含数字/字母/特殊字符),支持动态调整与配置文件设置,推荐使用STRONG策略并定期更新密码以提... 目录一、mysql 8 密码强度评估机制1.核心插件:validate_password2.密码策略级

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方