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中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1