Spark SQL支持在Hive中的数据读写,但是Hive中有大量的依赖在Spark中不存在,所以在使用过程中要配置这些依赖。
Configuration of Hive is done by placing your hive-site.xml, core-site.xml (for security configuration), and hdfs-site.xml (for HDFS configuration) file in conf/.
下面是使用Hive的测试:
import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Dataset, Row, SaveMode, SparkSession}
case class Info(timestamp: String, pro: String, city: String, category: String, ad: String)
object WriteToHDFS {
def main(args: Array[String]): Unit = {
Logger.getLogger("org").setLevel(Level.ERROR)
val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("WriteToHDFS")
// 连接hive需要mysql-connector-java依赖
val spark: SparkSession = SparkSession.builder()
.config(conf)
.config("spark.sql.warehouse.dir", "hdfs://hadoop:9000/user/hive/warehouse") // hdfs上hive仓库目录
.enableHiveSupport()
.getOrCreate()
import spark.implicits._
// 创建表结构 对比了加上using hive和不加,创建的表信息是一样的
// spark.sql("create table ad_info(timestamp String, pro String, city String, category String, ad String) using hive" +
// "row format delimited fields terminated by ' '")
//将数据导入表中,该方法直接将文件导入hive的表目录中
// spark.sql("load data local inpath 'in/1.txt' into table ad_info")
// 查询表数据 支持全套的hive sql
// spark.sql("select * from ad_info").show()
// 直接将hive表提取为DataFrame
val df: DataFrame = spark.table("ad_info")
// 将df的数据写入另一个表中 可以先创建表,也可以不实现创建表,在保存的时候会自动创建表
// df.write.mode(SaveMode.Overwrite).saveAsTable("hive_records")
// spark.sql("select * from hive_records").show()
// 由于我将同一个文件导入表中两次,即使现在将数据缩减了,hdfs中还是两个文件,而且文件很小,并没合并
val df2: DataFrame = spark.sql("select * from ad_info where cast(ad as int) >= 10")
// df2.write.mode(SaveMode.Overwrite).saveAsTable("hive_records02")
// spark.sql("select * from hive_records02").show()
// spark.sql("select * from student").show()
// 将df重新分成5个分区,确实shuffle用了很长时间,最终写到hive表中有5个数据文件,也就是说最终在hdfs产生几个
// 数据文件,可能很大程度由DataFrame的分区决定
val df3: DataFrame = df.repartition(5).toDF()
df3.write.mode(SaveMode.Append).saveAsTable("hive_records03")
df3.show()
spark.stop()
}
}