博客
关于我
pyspark笔记
阅读量:278 次
发布时间:2019-03-03

本文共 4352 字,大约阅读时间需要 14 分钟。

PySpark是Apache Spark在Python中的接口。它不仅允许您使用Python api编写Spark应用程序,而且还提供了用于在分布式环境中交互分析数据的PySpark shell。PySpark支持Spark的大部分特性,如Spark SQL、DataFrame、Streaming、MLlib(机器学习)和Spark Core。

在这里插入图片描述

  1. Spark SQL and DataFrame
    Spark SQL是用于结构化数据处理的Spark模块。它提供了一种称为DataFrame的编程抽象,还可以充当分布式SQL查询引擎。
  2. Streaming
    运行在Spark之上,Apache Spark中的流特性支持跨流数据和历史数据的强大交互和分析应用程序,同时继承了Spark的易用性和容错特性。
  3. MLlib
    MLlib是一个可扩展的机器学习库,构建在Spark之上,它提供了一组统一的高级api,帮助用户创建和调优实用的机器学习管道。
  4. Spark Core
    Spark Core是Spark平台的底层通用执行引擎,所有其他功能都构建在其之上。它提供RDD(弹性分布式数据集)和内存计算能力。

快速开始

对pyspark中的DataFrame API 快速简介:

PySpark DataFrames are lazily evaluated. They are implemented on top of RDDs. When Spark transforms data, it does not immediately compute the transformation but plans how to compute later. When actions such as collect() are explicitly called, the computation starts.

create a PySpark DataFrame from a list of rows

import findsparkfindspark.init()from pyspark.sql import SparkSessionfrom datetime import datetime, dateimport pandas as pdfrom pyspark.sql import Rowspark = SparkSession.builder.getOrCreate()df = spark.createDataFrame(    [        Row(a=1, b=2., c='string1', d=date(2000, 1, 1), e=datetime(2000, 1, 1, 12, 0)),        Row(a=2, b=3., c='string2', d=date(2000, 2, 1), e=datetime(2000, 1, 2, 12, 0)),        Row(a=4, b=5., c='string3', d=date(2000, 3, 1), e=datetime(2000, 1, 3, 12, 0))    ])df.show()df.printSchema()

记得加上

import findspark findspark.init()

Create a PySpark DataFrame with an explicit schema.

df = spark.createDataFrame([    (1, 2., 'string1', date(2000, 1, 1), datetime(2000, 1, 1, 12, 0)),    (2, 3., 'string2', date(2000, 2, 1), datetime(2000, 1, 2, 12, 0)),    (3, 4., 'string3', date(2000, 3, 1), datetime(2000, 1, 3, 12, 0))], schema='a long, b double, c string, d date, e timestamp')df

Create a PySpark DataFrame from a pandas DataFrame

pandas_df = pd.DataFrame({       'a': [1, 2, 3],    'b': [2., 3., 4.],    'c': ['string1', 'string2', 'string3'],    'd': [date(2000, 1, 1), date(2000, 2, 1), date(2000, 3, 1)],    'e': [datetime(2000, 1, 1, 12, 0), datetime(2000, 1, 2, 12, 0), datetime(2000, 1, 3, 12, 0)]})df = spark.createDataFrame(pandas_df)df

Create a PySpark DataFrame from an RDD consisting of a list of tuples.

rdd = spark.sparkContext.parallelize([    (1, 2., 'string1', date(2000, 1, 1), datetime(2000, 1, 1, 12, 0)),    (2, 3., 'string2', date(2000, 2, 1), datetime(2000, 1, 2, 12, 0)),    (3, 4., 'string3', date(2000, 3, 1), datetime(2000, 1, 3, 12, 0))])df = spark.createDataFrame(rdd, schema=['a', 'b', 'c', 'd', 'e'])df

结果都一样,如下

在这里插入图片描述

查看数据

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在Python中,DataFrame.collect()将分布式数据作为本地数据收集到驱动端。请注意,当数据集太大,无法装入驱动端时,这会抛出内存不足错误,因为它从执行器收集所有数据到驱动端。

