python 读取kafka 写hive_sparkStreaming读取kafka写入hive表

该博客介绍了如何使用Spark Streaming从Kafka的多个topic中读取数据,并将数据写入到不同的Hive表。通过设置SparkSession、配置Kafka参数和创建DirectStream,实现了数据的实时处理。数据过滤后分别存储到名为a和b的Hive表中。
摘要由CSDN通过智能技术生成

packagehiveimportjava.io.Fileimportorg.apache.kafka.clients.consumer.ConsumerRecordimportorg.apache.kafka.common.serialization.StringDeserializerimportorg.apache.log4j.{Level, Logger}importorg.apache.spark.sql.{Row, SparkSession}importorg.apache.spark.streaming.{Seconds, StreamingContext}importorg.apache.spark.streaming.dstream.InputDStreamimportorg.apache.spark.streaming.kafka010.{ConsumerStrategies, KafkaUtils, LocationStrategies}/*** spark消费多个topic的数据写入不同的hive表*/object SparkToHive {

def main(args: Array[String]): Unit={

Logger.getLogger("org.apache.spark").setLevel(Level.WARN)

Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.WARN)

Logger.getLogger("org.apache.kafka.clients.consumer").setLevel(Level.WARN)

val warehouseLocation= new File("hdfs://cluster/hive/warehouse").getAbsolutePath

@transientval spark=SparkSession

.builder()

.appName("Spark SQL To Hive")

.config("spark.sql.warehouse.dir", warehouseLocation)

.enableHiveSupport()

.getOrCreate()

spark.conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")

@transientval sc=spark.sparkContext

val scc= new StreamingContext(sc, Seconds(1))

val kafkaParams=Map[String, Object]("auto.offset.reset" -> "latest", //latest,earliest

"value.deserializer" ->classOf[StringDeserializer]

,"key.deserializer" ->classOf[StringDeserializer]

,"bootstrap.servers" -> "10.200.10.24:6667,10.200.10.26:6667,10.200.10.29:6667","group.id" -> "test_jason","enable.auto.commit" -> (true: java.lang.Boolean)

)

var stream: InputDStream[ConsumerRecord[String, String]]= nullval topics= Array("test", "test1","test2")

stream=KafkaUtils.createDirectStream[String, String](

scc,

LocationStrategies.PreferConsistent,

ConsumerStrategies.Subscribe[String, String](topics, kafkaParams)

)

stream.foreachRDD(rdd=>{if (!rdd.isEmpty()) {

val cache_rdd=rdd.map(_.value()).cache()//a 表

val a = cache_rdd.filter(_.contains("hello"))//b 表

val b = cache_rdd.filter(_.contains("jason"))//都可以打印结果,下面的代码就不在写了,可以参考另一篇博客里面写hive的

a.foreach(println)

b.foreach(println)

}

})

scc.start()

scc.awaitTermination()

}

}

可以按照以下步骤实现: 1. 首先,需要在Spark中使用JDBC连接Oracle数据库,读取数据。可以使用以下代码: ```scala val jdbcUrl = "jdbc:oracle:thin:@localhost:1521:ORCL" val jdbcUsername = "username" val jdbcPassword = "password" val jdbcDriverClass = "oracle.jdbc.driver.OracleDriver" val connectionProperties = new Properties() connectionProperties.put("user", jdbcUsername) connectionProperties.put("password", jdbcPassword) connectionProperties.put("driver", jdbcDriverClass) val oracleDF = spark.read.jdbc(jdbcUrl, "table_name", connectionProperties) ``` 2. 接下来,将数据写入Kafka。可以使用以下代码: ```scala import org.apache.spark.sql.functions._ import org.apache.spark.sql.streaming.Trigger val kafkaBrokers = "localhost:9092" val kafkaTopic = "topic_name" val kafkaDF = oracleDF.select(to_json(struct("*")).alias("value")) .selectExpr("CAST(NULL AS STRING) AS key", "value") .writeStream .format("kafka") .option("kafka.bootstrap.servers", kafkaBrokers) .option("topic", kafkaTopic) .trigger(Trigger.ProcessingTime("10 seconds")) .start() ``` 3. 最后,使用Spark StreamingKafka读取数据,并将其写入Hive。可以使用以下代码: ```scala import org.apache.spark.sql.SparkSession import org.apache.spark.sql.types.{StringType, StructType} import org.apache.spark.sql.functions._ val spark = SparkSession.builder .appName("KafkaToHive") .enableHiveSupport() .getOrCreate() val kafkaBrokers = "localhost:9092" val kafkaTopic = "topic_name" val schema = new StructType().add("column_name", StringType) val kafkaDF = spark.readStream .format("kafka") .option("kafka.bootstrap.servers", kafkaBrokers) .option("subscribe", kafkaTopic) .option("startingOffsets", "earliest") .load() .select(from_json(col("value").cast("string"), schema).alias("data")) .select("data.*") kafkaDF.writeStream .outputMode("append") .foreachBatch { (batchDF, _) => batchDF.write.mode("append").insertInto("hive_table") } .start() .awaitTermination() ``` 注意:在执行代码之前,需要先在Hive中创建相应的,以便可以将数据写入其中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值