1. 程式人生 > >Spark DataFrames入門指南:建立和操作DataFrame

Spark DataFrames入門指南:建立和操作DataFrame

一、從csv檔案建立DataFrame

  本文將介紹如何從csv檔案建立DataFrame。

如何做?
  從csv檔案建立DataFrame主要包括以下幾步驟:
  1、在build.sbt檔案裡面新增spark-csv支援庫;
  2、建立SparkConf物件,其中包括Spark執行所有的環境資訊;
  3、建立SparkContext物件,它是進入Spark的核心切入點,然後我們可以通過它建立SQLContext物件;
  4、使用SQLContext物件載入CSV檔案;
  5、Spark內建是不支援解析CSV檔案的,但是Databricks公司開發了一個類庫可以支援解析CSV檔案。所以我們需要把這個依賴檔案載入到依賴檔案中(pom.xml或者是build.sbt)

如果你是SBT工程,請加入以下依賴到build.sbt檔案中:

  1. libraryDependencies += "com.databricks" % "spark-csv_2.10" % "1.3.0"  

如果你是Maven工程,請加入以下依賴到pom.xml檔案中:

  1. <dependency>  
  2.     <groupid>com.databricks</groupid>  
  3.     <artifactid>spark-csv_2.10</artifactid>  
  4.     <version>1.3.0</version>  
  5. </dependency>  

6、SparkConf持有所有執行Spark程式的資訊,在這個例項中,我們將以本地的方式執行這個程式,而且我們打算使用2個核(local[2]),部分程式碼片段如下:

  1. import org.apache.spark.SparkConf  
  2. val conf = new SparkConf().setAppName("csvDataFrame").setMaster("local[2]")  

7、使用SparkConf初始化SparkContext物件,SparkContext是進入Spark的核心切入點:

  1. val sc = new SparkContext(conf)   

在Spark中查詢資料最簡單的一種方式就是使用SQL查詢,所以我們可以定義一個SQLContext物件:

  1. val sqlContext=new SQLContext(sc)   

8、現在我們就可以載入事先準備好的資料了:

  1. import com.databricks.spark.csv._   
  2. val students=sqlContext.csvFile(filePath="StudentData.csv", useHeader=true, delimiter='|')   

其中,students物件的型別是org.apache. spark.sql.DataFrame。

如何工作的
  csvFile方法接收需要載入的csv檔案路徑filePath,如果需要載入的csv檔案有頭部資訊,我們可以將useHeader設定為true,這樣就可以將第一行的資訊當作列名稱來讀;delimiter指定csv檔案列之間的分隔符。

  除了使用csvFile函式,我們還可以使用sqlContext裡面的load來載入csv檔案:

  1. val options = Map("header" -> "true", "path" -> "E:\\StudentData.csv")  
  2. val newStudents = sqlContext.read.options(options).format("com.databricks.spark.csv").load()  

附錄
為了方便大家測試,我提供了StudentData.csv檔案的部分資料集:

  1. id|studentName|phone|email  
  2. 1|Burke|1-300-746-8446|ullamcorper.velit.[email protected]  
  3. 2|Kamal|1-668-571-5046|[email protected]  
  4. 3|Olga|1-956-311-1686|[email protected]  
  5. 4|Belle|1-246-894-6340|[email protected]  
  6. 5|Trevor|1-300-527-4967|[email protected]  
  7. 6|Laurel|1-691-379-9921|[email protected]  
  8. 7|Sara|1-608-140-1995|[email protected]  
  9. 8|Kaseem|1-881-586-2689|[email protected]  
  10. 9|Lev|1-916-367-5608|[email protected]  
  11. 10|Maya|1-271-683-2698|[email protected]  
  12. 11|Emi|1-467-270-1337|[email protected]nunc.com  
  13. 12|Caleb|1-683-212-0896|[email protected]  
  14. 13|Florence|1-603-575-2444|[email protected]  
  15. 14|Anika|1-856-828-7883|[email protected]  
  16. 15|Tarik|1-398-171-2268|[email protected]  
  17. 16|Amena|1-878-250-3129|[email protected]  
  18. 17|Blossom|1-154-406-9596|[email protected]  
  19. 18|Guy|1-869-521-3230|[email protected]  
  20. 19|Malachi|1-608-637-2772|[email protected]  
  21. 20|Edward|1-711-710-6552|[email protected]  

二、從Scala case class中建立DataFrame

  在這篇文章中,你將學到如何從Scala case class中建立DataFrame。

如何做?
  1、我們首先建立一個case class,名為Employee,並且定義id和name兩個引數,如下:

  1. case class Employee(id: Int, name: String)  

和先前一樣,我們分別定義SparkConf、SparkContext以及SQLContext:

  1. val conf = new SparkConf().setAppName("colRowDataFrame"). setMaster("local[2]")   
  2. val sc = new SparkContext(conf)  
  3. val sqlContext = new SQLContext(sc)   

2、我們可以通過很多方式來初始化Employee類,比如從關係型資料庫中獲取資料以此來定義Employee類。但是在本文為了簡單起見,我將直接定義一個Employee類的List,如下:

  1. val listOfEmployees = List(Employee(1, "iteblog"), Employee(2, "Jason"), Employee(3, "Abhi"))  

3、我們將listOfEmployees列表傳遞給SQLContext類的createDataFrame 函式,這樣我們就可以創建出DataFrame了!然後我們可以呼叫DataFrame的printuSchema函式,打印出該DataFrame的模式,我們可以看出這個DataFrame主要有兩列:name和id,這正是我們定義Employee的兩個引數,並且型別都一致。

  1. val empFrame = sqlContext.createDataFrame(listOfEmployees)  
  2. empFrame.printSchema  
  3. root  
  4.  |-- id: integer (nullable = false)  
  5.  |-- name: string (nullable = true)  

之所以DataFrame打印出的模式和Employee類的兩個引數一致,那是因為DataFrame內部通過反射獲取到的。

4、如果你對預設反射獲取到的模式名稱不感興趣,你可以通過withColumnRenamed函式來指定列名:

  1. val empFrameWithRenamedColumns = sqlContext.createDataFrame(listOfEmployees).withColumnRenamed("id", "empId")  
  2. empFrameWithRenamedColumns.printSchema  
  3. root  
  4.  |-- empId: integer (nullable = false)  
  5.  |-- name: string (nullable = true)  

5、我們可以使用Spark支援的SQL功能來查詢相關的資料。在使用這個功能之前,我們必須先對DataFrame註冊成一張臨時表,我們可以使用registerTempTable函式實現,如下:

  1. empFrameWithRenamedColumns.registerTempTable("employeeTable")  

6、現在我們就可以使用SQL語句來查詢DataFrame裡面的資料了:

  1. val sortedByNameEmployees = sqlContext.sql("select * from employeeTable order by name desc")  
  2. sortedByNameEmployees.show()  
  3. +-----+-------+  
  4. |empId|   name|  
  5. +-----+-------+  
  6. |    1|iteblog|  
  7. |    2|  Jason|  
  8. |    3|   Abhi|  
  9. +-----+-------+  

它如何工作的
  createDataFrame函式可以接收一切繼承scala.Product類的集合物件:

  1. def createDataFrame[A <: Product : TypeTag](rdd: RDD[A]): DataFrame  

而case class類就是繼承了Product。我們所熟悉的TupleN型別也是繼承了scala.Product類的,所以我們也可以通過TupleN來建立DataFrame:

  1. val mobiles=sqlContext.createDataFrame(Seq((1,"Android"), (2, "iPhone"))) mobiles.printSchema mobiles.show()  
  2. root  
  3.  |-- _1: integer (nullable = false)  
  4.  |-- _2: string (nullable = true)  
  5. +---+-------+  
  6. | _1|     _2|  
  7. +---+-------+  
  8. |  1|Android|  
  9. |  2| iPhone|  
  10. +---+-------+  

