教程:使用SparkR SparkDataFrames磚

本文向您展示了如何使用SparkDataFrame加載和轉換數據API SparkR磚。

你可以練習跑步的本文的代碼示例從一個細胞在一個R筆記本這是附加對正在運行的集群。磚集群提供的在火花SparkR (R)包預裝,以便您可以開始使用SparkDataFrameAPI。

什麼是SparkDataFrame ?

SparkDataFrame是一個分布式數據組織成命名列的集合。概念上相當於一個表在數據庫或數據幀在R . SparkDataFrames可以由一係列廣泛的來源如結構化數據文件,表在數據庫中,或現有的當地R數據幀。SparkDataFrames提供一組豐富的功能(選擇列、過濾、連接、聚集),允許您來有效地解決常見的數據分析問題。

創建一個SparkDataFrame

大多數Apache在R上下文返回SparkDataFrame引發查詢。這包括閱讀從表,從文件加載數據,操作轉換數據。

創建一個SparkDataFrame的一個方法是通過構造一組數據並指定數據的模式,然後通過數據和模式createDataFrame功能,如以下示例。火花使用術語模式引用列的名稱和數據類型SparkDataFrame。您可以通過調用打印模式printSchema通過調用函數和打印數據showDF函數。

請注意

磚也使用這個詞模式描述表登記目錄的集合。

#加載SparkR包已經預裝在集群上。圖書館(SparkR)#獲取現有SparkSession已經開始在集群上。sparkR.session()#構造樣本數據的列表。你必須使用一種後綴#這裏的整數或你可能會得到錯誤# " . lang。雙不是一個有效的外部模式的int類型。”數據< -列表(列表(1 l,“雷蒙德”),列表(2 l,“洛雷塔”),列表(3 l,“韋恩。”))#指定數據的模式(列的名稱和數據類型)。模式< -structType(structField(“id”,“整數”),structField(“名稱”,“字符串”))#創建SparkDataFrame基於指定的數據和模式。df< -createDataFrame(數據=數據,模式=模式)#打印SparkDataFrame的模式。printSchema(df)#打印SparkDataFrame的內容。showDF(df)#輸出:##根# | - id:整數(nullable = true)# |——名稱:字符串(nullable = true)# + - - - + - - - - - - - +# | | | id名稱# + - - - + - - - - - - - +# | 1 |雷蒙德|# | 2 | Loretta |# | 3 | |# + - - - + - - - - - - - +

提示

以一種更健壯的格式顯示數據在一個磚筆記本,你可以叫磚顯示命令而不是SparkRshowDF功能,例如:

顯示(df)

讀表SparkDataFrame

磚使用三角洲湖默認所有表。你可以通過調用三角洲表加載到SparkDataFramestableToDF功能,如以下示例。這個示例假設您已經訪問表數據磚命名鑽石在指定的位置。如果沒有,根據需要改變表的名稱和位置。

# df < - tableToDF(“<目錄名稱>。<模式名稱>。<表名稱>”)df< -tableToDF(“main.default.diamonds”)顯示(df)#輸出:## + - - - - - - - - - - - - - - - - - - +……# |克拉削減| |…# + - - - - - - - - - - - - - - - - - - +……理想0.23 # | | |……溢價0.21 # | | |……#……

參見:

數據加載到SparkDataFrame從一個文件中

你可以從許多支持加載數據文件格式通過調用loadDF函數。下麵的示例加載一個CSV文件的內容和假設文件存在於指定的路徑。這個例子中推斷列名和模式基於文件的內容。的loadDF函數支持不同參數的文件格式。有關更多信息,請參見:

所有Apache火花從SparkR數據源可以使用。如果你可以加載數據從數據源使用PySpark或Scala中,您還可以通過使用SparkR加載它。下麵的例子使用了參數的值csv加載數據從一個CSV文件。從JSON文件加載數據相反,你可以指定json,等等。

df< -loadDF(路徑=“/ FileStore /表/ diamonds.csv”,=“csv”,=“真正的”,inferSchema=“真正的”)顯示(df)#輸出:## + - - - - - - - - - - - - - - - - - - +……# |克拉削減| |…# + - - - - - - - - - - - - - - - - - - +……理想0.23 # | | |……溢價0.21 # | | |……#……

分配SparkDataFrame轉換步驟

大多數的結果返回SparkDataFrame火花轉換。你可以分配這些結果返回給一個SparkDataFrame變量,類似於如何使用公共表表達式(cte),臨時視圖,或者DataFrames其他係統。

結合SparkDataFrames和加入工會

SparkDataFrames使用標準的SQL連接操作語義。加入返回合並後的結果兩個SparkDataFrames基於提供的匹配條件和連接類型。下麵的示例調用加入功能和使用內連接,這是缺省設置。調用選擇函數刪除重複的id列加入的結果:

