PySpark大数据分析(7):Spark SQL

Spark SQL

数据读写

Hive

Parquet

JSON

RDD

JDBC/ODBC

用户自定义函数(UDF)

UDF可以轻松实现复杂操作以及它们的反复使用。用户可以在dataframe的select(),withColumn(),以及SQL中的udf()调用Python中注册的自定义函数,简单来说就是对于复杂一些的处理,用户不需要在SQL中进行直接编程来实现,而是使用Python实现该功能,并作为一个UDF在SQL中调用。PySpark同时支持Spark SQL以及Hive的UDF。需要注意的是,由于对于Spark而言,UDF相当于一个黑盒,Spark内部对dataframe的优化无法应用在UDF上。因此UDF本身的开销比较大,原则上如果能使用其他方式达成目的,尽量不要使用UDF。

Spark SQL UDF

MovieLens 1M数据集为例,首先将movies数据集读入PySpark。

from pyspark.sql import SparkSession
from pyspark import SparkConf, SparkContext

conf = SparkConf().setMaster('local').setAppName('movielens')
sc = SparkContext(conf=conf)
spark = SparkSession(sc)

movies = spark.read.csv('movielens_1m/movies.csv', header=True)
movies.show(20)

前20部电影的列表
由于每一部电影的上映年份都是作为title的一部分拼在电影名称的最后的,因此我们可以通过一个字符串处理的函数将上映年份从标题中提取出来。

import datetime


# extract release year from the title
def extract_release_year(title):
    title = title.strip()
    title_list = title.split('(')
    
    year = None

    if len(title_list) >= 2:
        try:
            year = int(title_list[-1].strip(')').strip())
        except ValueError:
            return year
        else:
            year = None if year > datetime.date.today().year or year < 1000 else year
    
    return year

现在将这个提取年份的函数作为一个UDF,使用withColumn()创建一个新的数据列。在调用UDF时,需要对返回值的类型进行声明。

from pyspark.sql.functions import udf
from pyspark.sql.types import StringType, IntegerType


udf_year_extract = udf(extract_release_year, IntegerType())
movies.withColumn('releaseYear', udf_year_extract('title')).show(20)

请添加图片描述
由于udf()接收的参数就是一个Python函数,因此你也可以将上面的步骤以装饰器的形式实现,之后将目标列直接传入该函数即可。两者效果是完全一样的:

from pyspark.sql.functions import col


@udf(returnType=IntegerType())
def extract_release_year(title):
    title = title.strip()
    title_list = title.split('(')
    
    year = None

    if len(title_list) >= 2:
        try:
            year = int(title_list[-1].strip(')').strip())
        except ValueError:
            return year
        else:
            year = None if year > datetime.date.today().year or year < 1000 else year
    
    return year

movies.withColumn('releaseYear', udf_year_extract(col('title'))).show(20)

Hive UDF

上一篇:PySpark大数据分析(6):数据读写
下一篇:PySpark大数据分析(8):PySpark机器学习库

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值