pyspark DataFrame筆記

  • 相較于rdd勤讽,在數(shù)據(jù)挖掘中更常用的數(shù)據(jù)格式是DataFrame蟋座,由于Catalyst優(yōu)化器的原因,DataFrame在python上并不比scala上慢多少
# 引入必要包
from pyspark.sql import SparkSession
from pyspark.sql import types
spark = SparkSession.builder.master("local").appName("learnsparkdf").enableHiveSupport().getOrCreate()
sc = spark.sparkContext

創(chuàng)建DataFrame

# 使用sc創(chuàng)建df
#方法一:通過(guò)json創(chuàng)建
stringJSONRDD = sc.parallelize([""" 
  { "id": "123",
    "name": "Katie",
    "age": 19,
    "eyeColor": "brown"
  }""",
   """{
    "id": "234",
    "name": "Michael",
    "age": 22,
    "eyeColor": "green"
  }""", 
  """{
    "id": "345",
    "name": "Simone",
    "age": 23,
    "eyeColor": "blue"
  }"""]
)
df = spark.read.json(stringJSONRDD)
df.show()
[out]: 
+---+--------+---+-------+
|age|eyeColor| id|   name|
+---+--------+---+-------+
| 19|   brown|123|  Katie|
| 22|   green|234|Michael|
| 23|    blue|345| Simone|
+---+--------+---+-------+
# 方法二脚牍,通過(guò)sc創(chuàng)建向臀,通常要指定列名不然會(huì)變成[-1,-2]
list_rdd = sc.parallelize([('TOM', 23), ('JIM', 18), ('BOSE', 50), ('JAME',23), ('JAM')],4)
df2 = spark.createDataFrame(list_rdd)
df2.show()
print(df2.schema) # ***默認(rèn)int數(shù)據(jù)類型為L(zhǎng)ongType
[out]:
+----+---+
|  _1| _2|
+----+---+
| TOM| 23|
| JIM| 18|
|BOSE| 50|
|JAME| 23|
+----+---+
StructType(List(StructField(_1,StringType,true),StructField(_2,LongType,true)))

# 需要注意的是整數(shù)位LongType,與FloatType和DoubleType不能隱式轉(zhuǎn)換
schema = types.StructType([
  types.StructField('Name', types.StringType(), True), # 列名诸狭,數(shù)據(jù)類型券膀,能否為空
  types.StructField('Age', types.ShortType(), True),
])
df2 = spark.createDataFrame(list_rdd, schema)
df2.show()
print(df2.schema)
[out]:
+----+---+
|Name|Age|
+----+---+
| TOM| 23|
| JIM| 18|
|BOSE| 50|
|JAME| 23|
+----+---+
StructType(List(StructField(Name,StringType,true),StructField(Age,ShortType,true)))

數(shù)據(jù)類型總共有一下類型
"DataType", "NullType", "StringType", "BinaryType", "BooleanType", "DateType",
"TimestampType", "DecimalType", "DoubleType", "FloatType", "ByteType", "IntegerType",
"LongType", "ShortType", "ArrayType", "MapType", "StructField", "StructType"

創(chuàng)建臨時(shí)表

dataframe的操作通常會(huì)使用sql語(yǔ)句完成,下面有四個(gè)創(chuàng)建表的方法
#df.createGlobalTempView("tempViewName")           創(chuàng)建一個(gè)全局臨時(shí)表驯遇,生命周期為程序的生命周期  **使用的時(shí)候 global_temp.tempViewName
#df.createOrReplaceGlobalTempView("tempViewName")  創(chuàng)建或者替換一個(gè)全局臨時(shí)表芹彬,生命周期為程序的生命周期
#df.createOrReplaceTempView("tempViewName")        創(chuàng)建一個(gè)臨時(shí)表,生命周期為當(dāng)前SparkSession的生命周期
#df.createTempView("tempViewName")                 創(chuàng)建或者替換一個(gè)臨時(shí)表叉庐,生命周期為當(dāng)前SparkSession的生命周期

# 刪除臨時(shí)表
# spark.catalog.dropTempView("tempViewName")
# spark.catalog.dropGlobalTempView("tempViewName")

創(chuàng)建表之后舒帮,剩余的操作就和sql基本一樣,一般來(lái)說(shuō)sql操作都會(huì)返回一個(gè)新的dataframe

查看臨時(shí)表