df.collect()'''[Row(a=1, b=2.0, c='string1', d=datetime.date(2000, 1, 1), e=datetime.datetime(2000, 1, 1, 12, 0)), Row(a=2, b=3.0, c='string2', d=datetime.date(2000, 2, 1), e=datetime.datetime(2000, 1, 2, 12, 0)), Row(a=3, b=4.0, c='string3', d=datetime.date(2000, 3, 1), e=datetime.datetime(2000, 1, 3, 12, 0))]'''

PySpark DataFrame还提供了转换回一个pandas DataFrame来利用pandas api。请注意,toPandas还将所有数据收集到驱动端,当数据太大而无法容纳到驱动端时,这些数据很容易导致内存不足错误。

在这里插入图片描述

选择和访问数据

PySpark DataFrame是延迟计算的,简单地选择一个列不会触发计算,但它会返回一个column实例。

在这里插入图片描述
这些列可用于从DataFrame中选择列。例如,DataFrame.select()接受返回另一个DataFrame的Column实例。
在这里插入图片描述
访问新的列
在这里插入图片描述
DataFrame.filter()选择子集
在这里插入图片描述

使用函数

在这里插入图片描述

分组数据

df = spark.createDataFrame([    ['red', 'banana', 1, 10], ['blue', 'banana', 2, 20], ['red', 'carrot', 3, 30],    ['blue', 'grape', 4, 40], ['red', 'carrot', 5, 50], ['black', 'carrot', 6, 60],    ['red', 'banana', 7, 70], ['red', 'grape', 8, 80]], schema=['color', 'fruit', 'v1', 'v2'])df.show()

在这里插入图片描述

在这里插入图片描述
也可以应用函数

def plus_mean(pandas_df):    return pandas_df.assign(v1=pandas_df.v1 - pandas_df.v1.mean())df.groupby('color').applyInPandas(plus_mean, schema=df.schema).show()

在这里插入图片描述

分组连接

df1 = spark.createDataFrame(    [(20000101, 1, 1.0), (20000101, 2, 2.0), (20000102, 1, 3.0), (20000102, 2, 4.0)],    ('time', 'id', 'v1'))df2 = spark.createDataFrame(    [(20000101, 1, 'x'), (20000101, 2, 'y')],    ('time', 'id', 'v2'))def asof_join(l, r):    return pd.merge_asof(l, r, on='time', by='id')df1.groupby('id').cogroup(df2.groupby('id')).applyInPandas(    asof_join, schema='time int, id int, v1 double, v2 string').show()

在这里插入图片描述

获取、保存数据

在这里插入图片描述

使用SQL

DataFrame和Spark SQL共享相同的执行引擎,因此它们可以无缝地互换使用。例如,你可以注册DataFrame作为一个表,然后像下面这样轻松地运行SQL:

df.createOrReplaceTempView("tableA")spark.sql("SELECT count(*) from tableA").show()

±-------+

|count(1)|
±-------+
| 8|
±-------+

在这里插入图片描述

转载地址:http://wnsl.baihongyu.com/

你可能感兴趣的文章
DHCP和DHCP中继
查看>>
黄毅然的JAVA学习(七)
查看>>
Spring5框架工具类
查看>>
OPC应用实例和故障排除培训
查看>>
什么是网络基础设施?
查看>>
如何加载dll文件计算UDS服务的秘钥
查看>>
IP代理给模拟器多开和虚拟机多开提供了哪些帮助?
查看>>
细数哪些网络用户需要换IP?
查看>>
“山东大学移动互联网开发技术教学网站建设”项目实训日志一
查看>>
codeforces1307D 1900分最短路
查看>>
codeforces803F 2100分容斥原理 + 莫比乌斯函数
查看>>
2020牛客暑期多校训练营(第七场) 待补题
查看>>
2020牛客暑期多校训练营(第九场)
查看>>
The 2016 ACM-ICPC Asia Dalian Regional Contest 部分题解
查看>>
8皇后问题 递归 函数调用是重点
查看>>
1541 +1 *2 ²
查看>>
老鼠走迷宫
查看>>
跳马 (和小老鼠走迷宫差不多)
查看>>
ural 1627 生成树计数模板题 基尔霍夫矩阵树定理 + 行列式计算模板
查看>>
cf 977e 思维 + dfs
查看>>