hudi 测试程序

本文介绍如何使用Apache Hudi进行数据写入操作,包括添加Maven依赖、编写插入程序及查询更新数据的方法。

向hudi中写入数据

1.添加maven依赖


        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.5</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.apache.parquet/parquet-hadoop -->
        <dependency>
            <groupId>org.apache.parquet</groupId>
            <artifactId>parquet-hadoop</artifactId>
            <version>1.12.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core -->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql -->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.11</artifactId>
            <version>${spark.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.hudi/hudi-spark-bundle -->
        <dependency>
            <groupId>org.apache.hudi</groupId>
            <artifactId>hudi-spark-bundle_2.11</artifactId>
            <version>0.5.3</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-avro -->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-avro_2.11</artifactId>
            <version>2.4.0</version>
        </dependency>

2.编写插入程序

val spark = SparkSession.builder().master("local").config("spark.serializer","org.apache.spark.serializer.KryoSerializer").getOrCreate()
    val tableName = "hudi_trips_cow"
    val basePath = "file:///tmp/hudi_trips_cow"
    val dataGen = new DataGenerator
    val insert = convertToStringList(dataGen.generateInserts(10))
    val df = spark.read.json(spark.sparkContext.parallelize(insert, 2));
    df.show()//用于查看表结构和数据
    df.write.format("org.apache.hudi").
      options(getQuickstartWriteConfigs).
      option(PRECOMBINE_FIELD_OPT_KEY, "ts").
      option(RECORDKEY_FIELD_OPT_KEY, "uuid").
      option(PARTITIONPATH_FIELD_OPT_KEY, "partitionpath").
      option(TABLE_NAME, tableName).
      mode(Overwrite).
      save(basePath)

运行在目录下会生成相应的目录结构:

一、生成数据的结构:

该实例为出租车的数据: 其数据结构为:

begin_lat, begin_lon,end_lat,end_lon是出租的起点和重点数据

driver,rider为出租车id和 乘客id

fare为花费金额,partitionpath 为国家信息,uuid为主键

二、在测试程序中设置了一些参数,

hoodie.datasource.write.precombine.field 实际写入之前在preCombining中使用的字段。 当两个记录具有相同的键值时,我们将使用Object.compareTo(..)从precombine字段中选择一个值最大的记录。也就是说这个值类似于hbase的version,当我们读取数据时会取最新的值,所以hudi也不会立即覆盖原有的值而是重新增加了一条新的
hoodie.datasource.write.recordkey.field  主键字段
hoodie.datasource.write.partitionpath.field 分区字段,测试程序中使用国家信息作为分区

三、目录结构

 

 .hoodie 为表的属性,归档目录,hoodie.properties定义了表的相关属性,archive为表的归档目录

.hoodie_partition_metadata定义了分区的属性和提交时间。

四、查询和插入

查询

val basePath = "file:///tmp/hudi_trips_cow"
    val spark = SparkSession.builder().master("local").config("spark.serializer","org.apache.spark.serializer.KryoSerializer").getOrCreate()
    val roViewDF = spark.
      read.
      format("org.apache.hudi").
      load(basePath + "/*/*/*/*")
    roViewDF.createOrReplaceTempView("hudi_ro_table")
    spark.sql("select * from hudi_ro_table").show()
    spark.sql("select fare, begin_lon, begin_lat, ts from  hudi_ro_table where fare > 20.0").show()
    spark.sql("select _hoodie_commit_time, _hoodie_record_key, _hoodie_partition_path, rider, driver, fare from  hudi_ro_table").show()
    spark.sql("select count(1) from hudi_ro_table").show()

插入和更新

val spark = SparkSession.builder().master("local").config("spark.serializer","org.apache.spark.serializer.KryoSerializer").getOrCreate()
    val tableName = "hudi_trips_cow"
    val basePath = "file:///tmp/hudi_trips_cow"
    val dataGen = new DataGenerator
    val insert = convertToStringList(dataGen.generateInserts(10))
    val df = spark.read.json(spark.sparkContext.parallelize(insert, 2));
    df.show()
    df.write.format("org.apache.hudi").
      options(getQuickstartWriteConfigs).
      option(PRECOMBINE_FIELD_OPT_KEY, "ts").
      option(RECORDKEY_FIELD_OPT_KEY, "uuid").
      option(PARTITIONPATH_FIELD_OPT_KEY, "partitionpath").
      option(TABLE_NAME, tableName).
      mode(Overwrite).
      save(basePath)
    val updates = convertToStringList(dataGen.generateInserts(10))
    val updateDf = spark.read.json(spark.sparkContext.parallelize(updates, 2));
    updateDf.write.format("org.apache.hudi").
      options(getQuickstartWriteConfigs).
      option(PRECOMBINE_FIELD_OPT_KEY, "ts").
      option(RECORDKEY_FIELD_OPT_KEY, "uuid").
      option(PARTITIONPATH_FIELD_OPT_KEY, "partitionpath").
      option(TABLE_NAME, tableName).
      mode(Append).
      save(basePath)

参考:https://hudi.apachecn.org/docs/0.5.0/comparison.html

### Apache Hudi 0.15.0 版本安装指南 #### 准备工作 为了顺利安装 Apache Hudi 0.15.0,需先准备好环境并下载所需资源。 ```bash [root@bigdata001 ~]# mkdir -p /opt/hudi && cd /opt/hudi/ [root@bigdata001 hudi]# wget https://github.com/apache/hudi/archive/refs/tags/release-0.15.0.zip [root@bigdata001 hudi]# unzip release-0.15.0.zip [root@bigdata001 hudi]# mv hudi-release-0.15.0 hudi-0.15.0 ``` 上述命令创了一个目录用于存放 Hudi 文件,并从 GitHub 上获取了特定版本的压缩包进行解压[^2]。 #### 编译源码 如果希望基于源码构,则可以按照下面的方法操作: ```bash [root@bigdata001 hudi]# cd hudi-0.15.0/ [root@bigdata001 hudi-0.15.0]# mvn clean install -DskipTests ``` 此过程会利用 Maven 工具来编译项目,跳过测试阶段以加快速度。需要注意的是,在实际环境中可能还需要调整 `pom.xml` 中的相关配置项以适应不同场景下的需求,比如解决 Spark 和 Hive 的依赖冲突等问题[^3]。 对于大多数用户而言,直接使用官方提供的预编译二进制分发版可能是更简便的选择。可以从官方网站或镜像站点下载对应平台架构的 tarball 文件,解压后即可投入使用。 #### 配置集成 完成基本设置之后,还需考虑如何让 Hudi 能够良好地与其他大数据组件协同工作。特别是当涉及到 Spark 或 Flink 这样的流处理框架时,应当仔细检查各个库之间的兼容性情况,并作出适当调整以确保整个系统的稳定运行。 例如针对 Spark 应用程序来说,可以通过修改 `hudi-spark-bundle` 模块中的 POM 文件来规避潜在的 jar 包冲突风险;而对于 Hive 结构的支持则往往需要额外加载相应的 SerDe 类以及更新 metastore schema 等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值