Spark SQL 数据帧
DataFrame是一个分布式数据集合,它被组织成命名列。从概念上讲,它相当于具有良好优化技术的关系表。
DataFrame可以从不同来源的数组构造,例如Hive表,结构化数据文件,外部数据库或现有RDD。这个API是为现代大数据和数据科学应用程序设计的,从Python的R ProgrammingandPandas中的DataFrame中获得灵感。
DataFrame的特性
下面是一些DataFrame的一些特征:
能够将单个节点集群上的大小为Kilobytes到Petabytes的数据处理为大型集群。
支持不同的数据格式(Avro,csv,弹性搜索和Cassandra)和存储系统(HDFS,HIVE表,mysql等)。
通过Spark SQL Catalyst优化器(树变换框架)的最先进的优化和代码生成。
可以通过Spark-Core轻松地与所有大数据工具和框架集成。
提供用于Python,Java,Scala和R编程的API。
SQLContext
SQLContext是一个类,用于初始化Spark SQL的功能。初始化SQLContext类对象需要SparkContext类对象(sc)。
以下命令用于通过spark-shell初始化SparkContext。
$ spark-shell默认情况下,SparkContext对象在spark-shell启动时用namesc初始化。
使用以下命令创建SQLContext。
scala> val sqlcontext = new org.apache.spark.sql.SQLContext(sc)
例
让我们考虑一个名为employeesee.json的JSON文件中的员工记录示例。 使用以下命令创建DataFrame(df)并读取名为employee.json的JSON文档,并具有以下内容。
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为结构化数据操作提供了一个领域特定的语言。 这里,我们包括使用DataFrames的结构化数据处理的一些基本示例。
按照以下步骤执行DataFrame操作
阅读JSON文档
首先,我们要读取JSON文档。 基于此,生成名为(dfs)的DataFrame。
使用以下命令读取JSON文档namedemployee.json。 数据显示为带有字段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]
显示数据
如果你想看到的数据框的数据,然后使用以下命令。
scala> dfs.show()
输出:您可以以表格格式查看员工数据。
<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方法
使用以下命令计算同一年龄的员工人数。
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使应用程序能够在运行SQL函数时以编程方式运行SQL查询,并将结果作为DataFrame返回。通常,在后台,SparkSQL支持两种不同的方法将现有的RDD转换为DataFrames
编号 | 方法和说明 |
---|---|
1 | 使用反射来推断模式 此方法使用反射来生成包含特定类型的对象的RDD的模式。
|
2 | 以编程方式指定模式 第二种创建DataFrame的方法是通过编程接口,它允许您构造一个模式,然后将其应用到现有的RDD。 |
更多建议: