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的一些特征:
能夠?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是一個類,用于初始化Spark SQL的功能。初始化SQLContext類對象需要SparkContext類對象(sc)。
以下命令用于通過spark-shell初始化SparkContext。
$ spark-shell默認情況下,SparkContext對象在spark-shell啟動時用namesc初始化。
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為結(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ù),然后使用以下命令。
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 | +----+------+--------+
如果要查看DataFrame的Structure(Schema),請使用以下命令。
scala> dfs.printSchema()
輸出:
root |-- age: string (nullable = true) |-- id: string (nullable = true) |-- name: string (nullable = true)使用選擇方法
scala> dfs.select("name").show()
輸出:您可以查看名稱列的值。
<console>:22, took 0.044023 s +--------+ | name | +--------+ | satish | | krishna| | amith | | javed | | prudvi | +--------+使用年齡過濾器
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方法
scala> dfs.groupBy("age").count().show()
輸出:這兩個雇員有23歲。
<console>:22, took 5.196091 s +----+-----+ |age |count| +----+-----+ | 23 | 2 | | 25 | 1 | | 28 | 1 | | 39 | 1 | +----+-----+
編號 | 方法和說明 |
---|---|
1 | 使用反射來推斷模式 此方法使用反射來生成包含特定類型的對象的RDD的模式。
|
2 | 以編程方式指定模式 第二種創(chuàng)建DataFrame的方法是通過編程接口,它允許您構(gòu)造一個模式,然后將其應(yīng)用到現(xiàn)有的RDD。 |
更多建議: