写入分区表:
准备工作:先建好分区表
方法一:(使用dataframe)
写数据到数据所在的位置,因为hive分区的本质就是分文件夹,先用spark把数据写到文件夹位置,然后执行sql添加分区
1.写数据到文件夹
//df为DataFrame
df.write.mode(SaveMode.Overwrite).format("parquet")
.partitionBy("day" , "dev_platform" ).save(outputPath)
2.寻找刚刚数据新建的分区, 并添加hive分区
val hivePartitions: util.List[Row] = df.select($"day", $"dev_platform").distinct().collectAsList()
hivePartitions.toArray().foreach(r => {
val Row(day, dev_platform) = r
spark.sql( s"ALTER TABLE collectlog.login_origin ADD IF NOT EXISTS PARTITION (day=$day, dev_platform=$dev_platform)")
})
方法三:
spark接kafka数据,然后使用sparksql写入spark内存临时表,再使用sparksql(insert into select)的方式写入hive表
val session = SparkSession.builder().appName("WarehouseInventoryByNewMysqlSnap").enableHiveSupport().getOrCreate()
val sc: SparkContext=session.sparkContext
session.sql("use bi_work")
import session.implicits._
val data = sc.textFile("path").map(x=>x.split("\\s+")).map(x=>Person(x(0),x(1).toInt,x(2)))
data.toDF().registerTempTable("table1")
session.sql("insert into table2 partition(date='2015-04-02') select name,col1,col2 from table1")
性能测试:三台spark机器,原始配置,kafka3机器3分区,2158w数据,历时137s
方法四:
sparkstreaming消费kafka入hive的非分区表,然后使用sparksql把非分区表数据入到分区表里去。
方法五:
这种方法不需要开发代码
kafka -> flume ->hdfs落盘 -> hive
方法六:
一个程序实现从kafka读取数据到spark再到hive分区表,没有用到临时表
其中这两行代码
sqlContext.setConf("hive.exec.dynamic.partition.mode","nonstrict")
sqlContext.setConf("hive.exec.dynamic.partition","true")
保证了kafka的数据正确落到hive表正确的分区
这个方法和方法七一样,方法七是我手动实践的,方法六是网上大神写的
object KafkaToHive{
def main(args: Array[String]){
val sparkConf = new SparkConf().setAppName("KafkaToHive")
val sc = new SparkContext(sparkConf)
val ssc = new StringContext(sc,Seconds(60))
// 创建kaf