python 读取kafka 写hive_使用 spark 从 kafka 消费数据写入 hive 动态分区表(一)

本文介绍了如何使用Spark从Kafka读取数据并将其写入Hive动态分区表,详细展示了代码实现过程,包括直接写入和通过非分区表迁移的两种方法,以及在处理过程中遇到的Hadoop NameNode崩溃和Hive数据统计问题的解决方案。
摘要由CSDN通过智能技术生成

使用 spark 从 kafka 消费数据写入 hive 动态分区表

最近因为业务需求,需要把 kafka 内的数据写入 hive 动态分区表,进入 kafka 的数据是保证不会重复的,同一条业务数据仅会进入 kafka 一次。这就保证数据到了 hive 基本不会发生 update 操作,可以对 hive 进行统计生成静态表的形式将统计数据写入 MySQL。咱也不说那么多废话了,开整。

直接写入

从 kafka 取出数据转化成 bean 对象,根据业务要求将数据过滤,清洗,拿到最终的 RDD,直接写入 hive 分区表。(PS:我就不贴全部代码,仅仅贴出主要代码,作为一个有职业道德的程序员,职业道德不允许我这么做。哈哈哈,其实是我怂,我这么大条,万一泄露公司机密就 OVER 了)

RDD 写入 HIVE 动态分区表,因为我需要向两个动态分区表写数据,所以加了 type 字段

private static void writeHive(SparkSession sparkSession,JavaRDD rdd,String type){

Dataset writerTradeData = sparkSession.createDataFrame(rdd,type.equals("trade")?ApiTradePlus.class:ApiTradeOrderPlus.class);

writerTradeData.createOrReplaceTempView("tmp"+type);

String sql = "";

if(type.equals("trade")){

sql = "insert into tmp_trade `partition(tradedate)` select * from "+"tmp"+type;

}

else if(type.equals("order")){

sql = "insert into tmp_trade_order `partition(tradedate)` select * from "+"tmp"+type;

}

sparkSession.sql(sql);

}

别忘记最重要的 hive 操作,默认是不支持动态分区表需要开启配置。以 hive.exec.开头的几

可以通过Flink的Hive Sink将消费Kafka数据写入Hive中。具体步骤如下: 1. 在Flink中创建Kafka数据源,并使用Flink的DataStream API将数据转换为需要写入Hive的格式。 2. 使用Flink的Hive Sink将数据写入Hive中。Hive Sink需要配置Hive JDBC连接信息和结构信息。 下面是个示例代码,可以根据实际情况进行修改: ```java // 创建Flink的执行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 创建Kafka数据源 Properties props = new Properties(); props.setProperty("bootstrap.servers", "localhost:9092"); props.setProperty("group.id", "test-group"); FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>("test-topic", new SimpleStringSchema(), props); // 读取Kafka数据 DataStream<String> stream = env.addSource(consumer); // 转换数据格式 DataStream<Tuple2<String, Integer>> data = stream.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() { @Override public void flatMap(String s, Collector<Tuple2<String, Integer>> collector) throws Exception { // 根据实际情况进行数据转换 String[] parts = s.split(","); collector.collect(new Tuple2<>(parts[0], Integer.parseInt(parts[1]))); } }); // 配置Hive Sink HiveConf hiveConf = new HiveConf(); hiveConf.addResource(new Path("/path/to/hive-site.xml")); HiveCatalog hiveCatalog = new HiveCatalog("myHiveCatalog", "default", hiveConf); env.registerCatalog("myHiveCatalog", hiveCatalog); env.useCatalog("myHiveCatalog"); HiveTableSink hiveTableSink = new HiveTableSink.Builder() .setPartitions(Collections.singletonList("dt='20220101'")) .setTable(new ObjectPath("default", "test")) .setHiveConf(hiveConf) .setOverwrite(true) .setStaticPartitionInsert(false) .build(); // 写入Hive data.addSink(hiveTableSink); // 执行任务 env.execute("Kafka to Hive"); ``` 需要注意的是,在执行程序前需要先创建好Hive,并且的结构要与代码中配置的致。另外,Hive Sink在写入数据时会自动创建分区,因此在写入数据前需要确保分区已经存在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值