我們知道,Tuple2的預設兩個引數名字分別是_1和_2,同樣,我們如果對這個預設的名字不是特別喜歡,我們也是可以通過withColumnRenamed函式對預設反射的列名進行重新命名。

三、操作DataFrame

  在前面的文章中,我們介紹瞭如何建立DataFrame。本文將介紹如何操作DataFrame裡面的資料和打印出DataFrame裡面資料的模式

列印DataFrame裡面的模式
  在建立完DataFrame之後,我們一般都會檢視裡面資料的模式,我們可以通過printSchema函式來檢視。它會打印出列的名稱和型別:

  1. students.printSchema   
  2. root  
  3.  |-- id: string (nullable = true)  
  4.  |-- studentName: string (nullable = true)  
  5.  |-- phone: string (nullable = true)  
  6.  |-- email: string (nullable = true)  

如果採用的是load方式參見DataFrame的,students.printSchema的輸出則如下:

  1. root  
  2.  |-- id|studentName|phone|email: string (nullable = true)  

對DataFrame裡面的資料進行取樣
  列印完模式之後,我們要做的第二件事就是看看載入進DataFrame裡面的資料是否正確。從新建立的DataFrame裡面取樣資料的方法有很多種。我們來對其進行介紹。

  最簡單的就是使用show方法,show方法有四個版本:
  (1)、第一個需要我們指定取樣的行數def show(numRows: Int);
  (2)、第二種不需要我們指定任何引數,這種情況下,show函式預設會加載出20行的資料def show();
  (3)、第三種需要指定一個boolean值,這個值說明是否需要對超過20個字元的列進行擷取def show(truncate: Boolean);
  (4)、最後一種需要指定取樣的行和是否需要對列進行截斷def show(numRows: Int, truncate: Boolean)。實際上,前三個函式都是呼叫這個函式實現的。

  Show函式和其他函式不同的地方在於其不僅會顯示需要列印的行,而且還會打印出頭資訊,並且會直接在預設的輸出流打出(console)。來看看怎麼使用吧:

  1. students.show()  //打印出20行  
  2. +---+-----------+--------------+--------------------+  
  3. | id|studentName|         phone|               email|  
  4. +---+-----------+--------------+--------------------+  
  5. 相關推薦

    Spark DataFrames入門指南建立操作DataFrame

    一、從csv檔案建立DataFrame   本文將介紹如何從csv檔案建立DataFrame。 如何做?   從csv檔案建立DataFrame主要包括以下幾步驟:   1、在build.sbt檔案裡面新增spark-csv支援庫;   2、建立Sp

    Linux小小白入門教程(六)建立刪除資料夾

    以下操作在Linux終端進行。Linux因為許可權非常嚴格,所以暫時所有的命令操作全部是在/home資料夾下的/yangjw資料夾下進行。/yangjw資料夾就是登入使用者名稱所在的資料夾,出了此資料

    PyCharm入門第一步(四)建立執行第一個Django專案

    步驟4:建立和執行您的第一個Django專案 注:此功能僅在專業版中受支援。 在你開始之前 您正在使用PyCharm 2016.1或更高版本。 您的計算機上至少安裝了一個Python直譯器。 你已經安裝了Django包。 本教程是使用以下假設建立的: Py

    Apache Kafka程式設計入門指南設定分割槽數複製因子

    我們學習瞭如何編寫簡單的Kafka Producer程式。在那個例子中,在如果需要傳送的topic不存在,Producer將會建立它。我們都知道(假設你知道),每個topic都是有分割槽數和複製因子的,但是我們無法通過Producer相關的API設定分割槽數和複製因子的,

    spark dataframe建立操作

    對spark進行操作 1獲取spark環境 JavaSparkContext getSparkContext 建立dataframe //獲取spark上下文資訊

    【python】入門指南控制語句

    pan else pre 循環 clas python continue break for 條件控制 if,if-else,if-elseif-else #!/bin/python a = ‘test‘ if a == ‘test‘: print

    Kubernetes之kubectl常用命令使用指南:1:建立刪除

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    【python】入門指南常用資料結構

    Python內建了三種高階資料結構:list,tuple,dict list:陣列,相同型別的元素組成的陣列 tuple:元組,相同型別的元素組成的陣列,但是這裡有限定條件(長度是固定的,並且值也是固定的,不能被改變) dict:字典,k-v結構的   list陣列 1,初始化和遍歷li

    Maven入門指南倉庫

    轉載https://blog.csdn.net/a258831020/article/details/49965803 1 . 倉庫簡介 沒有 Maven 時,專案用到的 .jar 檔案通常需要拷貝到 /lib 目錄,專案多了,拷貝的檔案副本就多了,佔用磁碟空間,且難於管理。Maven 使用

    單元二建立維護資料表

    1、   一個關係由一個二維表表示 2、   二維表中的每一列稱為關係的一個屬性,即欄位 3、   二維表中的每一行的所有資料稱為一個元組,相當一個記錄,代表一個實體 4、   能唯一標識一個元組的一個或若干個屬性的集合稱為

    Excel零基礎入門——02Excel基本概念操作

    上節課大家已經體驗到了Excel的操作了,如果成功做完了小例子,那就更牛氣了,但只會操作不懂裡面的術語和原理就不太好了,本節課帶領大家初始熟悉一下Excel的環境、基本概念和基礎操作。咱要做個有文化的Excel人。 記住快捷鍵,秒殺老司機!   1、基本概念 大家把這裡當做字典,可以直接略過

    SpringBoot 入門之一Configuration Properties

      pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2

    Flutter 入門建立新的專案、開啟現有專案

    文章目錄 1、建立新的Flutter專案 2、開啟現有的程式碼 3、執行 1、建立新的Flutter專案 1、File->New->New Flutter Project: 2、彈出如下對話方塊 選擇applicat

    Spark快速入門指南Spark安裝與基礎使用

    Apache Spark 是一個新興的大資料處理通用引擎,提供了分散式的記憶體抽象。Spark 正如其名,最大的特點就是快(Lightning-fast),可比 Hadoop MapReduce 的處理速度快 100 倍。此外,Spark 提供了簡單易用的 API,幾行程式碼

    資料結構基礎篇-------4. 雙向迴圈連結串列的建立操作

    /* * 雙向迴圈連結串列的建立及操作 * 2018.10.23 * @L.F * * */ #include<stdio.h> #include<stdlib.h> #include<string.h> typedef

    SQL語句基礎1建立刪除資料庫,建表,插入資料並加入適當約束

    1.建立圖書管理資料庫 create database bookManager on (     name=bookManager_data,     filename='D:\SQL\bookManager_data.mdf',     size=5MB,     maxs

    WPF入門WPFXAML簡介

    什麼是WPFWindows Presentation Foundation的簡稱。專門用來編寫程式表示層的技術和工具。 學習WPF的好處:學習WPF技術可以為WCF的學習錦上添花。WF設計工作流,而設計WF的語言就是Xaml。學習WPF後,Silverlight可以算是會了80%,因為Silverlight可

    哈夫曼樹的建立操作

    哈夫曼樹的引進是與帶有權重的二叉樹有關的 首先定義帶權路徑長度(WPL):設二叉樹有n個葉子結點,每個葉子結點帶有權值Wk,從根結點到每個葉子的長度為Ik,則每個葉子結點的帶權路徑長度之和就是:WPL=∑nk=1wklk。 最優二叉樹或哈夫曼樹:WPL最小的

    30分鐘--Spark快速入門指南

    Apache Spark 是一個新興的大資料處理通用引擎,提供了分散式的記憶體抽象。Spark 正如其名,最大的特點就是快(Lightning-fast),可比 Hadoop MapReduce 的處理速度快 100 倍。此外,Spark 提供了簡單易用的 API,幾行程式碼就能實現 WordCount。本

    .NET windows服務(二建立解除安裝windows服務)

    引用地址: https://docs.microsoft.com/zh-cn/dotnet/framework/windows-services/how-to-create-windows-services   手動安裝你的服務 在 Windows“啟動”選單或“啟動”螢幕上,依次選