首页 > 数据库 >pyspark.sql处理多分隔符数据文件生成DF案例

pyspark.sql处理多分隔符数据文件生成DF案例

时间:2023-10-25 17:14:56浏览次数:37  
标签:24 10 pyspark DF 分隔符 2023 sql spark 12345678912

pyspark程序清洗多分隔符数据案例

原始数据

可以看到原始数据是以“|#$”多分隔符进行数据分割的

POD9_6ec8794bd3297048d6ef7b6dff7b8be1|#$2023-10-24|#$0833|#$#|#$#|#$99999999999|#$#|#$12345678912
POD9_352858578708f144bb166a77bad743f4|#$2023-10-24|#$0391|#$#|#$#|#$99999999999|#$#|#$12345678912
POD9_c8c996cff241529b2427a29e9d6c68d7|#$2023-10-24|#$0834|#$#|#$#|#$99999999999|#$P00000016970|#$12345678912

需求

使用spark将文本文件转成DataFrame并使用spark.sql进行数据数据操作

1.使用spark.read.format直接生成DF

首先我们可能会想到使用spark.read.format进行文件读取指定分隔符直接生成DF,但是该方法对于指定多分隔符会报错 (CSV格式是可以指定分隔符的但是只限有一个分隔符的时候)

df = spark.read.format("csv")\
    .option("sep", "|#$")\
    .load("BUS_RECOMMEND_STAFF.log")

## 报错如下
pyspark.sql.utils.IllegalArgumentException: 'Delimiter cannot be more than one character: |#$'

经排查搜索发现该方法只能处理单个分隔符的情况下使用

2.转换思路先生成RDD处理多分隔符在转成DF

对于多分隔符日志文件使用sc.textFile生成RDD进行分隔符切割,然后再把RDD转成DF

from pyspark.sql import SparkSession

spark = SparkSession.builder.master("local[*]").appName("log ETL").getOrCreate()
sc = spark.sparkContext

# spark.read.format 和 sc.textFile的区别
# * spark.read.format 生成DateFrame or DateSet
# * sc.textFile 生成RDD

columns = ["SERIALNUM_BG", "BUS_DATE", "CITY_CODE", "STAFF_NUM",
           "STAFF_NAME", "SERIAL_NUMBER", "CHANNEL_CODE", "BIND_USER_NUM"]

rdd = sc.textFile("BUS_RECOMMEND_STAFF.log")  # 读取文件
# print(rdd.collect())
# ['POD9_6ec8794bd3297048d6ef7b6dff7b8be1|#$2023-10-24|#$0833|#$#|#$#|#$99999999999|#$#|#$12345678912', 'POD9_352858578708f144bb166a77bad743f4|#$2023-10-24|#$0391|#$#|#$#|#$99999999999|#$#|#$12345678912', 'POD9_c8c996cff241529b2427a29e9d6c68d7|#$2023-10-24|#$0834|#$#|#$#|#$99999999999|#$P00000016970|#$12345678912']
rdd1 = rdd.map(lambda x: x.split("|#$"))  # 按指定分隔符进行分割
# print(rdd1.collect())
# [['POD9_6ec8794bd3297048d6ef7b6dff7b8be1', '2023-10-24', '0833', '#', '#', '99999999999', '#', '12345678912'], ['POD9_352858578708f144bb166a77bad743f4', '2023-10-24', '0391', '#', '#', '99999999999', '#', '12345678912'], ['POD9_c8c996cff241529b2427a29e9d6c68d7', '2023-10-24', '0834', '#', '#', '99999999999', 'P00000016970', '12345678912']]
df = rdd1.toDF(columns)  # rdd转DF指定schema
# df.show()
# +--------------------+----------+---------+---------+----------+-------------+------------+-------------+
# |        SERIALNUM_BG|  BUS_DATE|CITY_CODE|STAFF_NUM|STAFF_NAME|SERIAL_NUMBER|CHANNEL_CODE|BIND_USER_NUM|
# +--------------------+----------+---------+---------+----------+-------------+------------+-------------+
# |POD9_6ec8794bd329...|2023-10-24|     0833|        #|         #|  99999999999|           #|  12345678912|
# |POD9_352858578708...|2023-10-24|     0391|        #|         #|  99999999999|           #|  12345678912|
# |POD9_c8c996cff241...|2023-10-24|     0834|        #|         #|  99999999999|P00000016970|  12345678912|
# +--------------------+----------+---------+---------+----------+-------------+------------+-------------+
df.createOrReplaceTempView("people")  # 创建临时表
spark.sql("select BUS_DATE from people where CITY_CODE='0834'").show()  # 使用sql查询临时表数据

