Spark SQL 使用反射推断模式

2018-12-20 15:03 更新

此方法使用反射来生成包含特定类型的对象的RDD的模式。 Spark SQL的Scala接口支持将包含案例类的RDD自动转换为DataFrame。 case类定义了表的模式。 case类的参数的名称使用反射读取,它们成为列的名称。

案例类也可以嵌套或包含复杂类型,如序列或数组。 此RDD可以隐式地转换为DataFrame,然后注册为表。 表可以在后续的SQL语句中使用。

让我们考虑一个名为employeeee.txt的文本文件中的员工记录示例。 通过从文本文件读取数据并使用默认SQL函数将其转换为DataFrame来创建RDD。

给定数据 - 查看在运行spark shell点的当前相应目录中名为employees.txt的文件的以下数据。

1201, satish, 251202, krishna, 281203, amith, 391204, javed, 231205, prudvi, 23
以下示例说明如何使用“反射”生成模式。

启动Spark Shell

使用以下命令启动Spark Shell。
$ spark-shell

创建SQLContext

使用以下命令生成SQLContext。 这里,scmeans是SparkContext对象。

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

导入SQL函数

使用以下命令导入用于将RDD隐式转换为DataFrame的所有SQL函数。

scala> import sqlContext.implicts._

创建Case Class

接下来,我们必须使用案例类定义员工记录数据的模式。 以下命令用于根据给定数据(id,name,age)声明Case Class。

scala> case class Employee(id: Int, name: String, age: Int)defined class Employee

创建RDD和应用转换

使用以下命令生成RDD namedemplby,从中读取数据fromemployee.txt并使用Map函数将其转换为DataFrame。
这里,定义了两个映射函数。 一个是将文本记录分割成字段(.map(_。split(“,”)))和第二个映射函数用于将单个字段(id,name,age)转换为一个case类对象 0).trim.toInt,e(1),e(2).trim.toInt))。
最后,toDF()方法用于将具有模式的案例类对象转换为DataFrame。

scala>val empl=sc.textFile("employee.txt").map(_.split(",")).map(e⇒employee(e(0).trim.toInt,e(1),e(2).trim.toInt)).toDF()
输出:
empl: org.apache.spark.sql.DataFrame = [id: int, name: string, age: int]

将DataFrame数据存储在表中

使用以下命令将DataFrame数据存储到名为employeeee的表中。 在这个命令之后,我们可以应用所有类型的SQL语句。

scala> empl.registerTempTable("employee")
员工表已准备就绪。 让我们现在使用SQLContext.sql()方法在表上传递一些sql查询。
选择DataFrame上的查询
使用以下命令从theemployableable中选择所有记录。 这里,我们使用变量allrecords来捕获所有记录数据。 要显示这些记录,请调用show()方法。

scala> val allrecords = sqlContext.sql("SELeCT * FROM employee")
要查看allrecords DataFrame的结果数据,请使用以下命令。

scala> allrecords.show()
输出

+------+---------+----+|  id  |  name   |age |+------+---------+----+| 1201 | satish  | 25 || 1202 | krishna | 28 || 1203 | amith   | 39 || 1204 | javed   | 23 || 1205 | prudvi  | 23 |+------+---------+----+

子句SQL查询数据帧

使用以下命令在表中应用where语句。 这里,变量agefilter存储年龄在20和35之间的雇员的记录。

scala> val agefilter = sqlContext.sql("SELeCT * FROM employee WHERE ageC>=20 AND age <= 35")
要查看agefilter数据帧的结果数据,请使用以下命令。

scala> agefilter.show()
输出:

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

前两个查询是针对整个表DataFrame传递的。 现在让我们尝试通过对其应用Transform来从结果DataFrame获取数据。
使用列索引从agefilter 数据帧获取ID值
以下语句用于从agefilter RDD结果中获取ID值,使用字段索引。

scala> agefilter.map(t=>"ID: "+t(0)).collect().foreach(println)

输出

<console>:25, took 0.093844 sID: 1201ID: 1202ID: 1204ID: 1205

这种基于反射的方法可以获得更加简洁的代码,并且在编写Spark应用程序时更好地了解其概要。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号