pyspark DataFrame 數據預處理


pyspark = spark + python

一、在pyspark中運行代碼

pyspark提供了python交互式執行環境;
pyspark可以實時、交互的方式來分析數據;
pyspark提供了簡單的方式來學習Spark API.
python 交互式環境 開發spark應用程序
使用spark提供的pyspark庫來編寫spark應用程序

二、pyspark 與 DataFrame

DataFrame與RDD的區別:
1、DataFrame的推出,讓Spark具備了處理大規模數據的能力,不僅比原有的RDD轉換更加簡單易用,而且獲得了更高的計算性能
2、Spark能夠輕鬆實現從MySQL到DataFrame的轉化,而且支持SQL查詢
3、RDD是分佈式的Java對象的集合,但是對象內部的結構對於RDD而言卻是不可知的
4、DataFrame是一種以RDD爲基礎的分佈式數據集,提供了詳細的機構信息。

RDD分佈式的java集合,在最外層只能看到java對象,不能看到內部的細節信息
基於RDD的分佈式結構數據,提供明確的結構化信息。

RDD:對象——對象屬性
DataFrame:貨架,內部信息一目瞭然

三、pyspark DataFrame的創建及保存

從Spark2.0以上版本開始,Spark使用全新的SparkSession接口替代Spark1.6中的SQLContext及HiveContext接口。利用SparkSession接口來實現對數據的加載、轉換、處理等功能。SparkSession實現了對數據的加載、轉換、處理等功能。SparkSession實現了SQLContext及HiveContext所有功能。
SparkSession支持從不同的數據源加載數據,並把數據轉換程DataFrame,而且支持把DataFrame轉換程SQLContext自身中表,然後使用SQL語句來操作數據。SparkSession亦提供了HiveQL以及其他依賴於Hive的功能的支持。

SparkSession指揮官:

3.1、創建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()

3.2、創建DataFrame

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

3.3、DataFrame的保存

使用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’)

四、pyspark DataFrame的常見操作

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

五、pandas.DataFrame、spark.DataFrame互相轉換

#!/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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章