Spark SQL 以编程方式指定模式

2018-12-20 15:40 更新
第二种创建DataFrame的方法是通过编程接口,它允许您构造一个模式,然后将其应用到现有的RDD。 我们可以使用以下三个步骤以编程方式创建一个DataFrame。
从原始RDD创建行的RDD。
创建由与第1步中创建的RDD中的Rows结构匹配的StructType表示的模式。
通过SQLContext提供的createDataFrame方法将模式应用于Rows的RDD。

让我们考虑一个名为employee.txt的文本文件中的员工记录示例。 通过从文本文件读取数据直接使用DataFrame创建模式。

Given Data:查看名为employee.txt的文件的以下数据,该文件放在运行spark shell点的当前相应目录中。

1201, satish, 25
1202, krishna, 28
1203, amith, 39
1204, javed, 23
1205, prudvi, 23
按照以下步骤以编程方式生成模式。
打开Spark Shell
使用以下示例启动Spark shell。

$ spark-shell

创建SQLContext对象

使用以下命令生成SQLContext。 这里,sc表示SparkContext对象。

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

从文本文件读取输入

通过使用以下命令从名为employee.txt的文本文件读取数据来创建RDD DataFrame。

scala> val employee = sc.textFile("employee.txt")

以字符串格式创建编码模式

使用以下命令以字符串格式创建编码模式。 这意味着,假设一个表的字段结构,并使用一些分隔符传递字段名。

scala> val schemaString = "id name age"

输出:

schemaString: String = id name age

导入相应的API

使用以下命令导入行功能和SQL数据类型。

scala> import org.apache.spark.sql.Row;
scala> import org.apache.spark.sql.types.{StructType, StructField, StringType};

生成模式

以下命令用于通过读取schemaString变量来生成模式。 这意味着您需要通过将整个字符串以空格作为分隔符来读取每个字段,并且默认情况下,每个字段类型为String类型。

scala> val schema = StructType(schemaString.split(" ").map(fieldName ⇒ StructField(fieldName, StringType, true)))

应用转换以从文本文件读取数据

使用以下命令将RDD(employee)转换为Rows。 这意味着,这里我们指定读取RDD数据的逻辑并将其存储到rowRDD中。 这里我们使用两个映射函数:一个是用于分割记录字符串(.map(_。split(“,”))的定界符和用于定义具有字段索引值的行的第二个映射函数 ⇒Row(e(0).trim.toInt,e(1),e(2).trim.toInt)))。
scala> val rowRDD = employee.map(_.split(",")).map(e ⇒ Row(e(0).trim.toInt, e(1), e(2).trim.toInt))

基于模式在Row Data中应用RowRDD

使用以下语句通过使用roRDDdata和模式(SCHEMA)变量创建DataFrame。

scala> val employeeDF = sqlContext.createDataFrame(rowRDD, schema)
输出

employeeDF: org.apache.spark.sql.DataFrame = [id: string, name: string, age: string]

将数据帧存储到表中

使用以下命令将数据帧存储到名为employeeee的表中。

scala> employeeDF.registerTempTable("employee")
employee表现在准备好了。 让我们使用SQLContext.sql()方法将一些SQL查询传递到表中。

选择数据帧上的查询

使用以下语句从employee表中选择所有记录。 这里我们使用变量allrecords来捕获所有记录数据。 要显示这些记录,请调用show()方法。

scala> val allrecords = sqlContext.sql("SELECT * FROM employee")
要查看所有记录数据帧的结果数据,请使用以下命令。

scala> allrecords.show()
输出

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

方法sqlContext.sql允许您在列和它们的类型在运行时之前未知时构造数据框架。 现在,您可以对其运行不同的SQL查询。
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号