此方法使用反射来生成包含特定类型的对象的RDD的模式。 Spark SQL的Scala接口支持将包含案例类的RDD自动转换为DataFrame。 case类定义了表的模式。 case类的参数的名称使用反射读取,它们成为列的名称。
案例类也可以嵌套或包含复杂类型,如序列或数组。 此RDD可以隐式地转换为DataFrame,然后注册为表。 表可以在后续的SQL语句中使用。
例
让我们考虑一个名为employeeee.txt的文本文件中的员工记录示例。 通过从文本文件读取数据并使用默认SQL函数将其转换为DataFrame来创建RDD。
给定数据 - 查看在运行spark shell点的当前相应目录中名为employees.txt的文件的以下数据。
![a0a56028f494accb2e94a1726937d2d3.png](https://i-blog.csdnimg.cn/blog_migrate/0ecd4940b21201ac8c6c211a43651d75.png)
以下示例说明如何使用“反射”生成模式。
启动Spark Shell
使用以下命令启动Spark Shell。
![d955e6cb71907ff3bc490eccd5c38662.png](https://i-blog.csdnimg.cn/blog_migrate/6912bd41ac2767c8a783c8d629a05b92.png)
创建SQLContext
使用以下命令生成SQLContext。 这里,scmeans是SparkContext对象。
![4026c15f0e9a35bf2423c78af42e3c48.png](https://i-blog.csdnimg.cn/blog_migrate/c5c2c9c5f9b9aa18843ee7187047d3c5.png)
导入SQL函数
使用以下命令导入用于将RDD隐式转换为DataFrame的所有SQL函数。
![9a7ae5b3dd6262dda29df6b5c9b53d3e.png](https://i-blog.csdnimg.cn/blog_migrate/131f33a67d9154d98fd805f32dcced6f.png)
创建Case Class
接下来,我们必须使用案例类定义员工记录数据的模式。 以下命令用于根据给定数据(id,name,age)声明Case Class。
![4f5d32ea6b797b3fd8743429540dca16.png](https://i-blog.csdnimg.cn/blog_migrate/c47e980b4bd16c50edda1b010ed46f71.png)
创建RDD和应用转换
使用以下命令生成RDD namedemplby,从中读取数据fromemployee.txt并使用Map函数将其转换为DataFrame。这里,定义了两个映射函数。 一个是将文本记录分割成字段(.map(_。split(“,”)))和第二个映射函数用于将单个字段(id,name,age)转换为一个case类对象 0).trim.toInt,e(1),e(2).trim.toInt))。最后,toDF()方法用于将具有模式的案例类对象转换为DataFrame。
![60dcc506cf79b4d6a8c85260fa2f3525.png](https://i-blog.csdnimg.cn/blog_migrate/6dc93e2344e3742929553a6982578860.png)
输出:
![67cb57d01cba89a8fba257f72c56acc5.png](https://i-blog.csdnimg.cn/blog_migrate/9385771fe83a1cc5a36fd381eb362c54.png)
将DataFrame数据存储在表中
使用以下命令将DataFrame数据存储到名为employeeee的表中。 在这个命令之后,我们可以应用所有类型的SQL语句。
![f9430915fb8d893a5447f7d44f90639c.png](https://i-blog.csdnimg.cn/blog_migrate/78dc5be4783e42686fed4f42bc2b8552.png)
员工表已准备就绪。 让我们现在使用SQLContext.sql()方法在表上传递一些sql查询。选择DataFrame上的查询
使用以下命令从theemployableable中选择所有记录。 这里,我们使用变量allrecords来捕获所有记录数据。 要显示这些记录,请调用show()方法。
![8a6da3c5ce2d9d5117a4646155272a47.png](https://i-blog.csdnimg.cn/blog_migrate/4df34f5e72c07e780c1f131e6c6c2889.png)
要查看allrecords DataFrame的结果数据,请使用以下命令。
![dad51ba7e7b007b8a9bf81de7d5451fc.png](https://i-blog.csdnimg.cn/blog_migrate/ebdfdaf7438a13b27d12c24c368073ea.png)
输出:
![fa414415920b8aad6c321f2e388f23de.png](https://i-blog.csdnimg.cn/blog_migrate/b7acb7959fb2171848f3e0128ffa0e9b.png)
子句SQL查询数据帧
使用以下命令在表中应用where语句。 这里,变量agefilter存储年龄在20和35之间的雇员的记录。
![d82815a201b61c5a19778775cb63cf5a.png](https://i-blog.csdnimg.cn/blog_migrate/d353b029a88b81647bac288d240f03e7.png)
要查看agefilter数据帧的结果数据,请使用以下命令。
![7efca9e97a2db29962c65cbaabdeb22a.png](https://i-blog.csdnimg.cn/blog_migrate/8e24eb4270ffcb08253e8c3a25256b2e.png)
输出:
![e43c6b0a3e959e35c719d6b79c2d3bdc.png](https://i-blog.csdnimg.cn/blog_migrate/a04ed65a346675bc581af74273a0e021.png)
前两个查询是针对整个表DataFrame传递的。 现在让我们尝试通过对其应用Transform来从结果DataFrame获取数据。
使用列索引从agefilter 数据帧获取ID值以下语句用于从agefilter RDD结果中获取ID值,使用字段索引。
![62d3133182d8b7ab354ff8c246d406e3.png](https://i-blog.csdnimg.cn/blog_migrate/082658e591c7ab5c92b8cb1df6e7e28f.png)
输出
![fa97e105cdaf956cc0e829eadef6b75d.png](https://i-blog.csdnimg.cn/blog_migrate/5c5ada4560573e2129b7d7b97a7c689b.png)
这种基于反射的方法可以获得更加简洁的代码,并且在编写Spark应用程序时更好地了解其概要。