使用SparkSQL读取Hive上的数据.PDF
使用Spark SQL读取Hive上的数据
Spark大数据博客 -
使用Spark SQL读取Hive上的数据
Spark SQL主要目的是使得用户可以在Spark上使用SQL,其数据源既可以是RDD,也可以是
外部的数据源(比如Parquet、Hive、Json等)。Spark SQL的其中一个分支就是Spark on Hive,
也就是使用Hive中HQL的解析、逻辑执行计划翻译、执行计划优化等逻辑,可以近似认为仅将物
理执行计划从MR作业替换成了Spark作业。本文就是来介绍如何通过Spark
SQL来读取现有Hive中的数据。
不过,预先编译好的Spark assembly包是不支持Hive的,如果你需要在Spark中使用Hive,
必须重新编译,加上-Phive选项既可,具体如下:
[iteblog@ spark]$ ./make-
distribution.sh --tgz -Phadoop-2.2 -Pyarn -DskipTests -Dhadoop.version=2.2.0 -Phive
编译完成之后,会在SPARK_HOME的lib目录下多产生三个jar包,分别是datanucleus-api-jdo
-3.2.6.jar、datanucleus-core-3.2.10.jar、datanucleus-
rdbms-3.2.9.jar,这些包都是Hive所需要的。下面就开始介绍步骤。
一、环境准备
为了让Spark能够连接到Hive的原有数据仓库,我们需要将Hive中的hive-site.xml文件拷贝到
Spark的conf目录下,这样就可以通过这个配置文件找到Hive的元数据以及数据存放。
如果Hive的元数据存放在Mysql中,我们还需要准备好Mysql相关驱动,比如:mysql-
connector-java-5.1.22-bin.jar。
二、启动spark-shell
环境准备好之后,为了方便起见,我们使用spark-shell来进行说明如何通过Spark
SQL读取Hive中的数据。我们可以通过下面的命令来启动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.
1 / 8
使用Spark SQL读取Hive上的数据
Spark大数据博客 -
启动spark-shell的时候会先向ResourceManager申请资源,而且还会初始化SparkContext和
SQLContext实例。sqlContext对象其实是HiveContext的实例,sqlContext是进入Spark
SQL的切入点。接下来我们来读取Hive中的数据。
scala> sqlContext.sql("CREATE EXTERNAL TABLE IF NOT EXISTS ewaplog (key STRING, value ST
RING)
STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat' OUTPUTFOR
MAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION '/user/iteblog/ewa
plog' ")
res0: org.apache.spark.sql.DataFrame = [resu