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

相关文章

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

MySQL 迁移至 Doris 最佳实践方案(最新整理)

《MySQL迁移至Doris最佳实践方案(最新整理)》本文将深入剖析三种经过实践验证的MySQL迁移至Doris的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于CDC(ChangeData... 目录一、China编程JDBC Catalog 联邦查询方案(适合跨库实时查询)1. 方案概述2. 环境要求3.

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每