【无标题】

该博客展示了使用Spark SQL进行出租车轨迹数据的清洗和分析。首先,通过`regexp_replace`函数清洗CSV数据,提取关键信息。接着,将时间戳转换为日期,并计算行程总时长。然后,利用自定义UDF(用户定义函数)获取行程的起始和结束位置。最后,统计每天各类呼叫类型的数量,并按时间与呼叫类型排序展示结果。
摘要由CSDN通过智能技术生成

企业spark案例 —— 出租车轨迹分析(Python)

第1关:SparkSql 数据清洗

# -*- 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()

第2关:SparkSql数据分析

# -*- coding: UTF-8 -*-
from pyspark.sql import SparkSession
import json

if __name__ == '__main__':
    spark = SparkSession.builder.master("local").appName("demo").getOrCreate()
    #**********begin**********#
    df=spark.read.option("header",True).option("delimiter","\t").csv("/root/data2.csv")        
    df.createTempView("data")    
    # 1 将时间戳转换成时间 ,并将列名重命名为 TIME
    spark.sql("select TRIP_ID,CALL_TYPE,ORIGIN_CALL, TAXI_ID, ORIGIN_STAND, from_unixtime(TIMESTAMP,'yyyy-MM-dd') as TIME ,POLYLINE from data").show()

    # 2.1 计算每个行程总时长,以秒为单位,并将其作为新列,列名为 TIMELEN
    # 2.2 分离出起始位置与目的位置作为新列,起始位置列名为 STARTLOCATION,目的位置列名为 ENDLOCATION
    spark.udf.register("timeLen", lambda x: {
        (len(json.loads(x)) - 1) * 15 if len(json.loads(x)) > 0 else 8
    })
    spark.udf.register("startLocation", lambda x: {
        str(json.loads(x)[0]) if len(json.loads(x)) > 0 else ""
    })
    spark.udf.register( "endLocation", lambda x: {
        str(json.loads(x)[len(json.loads(x)) - 1]) if len(json.loads(x)) > 0 else ""
    })

    # 3 统计每天各种呼叫类型的数量并以CALL_TYPE,TIME升序排序
    df.createTempView("data2")
    res=spark.sql("select TRIP_ID,CALL_TYPE,ORIGIN_CALL,TAXI_ID,ORIGIN_STAND,from_unixtime(TIMESTAMP,'yyyy-MM-dd') as TIME, POLYLINE, timeLen(POLYLINE) as TIMELEN, startLocation(POLYLINE) as STARTLOCATION, endLocation(POLYLINE) as ENDLOCATION from data2")
    res.createTempView("data3")
    res.show()
    spark.sql("select CALL_TYPE,TIME,count(1) as NUM from data3 group by TIME,CALL_TYPE order by CALL_TYPE,TIME").show()

    #**********end**********#
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值