spark SQL and DataFrame(一)

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