Spark SQL 以編程方式指定模式

2018-12-20 15:40 更新
第二種創(chuàng)建DataFrame的方法是通過編程接口,它允許您構(gòu)造一個模式,然后將其應(yīng)用到現(xiàn)有的RDD。 我們可以使用以下三個步驟以編程方式創(chuàng)建一個DataFrame。
從原始RDD創(chuàng)建行的RDD。
創(chuàng)建由與第1步中創(chuàng)建的RDD中的Rows結(jié)構(gòu)匹配的StructType表示的模式。
通過SQLContext提供的createDataFrame方法將模式應(yīng)用于Rows的RDD。

讓我們考慮一個名為employee.txt的文本文件中的員工記錄示例。 通過從文本文件讀取數(shù)據(jù)直接使用DataFrame創(chuàng)建模式。

Given Data:查看名為employee.txt的文件的以下數(shù)據(jù),該文件放在運行spark shell點的當(dāng)前相應(yīng)目錄中。

1201, satish, 25
1202, krishna, 28
1203, amith, 39
1204, javed, 23
1205, prudvi, 23
按照以下步驟以編程方式生成模式。
打開Spark Shell
使用以下示例啟動Spark shell。

$ spark-shell

創(chuàng)建SQLContext對象

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

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

從文本文件讀取輸入

通過使用以下命令從名為employee.txt的文本文件讀取數(shù)據(jù)來創(chuàng)建RDD DataFrame。

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

以字符串格式創(chuàng)建編碼模式

使用以下命令以字符串格式創(chuàng)建編碼模式。 這意味著,假設(shè)一個表的字段結(jié)構(gòu),并使用一些分隔符傳遞字段名。

scala> val schemaString = "id name age"

輸出:

schemaString: String = id name age

導(dǎo)入相應(yīng)的API

使用以下命令導(dǎo)入行功能和SQL數(shù)據(jù)類型。

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

生成模式

以下命令用于通過讀取schemaString變量來生成模式。 這意味著您需要通過將整個字符串以空格作為分隔符來讀取每個字段,并且默認(rèn)情況下,每個字段類型為String類型。

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

應(yīng)用轉(zhuǎn)換以從文本文件讀取數(shù)據(jù)

使用以下命令將RDD(employee)轉(zhuǎn)換為Rows。 這意味著,這里我們指定讀取RDD數(shù)據(jù)的邏輯并將其存儲到rowRDD中。 這里我們使用兩個映射函數(shù):一個是用于分割記錄字符串(.map(_。split(“,”))的定界符和用于定義具有字段索引值的行的第二個映射函數(shù) ?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中應(yīng)用RowRDD

使用以下語句通過使用roRDDdata和模式(SCHEMA)變量創(chuàng)建DataFrame。

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

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

將數(shù)據(jù)幀存儲到表中

使用以下命令將數(shù)據(jù)幀存儲到名為employeeee的表中。

scala> employeeDF.registerTempTable("employee")
employee表現(xiàn)在準(zhǔn)備好了。 讓我們使用SQLContext.sql()方法將一些SQL查詢傳遞到表中。

選擇數(shù)據(jù)幀上的查詢

使用以下語句從employee表中選擇所有記錄。 這里我們使用變量allrecords來捕獲所有記錄數(shù)據(jù)。 要顯示這些記錄,請調(diào)用show()方法。

scala> val allrecords = sqlContext.sql("SELECT * FROM employee")
要查看所有記錄數(shù)據(jù)幀的結(jié)果數(shù)據(jù),請使用以下命令。

scala> allrecords.show()
輸出

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

方法sqlContext.sql允許您在列和它們的類型在運行時之前未知時構(gòu)造數(shù)據(jù)框架。 現(xiàn)在,您可以對其運行不同的SQL查詢。
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號