Spark SQL 數(shù)據(jù)幀

2018-12-20 15:49 更新

DataFrame是一個分布式數(shù)據(jù)集合,它被組織成命名列。從概念上講,它相當(dāng)于具有良好優(yōu)化技術(shù)的關(guān)系表。

DataFrame可以從不同來源的數(shù)組構(gòu)造,例如Hive表,結(jié)構(gòu)化數(shù)據(jù)文件,外部數(shù)據(jù)庫或現(xiàn)有RDD。這個API是為現(xiàn)代大數(shù)據(jù)和數(shù)據(jù)科學(xué)應(yīng)用程序設(shè)計的,從Python的R ProgrammingandPandas中的DataFrame中獲得靈感。

DataFrame的特性

下面是一些DataFrame的一些特征:

能夠?qū)蝹€節(jié)點集群上的大小為Kilobytes到Petabytes的數(shù)據(jù)處理為大型集群。

支持不同的數(shù)據(jù)格式(Avro,csv,彈性搜索和Cassandra)和存儲系統(tǒng)(HDFS,HIVE表,mysql等)。

通過Spark SQL Catalyst優(yōu)化器(樹變換框架)的最先進的優(yōu)化和代碼生成。

可以通過Spark-Core輕松地與所有大數(shù)據(jù)工具和框架集成。

提供用于Python,Java,Scala和R編程的API。

SQLContext

SQLContext是一個類,用于初始化Spark SQL的功能。初始化SQLContext類對象需要SparkContext類對象(sc)。

以下命令用于通過spark-shell初始化SparkContext。

$ spark-shell

默認情況下,SparkContext對象在spark-shell啟動時用namesc初始化。
使用以下命令創(chuàng)建SQLContext。

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

讓我們考慮一個名為employeesee.json的JSON文件中的員工記錄示例。 使用以下命令創(chuàng)建DataFrame(df)并讀取名為employee.json的JSON文檔,并具有以下內(nèi)容。

employee.json-將此文件放在currentscala>指針所在的目錄中。

{
   {"id" : "1201", "name" : "satish", "age" : "25"}
   {"id" : "1202", "name" : "krishna", "age" : "28"}
   {"id" : "1203", "name" : "amith", "age" : "39"}
   {"id" : "1204", "name" : "javed", "age" : "23"}
   {"id" : "1205", "name" : "prudvi", "age" : "23"}
}

DataFrame操作

DataFrame為結(jié)構(gòu)化數(shù)據(jù)操作提供了一個領(lǐng)域特定的語言。 這里,我們包括使用DataFrames的結(jié)構(gòu)化數(shù)據(jù)處理的一些基本示例。

按照以下步驟執(zhí)行DataFrame操作 

閱讀JSON文檔

首先,我們要讀取JSON文檔。 基于此,生成名為(dfs)的DataFrame。

使用以下命令讀取JSON文檔namedemployee.json。 數(shù)據(jù)顯示為帶有字段id,name和age的表。

scala> val dfs = sqlContext.read.json("employee.json")

輸出:字段名稱從employee.json自動獲取。

dfs: org.apache.spark.sql.DataFrame = [age: string, id: string, name: string]

顯示數(shù)據(jù)

如果你想看到的數(shù)據(jù)框的數(shù)據(jù),然后使用以下命令。

scala> dfs.show()

輸出:您可以以表格格式查看員工數(shù)據(jù)。

<console>:22, took 0.052610 s
+----+------+--------+
|age | id   |  name  |
+----+------+--------+
| 25 | 1201 | satish |
| 28 | 1202 | krishna|
| 39 | 1203 | amith  |
| 23 | 1204 | javed  |
| 23 | 1205 | prudvi |
+----+------+--------+

使用方法printSchema

如果要查看DataFrame的Structure(Schema),請使用以下命令。

scala> dfs.printSchema()

輸出:

root
   |-- age: string (nullable = true)
   |-- id: string (nullable = true)
   |-- name: string (nullable = true)

使用選擇方法
使用以下命令從DataFrame的三個列中獲取fetchname-column。

scala> dfs.select("name").show()

輸出:您可以查看名稱列的值。

<console>:22, took 0.044023 s
+--------+
|  name  |
+--------+
| satish |
| krishna|
| amith  |
| javed  |
| prudvi |
+--------+

使用年齡過濾器
使用以下命令查找年齡大于23(age> 23)的雇員。

scala> dfs.filter(dfs("age") > 23).show()

輸出

<console>:22, took 0.078670 s
+----+------+--------+
|age | id   | name   |
+----+------+--------+
| 25 | 1201 | satish |
| 28 | 1202 | krishna|
| 39 | 1203 | amith  |
+----+------+--------+

使用groupBy方法
使用以下命令計算同一年齡的員工人數(shù)。

scala> dfs.groupBy("age").count().show()

輸出:這兩個雇員有23歲。

<console>:22, took 5.196091 s
+----+-----+
|age |count|
+----+-----+
| 23 |  2  |
| 25 |  1  |
| 28 |  1  |
| 39 |  1  |
+----+-----+

運行SQL查詢

SQLContext使應(yīng)用程序能夠在運行SQL函數(shù)時以編程方式運行SQL查詢,并將結(jié)果作為DataFrame返回。
通常,在后臺,SparkSQL支持兩種不同的方法將現(xiàn)有的RDD轉(zhuǎn)換為DataFrames

編號方法和說明
1 使用反射來推斷模式
此方法使用反射來生成包含特定類型的對象的RDD的模式。

2 以編程方式指定模式
第二種創(chuàng)建DataFrame的方法是通過編程接口,它允許您構(gòu)造一個模式,然后將其應(yīng)用到現(xiàn)有的RDD。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號