版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据湖:ApacheHudi:Hudi时间旅行查询教程1数据湖与ApacheHudi简介1.1数据湖的概念与优势数据湖是一种存储大量原始数据的架构,这些数据可以是结构化的、半结构化的或非结构化的。数据湖的主要优势在于其能够以原始格式存储数据,无需预先定义数据模式,这为数据的后期分析提供了极大的灵活性。数据湖通常使用低成本的存储解决方案,如Hadoop的HDFS或云存储服务,如AmazonS3,这使得存储大量数据变得经济可行。数据湖的另一个关键优势是其支持多种数据处理和分析工具。数据可以被直接查询,也可以被转换成更结构化的格式,如ApacheHive或ApacheSpark中的数据表,以支持更复杂的数据分析和机器学习任务。此外,数据湖的架构设计使得数据的更新和查询操作能够以近实时的方式进行,这对于需要快速响应的业务场景尤为重要。1.2ApacheHudi的介绍与特性ApacheHudi是一个开源框架,用于在数据湖上构建实时、增量的数据管道。Hudi的主要特性包括:1.2.1时间旅行查询Hudi支持时间旅行查询,这意味着用户可以查询数据湖中的数据在任意历史时间点的状态。这一特性对于审计、回溯分析和数据恢复等场景非常有用。Hudi通过维护一个版本历史来实现时间旅行查询,每个版本都代表了数据在某一时间点的状态。1.2.2数据更新和删除Hudi允许对数据湖中的数据进行更新和删除操作,这在传统的数据湖架构中是很难实现的。Hudi通过引入增量文件和快照文件的概念,以及使用一种称为“预写日志”(Write-AheadLog,WAL)的机制,来确保数据更新和删除的原子性和一致性。1.2.3数据压缩和优化Hudi支持数据压缩和优化,以减少存储成本和提高查询性能。Hudi可以将数据压缩成更小的文件,同时通过索引和分区策略来加速数据查询。1.2.4与大数据生态系统的集成Hudi与ApacheSpark、ApacheHive、ApacheFlink等大数据生态系统中的工具紧密集成,使得数据湖上的数据处理和分析变得更加容易和高效。1.2.5示例:使用ApacheHudi进行时间旅行查询假设我们有一个使用ApacheHudi构建的数据湖,其中包含一个名为orders的表。下面的代码示例展示了如何使用ApacheSparkSQL进行时间旅行查询,以获取orders表在特定时间点的状态。#导入必要的库
frompyspark.sqlimportSparkSession
#创建SparkSession
spark=SparkSession.builder\
.appName("HudiTimeTravelQuery")\
.getOrCreate()
#指定Hudi表的位置
hudi_table_path="hdfs://localhost:9000/user/hive/warehouse/orders"
#指定要查询的时间点(以commit时间戳的形式)
query_time="2023-01-0100:00:00"
#使用SparkSQL进行时间旅行查询
orders_df=spark.read.format("hudi")\
.option("hoodie.datasource.query.type","incremental")\
.option("hoodie.datasource.query.begin.instanttime",query_time)\
.load(hudi_table_path)
#显示查询结果
orders_df.show()在这个示例中,我们首先创建了一个SparkSession,然后指定了Hudi表的存储位置和要查询的时间点。通过设置hoodie.datasource.query.type为incremental和hoodie.datasource.query.begin.instanttime为query_time,我们告诉SparkSQL只读取在query_time之后的数据变更。最后,我们加载了Hudi表并显示了查询结果。通过这种方式,ApacheHudi使得数据湖上的时间旅行查询变得简单而高效,为数据分析师和数据科学家提供了强大的工具,以探索和理解数据的历史变化。2数据湖:ApacheHudi:Hudi时间旅行查询基础2.1Hudi表的类型:COPY_ON_WRITE与MERGE_ON_READ在ApacheHudi中,数据的写入和更新操作通过两种主要的表类型来实现:COPY_ON_WRITE(COW)和MERGE_ON_READ(MOR)。这两种表类型的设计旨在优化不同的数据操作场景,同时支持时间旅行查询。2.1.1COPY_ON_WRITE(COW)COPY_ON_WRITE表类型在数据更新时,会创建一个新的数据文件来存储更新后的记录,而不会直接修改原有的数据文件。这种方式保证了数据的原子性和一致性,但可能会导致较高的存储成本,尤其是在频繁更新的场景下。示例代码#使用PySpark创建一个COPY_ON_WRITE类型的Hudi表
frompyspark.sqlimportSparkSession
spark=SparkSession.builder.appName("HudiCOWExample").getOrCreate()
#定义数据源
data=[("1","John","Doe",30),("2","Jane","Doe",25)]
df=spark.createDataFrame(data,["id","first_name","last_name","age"])
#写入Hudi表
df.write.format("hudi").option("hoodie.table.type","COPY_ON_WRITE")\
.option("hoodie.datasource.write.recordkey.field","id")\
.option("hoodie.datasource.write.partitionpath.field","age")\
.option("","example_cow_table")\
.mode("overwrite").save("/path/to/hudi/table")2.1.2MERGE_ON_READ(MOR)MERGE_ON_READ表类型在数据更新时,会先在内存中进行合并操作,然后将合并后的数据写入新的数据文件,同时保留旧文件。MOR表类型通过定期的合并操作(Compaction)来清理旧文件,从而减少存储成本。这种方式在处理大量更新时更为高效,但合并操作可能会增加计算成本。示例代码#使用PySpark创建一个MERGE_ON_READ类型的Hudi表
frompyspark.sqlimportSparkSession
spark=SparkSession.builder.appName("HudiMORExample").getOrCreate()
#定义数据源
data=[("1","John","Doe",30),("2","Jane","Doe",25)]
df=spark.createDataFrame(data,["id","first_name","last_name","age"])
#写入Hudi表
df.write.format("hudi").option("hoodie.table.type","MERGE_ON_READ")\
.option("hoodie.datasource.write.recordkey.field","id")\
.option("hoodie.datasource.write.partitionpath.field","age")\
.option("","example_mor_table")\
.mode("overwrite").save("/path/to/hudi/table")2.2时间旅行查询的基本原理时间旅行查询是ApacheHudi的一个关键特性,它允许用户查询数据在特定时间点的状态。Hudi通过维护一个时间线(Timeline)来跟踪数据的每一次变更,包括写入、更新和删除操作。时间线上的每一个时间戳(Instant)都对应着一次数据操作。用户可以通过指定时间戳来查询数据在该时间点的状态,从而实现时间旅行查询。2.2.1示例代码#使用PySpark进行时间旅行查询
frompyspark.sqlimportSparkSession
spark=SparkSession.builder.appName("HudiTimeTravelQuery").getOrCreate()
#读取Hudi表
df=spark.read.format("hudi").load("/path/to/hudi/table")
#查询数据在特定时间点的状态
time_travel_df=df.option("hoodie.read.instanttime","001")\
.load("/path/to/hudi/table")
#显示查询结果
time_travel_df.show()在这个例子中,hoodie.read.instanttime参数用于指定查询的时间点。假设001是数据在某个时间点的快照,那么time_travel_df将展示数据在该时间点的状态。通过这种方式,用户可以轻松地回溯数据的历史版本,这对于数据分析和数据恢复等场景非常有用。3数据湖:ApacheHudi:配置Hudi环境3.1安装与配置Hadoop3.1.1环境准备在开始ApacheHudi的安装之前,首先需要一个稳定运行的Hadoop环境。Hadoop是ApacheHudi的基础,用于存储和处理大规模数据集。以下步骤将指导你如何在Linux系统上安装Hadoop。下载Hadoop访问ApacheHadoop的官方网站,下载最新稳定版本的Hadoop。例如,下载Hadoop3.2.0版本的tar包。wget/hadoop/common/hadoop-3.2.0/hadoop-3.2.0.tar.gz解压并安装Hadoop解压下载的tar包,并将其移动到一个合适的目录,例如/usr/local/。tar-xzfhadoop-3.2.0.tar.gz-C/usr/local/
cd/usr/local/hadoop-3.2.0配置Hadoop编辑etc/hadoop/hadoop-env.sh文件,设置Java的路径。vietc/hadoop/hadoop-env.sh在文件中添加以下行:exportJAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk编辑etc/hadoop/core-site.xml文件,配置Hadoop的文件系统。vietc/hadoop/core-site.xml在<configuration>标签内添加以下内容:<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>编辑etc/hadoop/hdfs-site.xml文件,配置HDFS的副本数量。vietc/hadoop/hdfs-site.xml在<configuration>标签内添加以下内容:<property>
<name>dfs.replication</name>
<value>1</value>
</property>格式化HDFS在首次运行Hadoop之前,需要格式化HDFS。bin/hdfsnamenode-format启动Hadoop启动Hadoop的守护进程。sbin/start-dfs.sh3.1.2验证Hadoop安装通过运行一个简单的MapReduce任务来验证Hadoop的安装是否成功。bin/hadoopjarshare/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.0.jarwordcount/input/output确保/input目录存在一些文本数据,然后运行上述命令。检查/output目录以确认MapReduce任务是否成功执行。3.2安装ApacheHudi3.2.1下载ApacheHudi访问ApacheHudi的官方网站,下载最新稳定版本的Hudi。例如,下载Hudi0.10.0版本的tar包。wget/hudi/hudi-0.10.0/apache-hudi-0.10.0-bin.tar.gz解压并安装Hudi解压下载的tar包,并将其移动到一个合适的目录,例如/usr/local/。tar-xzfapache-hudi-0.10.0-bin.tar.gz-C/usr/local/
cd/usr/local/apache-hudi-0.10.03.2.2配置ApacheHudi编辑conf/hudi-site.xml文件,配置Hudi的存储位置和Hadoop的版本兼容性。viconf/hudi-site.xml在<configuration>标签内添加以下内容:<property>
<name></name>
<value>my_table</value>
</property>
<property>
<name>hoodie.datasource.write.hadoopcompat</name>
<value>3.2.0</value>
</property>3.2.3验证ApacheHudi安装通过运行一个简单的Hudi写入任务来验证Hudi的安装是否成功。首先,创建一个Hudi表。bin/hudi-cli.sh--operationcreate--table-typeCOPY_ON_WRITE--table-namemy_table--base-path/hudi/my_table--recordkey-fieldid--precombine-fieldts--partition-fieldregion--hadoop-conf/usr/local/hadoop-3.2.0/etc/hadoop/然后,向Hudi表中写入数据。假设你有一个CSV文件data.csv,其中包含id,ts,region,和data字段。bin/hudi-cli.sh--operationupsert--table-namemy_table--insert-batch-size10000--payload-classmon.model.HoodieAvroPayload--hadoop-conf/usr/local/hadoop-3.2.0/etc/hadoop/--payload-filedata.csv最后,查询Hudi表,以确认数据是否正确写入。bin/hudi-cli.sh--operationread--table-namemy_table--hadoop-conf/usr/local/hadoop-3.2.0/etc/hadoop/通过以上步骤,你已经成功配置了Hudi环境,为接下来的时间旅行查询打下了基础。接下来的教程将深入探讨如何使用ApacheHudi进行时间旅行查询,以及这一功能如何帮助你管理和查询历史数据版本。4创建Hudi表4.1使用Hudi建表语句在ApacheHudi中,创建表是一个关键步骤,它允许你定义数据的存储方式和查询特性。Hudi支持三种表类型:COPY_ON_WRITE(COW),MERGE_ON_READ(MOR),以及INCREMENTAL(用于实时查询)。下面的示例展示了如何使用Hudi的DDL语句创建一个COPY_ON_WRITE类型的表。--创建HudiCOW表
CREATETABLEIFNOTEXISTShudi_cow_table(
idINT,
nameSTRING,
ageINT,
tsTIMESTAMP,
partition_keySTRING
)
USINGorg.apache.hudi
TBLPROPERTIES(
'hoodie.table.type'='COPY_ON_WRITE',
'hoodie.datasource.write.recordkey.field'='id',
'hoodie.datasource.write.partitionpath.field'='partition_key',
'hoodie.datasource.hive_sync.enable'='true',
'hoodie.datasource.hive_sync.database'='hudi_db',
'hoodie.datasource.hive_sync.table'='hudi_cow_table',
'hoodie.datasource.hive_sync.use_jdbc'='false',
'hoodie.datasource.hive_sync.mode'='hms',
'hoodie.datasource.write.precombine.field'='ts',
'hoodie.upsert.shuffle.parallelism'='100',
'hoodie.insert.shuffle.parallelism'='100',
'hoodie.cleaner.policy'='KEEP_LATEST_COMMITS',
'mits.retained'='10',
'pact.inline'='true',
'mits'='10',
'hoodie.index.type'='BLOOM',
'hoodie.bloom.index.update.mode'='LAZY',
'erval'='10000',
'hoodie.bloom.index.expected.inserts'='1000000',
'bability'='0.01'
)
PARTITIONEDBY(partition_key)
LOCATION'/path/to/hudi/table';4.1.1代码解释USINGorg.apache.hudi:指定使用Hudi作为存储引擎。'hoodie.table.type'='COPY_ON_WRITE':设置表类型为COW,这意味着每次写入都会创建一个新的数据文件。'hoodie.datasource.write.recordkey.field'='id':指定id字段作为记录键,用于唯一标识每条记录。'hoodie.datasource.write.partitionpath.field'='partition_key':指定partition_key字段作为分区键,用于数据分区。'hoodie.datasource.hive_sync.enable'='true':启用Hive同步,确保Hudi表与Hive元数据保持同步。'hoodie.datasource.hive_sync.database'='hudi_db'和'hoodie.datasource.hive_sync.table'='hudi_cow_table':指定Hive数据库和表名。'hoodie.datasource.write.precombine.field'='ts':指定ts字段作为预合并字段,用于处理重复记录。'hoodie.cleaner.policy'='KEEP_LATEST_COMMITS':清理策略,保留最新的提交记录。'pact.inline'='true':启用内联压缩,以减少小文件的数量。'hoodie.index.type'='BLOOM':使用Bloom索引,以加速查询速度。4.2配置Hudi表属性Hudi表的属性配置对于优化写入和查询性能至关重要。以下是一些常见的Hudi表属性及其作用:hoodie.table.type:表类型,可以是COPY_ON_WRITE,MERGE_ON_READ或INCREMENTAL。hoodie.datasource.write.recordkey.field:记录键字段,用于唯一标识记录。hoodie.datasource.write.partitionpath.field:分区键字段,用于数据分区。hoodie.datasource.write.precombine.field:预合并字段,用于处理重复记录,通常是一个时间戳字段。hoodie.cleaner.policy:清理策略,如KEEP_LATEST_COMMITS,用于保留最新的提交记录。pact.inline:是否启用内联压缩。hoodie.index.type:索引类型,如BLOOM,用于加速查询。4.2.1示例数据假设我们有以下数据样例:idnameagetspartition_key1Alice302023-01-0110:00p12Bob252023-01-0111:00p23Charlie352023-01-0112:00p34.2.2插入数据使用以下SQL语句插入数据到Hudi表:INSERTINTOhudi_cow_table(id,name,age,ts,partition_key)
VALUES(1,'Alice',30,'2023-01-0110:00','p1'),
(2,'Bob',25,'2023-01-0111:00','p2'),
(3,'Charlie',35,'2023-01-0112:00','p3');4.2.3时间旅行查询Hudi支持时间旅行查询,这意味着你可以查询表在特定时间点的状态。例如,要查询表在2023-01-0111:00时的状态,可以使用以下语句:--查询特定时间点的表状态
SELECT*FROMhudi_cow_table
ASOFTIMESTAMP'2023-01-0111:00';或者,如果你知道特定的提交ID,也可以使用提交ID进行查询:--查询特定提交ID的表状态
SELECT*FROMhudi_cow_table
ASOFINSTANT'001';4.2.4总结通过上述步骤,你可以创建一个Hudi表并配置其属性以优化数据存储和查询。时间旅行查询功能使得Hudi成为数据湖中进行历史数据分析的理想选择。确保在创建表时正确设置属性,以满足你的数据处理需求。5时间旅行查询实践5.1查询特定时间点的数据在ApacheHudi中,时间旅行查询允许用户查询数据湖中任意时间点的数据状态。这一特性对于数据分析、审计和恢复历史数据版本非常有用。Hudi通过保存数据的快照和增量更新,使得时间旅行查询成为可能。5.1.1原理Hudi使用一种称为“时间旅行读取”的机制,它基于Hadoop的文件系统(如HDFS或S3)上的快照和增量更新。每个快照代表数据在某个时间点的状态,而增量更新则记录了自上次快照以来的数据变化。通过指定一个时间戳或提交ID,Hudi可以恢复到那个时间点的数据状态,从而实现时间旅行查询。5.1.2示例假设我们有一个使用ApacheHudi构建的数据湖表,表名为orders。我们想要查询在2023-01-0100:00:00这个时间点的数据状态。步骤1:确定时间戳或提交ID首先,我们需要确定2023-01-0100:00:00这个时间点对应的提交ID。这通常可以通过查看Hudi表的元数据来完成。#使用HudiCLI工具查看提交历史
hudi-cli--tableorders--show-commit-history假设输出显示,2023-01-0100:00:00对应的是提交ID1234567890abcdef。步骤2:执行时间旅行查询接下来,我们使用SparkSQL执行时间旅行查询,指定我们想要查询的提交ID。#SparkSQL时间旅行查询示例
frompyspark.sqlimportSparkSession
spark=SparkSession.builder.appName("HudiTimeTravel").getOrCreate()
#读取特定提交ID的数据
orders_df=spark.read.format("hudi").option("instantTime","1234567890abcdef").load("path/to/orders")
#显示结果
orders_df.show()在这个例子中,path/to/orders是Hudi表在Hadoop文件系统上的路径。instantTime参数用于指定我们想要查询的提交ID。5.2使用时间旅行查询优化数据读取时间旅行查询不仅可以用于查询历史数据,还可以用于优化数据读取过程,特别是在处理大量数据和频繁更新的场景下。5.2.1原理通过时间旅行查询,用户可以避免读取最新的所有数据,而是选择性地读取某个时间点的数据,这可以显著减少数据读取的时间和资源消耗。此外,如果数据更新频繁,时间旅行查询可以帮助用户避免读取不必要的更新,从而提高查询效率。5.2.2示例假设我们有一个每小时更新的sales表,我们想要查询2023-01-0112:00:00这个时间点的销售数据,而不是读取最新的所有数据。步骤1:确定时间点的提交ID使用HudiCLI工具查看提交历史,找到2023-01-0112:00:00对应的提交ID。hudi-cli--tablesales--show-commit-history假设输出显示,2023-01-0112:00:00对应的是提交IDghijklmnopqrstuvwxyz。步骤2:执行优化的时间旅行查询使用SparkSQL执行时间旅行查询,但这次我们结合使用instantTime和readLatestOnPath选项,以优化数据读取。#SparkSQL优化的时间旅行查询示例
frompyspark.sqlimportSparkSession
spark=SparkSession.builder.appName("HudiOptimizedTimeTravel").getOrCreate()
#读取特定提交ID的数据,并优化读取过程
sales_df=spark.read.format("hudi").option("instantTime","ghijklmnopqrstuvwxyz").option("readLatestOnPath","true").load("path/to/sales")
#显示结果
sales_df.show()在这个例子中,readLatestOnPath选项告诉Hudi读取器只读取最新的快照和增量更新,而不是从头开始读取所有数据。这在处理大量历史数据时可以显著提高查询性能。通过以上步骤,我们不仅能够查询特定时间点的数据,还能够以更高效的方式进行数据读取,充分利用ApacheHudi的时间旅行查询功能。6时间旅行查询的高级用法6.1结合Hudi快照与增量查询在ApacheHudi中,时间旅行查询允许我们访问历史版本的数据,这对于数据湖的构建和维护至关重要。通过结合快照(Snapshot)与增量(Incremental)查询,我们可以更高效地处理数据更新和查询,同时保持数据的完整性和一致性。6.1.1快照查询快照查询是指查询Hudi表在某一时间点的完整状态。这通常用于需要获取表的全貌,而不关心数据的更新历史的场景。例如,如果我们需要在每天的固定时间点生成报告,那么快照查询将非常有用。示例代码假设我们有一个Hudi表sales,我们想要查询在2023-01-01这一天的销售数据快照。frompyspark.sqlimportSparkSession
#初始化SparkSession
spark=SparkSession.builder.appName("HudiSnapshotQuery").getOrCreate()
#设置Hudi表的路径
hudi_table_path="/path/to/hudi/table"
#查询2023-01-01的快照数据
snapshot_df=spark.read.format("hudi").option("instantTime","20230101").load(hudi_table_path)
#显示结果
snapshot_df.show()6.1.2增量查询增量查询则是查询自上次查询以来的数据变更。这在实时数据处理和流式数据更新中非常有用,因为它可以减少数据处理的延迟和资源消耗。示例代码如果我们想要获取从2023-01-01到2023-01-02之间的所有销售数据的更新,可以使用增量查询。#查询2023-01-01到2023-01-02之间的增量数据
incremental_df=spark.read.format("hudi").option("beginInstantTime","20230101").option("endInstantTime","20230102").load(hudi_table_path)
#显示结果
incremental_df.show()6.2利用时间旅行特性进行数据恢复Hudi的时间旅行特性不仅用于查询历史数据,还可以用于数据恢复。当数据被意外删除或更新时,我们可以通过查询特定时间点的数据来恢复到之前的状态。6.2.1示例代码假设我们不小心删除了sales表中2023-01-01的数据,我们可以从备份中恢复这一天的数据。#读取2023-01-01的快照数据作为恢复数据
restore_df=spark.read.format("hudi").option("instantTime","20230101").load(hudi_table_path)
#将恢复数据写回到Hudi表中,覆盖现有数据
restore_df.write.format("hudi").option("","sales").option("hoodie.datasource.write.operation","upsert").mode("overwrite").save(hudi_table_path)6.2.2注意事项在进行数据恢复时,需要确保目标时间点的数据没有被进一步的更新覆盖。此外,恢复操作可能需要对Hudi表的元数据进行修改,因此在执行前应备份元数据,以防止任何不可预见的问题。6.3结合快照与增量查询的策略在实际应用中,结合快照与增量查询可以实现更高效的数据处理。例如,我们可以定期执行快照查询来获取数据的全貌,然后在两次快照之间执行增量查询来捕获数据的变更。这样,我们既可以保持数据的完整性,又可以减少数据处理的延迟和资源消耗。6.3.1示例代码假设我们每天执行一次快照查询,然后在两次快照之间执行增量查询。#查询前一天的快照数据
snapshot_df=spark.read.format("hudi").option("instantTime","20230101").load(hudi_table_path)
#查询自上次快照以来的增量数据
incremental_df=spark.read.format("hudi").option("beginInstantTime","20230101").option("endInstantTime","20230102").load(hudi_table_path)
#将快照数据与增量数据合并
merged_df=snapshot_df.union(incremental_df)
#显示合并后的结果
merged_df.show()通过这种方式,我们可以确保数据的实时性和准确性,同时利用Hudi的时间旅行特性来优化数据处理流程。6.4总结结合Hudi的快照与增量查询,以及利用时间旅行特性进行数据恢复,是构建和维护数据湖的关键技术。这些高级用法不仅可以提高数据处理的效率,还可以增强数据的完整性和一致性,为数据驱动的决策提供更可靠的支持。在实际操作中,应根据具体需求和场景,灵活运用这些技术,以实现最佳的数据处理效果。7数据湖中的时间旅行查询策略与ApacheHudi性能调优7.1数据湖中的时间旅行查询策略在数据湖的场景下,数据的变更历史变得尤为重要。ApacheHudi,作为一款开源的数据湖框架,提供了时间旅行查询的能力,允许用户查询任意时间点的数据状态。这一特性对于数据分析、数据恢复、数据审计等场景具有极大的价值。7.1.1原理Hudi通过在数据文件上附加一个时间戳(称为commit时间)来实现时间旅行查询。每当数据发生变化,Hudi会生成一个新的数据文件,并保留旧文件,同时在元数据中记录新文件的commit时间。这样,用户可以通过指定commit时间来查询数据在该时间点的状态。7.1.2实现在Hudi中,时间旅行查询可以通过指定hoodie.datasource.query.type为incremental或bloom来实现。下面是一个使用SparkSQL进行时间旅行查询的例子://读取Hudi表并指定时间旅行查询
valspark=SparkSession.builder().appName("HudiTimeTravel").getOrCreate()
importspark.implicits._
valhudiTablePath="/path/to/hudi/table"
valcommitTime="20230101_120000"//假设这是你想要查询的时间点
valdf=spark.read.format("hudi")
.option("hoodie.datasource.query.type","bloom")
.option("mit.time",commitTime)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 微波炉采购合同(3篇)
- 幼儿园老师开家长会发言稿
- 中队长述职报告范文
- 晋升转正述职报告
- 销售工作心得体会(35篇)
- 匆匆的读书心得感想(33篇)
- 五年级下册英语第4单元单词表
- 青海省西宁市(2024年-2025年小学五年级语文)人教版阶段练习(下学期)试卷及答案
- 上海市县(2024年-2025年小学五年级语文)人教版小升初真题(下学期)试卷及答案
- 五年级数学(小数乘除法)计算题专项练习及答案汇编
- 人体解剖学:神经系统课件
- 键盘的使用教案课件
- 《材料分析测试技术》全套教学课件
- 六年级上册数学课件-6.2 百分数的认识丨苏教版 (共24张PPT)
- 【精品主题班会】高三家长会(共30张PPT)
- 工程项目软硬件平台和集成服务采购技术投标文件
- 形位公差检验标准
- 限或禁用物质管理标准
- 四年级上册书法课件- 10兰叶撇 |通用版 (共10张PPT)
- 初中语文人教九年级下册命题作文扣题技巧设计
- 消防水池 (有限空间)作业安全告知牌及警示标志
评论
0/150
提交评论