pyspark常见使用方法

以日志文件的解析过程为例,其中部分日志文件样例为:

2021-03-09 06:54:21,907 [http-nio-16680-exec-6-43:tUxRo338DAxy6xpj]  INFO [m.u.g.s.l.ThreadLocalLogHandler] - request url: /wfbmall-api/homeGoods/queryMemberScoreInfo, finish at 1615244061907, total cost 8 ms.
2021-03-09 04:49:36,302 [http-nio-16680-exec-7-44:MFf7C1xRrxLgib44]  INFO [m.u.g.s.l.ThreadLocalLogHandler] - {"code":"200","message":"操作成功","data":{"memberId":2145,"availableScore":0},"transNonce":"ce9b7833-b7d1-4419-bc17-4ff6d77b45c0","transDate":"1615236576302"}

 案例一,将日志文件中的json部分提取出来

import findspark
findspark.init()
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("lichao-wordcount")
sc1 = SparkContext(conf=conf)
# 输入的数据
data = sc1.textFile("file:///C:/Users/86159/Desktop/wfbmall_uenshks.log")   #读取本地文件
data.first()  # 查看文件的首行数据
rdd=data.filter(lambda x:"{" in x)   # 过滤出包含大括号“{”的数据,即json文件
rdd_1 = rdd.map(lambda x:x.split(' - ')[1])   # 将包含json行的数据以分隔符进行分割,提取json文件部分
# rdd打印
for line in rdd_1.take(5):      #打印前5行数据
    print(line)
sc1.stop()

 

案例二,将rdd转化为DataFrame,并保存为csv文件

import findspark
findspark.init()
import pyspark
from pyspark.sql import SparkSession, Row
from pyspark.sql.types import StructType, StructField, StringType, IntegerType

spark = SparkSession.builder.appName("boye").getOrCreate()
sc = spark.sparkContext
data = sc.textFile("file:///C:/Users/86159/Desktop/wfbmall_uenshks.log")

rdd = data.filter(lambda x: "{" in x)  #获取包含大括号的行
rdd_1 = rdd.map(lambda x: x.split(' - ')) # 进行分割
rdd_3 = rdd_1.filter(lambda x: len(x) == 2) # 只取出长度为2的行
# schema = StructType(
#     [
#         StructField("name", StringType(), True),
#         StructField("age", IntegerType(), True)
#     ]
# )
# df = spark.createDataFrame(rdd_1, schema).take(5)
df = spark.createDataFrame(rdd_1, schema=["name", "age"])  # 创建dataframe ,schame为column名,也可以用15-21行的代码实现
for line in df.take(5):  # 打印前5行
    print(line)

# 写到csv
df.write.save(path='file:///D:/test/', format='csv', mode='overwrite', sep=',')
#地址末尾一定要加/,不能写成file:///D:/test,就会把test目录下所有其他文件夹覆盖,写成file:///D:/test/ 就会写到test目录下,文件名可以自动生成
sc.stop()

  

 

posted @ 2021-03-17 14:23  欣欣姐  Views(745)  Comments(0)    收藏  举报