我對DataFrame的理解(Spark)

2021-07-03 08:41:35 字數 1933 閱讀 5802

以下鏈結為spark –sql中的dataframe api

dataframe 官方說明:

在spark中,dataframe是乙個以命名列方式組織的分布式資料集,等同於關係型資料庫中的乙個表,也相當於r/python中的data frames(但是進行了更多的優化)。dataframes可以由結構化資料檔案轉換而來,也可以從hive中的表得來,以及可以轉換自外部資料庫或現有的rdd。

類似於rdd,dataframe同樣使用了lazy的方式。也就是說,只有動作真正發生時(如顯示結果,儲存輸出),計算才會進行。從而,通過一些技術,比如predicate push-downs和bytecode generation,執行過程可以進行適當的優化。同時,所有的dataframes也會自動的在集群上並行和分布執行。

官方給出了詳細的api可以給我們呼叫,下面用scala為例,簡單地說明:

1.在spark sql中所有函式的入口點都是乙個sqlcontext類,或者是它的子類,要建立乙個sqlcontext,那麼首先應該建立乙個sparkcontext的物件

val sc: sparkcontext //已經存在的 sparkcontext.(沒有的話,要自己重建)

val sqlcontext = new org.apache.spark.sql.sqlcontext(sc)

// 這個包可以將rdd轉換成dataframe

import sqlcontext.implicits._

除了乙個基本的 sqlcontext,你也能夠建立乙個 hivecontext,它支援基本 sqlcontext 所支援功能的乙個超集。它的額外的功能包括用更完整的 hiveql 分析器寫查詢去訪問 hiveudfs 的能力、 從 hive 表讀取資料的能力。用 hivecontext 你不需要乙個已經存在的 hive 開啟,sqlcontext 可用的資料來源對 hivecontext 也可用。hivecontext 分開打包是為了避免在 spark 構建時包含了所有 的 hive 依賴。如果對你的應用程式來說,這些依賴不存在問題,spark 1.3 推薦使用 hivecontext。以後的穩定版本將專注於為 sqlcontext 提供與 hivecontext 等價的功能。

用來解析查詢語句的特定 sql 變種語言可以通過 spark.sql.dialect 選項來選擇。這個引數可以通過兩種方式改變,一種方式是通過 setconf 方法設定,另一種方式是在 sql 命令中通過 set key=value 來設定。對於 sqlcontext,唯一可用的方言是 「sql」,它是 spark sql 提供的乙個簡單的 sql 解析器。在 hivecontext 中,雖然也支援"sql",但預設的方言是 「hiveql」,這是因為 hiveql 解析器更完整。

一.從檔案建立dataframe

1.dataframe的一些操作

2.以程式設計模式執行sql查詢

應用可以通過sqlcontext的sql操作進行查詢操作,該方法返回的結果是乙個dataframe,舉例如下:

二。把rdds轉換成dataframe

spark sql 支援兩種方法將存在的 rdd 轉換為 dataframe 。第一種方法使用反射來推斷包含特定物件型別的 rdd 的模式。在你寫 spark 程式的同時,當你已經知道了模式,這種基於反射的方法可以使**更簡潔並且程式工作得更好。

第二種方法是通過乙個程式設計介面來實現,這個介面允許你構造乙個模式,然後在存在的 rdd 上使用它。雖然這種方法更冗長,但是它允許你在執行期之前不知道列以及列的型別的情況下構造 dataframe。

用反射來推斷模式:

spark sql的 scala 介面支援將包含樣本類的 rdd 自動轉換為 dataframe。這個樣本類定義了表的模式。樣本類的引數名字通過反射來讀取,然後作為列的名字。樣本類可以巢狀或者包含複雜的型別如序列或者陣列。這個 rdd 可以隱式轉化為乙個 dataframe,然後註冊為乙個表,表可以在後續的 sql 語句中使用。

對DataFrame的再理解

1 構造需要從字典構造 cds codes pd.dataframe cds codes codes.set index code 如果要指定index,可以用set index,但要注意必須再次賦值。2 如果先用index陣列和列名構造乙個骨架,也可以 shijian 2011 2012 2013...

我對SNS我理解

模仿也要做得比真的還好,比如qq,它的業務包括客戶端都是模仿別人的,但能做得像它那樣,的確不容易。sns在國內肯定能火的,不過現在的sns 只是太跟風了,沒有了自己的特點,很多的sns 很難看出它到底還是不是sns,或者它到底去哪個方向?自己都沒有弄清楚。所以sns在國內是很有機遇的。其實在當前經濟...

我對補碼的理解

計算機中用補碼表示乙個數是為了方便運算的,這樣減法也可以通過加法來實現。為什麼這樣設計行呢?主要是因為計算機里數的特殊儲存格式決定的,計算機裡用固定位數表示乙個數,超過該位置的部分會被捨棄。拿8byte的int型來說,無符號形式下,最大到1111 1111 255,超過了該範圍,會被截斷的,如 11...