sparkSQL
1.SparkSQL 读取 CSV
spark = SparkSession.builder.appName("demo").master("local").getOrCreate()
spark.read.option("header", True).option("delimiter", "CSV分隔符").csv("csv路径")
2.SparkSQL 内置字符串处理函数

字符 描述
ascii(e: Column) 计算第一个字符的ascii码
base64(e: Column) base64转码
unbase64(e: Column) base64解码
concat(exprs: Column*) 连接多列字符串
concat_ws(sep: String, exprs: Column*) 使用sep作为分隔符连接多列字符串
decode(value: Column, charset: String) 解码
encode(value: Column, charset: String) 转码,charset支持 'US-ASCII','ISO-8859-1','UTF-8','UTF-16BE','UTF-16LE','UTF-16'
format_number(x: Column, d: Int) 格式化'#,###,###.##'形式的字符串
format_string(format: String, arguments: Column*) 将arguments按format格式化,格式为printf-style
initcap(e: Column) 单词首字母大写
lower(e: Column) 转小写
upper(e: Column) 转大写
instr(str: Column, substring: String) substring在str中第一次出现的位置
length(e: Column) 字符串长度
levenshtein(l: Column, r: Column) 计算两个字符串之间的编辑距离(Levenshtein distance)
locate(substr: String, str: Column) substring在str中第一次出现的位置,位置编号从1开始,0表示未找到
locate(substr: String, str: Column, pos: Int) 同上,但从pos位置后查找
lpad(str: Column, len: Int, pad: String) 字符串左填充。用pad字符填充str的字符串至len长度。有对应的rpad,右填充
ltrim(e: Column) 剪掉左边的空格、空白字符,对应有rtrim。
ltrim(e: Column, trimString: String) 剪掉左边的指定字符,对应有rtrim。
trim(e: Column, trimString: String) 剪掉左右两边的指定字符
trim(e: Column) 剪掉左右两边的空格、空白字符
regexp_ext\fract(e: Column, exp: String, groupIdx: Int) 正则提取匹配的组
regexp_replace(e: Column, pattern: Column, replacement: Column) 正则替换匹配的部分,这里参数为列
regexp_replace(e: Column, pattern: String, replacement: String) 正则替换匹配的部分
repeat(str: Column, n: Int) 将str重复n次返回
reverse(str: Column) 将str反转
soundex(e: Column) 计算桑迪克斯代码(soundex code)PS:用于按英语发音来索引姓名,发音相同但拼写不同的单词,会映射成同一个码
split(str: Column, pattern: String) 用pattern分割str
substring(str: Column, pos: Int, len: Int) 在str上截取从pos位置开始长度为len的子字符串
3.正则表达式
(1)正则表达式的限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。

字符 描述
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
(2)正则表达式的特殊字符类

字符 描述 替换写法
. 匹配除 "\n" 之外的任何单个字符 要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式
\d 匹配一个数字字符 等价于 [0-9]
\D 匹配一个非数字字符 等价于 [^0-9]
\s 匹配任何空白字符,包括空格、制表符、换页符等等 等价于 [ \f\n\r\t\v]
\S 匹配任何非空白字符 等价于 [^ \f\n\r\t\v]
\w 匹配包括下划线的任何单词字符 等价于'[A-Za-z0-9_]'
\W 匹配任何非单词字符 等价于 '[^A-Za-z0-9_]'
题目:第1关:SparkSql 数据清洗
将出租车轨迹数据规整化,清洗掉多余的字符串,并使用 DataFrame.show() 打印输出。

清洗掉红框里面的 $ 、@ 字符,由于这两字符出现的次数没有规律,所以需要使用正则匹配。
清洗后内容如下:

特别说明:本案例的 CSV 文件是以 \t 进行字段分隔,文件路径为 /root/data.csv
# -*- coding: UTF-8 -*-
from pyspark.sql import SparkSession
if __name__ == '__main__':
spark = SparkSession.builder.master("local").appName("demo").getOrCreate()
#**********begin**********#
df = spark.read.option("header",True).option("delimiter","\t").csv("/root/data.csv")
df.createTempView("data")
spark.sql("""
select regexp_replace(TRIP_ID,'\\\W+','') as TRIP_ID ,
regexp_replace(CALL_TYPE,'\\\W+','') as CALL_TYPE ,
regexp_replace(ORIGIN_CALL,'\\\W+','') as ORIGIN_CALL ,
regexp_replace(TAXI_ID,'\\\W+','') as TAXI_ID ,
regexp_replace(ORIGIN_STAND,'\\\W+','') as ORIGIN_STAND ,
regexp_replace(TIMESTAMP,'\\\W+','') as TIMESTAMP ,
regexp_replace(POLYLINE,'\\\W+','') as POLYLINE
from data
""").show()
#**********end**********#
spark.stop()
更多推荐




所有评论(0)