上次在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