spark把kafka数据写到hive

本文详细介绍了多种使用Spark将数据写入Hive分区表和非分区表的方法,包括DataFrame直接写入、通过内存临时表以及Spark Streaming消费Kafka数据等。同时,文章讨论了可能遇到的问题,如权限、数据一致性及性能测试,并提供了解决方案。此外,还探讨了不同写入方式对数据的影响和Hive查询的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写入分区表:

准备工作:先建好分区表

 

方法一:(使用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值