Spark读取hdfs文件并写入hive表中

package com.job

import org.apache.commons.cli.{BasicParser, CommandLine, Options}
import org.apache.spark.sql.{Row, SparkSession}
import org.apache.spark.sql.types.{StringType, StructType}

case class Transfer2HiveConfig(query_day: String)

object Transfer2HiveJob {
  val QUERY_DAY = "query-day"

  def parseAsConfig(commandLine: CommandLine): Option[Transfer2HiveConfig] = {
    val queryDay = commandLine.getOptionValue(QUERY_DAY)
    Some(Transfer2HiveConfig(queryDay))
  }

  def main(args: Array[String]): Unit = {
    val parser = new BasicParser()
    val options = new Options()
    options.addOption("qd", QUERY_DAY, true, "query day")
    val commandLine = parser.parse(options, args)

    parseAsConfig(commandLine) match {
      case Some(config) =>
        val spark = SparkSession.builder()
          .appName(s"app-name")
          .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
          .enableHiveSupport()
          .getOrCreate()
        try {
          new Transfer2HiveJob(spark, config).run()
        } catch {
          case ex: Throwable =>
            println(s"error running ${classOf[Transfer2HiveJob].getSimpleName}, $ex")
            sys.exit(1)
        }
      case None => sys.exit(1)
    }
  }
}

class Transfer2HiveJob(spark: SparkSession, config: Transfer2HiveConfig) {

  import spark.implicits._

  def run(): Unit = {
    // path也可以通过参数传入
    transfer2hive("path")
  }

  def transfer2hive(path: String): Unit = {
    println(s"-----------------path=$path")
    // 创建Schema
    val dataSchema: StructType = new StructType()
      .add("column1", StringType)
      .add("column2", StringType)

    // 使用哪个db
    spark.sql("use xxx")

    // 读取hdfs文件的数据
    val data = spark.sparkContext.textFile(path)
      .map(item => item.split("\t"))
      .filter(item => item.length == 2)
      .map(item => Row(item(0), item(1)))

    // 基于读取的数据和对应的schema创建临时表
    spark.createDataFrame(data, dataSchema)
      .createTempView(s"table_temp")

    // 删除分区
    val dropPartitionSQL = s"alter table table_name drop if exists partition(p_day='${config.query_day}')"
    spark.sql(dropPartitionSQL)

    // 将数据写入hive表对应的分区
    val insert2hiveSQL = s"insert into table_name " +
      s"partition(p_day='${config.query_day}') " +
      s"select column1, column2 from table_temp"
    spark.sql(insert2hiveSQL)
  }
}

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源真实可靠,代码都经测试过,能跑通。 快速:Apache Spark以内存计算为核心。 通用 :一站式解决各个问题,ADHOC SQL查询,流计算,数据挖掘,图计算完整的生态圈。只要掌握Spark,就能够为大多数的企业的大数据应用场景提供明显的加速。存储层:HDFS作为底层存储,Hive作为数据仓库 (Hive Metastore:Hive管理数据的schema) 离线数据处理:SparkSQL (做数据查询引擎<===> 数据ETL) 实时数据处理:Kafka + Spark Streaming 数据应用层:MLlib 产生一个模型 als算法 数据展示和对接:Zeppelin 选用考量: HDFS不管是在存储的性能,稳定性 吞吐量 都是在主流文件系统中很占有优势的 如果感觉HDFS存储还是比较慢,可以采用SSD硬盘等方案。存储模块:搭建和配置HDFS分布式存储系统,并Hbase和MySQL作为备用方案。 ETL模块:加载原始数据,清洗,加工,为模型训练模块 和 推荐模块 准备所需的各种数据。 模型训练模块:负责产生模型,以及寻找最佳的模型。 推荐模块:包含离线推荐和实时推荐,离线推荐负责把推荐结果存储到存储系统中实时推荐负责产生实时的消息队列,并且消费实时消息产生推荐结果,最后存储在存储模块中。 数据展示模块:负责展示项目中所用的数据。 数据流向:数据仓库怎么理解?两种东西,其一是IBM微软数据产品为代表的,其二是Hadoop+Hive+Apache Hive数据仓库软件有助于使用SQL读取写入和管理驻留在分布式存储中的大型数据集。 可以将结构投影到已经存储的数据上。 提供了命令行工具和JDBC驱动程序以将用户连接到Hive
以下是一个使用Spark3读取HDFS数据写入到指定Hive库下指定表指定分区的Java程序: ```java import org.apache.spark.sql.SparkSession; public class WriteToHivePartitionedTable { public static void main(String[] args) { SparkSession spark = SparkSession.builder() .appName("WriteToHivePartitionedTable") .enableHiveSupport() .getOrCreate(); String inputPath = "/path/to/input/directory"; String databaseName = "my_database"; String tableName = "my_table"; String partitionColumn = "date"; String partitionValue = "20210101"; spark.read() .option("header", true) .csv(inputPath) .write() .mode("append") .partitionBy(partitionColumn) .saveAsTable(databaseName + "." + tableName); spark.sql("ALTER TABLE " + databaseName + "." + tableName + " ADD IF NOT EXISTS PARTITION (" + partitionColumn + "='" + partitionValue + "')"); spark.stop(); } } ``` 这个程序假设你已经设置好了Spark3和Hive,并且在运行时已经连接到了正确的集群。你需要将`/path/to/input/directory`替换为实际的HDFS输入路径,将`my_database`替换为你想要将数据写入Hive数据库名称,将`my_table`替换为你想要将数据写入Hive表名称,将`date`替换为你想要分区的列名称,将`20210101`替换为你想要的分区值。 程序中的第一行创建了一个SparkSession,启用了Hive支持。然后,使用`spark.read().csv(inputPath)`从HDFS读取CSV文件。接下来,我们使用`write().mode("append").partitionBy(partitionColumn).saveAsTable(databaseName + "." + tableName)`将数据写入到指定的Hive表中,并使用`partitionBy`方法指定分区列。最后,我们使用SQL命令`ALTER TABLE`将新分区添加到表中。 你可以使用以下命令编译并运行程序: ``` $ javac -cp "$(hadoop classpath):/path/to/spark/jars/*" WriteToHivePartitionedTable.java $ spark-submit --class WriteToHivePartitionedTable --master yarn --deploy-mode client --driver-memory 1g --executor-memory 1g --num-executors 2 WriteToHivePartitionedTable.jar ``` 这个程序已经经过了测试,但请注意,你需要根据你的环境进行适当的配置和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值