Spark SQL来读取现有Hive中的数据
生活随笔
收集整理的這篇文章主要介紹了
Spark SQL来读取现有Hive中的数据
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Spark SQL主要目的是使得用戶可以在Spark上使用SQL,其數(shù)據(jù)源既可以是RDD,也可以是外部的數(shù)據(jù)源(比如Parquet、Hive、Json等)。
Spark SQL的其中一個(gè)分支就是Spark on Hive,也就是使用Hive中HQL的解析、邏輯執(zhí)行計(jì)劃翻譯、執(zhí)行計(jì)劃優(yōu)化等邏輯,可以近似認(rèn)為僅將物理執(zhí)行計(jì)劃從MR作業(yè)替換成了Spark作業(yè)。
本文就是來(lái)介紹如何通過(guò)Spark SQL來(lái)讀取現(xiàn)有Hive中的數(shù)據(jù)。
不過(guò),預(yù)先編譯好的Spark assembly包是不支持Hive的,如果你需要在Spark中使用Hive,必須重新編譯,加上<code>-Phive</code>選項(xiàng)既可,具體如下:
[iteblog@spark]$ ./make-distribution.sh --tgz -Phadoop-2.2 -Pyarn -DskipTests -Dhadoop.version=2.2.0? -Phive
編譯完成之后,會(huì)在SPARK_HOME的lib目錄下多產(chǎn)生三個(gè)jar包,分別是datanucleus-api-jdo-3.2.6.jar、datanucleus-core-3.2.10.jar、datanucleus-rdbms-3.2.9.jar,這些包都是Hive所需要的。下面就開(kāi)始介紹步驟。
一、環(huán)境準(zhǔn)備
為了讓Spark能夠連接到Hive的原有數(shù)據(jù)倉(cāng)庫(kù),我們需要將Hive中的hive-site.xml文件拷貝到Spark的conf目錄下,這樣就可以通過(guò)這個(gè)配置文件找到Hive的元數(shù)據(jù)以及數(shù)據(jù)存放。
如果Hive的元數(shù)據(jù)存放在Mysql中,我們還需要準(zhǔn)備好Mysql相關(guān)驅(qū)動(dòng),比如:mysql-connector-java-5.1.22-bin.jar。
二、啟動(dòng)spark-shell</h2>
環(huán)境準(zhǔn)備好之后,為了方便起見(jiàn),我們使用spark-shell來(lái)進(jìn)行說(shuō)明如何通過(guò)Spark SQL讀取Hive中的數(shù)據(jù)。我們可以通過(guò)下面的命令來(lái)啟動(dòng)spark-shell:
[iteblog@spark]$? bin/spark-shell --master yarn-client? --jars lib/mysql-connector-java-5.1.22-bin.jar
....
15/08/27 18:21:25 INFO repl.SparkILoop: Created spark context..
Spark context available as sc.
....
15/08/27 18:21:30 INFO repl.SparkILoop: Created sql context (with Hive support)..
SQL context available as sqlContext.
啟動(dòng)spark-shell的時(shí)候會(huì)先向ResourceManager申請(qǐng)資源,而且還會(huì)初始化SparkContext和SQLContext實(shí)例。sqlContext對(duì)象其實(shí)是HiveContext的實(shí)例,sqlContext是進(jìn)入Spark SQL的切入點(diǎn)。接下來(lái)我們來(lái)讀取Hive中的數(shù)據(jù)。
scala> sqlContext.sql("CREATE EXTERNAL? TABLE IF NOT EXISTS ewaplog (key STRING, value STRING)
STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat' OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION '/user/iteblog/ewaplog' ")
res0: org.apache.spark.sql.DataFrame = [result: string]
scala> sqlContext.sql("LOAD DATA LOCAL INPATH '/data/test.lzo' INTO TABLE ewaplog")
res1: org.apache.spark.sql.DataFrame = [result: string]
scala> sqlContext.sql("FROM ewaplog SELECT key, value").collect().foreach(println)
我們先創(chuàng)建了ewaplog表,然后導(dǎo)入數(shù)據(jù),最后查詢。我們可以看出所有的SQL和在Hive中是一樣的,只是在Spark上運(yùn)行而已。在執(zhí)行SQL的時(shí)候,默認(rèn)是調(diào)用hiveql解析器來(lái)解析SQL的。當(dāng)然,你完全可以調(diào)用Spark SQL內(nèi)置的SQL解析器sql,可以通過(guò)spark.sql.dialect
參數(shù)來(lái)設(shè)置。但是建議還是使用hivesql解析器,因?yàn)樗С值恼Z(yǔ)法更多,而且還支持Hive的UDF函數(shù),在多數(shù)情況下推薦使用hivesql解析器。
Spark SQL的其中一個(gè)分支就是Spark on Hive,也就是使用Hive中HQL的解析、邏輯執(zhí)行計(jì)劃翻譯、執(zhí)行計(jì)劃優(yōu)化等邏輯,可以近似認(rèn)為僅將物理執(zhí)行計(jì)劃從MR作業(yè)替換成了Spark作業(yè)。
本文就是來(lái)介紹如何通過(guò)Spark SQL來(lái)讀取現(xiàn)有Hive中的數(shù)據(jù)。
不過(guò),預(yù)先編譯好的Spark assembly包是不支持Hive的,如果你需要在Spark中使用Hive,必須重新編譯,加上<code>-Phive</code>選項(xiàng)既可,具體如下:
[iteblog@spark]$ ./make-distribution.sh --tgz -Phadoop-2.2 -Pyarn -DskipTests -Dhadoop.version=2.2.0? -Phive
編譯完成之后,會(huì)在SPARK_HOME的lib目錄下多產(chǎn)生三個(gè)jar包,分別是datanucleus-api-jdo-3.2.6.jar、datanucleus-core-3.2.10.jar、datanucleus-rdbms-3.2.9.jar,這些包都是Hive所需要的。下面就開(kāi)始介紹步驟。
一、環(huán)境準(zhǔn)備
為了讓Spark能夠連接到Hive的原有數(shù)據(jù)倉(cāng)庫(kù),我們需要將Hive中的hive-site.xml文件拷貝到Spark的conf目錄下,這樣就可以通過(guò)這個(gè)配置文件找到Hive的元數(shù)據(jù)以及數(shù)據(jù)存放。
如果Hive的元數(shù)據(jù)存放在Mysql中,我們還需要準(zhǔn)備好Mysql相關(guān)驅(qū)動(dòng),比如:mysql-connector-java-5.1.22-bin.jar。
二、啟動(dòng)spark-shell</h2>
環(huán)境準(zhǔn)備好之后,為了方便起見(jiàn),我們使用spark-shell來(lái)進(jìn)行說(shuō)明如何通過(guò)Spark SQL讀取Hive中的數(shù)據(jù)。我們可以通過(guò)下面的命令來(lái)啟動(dòng)spark-shell:
[iteblog@spark]$? bin/spark-shell --master yarn-client? --jars lib/mysql-connector-java-5.1.22-bin.jar
....
15/08/27 18:21:25 INFO repl.SparkILoop: Created spark context..
Spark context available as sc.
....
15/08/27 18:21:30 INFO repl.SparkILoop: Created sql context (with Hive support)..
SQL context available as sqlContext.
啟動(dòng)spark-shell的時(shí)候會(huì)先向ResourceManager申請(qǐng)資源,而且還會(huì)初始化SparkContext和SQLContext實(shí)例。sqlContext對(duì)象其實(shí)是HiveContext的實(shí)例,sqlContext是進(jìn)入Spark SQL的切入點(diǎn)。接下來(lái)我們來(lái)讀取Hive中的數(shù)據(jù)。
scala> sqlContext.sql("CREATE EXTERNAL? TABLE IF NOT EXISTS ewaplog (key STRING, value STRING)
STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat' OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION '/user/iteblog/ewaplog' ")
res0: org.apache.spark.sql.DataFrame = [result: string]
scala> sqlContext.sql("LOAD DATA LOCAL INPATH '/data/test.lzo' INTO TABLE ewaplog")
res1: org.apache.spark.sql.DataFrame = [result: string]
scala> sqlContext.sql("FROM ewaplog SELECT key, value").collect().foreach(println)
我們先創(chuàng)建了ewaplog表,然后導(dǎo)入數(shù)據(jù),最后查詢。我們可以看出所有的SQL和在Hive中是一樣的,只是在Spark上運(yùn)行而已。在執(zhí)行SQL的時(shí)候,默認(rèn)是調(diào)用hiveql解析器來(lái)解析SQL的。當(dāng)然,你完全可以調(diào)用Spark SQL內(nèi)置的SQL解析器sql,可以通過(guò)spark.sql.dialect
參數(shù)來(lái)設(shè)置。但是建議還是使用hivesql解析器,因?yàn)樗С值恼Z(yǔ)法更多,而且還支持Hive的UDF函數(shù),在多數(shù)情況下推薦使用hivesql解析器。
總結(jié)
以上是生活随笔為你收集整理的Spark SQL来读取现有Hive中的数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux命令学习总结:dos2unix
- 下一篇: Failed to load sql m