# +----------+
# |  BUS_DATE|
# +----------+
# |2023-10-24|
# +----------+

总结

  • spark.read.format进行文件读取指定分隔符直接生成DF只能在当文件只有一个分隔符的情况下使用
  • spark.read.format 和 sc.textFile的区别 :spark.read.format 生成DateFrame or DateSet ,sc.textFile 生成RDD
  • 使用RDD转DF更方便构建数据schema : df = rdd1.toDF(columns)

标签:24,10,pyspark,DF,分隔符,2023,sql,spark,12345678912
From: https://www.cnblogs.com/whiteY/p/17787664.html

相关文章

  • 现代C++语言核心特性解析 谢丙堃​ 2021年pdf电子版
    现代C++语言核心特性解析2021年pdf电子版作者: 谢丙堃出版年: 2021-10ISBN: 9787115564177连接提取码:ckop自从C++11发布,就没有系统学习C++的书,也很久没有看国内作者出的C++书籍了。市面上对于现代C++的书很少,这是一本讲述现代C++11~C++20的书。意外,写得不错,容易理解,难得是除了......
  • 具体数学: 计算机科学基础 pdf电子版
    具体数学:计算机科学基础pdf电子版下载作者:RonaldL.Graham/OrenPatashnik/DonaldE.Knuth原作名:ConcreteMathematics:AFoundationforComputerScience出版年:2013-4-1......
  • 正则指引(第2版)余晟 pdf电子版
    正则指引(第2版)余晟pdf电子版作者: 余晟出版年: 2018-10-1ISBN: 9787121351303连接提取码:wp1w如果是新手,想要感受下正则表达式的魅力,那么这本书适合你;如果是老手,觉得写的正则表达式已无可挑剔,读完本书,你可能会有不一样的认识;或者你觉得《精通正则表达式》比较难啃,也可以从本书......
  • windows安装MySQL8.0.20
    一、下载地址(zip版):https://downloads.mysql.com/archives/community/二、安装mysql8.0.201、解压缩至目录D:\software\mysql-8.0.20-winx642、新建my.ini文件在D:\software\mysql-8.0.20-winx64目录下新建my.ini文件注意:需要将配置文件中的basedir和datadir的值改成自己......
  • c# pdf转图片
    需安装nuget包:<packageid="PdfiumViewer"version="2.13.0.0"targetFramework="net45"/><packageid="HiraokaHyperTools.PdfiumViewer.Native.Windows"version="0.1.5637"targetFramework="net45"......
  • sql高级实践
    sql高级实践情景还原:在企业中心中,开通岗位风控的企业一共有13个,要在数据大屏中统计这13个企业的单元,事件,管控措施,任务数。难点解析:device表,risk_unit表,risk_event表,risk_measure只有device表有company_id。重点在于13个企业不是每个企业都有从装置往下的一个完整的数数据树的......
  • sql 审核工具 archery
    这里使用git下载gitclonehttps://gitee.com/rtttte/Archery.git使用docker-compose进行部署cdArchery/src/docker-compose执行部署命令docker-compose-fdocker-compose.ymlup-d初始化操作#表结构初始化dockerexec-tiarchery/bin/bashcd/opt/arche......
  • 多款国产操作系统安装数据库干货文档汇总(含Oracle/MySQL/国产数据库等)
    随着国产化的逐步推进,越来越多的企业选择将数据库安装在国产操作系统上。为帮助大家了解国产操作系统上的数据库成功搭建案例与搭建方式,本文整理了墨天轮数据技术社区上用户分享的实操文档,涵盖银河麒麟、中标麒麟、统信UOS、openEuler等常见的国产操作系统,数据库以Oracle为主,此外......
  • MySQL
    MySQL概述MySQL连接语法mysql -u用户名 -p密码[-h数据库服务器IP地址 -p端口号]关系型数据库:(RDBMS)建立在关系模型基础上,由多张相互连接的二维表组成的数据库特点:使用表存储数据,格式统一,便于维护使用SQL语言操作,标准统一,使用方便,可以用于复杂......
  • Kettle链接SqlServer+Jdk8 问题解决
     这两天要弄个ldap对接,客户端server2016,数据库那边winserver2008,数据库也是2008最开是链接出现类似这样的,更换了链接mssql的Jar版本,从12换到了6的老版本,没用。  后来更改网上提示的  C:\ProgramFiles\Java\jre-1.8\lib\security\java.security文件jdk.tls.......