目錄
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