databeplay体育app下载地址Customers< -列表(列表(1 l,“雷蒙德”),列表(2 l,“洛雷塔”),列表(3 l,“韋恩。”))schemabeplay体育app下载地址Customers< -structType(structField(“id”,“整數”),structField(“名稱”,“字符串”))dataPurchases< -列表(列表(1 l,“綠色”,“蘋果”),列表(2 l,“紫色”,“葡萄”),列表(3 l,“黃色”,“香蕉”))schemaPurchases< -structType(structField(“id”,“整數”),structField(“顏色”,“字符串”),structField(“水果”,“字符串”))dfbeplay体育app下载地址Customers< -createDataFrame(數據=databeplay体育app下载地址Customers,模式=schemabeplay体育app下载地址Customers)dfPurchases< -createDataFrame(數據=dataPurchases,模式=schemaPurchases)dfPurchaseHistory< -選擇(x=加入(x=dfbeplay体育app下载地址Customers,y=dfPurchases,joinExpr=dfbeplay体育app下载地址Customers美元id= =dfPurchases美元id),上校=列表(dfbeplay体育app下载地址Customers美元id,“名稱”,“顏色”,“水果”))顯示(dfPurchaseHistory)#輸出:## + - - - + - - - - - - - - - - - - - - - - - - - + +# | | id名稱| | |水果顏色# + - - - + - - - - - - - - - - - - - - - - - - - + +# | 1 |雷蒙德綠色蘋果| | |# | 2 | Loretta |紫色葡萄| |韋恩# | 3 | | | |黃色香蕉# + - - - + - - - - - - - - - - - - - - - - - - - + +

您可以添加的行SparkDataFrame到另一個通過調用聯盟功能,如以下示例:

模式< -structType(structField(“id”,“整數”),structField(“名稱”,“字符串”))df1< -createDataFrame(數據=列表(列表(1 l,“雷蒙德”),列表(2 l,“洛雷塔”),列表(3 l,“韋恩。”)),模式=模式)df2< -createDataFrame(數據=列表(列表(4 l,“特裏”),列表(5 l,“傑森”),列表(6 l,“雅”)),模式=模式)dfUnion< -聯盟(df1,df2)顯示(dfUnion)#輸出:## + - - - + - - - - - - - +# | | | id名稱# + - - - + - - - - - - - +# | 1 |雷蒙德|# | 2 | Loretta |# | 3 | |# | 4 |特裏|# | 5 | |# | 6 |湯婭|# + - - - + - - - - - - - +

過濾器SparkDataFrame行

您可以使用過濾選擇一個子集的行返回或修改在SparkDataFrame通過調用過濾器在哪裏功能。在性能或語法沒有區別,下麵的例子:

數據< -列表(列表(1 l,“雷蒙德”),列表(2 l,“洛雷塔”),列表(3 l,“韋恩。”))模式< -structType(structField(“id”,“整數”),structField(“名稱”,“字符串”))df< -createDataFrame(數據=數據,模式=模式)dfFilter< -過濾器(x=df,條件=df美元id>1)dfWhere< -在哪裏(x=df,條件=df美元id>1)showDF(dfFilter)showDF(dfWhere)#輸出:## + - - - + - - - - - - - +# | | | id名稱# + - - - + - - - - - - - +# | 2 | Loretta |# | 3 | |# + - - - + - - - - - - - +# + - - - + - - - - - - - +# | | | id名稱# + - - - + - - - - - - - +# | 2 | Loretta |# | 3 | |# + - - - + - - - - - - - +

從一個SparkDataFrame選擇列

您可以選擇列通過一個或多個列的名字選擇功能,如以下示例:

數據< -列表(列表(1 l,“雷蒙德”,“綠色”,“蘋果”),列表(2 l,“洛雷塔”,“紫色”,“葡萄”),列表(3 l,“韋恩。”,“黃色”,“香蕉”))模式< -structType(structField(“id”,“整數”),structField(“名稱”,“字符串”),structField(“顏色”,“字符串”),structField(“水果”,“字符串”))df< -createDataFrame(數據=數據,模式=模式)dfSelect< -選擇(x=df,上校=列表(“id”,“顏色”))顯示(dfSelect)#輸出:## + - - - + - - - +# | | | id顏色# + - - - + - - - +# | 1 | |# | 2 | |紫色#黃色| | 3 |# + - - - + - - - +

您可以組合選擇和過濾查詢來限製返回的行和列,就像下麵的例子:

數據< -列表(列表(1 l,“雷蒙德”,“綠色”,“蘋果”),列表(2 l,“洛雷塔”,“紫色”,“葡萄”),列表(3 l,“韋恩。”,“黃色”,“香蕉”))模式< -structType(structField(“id”,“整數”),structField(“名稱”,“字符串”),structField(“顏色”,“字符串”),structField(“水果”,“字符串”))df< -createDataFrame(數據=數據,模式=模式)dfFilterSelect< -過濾器(x=選擇(x=df,上校=列表(“id”,“水果”)),條件=df美元id>1)顯示(dfFilterSelect)#輸出:## + - - - + - - - +# | | |水果id# + - - - + - - - +# | 2 | |葡萄# | | 3 |香蕉# + - - - + - - - +

