1. SparkSession
需要使用spark SQL之前需要SparkSession類,可以通過 SparkSession.builder來創建一個SparkSession。如果SparkContext已經存在,SparkSession就會重用它;如果不存在,Spark就會創建一個新的SparkContext。在每一個JVM中只能有一個SparkContext,但是在一個Spark程序中可以有多個SparkSession
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.master("local") \
.appName("dataframe sql example") \
.config("spark.some.config.option", "some-value") \
.getOrCreate()
其中appName中的參數爲工程的名字,config(key=None, value=None, conf=None),設置一個config選項,使用這種方式設置config選項可以自動的同步到sparkconf中和sparkSession自己的配置中。master中的參數默認是“local”,也可以設置成“local[4]”是在本地4核運行,或者是“spark://master:7077”在一個spark上的單獨的集羣上運行。
如果已經存在了sparkconf, 可以使用以下方式建立SparkSession
from pyspark.conf import SparkConf
SparkSession.builder.config(conf=SparkConf())
下面的方式用於獲取一個已經存在的sparkSession或者如果已經存在了一個sparkSession在這個sparkSession的設置的基礎上建立一個新的sparkSession.
s1 = SparkSession.builder.config("k1", "v1").getOrCreate()
s1.conf.get("k1") == s1.sparkContext.getConf().get("k1") == "v1"
以上代碼會返回True
這種方式首先查看是否有一個有效的全局的SparkSession,如果有則返回這個SparkSession。如果沒有一個有效的SparkSession存在,這個方法會新創建一個SparkSession作爲一個全局的默認的SparkSession
爲了保證已經存在的SparkSession被返回,這個config選項將會應用於已經存在的SparkSession上
s2 = SparkSession.builder.config("k2", "v2").getOrCreate()
s1.conf.get("k1") == s2.conf.get("k1")
s1.conf.get("k2") == s2.conf.get("k2")
上述代碼會返回True
創建dataframe
可以通過以下方式創建一個dataframe
l = [('Alice', 1)]
spark.createDataFrame(l).collect()
spark.createDataFrame(l, ['name', 'age']).collect()
d = [{'name':'Alice', 'age':1}]
spark.createDataFrame(d).collect()
讀取數據
# 讀取文件
dpath = '/Users/huoshirui/Desktop/xyworking/pythonData/dataClean/'
df = spark.read.csv(dpath + 'tengxun_data.csv', header=True)
df返回的結果是一個dataframe
展示dataframe
df.show()
查看dataframe中字段類型
df.printSchema()
select 操作
df.select(df['target']).show(5)
df.select(df['tx_score'], df['target'] + 1).show()
filter操作
df.filter(df['target'] > 0).show(5)
groupby操作
df.groupBy(df['target']).count()
創建臨時視圖
parkSession 的 sql 函數可以讓應用程序以編程的方式運行 SQL 查詢, 並將結果作爲一個 DataFrame 返回
df.createOrReplaceTempView("df")
sqlDF = spark.sql("SELECT target FROM df")
sqlDF.show(5)
創建全局視圖
Spark SQL中的臨時視圖是session級別的, 也就是會隨着session的消失而消失. 如果你想讓一個臨時視圖在所有session中相互傳遞並且可用,
直到Spark 應用退出, 你可以建立一個全局的臨時視圖.全局的臨時視圖存在於系統數據庫 global_temp中, 我們必須加上庫名去引用它,
比如: SELECT * FROM global_temp.view.
df.createGlobalTempView("df")
sqlGLDF = spark.sql("select target from global_temp.df")
sqlGLDF.show(5)
寫出文件
df.toPandas().to_csv(path_or_buf = '/Users/huoshirui/Desktop/spark_save_test.csv', index=False)