# 創(chuàng)建臨時(shí)表,查看信息,
df2.createOrReplaceTempView('df')
spark.sql("select * from df").show()   #***注意返回的也是一個(gè)dataframe
[out]:
+----+---+
|Name|Age|
+----+---+
| TOM| 23|
| JIM| 18|
|BOSE| 50|
|JAME| 23|
+----+---+
[Row(Name='TOM', Age=23),
 Row(Name='JIM', Age=18),
 Row(Name='BOSE', Age=50),
 Row(Name='JAME', Age=23)]

# 取出數(shù)據(jù)后
ret= spark.sql("select * from df").collect() # 也可以直接取出來(lái)
ret[0]['name'] 類似于字典和列表綜合陡叠,這兩種方法都可以獲取元素
ret[0][0]          類似于字典和列表綜合会前,這兩種方法都可以獲取元素

數(shù)據(jù)結(jié)構(gòu)

printSchema()函數(shù)
輸出dataframe schema結(jié)構(gòu)
若不指定dataframe結(jié)構(gòu),系統(tǒng)會(huì)自動(dòng)推斷數(shù)據(jù)類型
df.printSchema()
[out]:
root
 |-- age: long (nullable = true)
 |-- eyeColor: string (nullable = true)
 |-- id: string (nullable = true)
 |-- name: string (nullable = true)

API操作

dataframe API查詢
dataframe可以通過(guò)take(),show()展示結(jié)果
可以使用select filter選擇過(guò)濾數(shù)據(jù),還有很多函數(shù)
df2.select("*").filter("age>18").show()
[out]:
+----+---+
|Name|Age|
+----+---+
| TOM| 23|
|BOSE| 50|
|JAME| 23|
+----+---+

保存文件

# 保存文件
# 一般來(lái)說(shuō)可以存儲(chǔ)為csv,json匾竿,不過(guò)更常見的是使用parquet存儲(chǔ)
# Parquet僅僅是一種存儲(chǔ)格式瓦宜,它是語(yǔ)言、平臺(tái)無(wú)關(guān)的岭妖,并且不需要和任何一種數(shù)據(jù)處理框架綁定临庇,目前能夠和Parquet適配的組件包括下面這些,可以看出基本上通常使用的查詢引擎和計(jì)算框架都已適配昵慌,并且可以很方便的將其它序列化工具生成的數(shù)據(jù)轉(zhuǎn)換成Parquet格式
df.rdd.getNumPartitions() # 獲取分區(qū)數(shù)目
df.write.parquet('/FileStore/tables/testpar', mode = 'overwrite') # 以parquet格式保存數(shù)據(jù)
df.toPandas().to_csv('/FileStore/tables/testpar2.csv')# 以csv格式保存數(shù)據(jù)

from sklearn.externals import joblib
joblib.dump(df.toJSON().collect(), '/FileStore/tables/testpar3.json') # 以json格式保存


# 保存后的/FileStore/tables/testpar是一個(gè)文件加假夺,有多少個(gè)分區(qū)數(shù)目就有多少個(gè)文件***********
df2 = spark.read.parquet('/FileStore/tables/testpar')# 讀取parquet格式文件

jupyter 代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市斋攀,隨后出現(xiàn)的幾起案子已卷,更是在濱河造成了極大的恐慌,老刑警劉巖淳蔼,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侧蘸,死亡現(xiàn)場(chǎng)離奇詭異裁眯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)讳癌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門穿稳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人晌坤,你說(shuō)我怎么就攤上這事逢艘。” “怎么了骤菠?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵它改,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我商乎,道長(zhǎng)央拖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任截亦,我火速辦了婚禮爬泥,結(jié)果婚禮上柬讨,老公的妹妹穿的比我還像新娘崩瓤。我一直安慰自己,他們只是感情好踩官,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布却桶。 她就那樣靜靜地躺著,像睡著了一般蔗牡。 火紅的嫁衣襯著肌膚如雪颖系。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天辩越,我揣著相機(jī)與錄音嘁扼,去河邊找鬼。 笑死黔攒,一個(gè)胖子當(dāng)著我的面吹牛趁啸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播督惰,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼不傅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了赏胚?” 一聲冷哼從身側(cè)響起访娶,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎觉阅,沒(méi)想到半個(gè)月后崖疤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秘车,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年戳晌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鲫尊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沦偎,死狀恐怖疫向,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情豪嚎,我是刑警寧澤搔驼,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站侈询,受9級(jí)特大地震影響舌涨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扔字,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一囊嘉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧革为,春花似錦扭粱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至抛虏,卻和暖如春博其,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迂猴。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工慕淡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沸毁。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓峰髓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親以清。 傳聞我的和親對(duì)象是個(gè)殘疾皇子儿普,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359