節省SparkDataFrame表

磚使用三角洲湖默認所有表。您可以保存的內容SparkDataFrame磚通過調用一個表saveAsTable功能,如以下示例:

#表名< - <目錄名稱>。<模式名稱>。<表名稱>”的表< -“main.default.purchasehistory”數據< -列表(列表(1 l,“雷蒙德”,“綠色”,“蘋果”),列表(2 l,“洛雷塔”,“紫色”,“葡萄”),列表(3 l,“韋恩。”,“黃色”,“香蕉”))模式< -structType(structField(“id”,“整數”),structField(“名稱”,“字符串”),structField(“顏色”,“字符串”),structField(“水果”,“字符串”))df< -createDataFrame(數據=數據,模式=模式)saveAsTable(df=df,的表=的表)#確認表已成功保存#顯示表的內容。顯示(sql(paste0(“SELECT * FROM”,的表)))#輸出:## + - - - + - - - - - - - - - - - - - - - - - - - + +# | | id名稱| | |水果顏色# + - - - + - - - - - - - - - - - - - - - - - - - + +# | 1 |雷蒙德綠色蘋果| | |# | 2 | Loretta |紫色葡萄| |韋恩# | 3 | | | |黃色香蕉# + - - - + - - - - - - - - - - - - - - - - - - - + +

寫一個SparkDataFrame文件的集合

大多數火花應用程序被設計成工作在大型數據集和工作在一個分布式的方式,並引發寫出一個目錄的文件,而不是單個文件。許多數據係統配置為讀取這些文件的目錄。磚推薦使用的表,而不是文件路徑對於大多數應用程序。

下麵的示例調用write.json函數將一個表的內容保存到一個目錄中。其他文件格式,請參閱:

參見:

#表名< - <目錄名稱>。<模式名稱>。<表名稱>”的表< -“main.default.diamonds”writeToPath< -paste0(“/ tmp /”,的表)df< -tableToDF(的表)write.json(x=df,路徑=writeToPath)#驗證JSON成功寫的#顯示SparkDataFrame JSON文件的內容。dfJSON< -read.json(writeToPath)顯示(dfJSON)#輸出:## + - - - - - - - - - - - - - - - - - - +……# |克拉削減| |…# + - - - - - - - - - - - - - - - - - - +……理想0.23 # | | |……溢價0.21 # | | |……#……

運行SQL查詢

SparkDataFrames提供許多選項將SQL與R。

selectExpr功能使您可以指定每一列作為一個SQL查詢,比如下麵的例子:

數據< -列表(列表(1 l,“雷蒙德”),列表(2 l,“洛雷塔”),列表(3 l,“韋恩。”))模式< -structType(structField(“id”,“整數”),structField(“名稱”,“字符串”))df< -createDataFrame(數據=數據,模式=模式)dfSelectExpr< -selectExpr(x=df,expr=”(id + 100)為id”,“(上層(名字))名稱”)顯示(dfSelectExpr)#輸出:## + - - - + - - - - - - - +# | | | id名稱# + - - - + - - - - - - - +# | 101 |雷蒙德|# | 102 | LORETTA |# | 103 | |# + - - - + - - - - - - - +

expr功能使您能夠使用SQL語法一列將被指定的任何地方,如以下示例:

數據< -列表(列表(1 l,“雷蒙德”),列表(2 l,“洛雷塔”),列表(3 l,“韋恩。”))模式< -structType(structField(“id”,“整數”),structField(“名稱”,“字符串”))df< -createDataFrame(數據=數據,模式=模式)dfSelect< -選擇(x=df,上校=列表(expr(“像id (id * 2)”),expr(”(低(名稱))名稱”)))顯示(dfSelect)#輸出:## + - - - + - - - - - - - +# | | | id名稱# + - - - + - - - - - - - +# | 2 |雷蒙德|# | 4 | loretta |# | 6 | |# + - - - + - - - - - - - +

你也可以調用sql函數運行任意SQL查詢,如以下示例:

df=sql(“選擇克拉,切割、顏色清晰main.default.diamonds清晰= VVS2限製2”)顯示(df)#輸出:## + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - +# |克拉| |清晰| |顏色# + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - +0.24 # | |很好| J | VVS2 |0.23 # | |很好| G | VVS2 |# + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - +

您可以使用字符串操作參數化SQL查詢,如以下示例:

columns_list< -“克拉、切割、顏色清晰”table_name< -“main.default.diamonds”column_name< -“清晰”column_value< -“VVS2”row_limit< -2df< -sql(paste0(“選擇”,columns_list,“從”,table_name,”,“,column_name,“=”,column_value,“限製”,row_limit))顯示(df)#輸出:## + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - +# |克拉| |清晰| |顏色# + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - +0.24 # | |很好| J | VVS2 |0.23 # | |很好| G | VVS2 |# + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - +

下一個步驟