Spark SQL 使用反射推断模式
此方法使用反射来生成包含特定类型的对象的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应用程序时更好地了解其概要。
更多建议: