【PySpark】Spark 2.0系列SparkSession與Spark 2.0之前版本中的SQLContext和HiveContext的聯繫與區別

目錄

1.Spark在2.0版本和之前版本的入口

2.SQLContext的使用

3.HiveContext 的使用

4.SparkSession的三種創建方式

4.1SparkSession直接builder方式

4.2SparkConf的builder方式

4.3SparkContext方式

 

1.Spark在2.0版本和之前版本的入口

        在Spark2.0之前,sparkContext是進入Spark的切入點。衆所周知的RDD的創建和操作就需要使用sparkContext提供的API。對於RDD之外的其他東西,我們需要使用其他的Context。

  • 流處理,使用StreamingContext
  • SQL:使用sqlContext
  • hive:使用HiveContext

spark 有三大引擎,spark core、sparkSQL、sparkStreaming:

  • spark core 的關鍵抽象是 SparkContext、RDD;
  • SparkSQL 的關鍵抽象是 SparkSession、DataFrame;
  • sparkStreaming 的關鍵抽象是 StreamingContext、DStream。

 

Spark 2.0引入了一個新的切入點,SparkSession實質上是SQLContext和HiveContext的組合(未來可能還會加上StreamingContext),所以在SQLContext和HiveContext上可用的API在SparkSession上同樣是可以使用的。SparkSession內部封裝了sparkContext,所以計算實際上是由sparkContext完成的。

2.SQLContext的使用

sparkSQL 的應用必須創建一個 SQLContext 或者 HiveContext 的類。這裏我使用的是local方式來運行:

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

conf = SparkConf().setAppName('test').setMaster('local')
sc = SparkContext(conf=conf)

sqlc = SQLContext(sc)
print(dir(sqlc))

# sqlcontext 讀取數據也自動生成 df
data = sqlc.read.text('.../dict.txt')
print(type(data))

結果:

>print(dir(sqlc))
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_conf', '_inferSchema', '_instantiatedContext', '_jsc', '_jsqlContext', '_jvm', '_sc', '_ssql_ctx', 'cacheTable', 'clearCache', 'createDataFrame', 'dropTempTable', 'getConf', 'getOrCreate', 'newSession', 'range', 'read', 'readStream', 'registerDataFrameAsTable', 'registerFunction', 'registerJavaFunction', 'setConf', 'sparkSession', 'sql', 'streams', 'table', 'tableNames', 'tables', 'udf', 'uncacheTable']

>print(type(data))
<class 'pyspark.sql.dataframe.DataFrame'>

>data.show(5)
                                                                                +--------+
|   value|
+--------+
|    疫情|
|    不含|
|  不安排|
|  有暖氣|
|公用wifi|
+--------+
only showing top 5 rows

3.HiveContext 的使用

HiveContext 是sparkSQL 的另一個入口點,繼承了SQLContext,用於處理 hive 中的數據。HiveContext 對 SQLContext 進行了擴展,功能要強大的多

  • 它可以執行 HiveSQL 和 SQL 查詢
  • 它可以操作 hive 數據,並且可以訪問 HiveUDF
  • 它不一定需要 hive,在沒有 hive 環境時也可以使用 HiveContext

這裏舉例是以集羣方式調用:

  • 首先是配置文件(hello.sh文件):

 

#!/bin/bash

export PYSPARK_PYTHON=/usr/bin/python3.6 #python 的服務器路徑


spark-submit \
    --master yarn-client --queue upd_security \
    --executor-memory 4G --num-executors 10 --executor-cores 3 \
    --driver-memory 16G \
    --conf "spark.pyspark.driver.python=/usr/bin/python3.6" \
    --conf "spark.pyspark.python=/usr/bin/python3.6" \
    --conf spark.rpc.message.maxSize=100 --conf spark.shuffle.manager=SORT \
    --conf spark.yarn.executor.memoryOverhead=2048 \
  • HiveContext.py文件:
from pyspark import SparkContext, SparkConf
from pyspark.sql import HiveContext

conf = SparkConf().setAppName('test').setMaster('yarn')
sc = SparkContext(conf=conf)

hivec = HiveContext(sc)
print(dir(hivec))

data = hivec.sql('''select internal_minute,starttime1,endtime1,cast(label as float) as label 
         from table
        where d in (select DATE_SUB(current_date(),1) as d)
          and internal_minute > 0
          limit 5''')
print(type(data))
print(data.show(5))
  • 然後在服務器上,使用下面命令調用:
bash hello.sh SparkSession.py

結果:

4.SparkSession的三種創建方式

4.1SparkSession直接builder方式

同樣在集羣上部署調度,使用yarn方式:

配置文件和調用命令和3一樣,只需要改HiveContext.py爲SparkSession.py即可。

SparkSession.py文件:這種方式是用的比較多的。

from pyspark.sql import SparkSession
# method 1
# sparkSQL 連接 hive 時需要enableHiveSupport()
# builder 方式必須getOrCreate
spark = SparkSession \
    .builder \
    .appName("m1") \
    .master("yarn") \
    .enableHiveSupport() \
    .getOrCreate()

trainData = spark.sql(
    '''select internal_minute,starttime1,endtime1,cast(label as float) as label 
         from table
        where d in (select DATE_SUB(current_date(),1) as d)
          and internal_minute > 0
          limit 5''')

print(trainData.show(5))

結果:

4.2SparkConf的builder方式

SparkSession.py文件:

# method 2
from pyspark.sql import SparkSession
from pyspark import SparkConf
conf = SparkConf().setAppName('m2').setMaster('yarn')  # 設定 appname 和 master
spark = SparkSession.builder.config(conf=conf).enableHiveSupport().getOrCreate()  # builder 方式必須有這句

trainData = spark.sql(
    '''select internal_minute,starttime1,endtime1,cast(label as float) as label 
         from table
        where d in (select DATE_SUB(current_date(),1) as d)
          and internal_minute > 0
          limit 5''')


print(trainData.show(5))

結果:

4.3SparkContext方式

這種是從本地讀取文件的方式,這裏在本地運行:

from pyspark.sql import SparkSession

# method 3
from pyspark import SparkContext, SparkConf

conf = SparkConf().setAppName('m3').setMaster('local')  # 設定 appname 和 master
sc = SparkContext(conf=conf)
spark = SparkSession(sc)

data = spark.read.text('.../dict.txt')
print(data.show(5))

結果:

>print(data.show(5))
+--------+
|   value|
+--------+
|    疫情|
|    不含|
|  不安排|
|  有暖氣|
|公用wifi|
+--------+
only showing top 5 rows
None

  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章