pyspark提供了python交互式执行环境;
pyspark可以实时、交互的方式来分析数据;
pyspark提供了简单的方式来学习Spark API.
python 交互式环境 开发spark应用程序
使用spark提供的pyspark库来编写spark应用程序
DataFrame与RDD的区别:
1、DataFrame的推出,让Spark具备了处理大规模数据的能力,不仅比原有的RDD转换更加简单易用,而且获得了更高的计算性能
2、Spark能够轻松实现从MySQL到DataFrame的转化,而且支持SQL查询
3、RDD是分布式的Java对象的集合,但是对象内部的结构对于RDD而言却是不可知的
4、DataFrame是一种以RDD为基础的分布式数据集,提供了详细的机构信息。
RDD分布式的java集合,在最外层只能看到java对象,不能看到内部的细节信息
基于RDD的分布式结构数据,提供明确的结构化信息。
RDD:对象——对象属性
DataFrame:货架,内部信息一目了然
从Spark2.0以上版本开始,Spark使用全新的SparkSession接口替代Spark1.6中的SQLContext及HiveContext接口。利用SparkSession接口来实现对数据的加载、转换、处理等功能。SparkSession实现了对数据的加载、转换、处理等功能。SparkSession实现了SQLContext及HiveContext所有功能。
SparkSession支持从不同的数据源加载数据,并把数据转换程DataFrame,而且支持把DataFrame转换程SQLContext自身中表,然后使用SQL语句来操作数据。SparkSession亦提供了HiveQL以及其他依赖于Hive的功能的支持。
SparkSession指挥官:
在启动进入pyspark以后mpyspark就默认提供了一个SparkContext对象(名称为sc)和一个SparkSession对象(名称为spark)
# 两个对象自动生成,直接使用
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
# 生成 sparksession对象
spark = SparkSession.builder.config(conf = SparkConf()).getOrCreate()
spark.read.text(‘people.txt’)
spark.read.json(‘people.json’)
spark.read.parquet(‘people.parquet’)
或者:
读取文本文件创建DataFrame
spark.read.format(‘text’).load(‘people.txt’)
park.read.format(‘json’).load(‘people.json’)
park.read.format(‘parquet’).load(‘people.parquet’)
df = spark.read.json(‘file:///usr/re/people.json’)
df.show
使用spark.write操作保存DataFrame
df ————> df.write.txt(‘people.txt’)
df ————> df.write.json(‘people.json’)
df ————> df.write.parquet(‘people.parquet’)
或者
df ————> df.write.format(‘text’).save(‘people.txt’)
df ————> df.write.format(‘json’).save(‘people.json’)
df ————> df.write.format(‘parquet’).save(‘people.parquet’)
df = spark.read.json('people.json')
# 打印模式信息,列名称,数据类型,是否为空
df.printSchema()
# 选取列值
df.select(df['name'], df['age']+1)
df.select(df['name'], df['age']+1).show()
# 过滤操作
df.filter(df['age'] > 20).show()
# groupBy()
df.groupby('age').count().show()
# dataframe排序
df.sort(df['age'].desc , df['name'].asc).show()
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Oct 4 17:00:10 2018
@author: chichao
"""
import pandas as pd
from pyspark.sql import SparkSession
from pyspark.sql import SQLContext
from pyspark import SparkContext
# 1. pandas DataFrame
# 1)赋值
df = pd.DataFrame([[1, 2, 3], [4, 5, 6]], index=['row1', 'row2'], columns=['c1', 'c2', 'c3'])
# 2)显示数据
print(df)
# 2. spark DataFrame
# 1)赋值
sc = SparkContext()
spark = SparkSession \
.builder \
.appName("testDataFrame") \
.getOrCreate()
sentenceData = spark.createDataFrame([
(0.0, "I like Spark"),
(1.0, "Pandas is useful"),
(2.0, "They are coded by Python ")
], ["label", "sentence"])
# 2)显示数据
sentenceData.show()
sentenceData.select("label").show()
# 3. spark.DataFrame 转换成 pandas.DataFrame
sqlContest = SQLContext(sc)
spark_df = sqlContest.createDataFrame(df)
spark_df.select("c1").show()
# 4. pandas.DataFrame 转换成 spark.DataFrame
pandas_df = sentenceData.toPandas()
print(pandas_df)
由于pandas的方式是单机版的,即toPandas()的方式是单机版的,所以也可以改成分布式版本:
import pandas as pd
def _map_to_pandas(rdds):
return [pd.DataFrame(list(rdds))]
def topas(df, n_partitions=None):
if n_partitions is not None: df = df.repartition(n_partitions)
df_pand = df.rdd.mapPartitions(_map_to_pandas).collect()
df_pand = pd.concat(df_pand)
df_pand.columns = df.columns
return df_pand
pandas_df = topas(spark_df)