sparksql 操作hive


寫在前面:hive的版本是1.2.1spark的版本是1.6.x

http://spark.apache.org/docs/1.6.1/sql-programming-guide.html#hive-tables 查看hive和spark版本對應情況

SparkSQL操作Hive中的表數據
spark可以通過讀取hive的元數據來兼容hive,讀取hive的表數據,然后在spark引擎中進行sql統計分析,從而,通過sparksql與hive結合實現數據分析將成為一種最佳實踐。詳細實現步驟如下:

1、啟動hive的元數據服務
hive可以通過服務的形式對外提供元數據讀寫操作,通過簡單的配置即可
    編輯 $HIVE_HOME/conf/hive-site.xml,增加如下內容:
<property>
<name>hive.metastore.uris</name>
<value>thrift:// hdp-node-01:9083</value>
</property>

    啟動hive metastore
[hadoop@hdp-node-01 ~]${HIVE_HOME}/bin/hive --service metastore  1>/dev/null  2>&1  &

    查看 metastore:
[hadoop@hdp-node-01 ~] jobs
[1]+ Running hive --service metastore &


2、spark配置
    將hive的配置文件拷貝給spark
將 $HIVE_HOME/conf/hive-site.xml copy $SPARK_HOME/conf/

    將mysql的jdbc驅動包拷貝給spark
將 $HIVE_HOME/lib/mysql-connector-java-5.1.12.jar copy或者軟鏈到$SPARK_HOME/lib/

3、啟動spark-sql的shell交互界面
spark-sql已經集成在spark-shell中,因此,只要啟動spark-shell,就可以使用spakr-sql的shell交互接口:
[hadoop@hdp-node-01 spark] bin/spark-shell --master spark://hdp-node-01:7077

 
或者,可以啟動spark-sql界面,使用起來更方便
[hadoop@hdp-node-01 spark] bin/spark-sql --master spark://hdp-node-01:7077

就可以使用hivesql了
由於在console中會打印很多info級別日志,所以可以改變spark的日志級別

4、在交互界面輸入sql進行查詢
注:以下所用到的庫和表,都是已經在hive中存在的庫和表

    如果在spark-shell中執行sql查詢,使用sqlContext對象調用sql()方法
scala> sqlContext.sql("select remote_addr from dw_weblog.t_ods_detail group by remote_addr").collect.foreach(println)

    如果是在spark-sql中執行sql查詢,則可以直接輸入sql語句
scala> show databases
scala> use dw_weblog
scala> select remote_addr from dw_weblog.t_ods_detail group by remote_addr



5、在IDEA中編寫代碼使用hive-sql
如下所示:
val hiveContext = new HiveContext(sc)
    import hiveContext.implicits._
    import hiveContext.sql
    //指定庫
sql("use dw_weblog")
//執行標准sql語句
sql("create table sparksql as select remote_addr,count(*) from t_ods_detail group by remote_addr")
……
綜上所述,sparksql類似於hive,可以支持sql語法來對海量數據進行分析查詢,跟hive不同的是,hive執行sql任務的底層運算引擎采用mapreduce運算框架,而sparksql執行sql任務的運算引擎是spark core,從而充分利用spark內存計算及DAG模型的優勢,大幅提升海量數據的分析查詢速度
源碼

 最后:

sparksql 如果連接報錯可能的原因是hive元數據庫的編碼不是utf8的,

alter database hive character set latin1;
ALTER TABLE hive.* DEFAULT CHARACTER SET latin1;

sparksql 執行創建表的時候報錯

org.apache.spark.sql.execution.QueryExecutionException: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:file:/user/hive/warehouse/student2 is not a directory or unable to create one)

可能是沒有啟動hive元數據服務


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM