sparksql---通過pyspark實現


上次在spark的一個群里面,眾大神議論:dataset會取代rdd么?

大神1:聽說之后的mlib都會用dataset來實現,嗚嗚,rdd要狗帶

大神2:dataset主要是用來實現sql的,跟mlib沒多大關系,你們說為什么要用dataset呢?

大神3:因為老板喜歡。-------在市場上找一個會寫sql和會做spark開發是兩個工資等級,兩個字“省錢”。

結論:上面的說的東西確實是如此,很多時候我們看到的結果其實某種程度都是市場選擇的結果。

-------------------------------------------------------------------------------華麗的分割線-------------------------------------------

以我自己了解sparksql的學習方法,我更傾向於首先實現它,然后再了解具體的原理,however,對於sparksql的數據類型還是要首先理解下,不然之后做的事情可能都做不了。

sparksql里面的類:

這些都在:http://spark.apache.org/docs/1.3.1/api/python/pyspark.sql.html#pyspark.sql 

重點說下SQLContext這個就是一個裝dataframe的容器,datafram就相當於一張表,Row格式是經常用到;

其他的大家可以去網上了解下:dataframe/rdd的區別於聯系,目前mlib大多是用rdd寫出來的;

以下給出一個用pyspark寫出來的列子:

###first table
from pyspark.sql import SQLContext,Row
ccdata=sc.textFile("/home/srtest/spark/spark-1.3.1/examples/src/main/resources/cc.txt")
ccpart = ccdata.map(lambda le:le.split(","))  ##我的表是以逗號做出分隔
cc1=ccpart.map(lambda p:Row(sid=p[0],age=int(p[1]),yz=p[2],yf=p[3],yc=p[4],hf=p[5],hk=p[6])) ####這就是將數據變成ROW的格式,另外確定數據類型
schemacc1=sqlContext.createDataFrame(cc1)#######源碼中createDataframe(ROW,schema),所以如果上步沒有轉化成ROW是無法完成轉化成dataframe
schemacc1.registerTempTable("cc1")#############注冊臨時表
xx=sqlContext.sql(" SELECT * FROM cc1 WHERE age=20 ") ########直接用寫sql就能實現表的運算

point1:說了上面的例子,大家會有可能用到IN,exist這樣的關系時,目前2.0版本一下的spark是不支持in,exist.到了2.0后你想怎么折騰都可以;

那么有人肯定會問,如果要用到in,exist,怎么辦,我只能說多建張表,用join實現;

point2:下篇博客,我打算直接不用注冊成表,直接用dataframe來實現sql

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM