diff --git a/content/404.html b/content/404.html index 6dfca1529d655..4ea5d98d3b7b9 100644 --- a/content/404.html +++ b/content/404.html @@ -19,7 +19,7 @@ - + diff --git a/content/404/index.html b/content/404/index.html index 376664e22b70a..32b40379636f3 100644 --- a/content/404/index.html +++ b/content/404/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/assets/js/02e54e09.a7c8fe63.js b/content/assets/js/02e54e09.dc70936f.js similarity index 95% rename from content/assets/js/02e54e09.a7c8fe63.js rename to content/assets/js/02e54e09.dc70936f.js index 04a952db63e39..7d061ddbcbeb9 100644 --- a/content/assets/js/02e54e09.a7c8fe63.js +++ b/content/assets/js/02e54e09.dc70936f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[34691],{28372:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>u,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"clustering","title":"Clustering","description":"Background","source":"@site/docs/clustering.md","sourceDirName":".","slug":"/clustering","permalink":"/docs/next/clustering","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/clustering.md","tags":[],"version":"current","frontMatter":{"title":"Clustering","summary":"In this page, we describe async compaction in Hudi.","toc":true,"last_modified_at":null},"sidebar":"docs","previous":{"title":"Compaction","permalink":"/docs/next/compaction"},"next":{"title":"Indexing","permalink":"/docs/next/metadata_indexing"}}');var s=i(74848),r=i(28453);const a={title:"Clustering",summary:"In this page, we describe async compaction in Hudi.",toc:!0,last_modified_at:null},l=void 0,o={},c=[{value:"Background",id:"background",level:2},{value:"How is compaction different from clustering?",id:"how-is-compaction-different-from-clustering",level:2},{value:"Clustering Architecture",id:"clustering-architecture",level:2},{value:"Overall, there are 2 steps to clustering",id:"overall-there-are-2-steps-to-clustering",level:3},{value:"Schedule clustering",id:"schedule-clustering",level:3},{value:"Execute clustering",id:"execute-clustering",level:3},{value:"Clustering Usecases",id:"clustering-usecases",level:2},{value:"Batching small files",id:"batching-small-files",level:3},{value:"Cluster by sort key",id:"cluster-by-sort-key",level:3},{value:"Clustering Strategies",id:"clustering-strategies",level:2},{value:"Plan Strategy",id:"plan-strategy",level:3},{value:"Size-based clustering strategies",id:"size-based-clustering-strategies",level:4},{value:"SparkSingleFileSortPlanStrategy",id:"sparksinglefilesortplanstrategy",level:4},{value:"SparkConsistentBucketClusteringPlanStrategy",id:"sparkconsistentbucketclusteringplanstrategy",level:4},{value:"Execution Strategy",id:"execution-strategy",level:3},{value:"Update Strategy",id:"update-strategy",level:3},{value:"Inline clustering",id:"inline-clustering",level:2},{value:"Async Clustering",id:"async-clustering",level:2},{value:"Setup Asynchronous Clustering",id:"setup-asynchronous-clustering",level:2},{value:"HoodieClusteringJob",id:"hoodieclusteringjob",level:3},{value:"HoodieStreamer",id:"hoodiestreamer",level:3},{value:"Spark Structured Streaming",id:"spark-structured-streaming",level:3},{value:"Java Client",id:"java-client",level:2},{value:"Related Resources",id:"related-resources",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"background",children:"Background"}),"\n",(0,s.jsxs)(t.p,{children:["Apache Hudi brings stream processing to big data, providing fresh data while being an order of magnitude efficient over traditional batch processing. In a data lake/warehouse, one of the key trade-offs is between ingestion speed and query performance. Data ingestion typically prefers small files to improve parallelism and make data available to queries as soon as possible. However, query performance degrades poorly with a lot of small files. Also, during ingestion, data is typically co-located based on arrival time. However, the query engines perform better when the data frequently queried is co-located together. In most architectures each of these systems tend to add optimizations independently to improve performance which hits limitations due to un-optimized data layouts. This doc introduces a new kind of table service called clustering ",(0,s.jsx)(t.a,{href:"https://cwiki.apache.org/confluence/display/HUDI/RFC+-+19+Clustering+data+for+freshness+and+query+performance",children:"[RFC-19]"})," to reorganize data for improved query performance without compromising on ingestion speed."]}),"\n",(0,s.jsx)(t.h2,{id:"how-is-compaction-different-from-clustering",children:"How is compaction different from clustering?"}),"\n",(0,s.jsxs)(t.p,{children:["Hudi is modeled like a log-structured storage engine with multiple versions of the data.\nParticularly, ",(0,s.jsx)(t.a,{href:"/docs/table_types#merge-on-read-table",children:"Merge-On-Read"}),"\ntables in Hudi store data using a combination of base file in columnar format and row-based delta logs that contain\nupdates. Compaction is a way to merge the delta logs with base files to produce the latest file slices with the most\nrecent snapshot of data. Compaction helps to keep the query performance in check (larger delta log files would incur\nlonger merge times on query side). On the other hand, clustering is a data layout optimization technique. One can stitch\ntogether small files into larger files using clustering. Additionally, data can be clustered by sort key so that queries\ncan take advantage of data locality."]}),"\n",(0,s.jsx)(t.h2,{id:"clustering-architecture",children:"Clustering Architecture"}),"\n",(0,s.jsxs)(t.p,{children:["At a high level, Hudi provides different operations such as insert/upsert/bulk_insert through it\u2019s write client API to be able to write data to a Hudi table. To be able to choose a trade-off between file size and ingestion speed, Hudi provides a knob ",(0,s.jsx)(t.code,{children:"hoodie.parquet.small.file.limit"})," to be able to configure the smallest allowable file size. Users are able to configure the small file ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/configurations/#hoodieparquetsmallfilelimit",children:"soft limit"})," to ",(0,s.jsx)(t.code,{children:"0"})," to force new data to go into a new set of filegroups or set it to a higher value to ensure new data gets \u201cpadded\u201d to existing files until it meets that limit that adds to ingestion latencies."]}),"\n",(0,s.jsx)(t.p,{children:"To be able to support an architecture that allows for fast ingestion without compromising query performance, we have introduced a \u2018clustering\u2019 service to rewrite the data to optimize Hudi data lake file layout."}),"\n",(0,s.jsx)(t.p,{children:"Clustering table service can run asynchronously or synchronously adding a new action type called \u201cREPLACE\u201d, that will mark the clustering action in the Hudi metadata timeline."}),"\n",(0,s.jsx)(t.h3,{id:"overall-there-are-2-steps-to-clustering",children:"Overall, there are 2 steps to clustering"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Scheduling clustering: Create a clustering plan using a pluggable clustering strategy."}),"\n",(0,s.jsx)(t.li,{children:"Execute clustering: Process the plan using an execution strategy to create new files and replace old files."}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"schedule-clustering",children:"Schedule clustering"}),"\n",(0,s.jsx)(t.p,{children:"Following steps are followed to schedule clustering."}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Identify files that are eligible for clustering: Depending on the clustering strategy chosen, the scheduling logic will identify the files eligible for clustering."}),"\n",(0,s.jsx)(t.li,{children:"Group files that are eligible for clustering based on specific criteria. Each group is expected to have data size in multiples of \u2018targetFileSize\u2019. Grouping is done as part of \u2018strategy\u2019 defined in the plan. Additionally, there is an option to put a cap on group size to improve parallelism and avoid shuffling large amounts of data."}),"\n",(0,s.jsxs)(t.li,{children:["Finally, the clustering plan is saved to the timeline in an avro ",(0,s.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-common/src/main/avro/HoodieClusteringPlan.avsc",children:"metadata format"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"execute-clustering",children:"Execute clustering"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Read the clustering plan and get the \u2018clusteringGroups\u2019 that mark the file groups that need to be clustered."}),"\n",(0,s.jsx)(t.li,{children:"For each group, we instantiate appropriate strategy class with strategyParams (example: sortColumns) and apply that strategy to rewrite the data."}),"\n",(0,s.jsxs)(t.li,{children:["Create a \u201cREPLACE\u201d commit and update the metadata in ",(0,s.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-common/src/main/java/org/apache/hudi/common/model/HoodieReplaceCommitMetadata.java",children:"HoodieReplaceCommitMetadata"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Clustering Service builds on Hudi\u2019s MVCC based design to allow for writers to continue to insert new data while clustering action runs in the background to reformat data layout, ensuring snapshot isolation between concurrent readers and writers."}),"\n",(0,s.jsx)(t.p,{children:"NOTE: Clustering can only be scheduled for tables / partitions not receiving any concurrent updates. In the future, concurrent updates use-case will be supported as well."}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"Clustering example",src:i(7004).A+"",width:"6827",height:"3334"}),"\n",(0,s.jsx)(t.em,{children:"Figure: Illustrating query performance improvements by clustering"})]}),"\n",(0,s.jsx)(t.h2,{id:"clustering-usecases",children:"Clustering Usecases"}),"\n",(0,s.jsx)(t.h3,{id:"batching-small-files",children:"Batching small files"}),"\n",(0,s.jsx)(t.p,{children:"As mentioned in the intro, streaming ingestion generally results in smaller files in your data lake. But having a lot of\nsuch small files could lead to higher query latency. From our experience supporting community users, there are quite a\nfew users who are using Hudi just for small file handling capabilities. So, you could employ clustering to batch a lot\nof such small files into larger ones."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Batching small files",src:i(67491).A+"",width:"3100",height:"1620"})}),"\n",(0,s.jsx)(t.h3,{id:"cluster-by-sort-key",children:"Cluster by sort key"}),"\n",(0,s.jsx)(t.p,{children:"Another classic problem in data lake is the arrival time vs event time problem. Generally you write data based on\narrival time, while query predicates do not sit well with it. With clustering, you can re-write your data by sorting\nbased on query predicates and so, your data skipping will be very efficient and your query can ignore scanning a lot of\nunnecessary data."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Batching small files",src:i(14438).A+"",width:"5003",height:"1464"})}),"\n",(0,s.jsx)(t.h2,{id:"clustering-strategies",children:"Clustering Strategies"}),"\n",(0,s.jsx)(t.p,{children:"On a high level, clustering creates a plan based on a configurable strategy, groups eligible files based on specific\ncriteria and then executes the plan. As mentioned before, clustering plan as well as execution depends on configurable\nstrategy. These strategies can be broadly classified into three types: clustering plan strategy, execution strategy and\nupdate strategy."}),"\n",(0,s.jsx)(t.h3,{id:"plan-strategy",children:"Plan Strategy"}),"\n",(0,s.jsxs)(t.p,{children:["This strategy comes into play while creating clustering plan. It helps to decide what file groups should be clustered\nand how many output file groups should the clustering produce. Note that these strategies are easily pluggable using the\nconfig ",(0,s.jsx)(t.a,{href:"/docs/configurations#hoodieclusteringplanstrategyclass",children:"hoodie.clustering.plan.strategy.class"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"Different plan strategies are as follows:"}),"\n",(0,s.jsx)(t.h4,{id:"size-based-clustering-strategies",children:"Size-based clustering strategies"}),"\n",(0,s.jsxs)(t.p,{children:["This strategy creates clustering groups based on max size allowed per group. Also, it excludes files that are greater\nthan the small file limit from the clustering plan. Available strategies depending on write client\nare: ",(0,s.jsx)(t.code,{children:"SparkSizeBasedClusteringPlanStrategy"}),", ",(0,s.jsx)(t.code,{children:"FlinkSizeBasedClusteringPlanStrategy"}),"\nand ",(0,s.jsx)(t.code,{children:"JavaSizeBasedClusteringPlanStrategy"}),". Furthermore, Hudi provides flexibility to include or exclude partitions for\nclustering, tune the file size limits, maximum number of output groups. Please refer to ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations/#hoodieclusteringplanstrategysmallfilelimit",children:"hoodie.clustering.plan.strategy.small.file.limit"}),"\n, ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations/#hoodieclusteringplanstrategymaxnumgroups",children:"hoodie.clustering.plan.strategy.max.num.groups"}),", ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations/#hoodieclusteringplanstrategymaxbytespergroup",children:"hoodie.clustering.plan.strategy.max.bytes.per.group"}),"\n, ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations/#hoodieclusteringplanstrategytargetfilemaxbytes",children:"hoodie.clustering.plan.strategy.target.file.max.bytes"})," for more details."]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.plan.strategy.partition.selected"}),(0,s.jsxs)(t.td,{children:["N/A ",(0,s.jsx)(t.strong,{children:"(Required)"})]}),(0,s.jsxs)(t.td,{children:["Comma separated list of partitions to run clustering",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: PARTITION_SELECTED"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.11.0"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.plan.strategy.partition.regex.pattern"}),(0,s.jsxs)(t.td,{children:["N/A ",(0,s.jsx)(t.strong,{children:"(Required)"})]}),(0,s.jsxs)(t.td,{children:["Filter clustering partitions that matched regex pattern",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: PARTITION_REGEX_PATTERN"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.11.0"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.plan.partition.filter.mode"}),(0,s.jsx)(t.td,{children:"NONE (Optional)"}),(0,s.jsxs)(t.td,{children:["Partition filter mode used in the creation of clustering plan. Possible values:",(0,s.jsx)("br",{}),(0,s.jsxs)("ul",{children:[(0,s.jsxs)("li",{children:[(0,s.jsx)(t.code,{children:"NONE"}),": Do not filter partitions. The clustering plan will include all partitions that have clustering candidates."]}),(0,s.jsxs)("li",{children:[(0,s.jsx)(t.code,{children:"RECENT_DAYS"}),": This filter assumes that your data is partitioned by date. The clustering plan will only include partitions from K days ago to N days ago, where K >= N. K is determined by ",(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.daybased.lookback.partitions"})," and N is determined by ",(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.daybased.skipfromlatest.partitions"}),"."]}),(0,s.jsxs)("li",{children:[(0,s.jsx)(t.code,{children:"SELECTED_PARTITIONS"}),": The clustering plan will include only partition paths with names that sort within the inclusive range [",(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.cluster.begin.partition"}),", ",(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.cluster.end.partition"}),"]."]}),(0,s.jsxs)("li",{children:[(0,s.jsx)(t.code,{children:"DAY_ROLLING"}),": To determine the partitions in the clustering plan, the eligible partitions will be sorted in ascending order. Each partition will have an index i in that list. The clustering plan will only contain partitions such that i mod 24 = H, where H is the current hour of the day (from 0 to 23)."]})]}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: PLAN_PARTITION_FILTER_MODE_NAME"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.11.0"})]})]})]})]}),"\n",(0,s.jsx)(t.h4,{id:"sparksinglefilesortplanstrategy",children:"SparkSingleFileSortPlanStrategy"}),"\n",(0,s.jsxs)(t.p,{children:["In this strategy, clustering group for each partition is built in the same way as ",(0,s.jsx)(t.code,{children:"SparkSizeBasedClusteringPlanStrategy"}),"\n. The difference is that the output group is 1 and file group id remains the same,\nwhile ",(0,s.jsx)(t.code,{children:"SparkSizeBasedClusteringPlanStrategy"})," can create multiple file groups with newer fileIds."]}),"\n",(0,s.jsx)(t.h4,{id:"sparkconsistentbucketclusteringplanstrategy",children:"SparkConsistentBucketClusteringPlanStrategy"}),"\n",(0,s.jsx)(t.p,{children:"This strategy is specifically used for consistent bucket index. This will be leveraged to expand your bucket index (from\nstatic partitioning to dynamic). Typically, users don\u2019t need to use this strategy. Hudi internally uses this for\ndynamically expanding the buckets for bucket index datasets."}),"\n",(0,s.jsx)(t.admonition,{title:"The latter two strategies are applicable only for the Spark engine.",type:"note"}),"\n",(0,s.jsx)(t.h3,{id:"execution-strategy",children:"Execution Strategy"}),"\n",(0,s.jsxs)(t.p,{children:["After building the clustering groups in the planning phase, Hudi applies execution strategy, for each group, primarily\nbased on sort columns and size. The strategy can be specified using the\nconfig ",(0,s.jsx)(t.a,{href:"/docs/configurations/#hoodieclusteringexecutionstrategyclass",children:"hoodie.clustering.execution.strategy.class"}),". By\ndefault, Hudi sorts the file groups in the plan by the specified columns, while meeting the configured target file\nsizes."]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.execution.strategy.class"}),(0,s.jsx)(t.td,{children:"org.apache.hudi.client.clustering.run.strategy.SparkSortAndSizeExecutionStrategy (Optional)"}),(0,s.jsxs)(t.td,{children:["Config to provide a strategy class (subclass of RunClusteringStrategy) to define how the clustering plan is executed. By default, we sort the file groups in th plan by the specified columns, while meeting the configured target file sizes.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: EXECUTION_STRATEGY_CLASS_NAME"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.7.0"})]})]})})]}),"\n",(0,s.jsx)(t.p,{children:"The available strategies are as follows:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"SPARK_SORT_AND_SIZE_EXECUTION_STRATEGY"}),": Uses bulk_insert to re-write data from input file groups.","\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["Set ",(0,s.jsx)(t.code,{children:"hoodie.clustering.execution.strategy.class"}),"\nto ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.run.strategy.SparkSortAndSizeExecutionStrategy"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.sort.columns"}),": Columns to sort the data while clustering. This goes in\nconjunction with layout optimization strategies depending on your query predicates. One can set comma separated\nlist of columns that needs to be sorted in this config."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"JAVA_SORT_AND_SIZE_EXECUTION_STRATEGY"}),": Similar to ",(0,s.jsx)(t.code,{children:"SPARK_SORT_AND_SIZE_EXECUTION_STRATEGY"}),", for the Java and Flink\nengines. Set ",(0,s.jsx)(t.code,{children:"hoodie.clustering.execution.strategy.class"}),"\nto ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.run.strategy.JavaSortAndSizeExecutionStrategy"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"SPARK_CONSISTENT_BUCKET_EXECUTION_STRATEGY"}),": As the name implies, this is applicable to dynamically expand\nconsistent bucket index and only applicable to the Spark engine. Set ",(0,s.jsx)(t.code,{children:"hoodie.clustering.execution.strategy.class"}),"\nto ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.run.strategy.SparkConsistentBucketClusteringExecutionStrategy"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"update-strategy",children:"Update Strategy"}),"\n",(0,s.jsxs)(t.p,{children:["Currently, clustering can only be scheduled for tables/partitions not receiving any concurrent updates. By default,\nthe config for update strategy - ",(0,s.jsx)(t.a,{href:"/docs/configurations/#hoodieclusteringupdatesstrategy",children:(0,s.jsx)(t.code,{children:"hoodie.clustering.updates.strategy"})})," is set to ",(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:"SparkRejectUpdateStrategy"})}),". If some file group has updates during clustering then it will reject updates and throw an\nexception. However, in some use-cases updates are very sparse and do not touch most file groups. The default strategy to\nsimply reject updates does not seem fair. In such use-cases, users can set the config to ",(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:"SparkAllowUpdateStrategy"})}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["We discussed the critical strategy configurations. All other configurations related to clustering are\nlisted ",(0,s.jsx)(t.a,{href:"/docs/configurations/#Clustering-Configs",children:"here"}),". Out of this list, a few configurations that will be very useful\nfor inline or async clustering are shown below with code samples."]}),"\n",(0,s.jsx)(t.h2,{id:"inline-clustering",children:"Inline clustering"}),"\n",(0,s.jsx)(t.p,{children:"Inline clustering happens synchronously with the regular ingestion writer or as part of the data ingestion pipeline. This means the next round of ingestion cannot proceed until the clustering is complete With inline clustering, Hudi will schedule, plan clustering operations after each commit is completed and execute the clustering plans after it\u2019s created. This is the simplest deployment model to run because it\u2019s easier to manage than running different asynchronous Spark jobs. This mode is supported on Spark Datasource, Flink, Spark-SQL and DeltaStreamer in a sync-once mode."}),"\n",(0,s.jsxs)(t.p,{children:["For this deployment mode, please enable and set: ",(0,s.jsx)(t.code,{children:"hoodie.clustering.inline"})]}),"\n",(0,s.jsxs)(t.p,{children:["To choose how often clustering is triggered, also set: ",(0,s.jsx)(t.code,{children:"hoodie.clustering.inline.max.commits"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"Inline clustering can be setup easily using spark dataframe options.\nSee sample below:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-scala",children:'import org.apache.hudi.QuickstartUtils._\nimport scala.collection.JavaConversions._\nimport org.apache.spark.sql.SaveMode._\nimport org.apache.hudi.DataSourceReadOptions._\nimport org.apache.hudi.DataSourceWriteOptions._\nimport org.apache.hudi.config.HoodieWriteConfig._\n\n\nval df = //generate data frame\ndf.write.format("org.apache.hudi").\n options(getQuickstartWriteConfigs).\n option("hoodie.datasource.write.precombine.field", "ts").\n option("hoodie.datasource.write.recordkey.field", "uuid").\n option("hoodie.datasource.write.partitionpath.field", "partitionpath").\n option("hoodie.table.name", "tableName").\n option("hoodie.parquet.small.file.limit", "0").\n option("hoodie.clustering.inline", "true").\n option("hoodie.clustering.inline.max.commits", "4").\n option("hoodie.clustering.plan.strategy.target.file.max.bytes", "1073741824").\n option("hoodie.clustering.plan.strategy.small.file.limit", "629145600").\n option("hoodie.clustering.plan.strategy.sort.columns", "column1,column2"). //optional, if sorting is needed as part of rewriting data\n mode(Append).\n save("dfs://location");\n'})}),"\n",(0,s.jsx)(t.h2,{id:"async-clustering",children:"Async Clustering"}),"\n",(0,s.jsx)(t.p,{children:"Async clustering runs the clustering table service in the background without blocking the regular ingestions writers. There are three different ways to deploy an asynchronous clustering process:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Asynchronous execution within the same process"}),": In this deployment mode, Hudi will schedule and plan the clustering operations after each commit is completed as part of the ingestion pipeline. Separately, Hudi spins up another thread within the same job and executes the clustering table service. This is supported by Spark Streaming, Flink and DeltaStreamer in continuous mode. For this deployment mode, please enable ",(0,s.jsx)(t.code,{children:"hoodie.clustering.async.enabled"})," and ",(0,s.jsx)(t.code,{children:"hoodie.clustering.async.max.commits\u200b"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Asynchronous scheduling and execution by a separate process"}),": In this deployment mode, the application will write data to a Hudi table as part of the ingestion pipeline. A separate clustering job will schedule, plan and execute the clustering operation. By running a different job for the clustering operation, it rebalances how Hudi uses compute resources: fewer compute resources are needed for the ingestion, which makes ingestion latency stable, and an independent set of compute resources are reserved for the clustering process. Please configure the lock providers for the concurrency control among all jobs (both writer and table service jobs). In general, configure lock providers when there are two different jobs or two different processes occurring. All writers support this deployment model. For this deployment mode, no clustering configs should be set for the ingestion writer."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Scheduling inline and executing async"}),": In this deployment mode, the application ingests data and schedules the clustering in one job; in another, the application executes the clustering plan. The supported writers (see below) won\u2019t be blocked from ingesting data. If the metadata table is enabled, a lock provider is not needed. However, if the metadata table is enabled, please ensure all jobs have the lock providers configured for concurrency control. All writers support this deployment option. For this deployment mode, please enable, ",(0,s.jsx)(t.code,{children:"hoodie.clustering.schedule.inline"})," and ",(0,s.jsx)(t.code,{children:"hoodie.clustering.async.enabled"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Hudi supports ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/concurrency_control#enabling-multi-writing",children:"multi-writers"})," which provides\nsnapshot isolation between multiple table services, thus allowing writers to continue with ingestion while clustering\nruns in the background."]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.async.enabled"}),(0,s.jsx)(t.td,{children:"false (Optional)"}),(0,s.jsxs)(t.td,{children:["Enable running of clustering service, asynchronously as inserts happen on the table.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: ASYNC_CLUSTERING_ENABLE"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.7.0"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.async.max.commits"}),(0,s.jsx)(t.td,{children:"4 (Optional)"}),(0,s.jsxs)(t.td,{children:["Config to control frequency of async clustering",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: ASYNC_CLUSTERING_MAX_COMMITS"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.9.0"})]})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"setup-asynchronous-clustering",children:"Setup Asynchronous Clustering"}),"\n",(0,s.jsxs)(t.p,{children:["Users can leverage ",(0,s.jsx)(t.a,{href:"https://cwiki.apache.org/confluence/display/HUDI/RFC+-+19+Clustering+data+for+freshness+and+query+performance#RFC19Clusteringdataforfreshnessandqueryperformance-SetupforAsyncclusteringJob",children:"HoodieClusteringJob"}),"\nto setup 2-step asynchronous clustering."]}),"\n",(0,s.jsx)(t.h3,{id:"hoodieclusteringjob",children:"HoodieClusteringJob"}),"\n",(0,s.jsxs)(t.p,{children:["By specifying the ",(0,s.jsx)(t.code,{children:"scheduleAndExecute"})," mode both schedule as well as clustering can be achieved in the same step.\nThe appropriate mode can be specified using ",(0,s.jsx)(t.code,{children:"-mode"})," or ",(0,s.jsx)(t.code,{children:"-m"})," option. There are three modes:"]}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"schedule"}),": Make a clustering plan. This gives an instant which can be passed in execute mode."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"execute"}),": Execute a clustering plan at a particular instant. If no instant-time is specified, HoodieClusteringJob will execute for the earliest instant on the Hudi timeline."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"scheduleAndExecute"}),": Make a clustering plan first and execute that plan immediately."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Note that to run this job while the original writer is still running, please enable multi-writing:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"hoodie.write.concurrency.mode=optimistic_concurrency_control\nhoodie.write.lock.provider=org.apache.hudi.client.transaction.lock.ZookeeperBasedLockProvider\n"})}),"\n",(0,s.jsx)(t.p,{children:"A sample spark-submit command to setup HoodieClusteringJob is as below:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'spark-submit \\\n--jars "packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar,packaging/hudi-spark-bundle/target/hudi-spark3.5-bundle_2.12-1.0.0.jar" \\\n--class org.apache.hudi.utilities.HoodieClusteringJob \\\n/path/to/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar \\\n--props /path/to/config/clusteringjob.properties \\\n--mode scheduleAndExecute \\\n--base-path /path/to/hudi_table/basePath \\\n--table-name hudi_table_schedule_clustering \\\n--spark-memory 1g\n'})}),"\n",(0,s.jsxs)(t.p,{children:["A sample ",(0,s.jsx)(t.code,{children:"clusteringjob.properties"})," file:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"hoodie.clustering.async.enabled=true\nhoodie.clustering.async.max.commits=4\nhoodie.clustering.plan.strategy.target.file.max.bytes=1073741824\nhoodie.clustering.plan.strategy.small.file.limit=629145600\nhoodie.clustering.execution.strategy.class=org.apache.hudi.client.clustering.run.strategy.SparkSortAndSizeExecutionStrategy\nhoodie.clustering.plan.strategy.sort.columns=column1,column2\n"})}),"\n",(0,s.jsx)(t.h3,{id:"hoodiestreamer",children:"HoodieStreamer"}),"\n",(0,s.jsxs)(t.p,{children:["This brings us to our users' favorite utility in Hudi. Now, we can trigger asynchronous clustering with Hudi Streamer.\nJust set the ",(0,s.jsx)(t.code,{children:"hoodie.clustering.async.enabled"})," config to true and specify other clustering config in properties file\nwhose location can be pased as ",(0,s.jsx)(t.code,{children:"\u2014props"})," when starting the Hudi Streamer (just like in the case of HoodieClusteringJob)."]}),"\n",(0,s.jsx)(t.p,{children:"A sample spark-submit command to setup HoodieStreamer is as below:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'spark-submit \\\n--jars "packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar,packaging/hudi-spark-bundle/target/hudi-spark3.5-bundle_2.12-1.0.0.jar" \\\n--class org.apache.hudi.utilities.streamer.HoodieStreamer \\\n/path/to/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar \\\n--props /path/to/config/clustering_kafka.properties \\\n--schemaprovider-class org.apache.hudi.utilities.schema.SchemaRegistryProvider \\\n--source-class org.apache.hudi.utilities.sources.AvroKafkaSource \\\n--source-ordering-field impresssiontime \\\n--table-type COPY_ON_WRITE \\\n--target-base-path /path/to/hudi_table/basePath \\\n--target-table impressions_cow_cluster \\\n--op INSERT \\\n--hoodie-conf hoodie.clustering.async.enabled=true \\\n--continuous\n'})}),"\n",(0,s.jsx)(t.h3,{id:"spark-structured-streaming",children:"Spark Structured Streaming"}),"\n",(0,s.jsx)(t.p,{children:"We can also enable asynchronous clustering with Spark structured streaming sink as shown below."}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-scala",children:'val commonOpts = Map(\n "hoodie.insert.shuffle.parallelism" -> "4",\n "hoodie.upsert.shuffle.parallelism" -> "4",\n "hoodie.datasource.write.recordkey.field" -> "_row_key",\n "hoodie.datasource.write.partitionpath.field" -> "partition",\n "hoodie.datasource.write.precombine.field" -> "timestamp",\n "hoodie.table.name" -> "hoodie_test"\n)\n\ndef getAsyncClusteringOpts(isAsyncClustering: String, \n clusteringNumCommit: String, \n executionStrategy: String):Map[String, String] = {\n commonOpts + (DataSourceWriteOptions.ASYNC_CLUSTERING_ENABLE.key -> isAsyncClustering,\n HoodieClusteringConfig.ASYNC_CLUSTERING_MAX_COMMITS.key -> clusteringNumCommit,\n HoodieClusteringConfig.EXECUTION_STRATEGY_CLASS_NAME.key -> executionStrategy\n )\n}\n\ndef initStreamingWriteFuture(hudiOptions: Map[String, String]): Future[Unit] = {\n val streamingInput = // define the source of streaming\n Future {\n println("streaming starting")\n streamingInput\n .writeStream\n .format("org.apache.hudi")\n .options(hudiOptions)\n .option("checkpointLocation", basePath + "/checkpoint")\n .mode(Append)\n .start()\n .awaitTermination(10000)\n println("streaming ends")\n }\n}\n\ndef structuredStreamingWithClustering(): Unit = {\n val df = //generate data frame\n val hudiOptions = getClusteringOpts("true", "1", "org.apache.hudi.client.clustering.run.strategy.SparkSortAndSizeExecutionStrategy")\n val f1 = initStreamingWriteFuture(hudiOptions)\n Await.result(f1, Duration.Inf)\n}\n'})}),"\n",(0,s.jsx)(t.h2,{id:"java-client",children:"Java Client"}),"\n",(0,s.jsxs)(t.p,{children:["Clustering is also supported via Java client. Plan strategy ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.plan.strategy.JavaSizeBasedClusteringPlanStrategy"}),"\nand execution strategy ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.run.strategy.JavaSortAndSizeExecutionStrategy"})," are supported\nout-of-the-box. Note that as of now only linear sort is supported in Java execution strategy."]}),"\n",(0,s.jsx)(t.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,s.jsx)("h3",{children:"Videos"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://www.youtube.com/watch?v=R_sm4wlGXuE",children:"Understanding Clustering in Apache Hudi and the Benefits of Asynchronous Clustering"})}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},7004:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/clustering1_new-d67c9e691d235b140f7c80d68400f425.png"},67491:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/clustering2_new-0837c07b6db44ab75873633f0eab2e2c.png"},14438:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/clustering_3-8bc286ab44c48137f8409b5c342a7207.png"},28453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>l});var n=i(96540);const s={},r=n.createContext(s);function a(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[34691],{28372:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>u,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"clustering","title":"Clustering","description":"Background","source":"@site/docs/clustering.md","sourceDirName":".","slug":"/clustering","permalink":"/docs/next/clustering","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/clustering.md","tags":[],"version":"current","frontMatter":{"title":"Clustering","summary":"In this page, we describe async compaction in Hudi.","toc":true,"last_modified_at":null},"sidebar":"docs","previous":{"title":"Compaction","permalink":"/docs/next/compaction"},"next":{"title":"Indexing","permalink":"/docs/next/metadata_indexing"}}');var s=i(74848),r=i(28453);const a={title:"Clustering",summary:"In this page, we describe async compaction in Hudi.",toc:!0,last_modified_at:null},l=void 0,o={},c=[{value:"Background",id:"background",level:2},{value:"How is compaction different from clustering?",id:"how-is-compaction-different-from-clustering",level:2},{value:"Clustering Architecture",id:"clustering-architecture",level:2},{value:"Overall, there are 2 steps to clustering",id:"overall-there-are-2-steps-to-clustering",level:3},{value:"Schedule clustering",id:"schedule-clustering",level:3},{value:"Execute clustering",id:"execute-clustering",level:3},{value:"Clustering Usecases",id:"clustering-usecases",level:2},{value:"Batching small files",id:"batching-small-files",level:3},{value:"Cluster by sort key",id:"cluster-by-sort-key",level:3},{value:"Clustering Strategies",id:"clustering-strategies",level:2},{value:"Plan Strategy",id:"plan-strategy",level:3},{value:"Size-based clustering strategies",id:"size-based-clustering-strategies",level:4},{value:"SparkSingleFileSortPlanStrategy",id:"sparksinglefilesortplanstrategy",level:4},{value:"SparkConsistentBucketClusteringPlanStrategy",id:"sparkconsistentbucketclusteringplanstrategy",level:4},{value:"Execution Strategy",id:"execution-strategy",level:3},{value:"Update Strategy",id:"update-strategy",level:3},{value:"Inline clustering",id:"inline-clustering",level:2},{value:"Async Clustering",id:"async-clustering",level:2},{value:"Setup Asynchronous Clustering",id:"setup-asynchronous-clustering",level:2},{value:"HoodieClusteringJob",id:"hoodieclusteringjob",level:3},{value:"HoodieStreamer",id:"hoodiestreamer",level:3},{value:"Spark Structured Streaming",id:"spark-structured-streaming",level:3},{value:"Java Client",id:"java-client",level:2},{value:"Related Resources",id:"related-resources",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"background",children:"Background"}),"\n",(0,s.jsxs)(t.p,{children:["Apache Hudi brings stream processing to big data, providing fresh data while being an order of magnitude efficient over traditional batch processing. In a data lake/warehouse, one of the key trade-offs is between ingestion speed and query performance. Data ingestion typically prefers small files to improve parallelism and make data available to queries as soon as possible. However, query performance degrades poorly with a lot of small files. Also, during ingestion, data is typically co-located based on arrival time. However, the query engines perform better when the data frequently queried is co-located together. In most architectures each of these systems tend to add optimizations independently to improve performance which hits limitations due to un-optimized data layouts. This doc introduces a new kind of table service called clustering ",(0,s.jsx)(t.a,{href:"https://cwiki.apache.org/confluence/display/HUDI/RFC+-+19+Clustering+data+for+freshness+and+query+performance",children:"[RFC-19]"})," to reorganize data for improved query performance without compromising on ingestion speed."]}),"\n",(0,s.jsx)(t.h2,{id:"how-is-compaction-different-from-clustering",children:"How is compaction different from clustering?"}),"\n",(0,s.jsxs)(t.p,{children:["Hudi is modeled like a log-structured storage engine with multiple versions of the data.\nParticularly, ",(0,s.jsx)(t.a,{href:"/docs/table_types#merge-on-read-table",children:"Merge-On-Read"}),"\ntables in Hudi store data using a combination of base file in columnar format and row-based delta logs that contain\nupdates. Compaction is a way to merge the delta logs with base files to produce the latest file slices with the most\nrecent snapshot of data. Compaction helps to keep the query performance in check (larger delta log files would incur\nlonger merge times on query side). On the other hand, clustering is a data layout optimization technique. One can stitch\ntogether small files into larger files using clustering. Additionally, data can be clustered by sort key so that queries\ncan take advantage of data locality."]}),"\n",(0,s.jsx)(t.h2,{id:"clustering-architecture",children:"Clustering Architecture"}),"\n",(0,s.jsxs)(t.p,{children:["At a high level, Hudi provides different operations such as insert/upsert/bulk_insert through it\u2019s write client API to be able to write data to a Hudi table. To be able to choose a trade-off between file size and ingestion speed, Hudi provides a knob ",(0,s.jsx)(t.code,{children:"hoodie.parquet.small.file.limit"})," to be able to configure the smallest allowable file size. Users are able to configure the small file ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/configurations/#hoodieparquetsmallfilelimit",children:"soft limit"})," to ",(0,s.jsx)(t.code,{children:"0"})," to force new data to go into a new set of filegroups or set it to a higher value to ensure new data gets \u201cpadded\u201d to existing files until it meets that limit that adds to ingestion latencies."]}),"\n",(0,s.jsx)(t.p,{children:"To be able to support an architecture that allows for fast ingestion without compromising query performance, we have introduced a \u2018clustering\u2019 service to rewrite the data to optimize Hudi data lake file layout."}),"\n",(0,s.jsx)(t.p,{children:"Clustering table service can run asynchronously or synchronously adding a new action type called \u201cREPLACE\u201d, that will mark the clustering action in the Hudi metadata timeline."}),"\n",(0,s.jsx)(t.h3,{id:"overall-there-are-2-steps-to-clustering",children:"Overall, there are 2 steps to clustering"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Scheduling clustering: Create a clustering plan using a pluggable clustering strategy."}),"\n",(0,s.jsx)(t.li,{children:"Execute clustering: Process the plan using an execution strategy to create new files and replace old files."}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"schedule-clustering",children:"Schedule clustering"}),"\n",(0,s.jsx)(t.p,{children:"Following steps are followed to schedule clustering."}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Identify files that are eligible for clustering: Depending on the clustering strategy chosen, the scheduling logic will identify the files eligible for clustering."}),"\n",(0,s.jsx)(t.li,{children:"Group files that are eligible for clustering based on specific criteria. Each group is expected to have data size in multiples of \u2018targetFileSize\u2019. Grouping is done as part of \u2018strategy\u2019 defined in the plan. Additionally, there is an option to put a cap on group size to improve parallelism and avoid shuffling large amounts of data."}),"\n",(0,s.jsxs)(t.li,{children:["Finally, the clustering plan is saved to the timeline in an avro ",(0,s.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-common/src/main/avro/HoodieClusteringPlan.avsc",children:"metadata format"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"execute-clustering",children:"Execute clustering"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Read the clustering plan and get the \u2018clusteringGroups\u2019 that mark the file groups that need to be clustered."}),"\n",(0,s.jsx)(t.li,{children:"For each group, we instantiate appropriate strategy class with strategyParams (example: sortColumns) and apply that strategy to rewrite the data."}),"\n",(0,s.jsxs)(t.li,{children:["Create a \u201cREPLACE\u201d commit and update the metadata in ",(0,s.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-common/src/main/java/org/apache/hudi/common/model/HoodieReplaceCommitMetadata.java",children:"HoodieReplaceCommitMetadata"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Clustering Service builds on Hudi\u2019s MVCC based design to allow for writers to continue to insert new data while clustering action runs in the background to reformat data layout, ensuring snapshot isolation between concurrent readers and writers."}),"\n",(0,s.jsx)(t.p,{children:"NOTE: Clustering can only be scheduled for tables / partitions not receiving any concurrent updates. In the future, concurrent updates use-case will be supported as well."}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"Clustering example",src:i(7004).A+"",width:"6827",height:"3334"}),"\n",(0,s.jsx)(t.em,{children:"Figure: Illustrating query performance improvements by clustering"})]}),"\n",(0,s.jsx)(t.h2,{id:"clustering-usecases",children:"Clustering Usecases"}),"\n",(0,s.jsx)(t.h3,{id:"batching-small-files",children:"Batching small files"}),"\n",(0,s.jsx)(t.p,{children:"As mentioned in the intro, streaming ingestion generally results in smaller files in your data lake. But having a lot of\nsuch small files could lead to higher query latency. From our experience supporting community users, there are quite a\nfew users who are using Hudi just for small file handling capabilities. So, you could employ clustering to batch a lot\nof such small files into larger ones."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Batching small files",src:i(67491).A+"",width:"3100",height:"1620"})}),"\n",(0,s.jsx)(t.h3,{id:"cluster-by-sort-key",children:"Cluster by sort key"}),"\n",(0,s.jsx)(t.p,{children:"Another classic problem in data lake is the arrival time vs event time problem. Generally you write data based on\narrival time, while query predicates do not sit well with it. With clustering, you can re-write your data by sorting\nbased on query predicates and so, your data skipping will be very efficient and your query can ignore scanning a lot of\nunnecessary data."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Batching small files",src:i(14438).A+"",width:"5003",height:"1464"})}),"\n",(0,s.jsx)(t.h2,{id:"clustering-strategies",children:"Clustering Strategies"}),"\n",(0,s.jsx)(t.p,{children:"On a high level, clustering creates a plan based on a configurable strategy, groups eligible files based on specific\ncriteria and then executes the plan. As mentioned before, clustering plan as well as execution depends on configurable\nstrategy. These strategies can be broadly classified into three types: clustering plan strategy, execution strategy and\nupdate strategy."}),"\n",(0,s.jsx)(t.h3,{id:"plan-strategy",children:"Plan Strategy"}),"\n",(0,s.jsxs)(t.p,{children:["This strategy comes into play while creating clustering plan. It helps to decide what file groups should be clustered\nand how many output file groups should the clustering produce. Note that these strategies are easily pluggable using the\nconfig ",(0,s.jsx)(t.a,{href:"/docs/configurations#hoodieclusteringplanstrategyclass",children:"hoodie.clustering.plan.strategy.class"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"Different plan strategies are as follows:"}),"\n",(0,s.jsx)(t.h4,{id:"size-based-clustering-strategies",children:"Size-based clustering strategies"}),"\n",(0,s.jsxs)(t.p,{children:["This strategy creates clustering groups based on max size allowed per group. Also, it excludes files that are greater\nthan the small file limit from the clustering plan. Available strategies depending on write client\nare: ",(0,s.jsx)(t.code,{children:"SparkSizeBasedClusteringPlanStrategy"}),", ",(0,s.jsx)(t.code,{children:"FlinkSizeBasedClusteringPlanStrategy"}),"\nand ",(0,s.jsx)(t.code,{children:"JavaSizeBasedClusteringPlanStrategy"}),". Furthermore, Hudi provides flexibility to include or exclude partitions for\nclustering, tune the file size limits, maximum number of output groups. Please refer to ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations/#hoodieclusteringplanstrategysmallfilelimit",children:"hoodie.clustering.plan.strategy.small.file.limit"}),"\n, ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations/#hoodieclusteringplanstrategymaxnumgroups",children:"hoodie.clustering.plan.strategy.max.num.groups"}),", ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations/#hoodieclusteringplanstrategymaxbytespergroup",children:"hoodie.clustering.plan.strategy.max.bytes.per.group"}),"\n, ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations/#hoodieclusteringplanstrategytargetfilemaxbytes",children:"hoodie.clustering.plan.strategy.target.file.max.bytes"})," for more details."]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.plan.strategy.partition.selected"}),(0,s.jsxs)(t.td,{children:["N/A ",(0,s.jsx)(t.strong,{children:"(Required)"})]}),(0,s.jsxs)(t.td,{children:["Comma separated list of partitions to run clustering",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: PARTITION_SELECTED"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.11.0"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.plan.strategy.partition.regex.pattern"}),(0,s.jsxs)(t.td,{children:["N/A ",(0,s.jsx)(t.strong,{children:"(Required)"})]}),(0,s.jsxs)(t.td,{children:["Filter clustering partitions that matched regex pattern",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: PARTITION_REGEX_PATTERN"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.11.0"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.plan.partition.filter.mode"}),(0,s.jsx)(t.td,{children:"NONE (Optional)"}),(0,s.jsxs)(t.td,{children:["Partition filter mode used in the creation of clustering plan. Possible values:",(0,s.jsx)("br",{}),(0,s.jsxs)("ul",{children:[(0,s.jsxs)("li",{children:[(0,s.jsx)(t.code,{children:"NONE"}),": Do not filter partitions. The clustering plan will include all partitions that have clustering candidates."]}),(0,s.jsxs)("li",{children:[(0,s.jsx)(t.code,{children:"RECENT_DAYS"}),": This filter assumes that your data is partitioned by date. The clustering plan will only include partitions from K days ago to N days ago, where K >= N. K is determined by ",(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.daybased.lookback.partitions"})," and N is determined by ",(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.daybased.skipfromlatest.partitions"}),"."]}),(0,s.jsxs)("li",{children:[(0,s.jsx)(t.code,{children:"SELECTED_PARTITIONS"}),": The clustering plan will include only partition paths with names that sort within the inclusive range [",(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.cluster.begin.partition"}),", ",(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.cluster.end.partition"}),"]."]}),(0,s.jsxs)("li",{children:[(0,s.jsx)(t.code,{children:"DAY_ROLLING"}),": To determine the partitions in the clustering plan, the eligible partitions will be sorted in ascending order. Each partition will have an index i in that list. The clustering plan will only contain partitions such that i mod 24 = H, where H is the current hour of the day (from 0 to 23)."]})]}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: PLAN_PARTITION_FILTER_MODE_NAME"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.11.0"})]})]})]})]}),"\n",(0,s.jsx)(t.h4,{id:"sparksinglefilesortplanstrategy",children:"SparkSingleFileSortPlanStrategy"}),"\n",(0,s.jsxs)(t.p,{children:["In this strategy, clustering group for each partition is built in the same way as ",(0,s.jsx)(t.code,{children:"SparkSizeBasedClusteringPlanStrategy"}),"\n. The difference is that the output group is 1 and file group id remains the same,\nwhile ",(0,s.jsx)(t.code,{children:"SparkSizeBasedClusteringPlanStrategy"})," can create multiple file groups with newer fileIds."]}),"\n",(0,s.jsx)(t.h4,{id:"sparkconsistentbucketclusteringplanstrategy",children:"SparkConsistentBucketClusteringPlanStrategy"}),"\n",(0,s.jsx)(t.p,{children:"This strategy is specifically used for consistent bucket index. This will be leveraged to expand your bucket index (from\nstatic partitioning to dynamic). Typically, users don\u2019t need to use this strategy. Hudi internally uses this for\ndynamically expanding the buckets for bucket index datasets."}),"\n",(0,s.jsx)(t.admonition,{title:"The latter two strategies are applicable only for the Spark engine.",type:"note"}),"\n",(0,s.jsx)(t.h3,{id:"execution-strategy",children:"Execution Strategy"}),"\n",(0,s.jsxs)(t.p,{children:["After building the clustering groups in the planning phase, Hudi applies execution strategy, for each group, primarily\nbased on sort columns and size. The strategy can be specified using the\nconfig ",(0,s.jsx)(t.a,{href:"/docs/configurations/#hoodieclusteringexecutionstrategyclass",children:"hoodie.clustering.execution.strategy.class"}),". By\ndefault, Hudi sorts the file groups in the plan by the specified columns, while meeting the configured target file\nsizes."]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.execution.strategy.class"}),(0,s.jsx)(t.td,{children:"org.apache.hudi.client.clustering.run.strategy.SparkSortAndSizeExecutionStrategy (Optional)"}),(0,s.jsxs)(t.td,{children:["Config to provide a strategy class (subclass of RunClusteringStrategy) to define how the clustering plan is executed. By default, we sort the file groups in th plan by the specified columns, while meeting the configured target file sizes.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: EXECUTION_STRATEGY_CLASS_NAME"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.7.0"})]})]})})]}),"\n",(0,s.jsx)(t.p,{children:"The available strategies are as follows:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"SPARK_SORT_AND_SIZE_EXECUTION_STRATEGY"}),": Uses bulk_insert to re-write data from input file groups.","\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["Set ",(0,s.jsx)(t.code,{children:"hoodie.clustering.execution.strategy.class"}),"\nto ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.run.strategy.SparkSortAndSizeExecutionStrategy"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.sort.columns"}),": Columns to sort the data while clustering. This goes in\nconjunction with layout optimization strategies depending on your query predicates. One can set comma separated\nlist of columns that needs to be sorted in this config."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"JAVA_SORT_AND_SIZE_EXECUTION_STRATEGY"}),": Similar to ",(0,s.jsx)(t.code,{children:"SPARK_SORT_AND_SIZE_EXECUTION_STRATEGY"}),", for the Java and Flink\nengines. Set ",(0,s.jsx)(t.code,{children:"hoodie.clustering.execution.strategy.class"}),"\nto ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.run.strategy.JavaSortAndSizeExecutionStrategy"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"SPARK_CONSISTENT_BUCKET_EXECUTION_STRATEGY"}),": As the name implies, this is applicable to dynamically expand\nconsistent bucket index and only applicable to the Spark engine. Set ",(0,s.jsx)(t.code,{children:"hoodie.clustering.execution.strategy.class"}),"\nto ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.run.strategy.SparkConsistentBucketClusteringExecutionStrategy"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"update-strategy",children:"Update Strategy"}),"\n",(0,s.jsxs)(t.p,{children:["Currently, clustering can only be scheduled for tables/partitions not receiving any concurrent updates. By default,\nthe config for update strategy - ",(0,s.jsx)(t.a,{href:"/docs/configurations/#hoodieclusteringupdatesstrategy",children:(0,s.jsx)(t.code,{children:"hoodie.clustering.updates.strategy"})})," is set to ",(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:"SparkRejectUpdateStrategy"})}),". If some file group has updates during clustering then it will reject updates and throw an\nexception. However, in some use-cases updates are very sparse and do not touch most file groups. The default strategy to\nsimply reject updates does not seem fair. In such use-cases, users can set the config to ",(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:"SparkAllowUpdateStrategy"})}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["We discussed the critical strategy configurations. All other configurations related to clustering are\nlisted ",(0,s.jsx)(t.a,{href:"/docs/configurations/#Clustering-Configs",children:"here"}),". Out of this list, a few configurations that will be very useful\nfor inline or async clustering are shown below with code samples."]}),"\n",(0,s.jsx)(t.h2,{id:"inline-clustering",children:"Inline clustering"}),"\n",(0,s.jsx)(t.p,{children:"Inline clustering happens synchronously with the regular ingestion writer or as part of the data ingestion pipeline. This means the next round of ingestion cannot proceed until the clustering is complete With inline clustering, Hudi will schedule, plan clustering operations after each commit is completed and execute the clustering plans after it\u2019s created. This is the simplest deployment model to run because it\u2019s easier to manage than running different asynchronous Spark jobs. This mode is supported on Spark Datasource, Flink, Spark-SQL and DeltaStreamer in a sync-once mode."}),"\n",(0,s.jsxs)(t.p,{children:["For this deployment mode, please enable and set: ",(0,s.jsx)(t.code,{children:"hoodie.clustering.inline"})]}),"\n",(0,s.jsxs)(t.p,{children:["To choose how often clustering is triggered, also set: ",(0,s.jsx)(t.code,{children:"hoodie.clustering.inline.max.commits"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"Inline clustering can be setup easily using spark dataframe options.\nSee sample below:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-scala",children:'import org.apache.hudi.QuickstartUtils._\nimport scala.collection.JavaConversions._\nimport org.apache.spark.sql.SaveMode._\nimport org.apache.hudi.DataSourceReadOptions._\nimport org.apache.hudi.DataSourceWriteOptions._\nimport org.apache.hudi.config.HoodieWriteConfig._\n\n\nval df = //generate data frame\ndf.write.format("org.apache.hudi").\n options(getQuickstartWriteConfigs).\n option("hoodie.datasource.write.precombine.field", "ts").\n option("hoodie.datasource.write.recordkey.field", "uuid").\n option("hoodie.datasource.write.partitionpath.field", "partitionpath").\n option("hoodie.table.name", "tableName").\n option("hoodie.parquet.small.file.limit", "0").\n option("hoodie.clustering.inline", "true").\n option("hoodie.clustering.inline.max.commits", "4").\n option("hoodie.clustering.plan.strategy.target.file.max.bytes", "1073741824").\n option("hoodie.clustering.plan.strategy.small.file.limit", "629145600").\n option("hoodie.clustering.plan.strategy.sort.columns", "column1,column2"). //optional, if sorting is needed as part of rewriting data\n mode(Append).\n save("dfs://location");\n'})}),"\n",(0,s.jsx)(t.h2,{id:"async-clustering",children:"Async Clustering"}),"\n",(0,s.jsx)(t.p,{children:"Async clustering runs the clustering table service in the background without blocking the regular ingestions writers. There are three different ways to deploy an asynchronous clustering process:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Asynchronous execution within the same process"}),": In this deployment mode, Hudi will schedule and plan the clustering operations after each commit is completed as part of the ingestion pipeline. Separately, Hudi spins up another thread within the same job and executes the clustering table service. This is supported by Spark Streaming, Flink and DeltaStreamer in continuous mode. For this deployment mode, please enable ",(0,s.jsx)(t.code,{children:"hoodie.clustering.async.enabled"})," and ",(0,s.jsx)(t.code,{children:"hoodie.clustering.async.max.commits\u200b"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Asynchronous scheduling and execution by a separate process"}),": In this deployment mode, the application will write data to a Hudi table as part of the ingestion pipeline. A separate clustering job will schedule, plan and execute the clustering operation. By running a different job for the clustering operation, it rebalances how Hudi uses compute resources: fewer compute resources are needed for the ingestion, which makes ingestion latency stable, and an independent set of compute resources are reserved for the clustering process. Please configure the lock providers for the concurrency control among all jobs (both writer and table service jobs). In general, configure lock providers when there are two different jobs or two different processes occurring. All writers support this deployment model. For this deployment mode, no clustering configs should be set for the ingestion writer."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Scheduling inline and executing async"}),": In this deployment mode, the application ingests data and schedules the clustering in one job; in another, the application executes the clustering plan. The supported writers (see below) won\u2019t be blocked from ingesting data. If the metadata table is enabled, a lock provider is not needed. However, if the metadata table is enabled, please ensure all jobs have the lock providers configured for concurrency control. All writers support this deployment option. For this deployment mode, please enable, ",(0,s.jsx)(t.code,{children:"hoodie.clustering.schedule.inline"})," and ",(0,s.jsx)(t.code,{children:"hoodie.clustering.async.enabled"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Hudi supports ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/concurrency_control#enabling-multi-writing",children:"multi-writers"})," which provides\nsnapshot isolation between multiple table services, thus allowing writers to continue with ingestion while clustering\nruns in the background."]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.async.enabled"}),(0,s.jsx)(t.td,{children:"false (Optional)"}),(0,s.jsxs)(t.td,{children:["Enable running of clustering service, asynchronously as inserts happen on the table.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: ASYNC_CLUSTERING_ENABLE"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.7.0"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.async.max.commits"}),(0,s.jsx)(t.td,{children:"4 (Optional)"}),(0,s.jsxs)(t.td,{children:["Config to control frequency of async clustering",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: ASYNC_CLUSTERING_MAX_COMMITS"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.9.0"})]})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"setup-asynchronous-clustering",children:"Setup Asynchronous Clustering"}),"\n",(0,s.jsxs)(t.p,{children:["Users can leverage ",(0,s.jsx)(t.a,{href:"https://cwiki.apache.org/confluence/display/HUDI/RFC+-+19+Clustering+data+for+freshness+and+query+performance#RFC19Clusteringdataforfreshnessandqueryperformance-SetupforAsyncclusteringJob",children:"HoodieClusteringJob"}),"\nto setup 2-step asynchronous clustering."]}),"\n",(0,s.jsx)(t.h3,{id:"hoodieclusteringjob",children:"HoodieClusteringJob"}),"\n",(0,s.jsxs)(t.p,{children:["By specifying the ",(0,s.jsx)(t.code,{children:"scheduleAndExecute"})," mode both schedule as well as clustering can be achieved in the same step.\nThe appropriate mode can be specified using ",(0,s.jsx)(t.code,{children:"-mode"})," or ",(0,s.jsx)(t.code,{children:"-m"})," option. There are three modes:"]}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"schedule"}),": Make a clustering plan. This gives an instant which can be passed in execute mode."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"execute"}),": Execute a clustering plan at a particular instant. If no instant-time is specified, HoodieClusteringJob will execute for the earliest instant on the Hudi timeline."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"scheduleAndExecute"}),": Make a clustering plan first and execute that plan immediately."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Note that to run this job while the original writer is still running, please enable multi-writing:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"hoodie.write.concurrency.mode=optimistic_concurrency_control\nhoodie.write.lock.provider=org.apache.hudi.client.transaction.lock.ZookeeperBasedLockProvider\n"})}),"\n",(0,s.jsx)(t.p,{children:"A sample spark-submit command to setup HoodieClusteringJob is as below:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'spark-submit \\\n--jars "packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar,packaging/hudi-spark-bundle/target/hudi-spark3.5-bundle_2.12-1.0.0.jar" \\\n--class org.apache.hudi.utilities.HoodieClusteringJob \\\n/path/to/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar \\\n--props /path/to/config/clusteringjob.properties \\\n--mode scheduleAndExecute \\\n--base-path /path/to/hudi_table/basePath \\\n--table-name hudi_table_schedule_clustering \\\n--spark-memory 1g\n'})}),"\n",(0,s.jsxs)(t.p,{children:["A sample ",(0,s.jsx)(t.code,{children:"clusteringjob.properties"})," file:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"hoodie.clustering.async.enabled=true\nhoodie.clustering.async.max.commits=4\nhoodie.clustering.plan.strategy.target.file.max.bytes=1073741824\nhoodie.clustering.plan.strategy.small.file.limit=629145600\nhoodie.clustering.execution.strategy.class=org.apache.hudi.client.clustering.run.strategy.SparkSortAndSizeExecutionStrategy\nhoodie.clustering.plan.strategy.sort.columns=column1,column2\n"})}),"\n",(0,s.jsx)(t.h3,{id:"hoodiestreamer",children:"HoodieStreamer"}),"\n",(0,s.jsxs)(t.p,{children:["This brings us to our users' favorite utility in Hudi. Now, we can trigger asynchronous clustering with Hudi Streamer.\nJust set the ",(0,s.jsx)(t.code,{children:"hoodie.clustering.async.enabled"})," config to true and specify other clustering config in properties file\nwhose location can be pased as ",(0,s.jsx)(t.code,{children:"\u2014props"})," when starting the Hudi Streamer (just like in the case of HoodieClusteringJob)."]}),"\n",(0,s.jsx)(t.p,{children:"A sample spark-submit command to setup HoodieStreamer is as below:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'spark-submit \\\n--jars "packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar,packaging/hudi-spark-bundle/target/hudi-spark3.5-bundle_2.12-1.0.0.jar" \\\n--class org.apache.hudi.utilities.streamer.HoodieStreamer \\\n/path/to/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar \\\n--props /path/to/config/clustering_kafka.properties \\\n--schemaprovider-class org.apache.hudi.utilities.schema.SchemaRegistryProvider \\\n--source-class org.apache.hudi.utilities.sources.AvroKafkaSource \\\n--source-ordering-field impresssiontime \\\n--table-type COPY_ON_WRITE \\\n--target-base-path /path/to/hudi_table/basePath \\\n--target-table impressions_cow_cluster \\\n--op INSERT \\\n--hoodie-conf hoodie.clustering.async.enabled=true \\\n--continuous\n'})}),"\n",(0,s.jsx)(t.h3,{id:"spark-structured-streaming",children:"Spark Structured Streaming"}),"\n",(0,s.jsx)(t.p,{children:"We can also enable asynchronous clustering with Spark structured streaming sink as shown below."}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-scala",children:'val commonOpts = Map(\n "hoodie.insert.shuffle.parallelism" -> "4",\n "hoodie.upsert.shuffle.parallelism" -> "4",\n "hoodie.datasource.write.recordkey.field" -> "_row_key",\n "hoodie.datasource.write.partitionpath.field" -> "partition",\n "hoodie.datasource.write.precombine.field" -> "timestamp",\n "hoodie.table.name" -> "hoodie_test"\n)\n\ndef getAsyncClusteringOpts(isAsyncClustering: String, \n clusteringNumCommit: String, \n executionStrategy: String):Map[String, String] = {\n commonOpts + (DataSourceWriteOptions.ASYNC_CLUSTERING_ENABLE.key -> isAsyncClustering,\n HoodieClusteringConfig.ASYNC_CLUSTERING_MAX_COMMITS.key -> clusteringNumCommit,\n HoodieClusteringConfig.EXECUTION_STRATEGY_CLASS_NAME.key -> executionStrategy\n )\n}\n\ndef initStreamingWriteFuture(hudiOptions: Map[String, String]): Future[Unit] = {\n val streamingInput = // define the source of streaming\n Future {\n println("streaming starting")\n streamingInput\n .writeStream\n .format("org.apache.hudi")\n .options(hudiOptions)\n .option("checkpointLocation", basePath + "/checkpoint")\n .mode(Append)\n .start()\n .awaitTermination(10000)\n println("streaming ends")\n }\n}\n\ndef structuredStreamingWithClustering(): Unit = {\n val df = //generate data frame\n val hudiOptions = getClusteringOpts("true", "1", "org.apache.hudi.client.clustering.run.strategy.SparkSortAndSizeExecutionStrategy")\n val f1 = initStreamingWriteFuture(hudiOptions)\n Await.result(f1, Duration.Inf)\n}\n'})}),"\n",(0,s.jsx)(t.h2,{id:"java-client",children:"Java Client"}),"\n",(0,s.jsxs)(t.p,{children:["Clustering is also supported via Java client. Plan strategy ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.plan.strategy.JavaSizeBasedClusteringPlanStrategy"}),"\nand execution strategy ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.run.strategy.JavaSortAndSizeExecutionStrategy"})," are supported\nout-of-the-box. Note that as of now only linear sort is supported in Java execution strategy."]}),"\n",(0,s.jsx)(t.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)("h3",{children:"Blogs"}),"\n",(0,s.jsx)(t.a,{href:"https://www.onehouse.ai/blog/apachehudi-z-order-and-hilbert-space-filling-curves",children:"Apache Hudi Z-Order and Hilbert Space Filling Curves"}),"\n",(0,s.jsx)(t.a,{href:"https://medium.com/apache-hudi-blogs/hudi-z-order-and-hilbert-space-filling-curves-68fa28bffaf0",children:"Hudi Z-Order and Hilbert Space-filling Curves"})]}),"\n",(0,s.jsx)("h3",{children:"Videos"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://www.youtube.com/watch?v=R_sm4wlGXuE",children:"Understanding Clustering in Apache Hudi and the Benefits of Asynchronous Clustering"})}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},7004:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/clustering1_new-d67c9e691d235b140f7c80d68400f425.png"},67491:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/clustering2_new-0837c07b6db44ab75873633f0eab2e2c.png"},14438:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/clustering_3-8bc286ab44c48137f8409b5c342a7207.png"},28453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>l});var n=i(96540);const s={},r=n.createContext(s);function a(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/10b6d210.af5d2223.js b/content/assets/js/10b6d210.af5d2223.js deleted file mode 100644 index 2bd069901324c..0000000000000 --- a/content/assets/js/10b6d210.af5d2223.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[18757],{78367:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"compaction","title":"Compaction","description":"Background","source":"@site/docs/compaction.md","sourceDirName":".","slug":"/compaction","permalink":"/docs/next/compaction","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/compaction.md","tags":[],"version":"current","frontMatter":{"title":"Compaction","summary":"In this page, we describe async compaction in Hudi.","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4,"last_modified_at":null},"sidebar":"docs","previous":{"title":"Cleaning","permalink":"/docs/next/cleaning"},"next":{"title":"Clustering","permalink":"/docs/next/clustering"}}');var o=t(74848),a=t(28453);const s={title:"Compaction",summary:"In this page, we describe async compaction in Hudi.",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4,last_modified_at:null},r=void 0,c={},l=[{value:"Background",id:"background",level:2},{value:"Why MOR tables need compaction?",id:"why-mor-tables-need-compaction",level:3},{value:"Compaction Architecture",id:"compaction-architecture",level:2},{value:"Strategies in Compaction Scheduling",id:"strategies-in-compaction-scheduling",level:3},{value:"Trigger Strategies",id:"trigger-strategies",level:4},{value:"Compaction Strategies",id:"compaction-strategies",level:4},{value:"Ways to trigger Compaction",id:"ways-to-trigger-compaction",level:2},{value:"Inline",id:"inline",level:3},{value:"Async & Offline Compaction models",id:"async--offline-compaction-models",level:3},{value:"Async execution within the same process",id:"async-execution-within-the-same-process",level:4},{value:"Spark Structured Streaming",id:"spark-structured-streaming",level:5},{value:"Hudi Streamer Continuous Mode",id:"hudi-streamer-continuous-mode",level:5},{value:"Scheduling and Execution by a separate process",id:"scheduling-and-execution-by-a-separate-process",level:4},{value:"Scheduling inline and executing async",id:"scheduling-inline-and-executing-async",level:4},{value:"Hudi Compactor Utility",id:"hudi-compactor-utility",level:4},{value:"Hudi CLI",id:"hudi-cli",level:4},{value:"Flink Offline Compaction",id:"flink-offline-compaction",level:4},{value:"Options",id:"options",level:4}];function d(e){const i={a:"a",admonition:"admonition",br:"br",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.h2,{id:"background",children:"Background"}),"\n",(0,o.jsx)(i.p,{children:"Compaction is a table service employed by Hudi specifically in Merge On Read(MOR) tables to merge updates from row-based log\nfiles to the corresponding columnar-based base file periodically to produce a new version of the base file. Compaction is\nnot applicable to Copy On Write(COW) tables and only applies to MOR tables."}),"\n",(0,o.jsx)(i.h3,{id:"why-mor-tables-need-compaction",children:"Why MOR tables need compaction?"}),"\n",(0,o.jsxs)(i.p,{children:["To understand the significance of compaction in MOR tables, it is helpful to understand the MOR table layout first. In Hudi,\ndata is organized in terms of ",(0,o.jsx)(i.a,{href:"https://hudi.apache.org/docs/file_layouts/",children:"file groups"}),". Each file group in a MOR table\nconsists of a base file and one or more log files. Typically, during writes, inserts are stored in the base file, and updates\nare appended to log files."]}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.img,{alt:"mor_table_file_layout",src:t(67587).A+"",width:"6528",height:"2450"}),"\n",(0,o.jsx)(i.em,{children:"Figure: MOR table file layout showing different file groups with base data file and log files"})]}),"\n",(0,o.jsx)(i.p,{children:"During the compaction process, updates from the log files are merged with the base file to form a new version of the\nbase file as shown below. Since MOR is designed to be write-optimized, on new writes, after index tagging is complete,\nHudi appends the records pertaining to each file groups as log blocks in log files. There is no synchronous merge\nhappening during write, resulting in a lower write amplification and better write latency. In contrast, on new writes to a\nCOW table, Hudi combines the new writes with the older base file to produce a new version of the base file resulting in\na higher write amplification and higher write latencies."}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.img,{alt:"mor_table_file_layout",src:t(56040).A+"",width:"5081",height:"3148"}),"\n",(0,o.jsx)(i.em,{children:"Figure: Compaction on a given file group"})]}),"\n",(0,o.jsx)(i.p,{children:"While serving the read query(snapshot read), for each file group, records in base file and all its corresponding log\nfiles are merged together and served. And hence the read latency for MOR snapshot query might be higher compared to\nCOW table since there is no merge involved in case of COW at read time. Compaction takes care of merging the updates from\nlog files with the base file at regular intervals to bound the growth of log files and to ensure the read latencies do not\nspike up."}),"\n",(0,o.jsx)(i.h2,{id:"compaction-architecture",children:"Compaction Architecture"}),"\n",(0,o.jsx)(i.p,{children:"There are two steps to compaction."}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.em,{children:(0,o.jsx)(i.strong,{children:"Compaction Scheduling"})}),": In this step, Hudi scans the partitions and selects file slices to be compacted. A compaction\nplan is finally written to Hudi timeline."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.em,{children:(0,o.jsx)(i.strong,{children:"Compaction Execution"})}),": In this step the compaction plan is read and file slices are compacted."]}),"\n"]}),"\n",(0,o.jsx)(i.h3,{id:"strategies-in-compaction-scheduling",children:"Strategies in Compaction Scheduling"}),"\n",(0,o.jsx)(i.p,{children:"There are two strategies involved in scheduling the compaction:"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"Trigger Strategy: Determines how often to trigger scheduling of the compaction."}),"\n",(0,o.jsx)(i.li,{children:"Compaction Strategy: Determines which file groups to compact."}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"Hudi provides various options for both these strategies as discussed below."}),"\n",(0,o.jsx)(i.h4,{id:"trigger-strategies",children:"Trigger Strategies"}),"\n",(0,o.jsxs)(i.table,{children:[(0,o.jsx)(i.thead,{children:(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.th,{children:"Config Name"}),(0,o.jsx)(i.th,{children:"Default"}),(0,o.jsx)(i.th,{children:"Description"})]})}),(0,o.jsxs)(i.tbody,{children:[(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:"hoodie.compact.inline.trigger.strategy"}),(0,o.jsx)(i.td,{children:"NUM_COMMITS (Optional)"}),(0,o.jsxs)(i.td,{children:["org.apache.hudi.table.action.compact.CompactionTriggerStrategy: Controls when compaction is scheduled.",(0,o.jsx)("br",{}),(0,o.jsx)(i.code,{children:"Config Param: INLINE_COMPACT_TRIGGER_STRATEGY"})," ",(0,o.jsx)("br",{})]})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsxs)("ul",{children:[(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"NUM_COMMITS"}),": triggers compaction when there are at least N delta commits after last completed compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"NUM_COMMITS_AFTER_LAST_REQUEST"}),": triggers compaction when there are at least N delta commits after last completed or requested compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"TIME_ELAPSED"}),": triggers compaction after N seconds since last compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"NUM_AND_TIME"}),": triggers compaction when both there are at least N delta commits and N seconds elapsed (both must be satisfied) after last completed compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"NUM_OR_TIME"}),": triggers compaction when both there are at least N delta commits or N seconds elapsed (either condition is satisfied) after last completed compaction."]})]})}),(0,o.jsx)(i.td,{}),(0,o.jsx)(i.td,{})]})]})]}),"\n",(0,o.jsx)(i.h4,{id:"compaction-strategies",children:"Compaction Strategies"}),"\n",(0,o.jsxs)(i.table,{children:[(0,o.jsx)(i.thead,{children:(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.th,{children:"Config Name"}),(0,o.jsx)(i.th,{children:"Default"}),(0,o.jsx)(i.th,{children:"Description"})]})}),(0,o.jsx)(i.tbody,{children:(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:"hoodie.compaction.strategy"}),(0,o.jsx)(i.td,{children:"org.apache.hudi.table.action.compact.strategy.LogFileSizeBasedCompactionStrategy (Optional)"}),(0,o.jsxs)(i.td,{children:["Compaction strategy decides which file groups are picked up for compaction during each compaction run. By default. Hudi picks the log file with most accumulated unmerged data. ",(0,o.jsx)("br",{}),(0,o.jsx)("br",{}),(0,o.jsx)(i.code,{children:"Config Param: COMPACTION_STRATEGY"})]})]})})]}),"\n",(0,o.jsxs)(i.p,{children:["Available Strategies (Provide the full package name when using the strategy): ",(0,o.jsxs)("ul",{children:[(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"LogFileNumBasedCompactionStrategy"}),":\norders the compactions based on the total log files count, filters the file group with log files count greater than the\nthreshold and limits the compactions within a configured IO bound."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"LogFileSizeBasedCompactionStrategy"}),": orders\nthe compactions based on the total log files size, filters the file group which log files size is greater than the\nthreshold and limits the compactions within a configured IO bound."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"BoundedIOCompactionStrategy"}),": CompactionStrategy\nwhich looks at total IO to be done for the compaction (read + write) and limits the list of compactions to be under a\nconfigured limit on the IO."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"BoundedPartitionAwareCompactionStrategy"}),":This"," strategy ensures that the last N partitions\nare picked up even if there are later partitions created for the table. lastNPartitions is defined as the N partitions before\nthe currentDate. currentDay = 2018/01/01 The table has partitions for 2018/02/02 and 2018/03/03 beyond the currentDay This\nstrategy will pick up the following partitions for compaction : (2018/01/01, allPartitionsInRange[(2018/01/01 - lastNPartitions)\nto 2018/01/01), 2018/02/02, 2018/03/03)"]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"DayBasedCompactionStrategy"}),":This"," strategy orders compactions in reverse\norder of creation of Hive Partitions. It helps to compact data in latest partitions first and then older capped at the\nTotal_IO allowed."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"UnBoundedCompactionStrategy"}),": UnBoundedCompactionStrategy will not change ordering or filter\nany compaction. It is a pass-through and will compact all the base files which has a log file. This usually means\nno-intelligence on compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"UnBoundedPartitionAwareCompactionStrategy"}),":UnBoundedPartitionAwareCompactionStrategy"," is a custom UnBounded Strategy. This will filter all the partitions that\nare eligible to be compacted by a {@link BoundedPartitionAwareCompactionStrategy} and return the result. This is done\nso that a long running UnBoundedPartitionAwareCompactionStrategy does not step over partitions in a shorter running\nBoundedPartitionAwareCompactionStrategy. Essentially, this is an inverse of the partitions chosen in\nBoundedPartitionAwareCompactionStrategy"]})]})]}),"\n",(0,o.jsx)(i.admonition,{type:"note",children:(0,o.jsxs)(i.p,{children:["Please refer to ",(0,o.jsx)(i.a,{href:"https://hudi.apache.org/docs/next/configurations#Compaction-Configs",children:"advanced configs"})," for more details."]})}),"\n",(0,o.jsx)(i.h2,{id:"ways-to-trigger-compaction",children:"Ways to trigger Compaction"}),"\n",(0,o.jsx)(i.h3,{id:"inline",children:"Inline"}),"\n",(0,o.jsx)(i.p,{children:"By default, compaction is run asynchronously."}),"\n",(0,o.jsx)(i.p,{children:"If latency of ingesting records is important for you, you are most likely using Merge-On-Read tables.\nMerge-On-Read tables store data using a combination of columnar (e.g parquet) + row based (e.g avro) file formats.\nUpdates are logged to delta files & later compacted to produce new versions of columnar files.\nTo improve ingestion latency, Async Compaction is the default configuration."}),"\n",(0,o.jsx)(i.p,{children:"If immediate read performance of a new commit is important for you, or you want simplicity of not managing separate compaction jobs,\nyou may want synchronous inline compaction, which means that as a commit is written it is also compacted by the same job."}),"\n",(0,o.jsxs)(i.p,{children:["For this deployment mode, please use ",(0,o.jsx)(i.code,{children:"hoodie.compact.inline = true"})," for Spark Datasource and Spark SQL writers. For\nHoodieStreamer sync once mode inline compaction can be achieved by passing the flag ",(0,o.jsx)(i.code,{children:"--disable-compaction"})," (Meaning to\ndisable async compaction). Further in HoodieStreamer when both\ningestion and compaction is running in the same spark context, you can use resource allocation configuration\nin Hudi Streamer CLI such as (",(0,o.jsx)(i.code,{children:"--delta-sync-scheduling-weight"}),",\n",(0,o.jsx)(i.code,{children:"--compact-scheduling-weight"}),", ",(0,o.jsx)(i.code,{children:"--delta-sync-scheduling-minshare"}),", and ",(0,o.jsx)(i.code,{children:"--compact-scheduling-minshare"}),")\nto control executor allocation between ingestion and compaction."]}),"\n",(0,o.jsx)(i.h3,{id:"async--offline-compaction-models",children:"Async & Offline Compaction models"}),"\n",(0,o.jsx)(i.p,{children:"There are a couple of ways here to trigger compaction ."}),"\n",(0,o.jsx)(i.h4,{id:"async-execution-within-the-same-process",children:"Async execution within the same process"}),"\n",(0,o.jsx)(i.p,{children:"In streaming ingestion write models like HoodieStreamer\ncontinuous mode, Flink and Spark Streaming, async compaction is enabled by default and runs alongside without blocking\nregular ingestion."}),"\n",(0,o.jsx)(i.h5,{id:"spark-structured-streaming",children:"Spark Structured Streaming"}),"\n",(0,o.jsx)(i.p,{children:"Compactions are scheduled and executed asynchronously inside the\nstreaming job.Here is an example snippet in java"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-properties",children:'import org.apache.hudi.DataSourceWriteOptions;\nimport org.apache.hudi.HoodieDataSourceHelpers;\nimport org.apache.hudi.config.HoodieCompactionConfig;\nimport org.apache.hudi.config.HoodieWriteConfig;\n\nimport org.apache.spark.sql.streaming.OutputMode;\nimport org.apache.spark.sql.streaming.ProcessingTime;\n\n\n DataStreamWriter writer = streamingInput.writeStream().format("org.apache.hudi")\n .option("hoodie.datasource.write.operation", operationType)\n .option("hoodie.datasource.write.table.type", tableType)\n .option("hoodie.datasource.write.recordkey.field", "_row_key")\n .option("hoodie.datasource.write.partitionpath.field", "partition")\n .option("hoodie.datasource.write.precombine.field"(), "timestamp")\n .option("hoodie.compact.inline.max.delta.commits", "10")\n .option("hoodie.datasource.compaction.async.enable", "true")\n .option("hoodie.table.name", tableName).option("checkpointLocation", checkpointLocation)\n .outputMode(OutputMode.Append());\n writer.trigger(new ProcessingTime(30000)).start(tablePath);\n'})}),"\n",(0,o.jsx)(i.h5,{id:"hudi-streamer-continuous-mode",children:"Hudi Streamer Continuous Mode"}),"\n",(0,o.jsxs)(i.p,{children:["Hudi Streamer provides continuous ingestion mode where a single long running spark application",(0,o.jsx)(i.br,{}),"\n","ingests data to Hudi table continuously from upstream sources. In this mode, Hudi supports managing asynchronous\ncompactions. Here is an example snippet for running in continuous mode with async compactions"]}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-properties",children:"spark-submit --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n--class org.apache.hudi.utilities.streamer.HoodieStreamer \\\n--table-type MERGE_ON_READ \\\n--target-base-path \\\n--target-table \\\n--source-class org.apache.hudi.utilities.sources.JsonDFSSource \\\n--source-ordering-field ts \\\n--props /path/to/source.properties \\\n--continous\n"})}),"\n",(0,o.jsx)(i.h4,{id:"scheduling-and-execution-by-a-separate-process",children:"Scheduling and Execution by a separate process"}),"\n",(0,o.jsxs)(i.p,{children:["For some use cases with long running table services, instead of having the regular writes block, users have the option to run\nboth steps of the compaction (",(0,o.jsx)(i.a,{href:"#compaction-architecture",children:"scheduling and execution"}),") offline in a separate process altogether.\nThis allows for regular writers to not bother about these compaction steps and allows users to provide more resources for\nthe compaction job as needed."]}),"\n",(0,o.jsx)(i.admonition,{type:"note",children:(0,o.jsx)(i.p,{children:"This model needs a lock provider configured for all jobs - the regular writer as well as the offline compaction job."})}),"\n",(0,o.jsx)(i.h4,{id:"scheduling-inline-and-executing-async",children:"Scheduling inline and executing async"}),"\n",(0,o.jsx)(i.p,{children:"In this model, it is possible for a Spark Datasource writer or a Flink job to just schedule the compaction inline ( that\nwill serialize the compaction plan in the timeline but will not execute it). And then a separate utility like\nHudiCompactor or HoodieFlinkCompactor can take care of periodically executing the compaction plan."}),"\n",(0,o.jsx)(i.admonition,{type:"note",children:(0,o.jsxs)(i.p,{children:["This model may need a lock provider ",(0,o.jsx)(i.strong,{children:"if"})," metadata table is enabled."]})}),"\n",(0,o.jsx)(i.h4,{id:"hudi-compactor-utility",children:"Hudi Compactor Utility"}),"\n",(0,o.jsxs)(i.p,{children:["Hudi provides a standalone tool to execute specific compactions asynchronously. Below is an example and you can read more in the ",(0,o.jsx)(i.a,{href:"/docs/cli#compactions",children:"deployment guide"}),"\nThe compactor utility allows to do scheduling and execution of compaction."]}),"\n",(0,o.jsx)(i.p,{children:"Example:"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-properties",children:"spark-submit --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n--class org.apache.hudi.utilities.HoodieCompactor \\\n--base-path \\\n--table-name \\\n--schema-file \\\n--instant-time \n"})}),"\n",(0,o.jsxs)(i.p,{children:["Note, the ",(0,o.jsx)(i.code,{children:"instant-time"})," parameter is now optional for the Hudi Compactor Utility. If using the utility without ",(0,o.jsx)(i.code,{children:"--instant time"}),",\nthe spark-submit will execute the earliest scheduled compaction on the Hudi timeline."]}),"\n",(0,o.jsx)(i.h4,{id:"hudi-cli",children:"Hudi CLI"}),"\n",(0,o.jsxs)(i.p,{children:["Hudi CLI is yet another way to execute specific compactions asynchronously. Here is an example and you can read more in the ",(0,o.jsx)(i.a,{href:"/docs/cli#compactions",children:"deployment guide"})]}),"\n",(0,o.jsx)(i.p,{children:"Example:"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-properties",children:"hudi:trips->compaction run --tableName --parallelism --compactionInstant \n...\n"})}),"\n",(0,o.jsx)(i.h4,{id:"flink-offline-compaction",children:"Flink Offline Compaction"}),"\n",(0,o.jsxs)(i.p,{children:["Offline compaction needs to submit the Flink task on the command line. The program entry is as follows: ",(0,o.jsx)(i.code,{children:"hudi-flink-bundle_2.11-0.9.0-SNAPSHOT.jar"})," :\n",(0,o.jsx)(i.code,{children:"org.apache.hudi.sink.compact.HoodieFlinkCompactor"})]}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-bash",children:"# Command line\n./bin/flink run -c org.apache.hudi.sink.compact.HoodieFlinkCompactor lib/hudi-flink-bundle_2.11-0.9.0.jar --path hdfs://xxx:9000/table\n"})}),"\n",(0,o.jsx)(i.h4,{id:"options",children:"Options"}),"\n",(0,o.jsxs)(i.table,{children:[(0,o.jsx)(i.thead,{children:(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.th,{children:"Option Name"}),(0,o.jsx)(i.th,{children:"Default"}),(0,o.jsx)(i.th,{children:"Description"})]})}),(0,o.jsxs)(i.tbody,{children:[(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--path"})}),(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"n/a **(Required)**"})}),(0,o.jsx)(i.td,{children:"The path where the target table is stored on Hudi"})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--compaction-max-memory"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"100"})," (Optional)"]}),(0,o.jsx)(i.td,{children:"The index map size of log data during compaction, 100 MB by default. If you have enough memory, you can turn up this parameter"})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--schedule"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"false"})," (Optional)"]}),(0,o.jsx)(i.td,{children:"whether to execute the operation of scheduling compaction plan. When the write process is still writing\uff0c turning on this parameter have a risk of losing data. Therefore, it must be ensured that there are no write tasks currently writing data to this table when this parameter is turned on"})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--seq"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"LIFO"})," (Optional)"]}),(0,o.jsxs)(i.td,{children:["The order in which compaction tasks are executed. Executing from the latest compaction plan by default. ",(0,o.jsx)(i.code,{children:"LIFO"}),": executing from the latest plan. ",(0,o.jsx)(i.code,{children:"FIFO"}),": executing from the oldest plan."]})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--service"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"false"})," (Optional)"]}),(0,o.jsx)(i.td,{children:"Whether to start a monitoring service that checks and schedules new compaction task in configured interval."})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--min-compaction-interval-seconds"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"600(s)"})," (optional)"]}),(0,o.jsx)(i.td,{children:"The checking interval for service mode, by default 10 minutes."})]})]})]})]})}function h(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},67587:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/hudi_mor_file_layout-643f9f7fda5aa0d532682af27fe3e42c.jpg"},56040:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/hudi_mor_file_layout_post_compaction-9f10af785d4927dc3d66303dac5bc7ba.jpg"},28453:(e,i,t)=>{t.d(i,{R:()=>s,x:()=>r});var n=t(96540);const o={},a=n.createContext(o);function s(e){const i=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/10b6d210.bc03ff70.js b/content/assets/js/10b6d210.bc03ff70.js new file mode 100644 index 0000000000000..06d277b2e3d9e --- /dev/null +++ b/content/assets/js/10b6d210.bc03ff70.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[18757],{78367:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"compaction","title":"Compaction","description":"Background","source":"@site/docs/compaction.md","sourceDirName":".","slug":"/compaction","permalink":"/docs/next/compaction","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/compaction.md","tags":[],"version":"current","frontMatter":{"title":"Compaction","summary":"In this page, we describe async compaction in Hudi.","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4,"last_modified_at":null},"sidebar":"docs","previous":{"title":"Cleaning","permalink":"/docs/next/cleaning"},"next":{"title":"Clustering","permalink":"/docs/next/clustering"}}');var o=t(74848),a=t(28453);const s={title:"Compaction",summary:"In this page, we describe async compaction in Hudi.",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4,last_modified_at:null},r=void 0,c={},l=[{value:"Background",id:"background",level:2},{value:"Why MOR tables need compaction?",id:"why-mor-tables-need-compaction",level:3},{value:"Compaction Architecture",id:"compaction-architecture",level:2},{value:"Strategies in Compaction Scheduling",id:"strategies-in-compaction-scheduling",level:3},{value:"Trigger Strategies",id:"trigger-strategies",level:4},{value:"Compaction Strategies",id:"compaction-strategies",level:4},{value:"Ways to trigger Compaction",id:"ways-to-trigger-compaction",level:2},{value:"Inline",id:"inline",level:3},{value:"Async & Offline Compaction models",id:"async--offline-compaction-models",level:3},{value:"Async execution within the same process",id:"async-execution-within-the-same-process",level:4},{value:"Spark Structured Streaming",id:"spark-structured-streaming",level:5},{value:"Hudi Streamer Continuous Mode",id:"hudi-streamer-continuous-mode",level:5},{value:"Scheduling and Execution by a separate process",id:"scheduling-and-execution-by-a-separate-process",level:4},{value:"Scheduling inline and executing async",id:"scheduling-inline-and-executing-async",level:4},{value:"Hudi Compactor Utility",id:"hudi-compactor-utility",level:4},{value:"Hudi CLI",id:"hudi-cli",level:4},{value:"Flink Offline Compaction",id:"flink-offline-compaction",level:4},{value:"Options",id:"options",level:4},{value:"Related Resources",id:"related-resources",level:2}];function d(e){const i={a:"a",admonition:"admonition",br:"br",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.h2,{id:"background",children:"Background"}),"\n",(0,o.jsx)(i.p,{children:"Compaction is a table service employed by Hudi specifically in Merge On Read(MOR) tables to merge updates from row-based log\nfiles to the corresponding columnar-based base file periodically to produce a new version of the base file. Compaction is\nnot applicable to Copy On Write(COW) tables and only applies to MOR tables."}),"\n",(0,o.jsx)(i.h3,{id:"why-mor-tables-need-compaction",children:"Why MOR tables need compaction?"}),"\n",(0,o.jsxs)(i.p,{children:["To understand the significance of compaction in MOR tables, it is helpful to understand the MOR table layout first. In Hudi,\ndata is organized in terms of ",(0,o.jsx)(i.a,{href:"https://hudi.apache.org/docs/file_layouts/",children:"file groups"}),". Each file group in a MOR table\nconsists of a base file and one or more log files. Typically, during writes, inserts are stored in the base file, and updates\nare appended to log files."]}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.img,{alt:"mor_table_file_layout",src:t(67587).A+"",width:"6528",height:"2450"}),"\n",(0,o.jsx)(i.em,{children:"Figure: MOR table file layout showing different file groups with base data file and log files"})]}),"\n",(0,o.jsx)(i.p,{children:"During the compaction process, updates from the log files are merged with the base file to form a new version of the\nbase file as shown below. Since MOR is designed to be write-optimized, on new writes, after index tagging is complete,\nHudi appends the records pertaining to each file groups as log blocks in log files. There is no synchronous merge\nhappening during write, resulting in a lower write amplification and better write latency. In contrast, on new writes to a\nCOW table, Hudi combines the new writes with the older base file to produce a new version of the base file resulting in\na higher write amplification and higher write latencies."}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.img,{alt:"mor_table_file_layout",src:t(56040).A+"",width:"5081",height:"3148"}),"\n",(0,o.jsx)(i.em,{children:"Figure: Compaction on a given file group"})]}),"\n",(0,o.jsx)(i.p,{children:"While serving the read query(snapshot read), for each file group, records in base file and all its corresponding log\nfiles are merged together and served. And hence the read latency for MOR snapshot query might be higher compared to\nCOW table since there is no merge involved in case of COW at read time. Compaction takes care of merging the updates from\nlog files with the base file at regular intervals to bound the growth of log files and to ensure the read latencies do not\nspike up."}),"\n",(0,o.jsx)(i.h2,{id:"compaction-architecture",children:"Compaction Architecture"}),"\n",(0,o.jsx)(i.p,{children:"There are two steps to compaction."}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.em,{children:(0,o.jsx)(i.strong,{children:"Compaction Scheduling"})}),": In this step, Hudi scans the partitions and selects file slices to be compacted. A compaction\nplan is finally written to Hudi timeline."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.em,{children:(0,o.jsx)(i.strong,{children:"Compaction Execution"})}),": In this step the compaction plan is read and file slices are compacted."]}),"\n"]}),"\n",(0,o.jsx)(i.h3,{id:"strategies-in-compaction-scheduling",children:"Strategies in Compaction Scheduling"}),"\n",(0,o.jsx)(i.p,{children:"There are two strategies involved in scheduling the compaction:"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"Trigger Strategy: Determines how often to trigger scheduling of the compaction."}),"\n",(0,o.jsx)(i.li,{children:"Compaction Strategy: Determines which file groups to compact."}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"Hudi provides various options for both these strategies as discussed below."}),"\n",(0,o.jsx)(i.h4,{id:"trigger-strategies",children:"Trigger Strategies"}),"\n",(0,o.jsxs)(i.table,{children:[(0,o.jsx)(i.thead,{children:(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.th,{children:"Config Name"}),(0,o.jsx)(i.th,{children:"Default"}),(0,o.jsx)(i.th,{children:"Description"})]})}),(0,o.jsxs)(i.tbody,{children:[(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:"hoodie.compact.inline.trigger.strategy"}),(0,o.jsx)(i.td,{children:"NUM_COMMITS (Optional)"}),(0,o.jsxs)(i.td,{children:["org.apache.hudi.table.action.compact.CompactionTriggerStrategy: Controls when compaction is scheduled.",(0,o.jsx)("br",{}),(0,o.jsx)(i.code,{children:"Config Param: INLINE_COMPACT_TRIGGER_STRATEGY"})," ",(0,o.jsx)("br",{})]})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsxs)("ul",{children:[(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"NUM_COMMITS"}),": triggers compaction when there are at least N delta commits after last completed compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"NUM_COMMITS_AFTER_LAST_REQUEST"}),": triggers compaction when there are at least N delta commits after last completed or requested compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"TIME_ELAPSED"}),": triggers compaction after N seconds since last compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"NUM_AND_TIME"}),": triggers compaction when both there are at least N delta commits and N seconds elapsed (both must be satisfied) after last completed compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"NUM_OR_TIME"}),": triggers compaction when both there are at least N delta commits or N seconds elapsed (either condition is satisfied) after last completed compaction."]})]})}),(0,o.jsx)(i.td,{}),(0,o.jsx)(i.td,{})]})]})]}),"\n",(0,o.jsx)(i.h4,{id:"compaction-strategies",children:"Compaction Strategies"}),"\n",(0,o.jsxs)(i.table,{children:[(0,o.jsx)(i.thead,{children:(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.th,{children:"Config Name"}),(0,o.jsx)(i.th,{children:"Default"}),(0,o.jsx)(i.th,{children:"Description"})]})}),(0,o.jsx)(i.tbody,{children:(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:"hoodie.compaction.strategy"}),(0,o.jsx)(i.td,{children:"org.apache.hudi.table.action.compact.strategy.LogFileSizeBasedCompactionStrategy (Optional)"}),(0,o.jsxs)(i.td,{children:["Compaction strategy decides which file groups are picked up for compaction during each compaction run. By default. Hudi picks the log file with most accumulated unmerged data. ",(0,o.jsx)("br",{}),(0,o.jsx)("br",{}),(0,o.jsx)(i.code,{children:"Config Param: COMPACTION_STRATEGY"})]})]})})]}),"\n",(0,o.jsxs)(i.p,{children:["Available Strategies (Provide the full package name when using the strategy): ",(0,o.jsxs)("ul",{children:[(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"LogFileNumBasedCompactionStrategy"}),":\norders the compactions based on the total log files count, filters the file group with log files count greater than the\nthreshold and limits the compactions within a configured IO bound."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"LogFileSizeBasedCompactionStrategy"}),": orders\nthe compactions based on the total log files size, filters the file group which log files size is greater than the\nthreshold and limits the compactions within a configured IO bound."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"BoundedIOCompactionStrategy"}),": CompactionStrategy\nwhich looks at total IO to be done for the compaction (read + write) and limits the list of compactions to be under a\nconfigured limit on the IO."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"BoundedPartitionAwareCompactionStrategy"}),":This"," strategy ensures that the last N partitions\nare picked up even if there are later partitions created for the table. lastNPartitions is defined as the N partitions before\nthe currentDate. currentDay = 2018/01/01 The table has partitions for 2018/02/02 and 2018/03/03 beyond the currentDay This\nstrategy will pick up the following partitions for compaction : (2018/01/01, allPartitionsInRange[(2018/01/01 - lastNPartitions)\nto 2018/01/01), 2018/02/02, 2018/03/03)"]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"DayBasedCompactionStrategy"}),":This"," strategy orders compactions in reverse\norder of creation of Hive Partitions. It helps to compact data in latest partitions first and then older capped at the\nTotal_IO allowed."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"UnBoundedCompactionStrategy"}),": UnBoundedCompactionStrategy will not change ordering or filter\nany compaction. It is a pass-through and will compact all the base files which has a log file. This usually means\nno-intelligence on compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"UnBoundedPartitionAwareCompactionStrategy"}),":UnBoundedPartitionAwareCompactionStrategy"," is a custom UnBounded Strategy. This will filter all the partitions that\nare eligible to be compacted by a {@link BoundedPartitionAwareCompactionStrategy} and return the result. This is done\nso that a long running UnBoundedPartitionAwareCompactionStrategy does not step over partitions in a shorter running\nBoundedPartitionAwareCompactionStrategy. Essentially, this is an inverse of the partitions chosen in\nBoundedPartitionAwareCompactionStrategy"]})]})]}),"\n",(0,o.jsx)(i.admonition,{type:"note",children:(0,o.jsxs)(i.p,{children:["Please refer to ",(0,o.jsx)(i.a,{href:"https://hudi.apache.org/docs/next/configurations#Compaction-Configs",children:"advanced configs"})," for more details."]})}),"\n",(0,o.jsx)(i.h2,{id:"ways-to-trigger-compaction",children:"Ways to trigger Compaction"}),"\n",(0,o.jsx)(i.h3,{id:"inline",children:"Inline"}),"\n",(0,o.jsx)(i.p,{children:"By default, compaction is run asynchronously."}),"\n",(0,o.jsx)(i.p,{children:"If latency of ingesting records is important for you, you are most likely using Merge-On-Read tables.\nMerge-On-Read tables store data using a combination of columnar (e.g parquet) + row based (e.g avro) file formats.\nUpdates are logged to delta files & later compacted to produce new versions of columnar files.\nTo improve ingestion latency, Async Compaction is the default configuration."}),"\n",(0,o.jsx)(i.p,{children:"If immediate read performance of a new commit is important for you, or you want simplicity of not managing separate compaction jobs,\nyou may want synchronous inline compaction, which means that as a commit is written it is also compacted by the same job."}),"\n",(0,o.jsxs)(i.p,{children:["For this deployment mode, please use ",(0,o.jsx)(i.code,{children:"hoodie.compact.inline = true"})," for Spark Datasource and Spark SQL writers. For\nHoodieStreamer sync once mode inline compaction can be achieved by passing the flag ",(0,o.jsx)(i.code,{children:"--disable-compaction"})," (Meaning to\ndisable async compaction). Further in HoodieStreamer when both\ningestion and compaction is running in the same spark context, you can use resource allocation configuration\nin Hudi Streamer CLI such as (",(0,o.jsx)(i.code,{children:"--delta-sync-scheduling-weight"}),",\n",(0,o.jsx)(i.code,{children:"--compact-scheduling-weight"}),", ",(0,o.jsx)(i.code,{children:"--delta-sync-scheduling-minshare"}),", and ",(0,o.jsx)(i.code,{children:"--compact-scheduling-minshare"}),")\nto control executor allocation between ingestion and compaction."]}),"\n",(0,o.jsx)(i.h3,{id:"async--offline-compaction-models",children:"Async & Offline Compaction models"}),"\n",(0,o.jsx)(i.p,{children:"There are a couple of ways here to trigger compaction ."}),"\n",(0,o.jsx)(i.h4,{id:"async-execution-within-the-same-process",children:"Async execution within the same process"}),"\n",(0,o.jsx)(i.p,{children:"In streaming ingestion write models like HoodieStreamer\ncontinuous mode, Flink and Spark Streaming, async compaction is enabled by default and runs alongside without blocking\nregular ingestion."}),"\n",(0,o.jsx)(i.h5,{id:"spark-structured-streaming",children:"Spark Structured Streaming"}),"\n",(0,o.jsx)(i.p,{children:"Compactions are scheduled and executed asynchronously inside the\nstreaming job.Here is an example snippet in java"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-properties",children:'import org.apache.hudi.DataSourceWriteOptions;\nimport org.apache.hudi.HoodieDataSourceHelpers;\nimport org.apache.hudi.config.HoodieCompactionConfig;\nimport org.apache.hudi.config.HoodieWriteConfig;\n\nimport org.apache.spark.sql.streaming.OutputMode;\nimport org.apache.spark.sql.streaming.ProcessingTime;\n\n\n DataStreamWriter writer = streamingInput.writeStream().format("org.apache.hudi")\n .option("hoodie.datasource.write.operation", operationType)\n .option("hoodie.datasource.write.table.type", tableType)\n .option("hoodie.datasource.write.recordkey.field", "_row_key")\n .option("hoodie.datasource.write.partitionpath.field", "partition")\n .option("hoodie.datasource.write.precombine.field"(), "timestamp")\n .option("hoodie.compact.inline.max.delta.commits", "10")\n .option("hoodie.datasource.compaction.async.enable", "true")\n .option("hoodie.table.name", tableName).option("checkpointLocation", checkpointLocation)\n .outputMode(OutputMode.Append());\n writer.trigger(new ProcessingTime(30000)).start(tablePath);\n'})}),"\n",(0,o.jsx)(i.h5,{id:"hudi-streamer-continuous-mode",children:"Hudi Streamer Continuous Mode"}),"\n",(0,o.jsxs)(i.p,{children:["Hudi Streamer provides continuous ingestion mode where a single long running spark application",(0,o.jsx)(i.br,{}),"\n","ingests data to Hudi table continuously from upstream sources. In this mode, Hudi supports managing asynchronous\ncompactions. Here is an example snippet for running in continuous mode with async compactions"]}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-properties",children:"spark-submit --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n--class org.apache.hudi.utilities.streamer.HoodieStreamer \\\n--table-type MERGE_ON_READ \\\n--target-base-path \\\n--target-table \\\n--source-class org.apache.hudi.utilities.sources.JsonDFSSource \\\n--source-ordering-field ts \\\n--props /path/to/source.properties \\\n--continous\n"})}),"\n",(0,o.jsx)(i.h4,{id:"scheduling-and-execution-by-a-separate-process",children:"Scheduling and Execution by a separate process"}),"\n",(0,o.jsxs)(i.p,{children:["For some use cases with long running table services, instead of having the regular writes block, users have the option to run\nboth steps of the compaction (",(0,o.jsx)(i.a,{href:"#compaction-architecture",children:"scheduling and execution"}),") offline in a separate process altogether.\nThis allows for regular writers to not bother about these compaction steps and allows users to provide more resources for\nthe compaction job as needed."]}),"\n",(0,o.jsx)(i.admonition,{type:"note",children:(0,o.jsx)(i.p,{children:"This model needs a lock provider configured for all jobs - the regular writer as well as the offline compaction job."})}),"\n",(0,o.jsx)(i.h4,{id:"scheduling-inline-and-executing-async",children:"Scheduling inline and executing async"}),"\n",(0,o.jsx)(i.p,{children:"In this model, it is possible for a Spark Datasource writer or a Flink job to just schedule the compaction inline ( that\nwill serialize the compaction plan in the timeline but will not execute it). And then a separate utility like\nHudiCompactor or HoodieFlinkCompactor can take care of periodically executing the compaction plan."}),"\n",(0,o.jsx)(i.admonition,{type:"note",children:(0,o.jsxs)(i.p,{children:["This model may need a lock provider ",(0,o.jsx)(i.strong,{children:"if"})," metadata table is enabled."]})}),"\n",(0,o.jsx)(i.h4,{id:"hudi-compactor-utility",children:"Hudi Compactor Utility"}),"\n",(0,o.jsxs)(i.p,{children:["Hudi provides a standalone tool to execute specific compactions asynchronously. Below is an example and you can read more in the ",(0,o.jsx)(i.a,{href:"/docs/cli#compactions",children:"deployment guide"}),"\nThe compactor utility allows to do scheduling and execution of compaction."]}),"\n",(0,o.jsx)(i.p,{children:"Example:"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-properties",children:"spark-submit --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n--class org.apache.hudi.utilities.HoodieCompactor \\\n--base-path \\\n--table-name \\\n--schema-file \\\n--instant-time \n"})}),"\n",(0,o.jsxs)(i.p,{children:["Note, the ",(0,o.jsx)(i.code,{children:"instant-time"})," parameter is now optional for the Hudi Compactor Utility. If using the utility without ",(0,o.jsx)(i.code,{children:"--instant time"}),",\nthe spark-submit will execute the earliest scheduled compaction on the Hudi timeline."]}),"\n",(0,o.jsx)(i.h4,{id:"hudi-cli",children:"Hudi CLI"}),"\n",(0,o.jsxs)(i.p,{children:["Hudi CLI is yet another way to execute specific compactions asynchronously. Here is an example and you can read more in the ",(0,o.jsx)(i.a,{href:"/docs/cli#compactions",children:"deployment guide"})]}),"\n",(0,o.jsx)(i.p,{children:"Example:"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-properties",children:"hudi:trips->compaction run --tableName --parallelism --compactionInstant \n...\n"})}),"\n",(0,o.jsx)(i.h4,{id:"flink-offline-compaction",children:"Flink Offline Compaction"}),"\n",(0,o.jsxs)(i.p,{children:["Offline compaction needs to submit the Flink task on the command line. The program entry is as follows: ",(0,o.jsx)(i.code,{children:"hudi-flink-bundle_2.11-0.9.0-SNAPSHOT.jar"})," :\n",(0,o.jsx)(i.code,{children:"org.apache.hudi.sink.compact.HoodieFlinkCompactor"})]}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-bash",children:"# Command line\n./bin/flink run -c org.apache.hudi.sink.compact.HoodieFlinkCompactor lib/hudi-flink-bundle_2.11-0.9.0.jar --path hdfs://xxx:9000/table\n"})}),"\n",(0,o.jsx)(i.h4,{id:"options",children:"Options"}),"\n",(0,o.jsxs)(i.table,{children:[(0,o.jsx)(i.thead,{children:(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.th,{children:"Option Name"}),(0,o.jsx)(i.th,{children:"Default"}),(0,o.jsx)(i.th,{children:"Description"})]})}),(0,o.jsxs)(i.tbody,{children:[(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--path"})}),(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"n/a **(Required)**"})}),(0,o.jsx)(i.td,{children:"The path where the target table is stored on Hudi"})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--compaction-max-memory"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"100"})," (Optional)"]}),(0,o.jsx)(i.td,{children:"The index map size of log data during compaction, 100 MB by default. If you have enough memory, you can turn up this parameter"})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--schedule"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"false"})," (Optional)"]}),(0,o.jsx)(i.td,{children:"whether to execute the operation of scheduling compaction plan. When the write process is still writing\uff0c turning on this parameter have a risk of losing data. Therefore, it must be ensured that there are no write tasks currently writing data to this table when this parameter is turned on"})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--seq"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"LIFO"})," (Optional)"]}),(0,o.jsxs)(i.td,{children:["The order in which compaction tasks are executed. Executing from the latest compaction plan by default. ",(0,o.jsx)(i.code,{children:"LIFO"}),": executing from the latest plan. ",(0,o.jsx)(i.code,{children:"FIFO"}),": executing from the oldest plan."]})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--service"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"false"})," (Optional)"]}),(0,o.jsx)(i.td,{children:"Whether to start a monitoring service that checks and schedules new compaction task in configured interval."})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--min-compaction-interval-seconds"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"600(s)"})," (optional)"]}),(0,o.jsx)(i.td,{children:"The checking interval for service mode, by default 10 minutes."})]})]})]}),"\n",(0,o.jsx)(i.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)("h3",{children:"Blogs"}),"\n",(0,o.jsx)(i.a,{href:"https://medium.com/@simpsons/apache-hudi-compaction-6e6383790234",children:"Apache Hudi Compaction"}),"\n",(0,o.jsx)(i.a,{href:"https://medium.com/@simpsons/standalone-hoodiecompactor-utility-890198e4c539",children:"Standalone HoodieCompactor Utility"})]})]})}function h(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},67587:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/hudi_mor_file_layout-643f9f7fda5aa0d532682af27fe3e42c.jpg"},56040:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/hudi_mor_file_layout_post_compaction-9f10af785d4927dc3d66303dac5bc7ba.jpg"},28453:(e,i,t)=>{t.d(i,{R:()=>s,x:()=>r});var n=t(96540);const o={},a=n.createContext(o);function s(e){const i=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/1a20bc57.7e53ee45.js b/content/assets/js/1a20bc57.7e53ee45.js deleted file mode 100644 index 8db1f3ee1cc7b..0000000000000 --- a/content/assets/js/1a20bc57.7e53ee45.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[59114],{46768:(e,_,n)=>{n.r(_),n.d(_,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>t,toc:()=>r});const t=JSON.parse('{"id":"cli","title":"CLI","description":"Local set up","source":"@site/docs/cli.md","sourceDirName":".","slug":"/cli","permalink":"/docs/next/cli","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/cli.md","tags":[],"version":"current","frontMatter":{"title":"CLI","keywords":["hudi","cli"],"last_modified_at":"2021-08-18T19:59:57.000Z"},"sidebar":"docs","previous":{"title":"SQL Procedures","permalink":"/docs/next/procedures"},"next":{"title":"Metrics","permalink":"/docs/next/metrics"}}');var i=n(74848),a=n(28453);const o={title:"CLI",keywords:["hudi","cli"],last_modified_at:new Date("2021-08-18T19:59:57.000Z")},s=void 0,l={},r=[{value:"Local set up",id:"local-set-up",level:3},{value:"Hudi CLI Bundle setup",id:"hudi-cli-bundle-setup",level:3},{value:"Base path",id:"base-path",level:3},{value:"Using Hudi-cli in S3",id:"using-hudi-cli-in-s3",level:3},{value:"Note: These AWS jar versions below are specific to Spark 3.2.0",id:"note-these-aws-jar-versions-below-are-specific-to-spark-320",level:4},{value:"Using hudi-cli on Google Dataproc",id:"using-hudi-cli-on-google-dataproc",level:3},{value:"Connect to a Kerberized cluster",id:"connect-to-a-kerberized-cluster",level:2},{value:"Using hudi-cli",id:"using-hudi-cli",level:2},{value:"Inspecting Commits",id:"inspecting-commits",level:3},{value:"Drilling Down to a specific Commit",id:"drilling-down-to-a-specific-commit",level:3},{value:"FileSystem View",id:"filesystem-view",level:3},{value:"Statistics",id:"statistics",level:3},{value:"Archived Commits",id:"archived-commits",level:3},{value:"Compactions",id:"compactions",level:3},{value:"Validate Compaction",id:"validate-compaction",level:3},{value:"Unscheduling Compaction",id:"unscheduling-compaction",level:3},{value:"Repair Compaction",id:"repair-compaction",level:3},{value:"Savepoint and Restore",id:"savepoint-and-restore",level:3},{value:"Upgrade and Downgrade Table",id:"upgrade-and-downgrade-table",level:3},{value:"Change Hudi Table Type",id:"change-hudi-table-type",level:3}];function c(e){const _={a:"a",admonition:"admonition",br:"br",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(_.h3,{id:"local-set-up",children:"Local set up"}),"\n",(0,i.jsxs)(_.p,{children:["Once hudi has been built, the shell can be fired by via ",(0,i.jsx)(_.code,{children:"cd hudi-cli && ./hudi-cli.sh"}),"."]}),"\n",(0,i.jsx)(_.h3,{id:"hudi-cli-bundle-setup",children:"Hudi CLI Bundle setup"}),"\n",(0,i.jsxs)(_.p,{children:["In release ",(0,i.jsx)(_.code,{children:"0.13.0"})," we have now added another way of launching the ",(0,i.jsx)(_.code,{children:"hudi cli"}),", which is using the ",(0,i.jsx)(_.code,{children:"hudi-cli-bundle"}),"."]}),"\n",(0,i.jsxs)(_.p,{children:["There are a couple of requirements when using this approach such as having ",(0,i.jsx)(_.code,{children:"spark"})," installed locally on your machine.\nIt is required to use a spark distribution with hadoop dependencies packaged such as ",(0,i.jsx)(_.code,{children:"spark-3.3.1-bin-hadoop2.tgz"})," from ",(0,i.jsx)(_.a,{href:"https://archive.apache.org/dist/spark/",children:"https://archive.apache.org/dist/spark/"}),".\nWe also recommend you set an env variable ",(0,i.jsx)(_.code,{children:"$SPARK_HOME"})," to the path of where spark is installed on your machine.\nOne important thing to note is that the ",(0,i.jsx)(_.code,{children:"hudi-spark-bundle"})," should also be present when using the ",(0,i.jsx)(_.code,{children:"hudi-cli-bundle"}),".",(0,i.jsx)(_.br,{}),"\n","To provide the locations of these bundle jars you can set them in your shell like so:\n",(0,i.jsx)(_.code,{children:"export CLI_BUNDLE_JAR="})," , ",(0,i.jsx)(_.code,{children:"export SPARK_BUNDLE_JAR="}),"."]}),"\n",(0,i.jsx)(_.p,{children:"For steps see below if you are not compiling the project and downloading the jars:"}),"\n",(0,i.jsxs)(_.ol,{children:["\n",(0,i.jsx)(_.li,{children:"Create an empty folder as a new directory"}),"\n",(0,i.jsx)(_.li,{children:"Copy the hudi-cli-bundle jars and hudi-spark*-bundle jars to this directory"}),"\n",(0,i.jsx)(_.li,{children:"Copy the following script and folder to this directory"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"packaging/hudi-cli-bundle/hudi-cli-with-bundle.sh\npackaging/hudi-cli-bundle/conf . the `conf` folder should be in this directory.\n"})}),"\n",(0,i.jsxs)(_.ol,{start:"4",children:["\n",(0,i.jsx)(_.li,{children:"Start Hudi CLI shell with environment variables set"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"export SPARK_HOME=\nexport CLI_BUNDLE_JAR=\nexport SPARK_BUNDLE_JAR=\n\n./hudi-cli-with-bundle.sh\n\n"})}),"\n",(0,i.jsx)(_.h3,{id:"base-path",children:"Base path"}),"\n",(0,i.jsxs)(_.p,{children:["A hudi table resides on DFS, in a location referred to as the ",(0,i.jsx)(_.code,{children:"basePath"})," and\nwe would need this location in order to connect to a Hudi table. Hudi library effectively manages this table internally, using ",(0,i.jsx)(_.code,{children:".hoodie"})," subfolder to track all metadata."]}),"\n",(0,i.jsx)(_.h3,{id:"using-hudi-cli-in-s3",children:"Using Hudi-cli in S3"}),"\n",(0,i.jsxs)(_.p,{children:["If you are using hudi that comes packaged with AWS EMR, you can find instructions to use hudi-cli ",(0,i.jsx)(_.a,{href:"https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hudi-cli.html",children:"here"}),".\nIf you are not using EMR, or would like to use latest hudi-cli from master, you can follow the below steps to access S3 dataset in your local environment (laptop)."]}),"\n",(0,i.jsx)(_.p,{children:"Build Hudi with corresponding Spark version, for eg, -Dspark3.1.x"}),"\n",(0,i.jsx)(_.p,{children:"Set the following environment variables."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"export AWS_REGION=us-east-2\nexport AWS_ACCESS_KEY_ID=\nexport AWS_SECRET_ACCESS_KEY=\nexport SPARK_HOME=\n"})}),"\n",(0,i.jsx)(_.p,{children:"Ensure you set the SPARK_HOME to your local spark home compatible to compiled hudi spark version above."}),"\n",(0,i.jsx)(_.p,{children:"Apart from these, we might need to add aws jars to class path so that accessing S3 is feasible from local.\nWe need two jars, namely, aws-java-sdk-bundle jar and hadoop-aws jar which you can find online.\nFor eg:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/3.2.0/hadoop-aws-3.2.0.jar -o /lib/spark-3.2.0-bin-hadoop3.2/jars/hadoop-aws-3.2.0.jar\nwget https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-bundle/1.11.375/aws-java-sdk-bundle-1.11.375.jar -o /lib/spark-3.2.0-bin-hadoop3.2/jars/aws-java-sdk-bundle-1.11.375.jar\n"})}),"\n",(0,i.jsx)(_.h4,{id:"note-these-aws-jar-versions-below-are-specific-to-spark-320",children:"Note: These AWS jar versions below are specific to Spark 3.2.0"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"export CLIENT_JAR=/lib/spark-3.2.0-bin-hadoop3.2/jars/aws-java-sdk-bundle-1.12.48.jar:/lib/spark-3.2.0-bin-hadoop3.2/jars/hadoop-aws-3.3.1.jar\n"})}),"\n",(0,i.jsx)(_.p,{children:"Once these are set, you are good to launch hudi-cli and access S3 dataset."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"./hudi-cli/hudi-cli.sh\n"})}),"\n",(0,i.jsx)(_.h3,{id:"using-hudi-cli-on-google-dataproc",children:"Using hudi-cli on Google Dataproc"}),"\n",(0,i.jsxs)(_.p,{children:[(0,i.jsx)(_.a,{href:"https://cloud.google.com/dataproc",children:"Dataproc"})," is Google's managed service for running Apache Hadoop, Apache Spark,\nApache Flink, Presto and many other frameworks, including Hudi. If you want to run the Hudi CLI on a Dataproc node\nwhich has not been launched with Hudi support enabled, you can use the steps below:"]}),"\n",(0,i.jsx)(_.p,{children:"These steps use Hudi version 0.13.0. If you want to use a different version you will have to edit the below commands\nappropriately:"}),"\n",(0,i.jsxs)(_.ol,{children:["\n",(0,i.jsx)(_.li,{children:"Once you've started the Dataproc cluster, you can ssh into it as follows:"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:'$ gcloud compute ssh --zone "YOUR_ZONE" "HOSTNAME_OF_MASTER_NODE" --project "YOUR_PROJECT"\n'})}),"\n",(0,i.jsxs)(_.ol,{start:"2",children:["\n",(0,i.jsx)(_.li,{children:"Download the Hudi CLI bundle"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"wget https://repo1.maven.org/maven2/org/apache/hudi/hudi-cli-bundle_2.12/0.13.0/hudi-cli-bundle_2.12-0.13.0.jar \n"})}),"\n",(0,i.jsxs)(_.ol,{start:"3",children:["\n",(0,i.jsx)(_.li,{children:"Download the Hudi Spark bundle"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"wget https://repo1.maven.org/maven2/org/apache/hudi/hudi-spark-bundle_2.12/0.13.0/hudi-spark-bundle_2.12-0.13.0.jar\n"})}),"\n",(0,i.jsxs)(_.ol,{start:"4",children:["\n",(0,i.jsx)(_.li,{children:"Download the shell script that launches Hudi CLI bundle"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"wget https://raw.githubusercontent.com/apache/hudi/release-0.13.0/packaging/hudi-cli-bundle/hudi-cli-with-bundle.sh\n"})}),"\n",(0,i.jsxs)(_.ol,{start:"5",children:["\n",(0,i.jsx)(_.li,{children:"Launch Hudi CLI bundle with appropriate environment variables as follows:"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"CLIENT_JAR=$DATAPROC_DIR/lib/gcs-connector.jar CLI_BUNDLE_JAR=hudi-cli-bundle_2.12-0.13.0.jar SPARK_BUNDLE_JAR=hudi-spark-bundle_2.12-0.13.0.jar ./hudi-cli-with-bundle.sh \n"})}),"\n",(0,i.jsxs)(_.ol,{start:"6",children:["\n",(0,i.jsxs)(_.li,{children:["\n",(0,i.jsxs)(_.p,{children:["hudi->connect --path gs://path_to_some_table",(0,i.jsx)(_.br,{}),"\n","Metadata for table some_table loaded"]}),"\n"]}),"\n",(0,i.jsxs)(_.li,{children:["\n",(0,i.jsxs)(_.p,{children:["hudi:some_table->commits show --limit 5",(0,i.jsx)(_.br,{}),"\n","This command should show the recent commits, if the above steps work correctly."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(_.h2,{id:"connect-to-a-kerberized-cluster",children:"Connect to a Kerberized cluster"}),"\n",(0,i.jsxs)(_.p,{children:["Before connecting to a Kerberized cluster, you can use ",(0,i.jsx)(_.strong,{children:"kerberos kinit"})," command. Following is the usage of this command."]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"hudi->help kerberos kinit\nNAME\n kerberos kinit - Perform Kerberos authentication\n\nSYNOPSIS\n kerberos kinit --krb5conf String [--principal String] [--keytab String]\n\nOPTIONS\n --krb5conf String\n Path to krb5.conf\n [Optional, default = /etc/krb5.conf]\n\n --principal String\n Kerberos principal\n [Mandatory]\n\n --keytab String\n Path to keytab\n [Mandatory]\n"})}),"\n",(0,i.jsx)(_.p,{children:"For example:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"hudi->kerberos kinit --principal user/host@DOMAIN --keytab /etc/security/keytabs/user.keytab\nPerform Kerberos authentication\nParameters:\n--krb5conf: /etc/krb5.conf\n--principal: user/host@DOMAIN\n--keytab: /etc/security/keytabs/user.keytab\nKerberos current user: user/host@DOMAIN (auth:KERBEROS)\nKerberos login user: user/host@DOMAIN (auth:KERBEROS)\nKerberos authentication success\n"})}),"\n",(0,i.jsx)(_.p,{children:'If you see "Kerberos authentication success" in the command output, it means Kerberos authentication has been successful.'}),"\n",(0,i.jsx)(_.h2,{id:"using-hudi-cli",children:"Using hudi-cli"}),"\n",(0,i.jsx)(_.p,{children:"To initialize a hudi table, use the following command."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"===================================================================\n* ___ ___ *\n* /\\__\\ ___ /\\ \\ ___ *\n* / / / /\\__\\ / \\ \\ /\\ \\ *\n* / /__/ / / / / /\\ \\ \\ \\ \\ \\ *\n* / \\ \\ ___ / / / / / \\ \\__\\ / \\__\\ *\n* / /\\ \\ /\\__\\ / /__/ ___ / /__/ \\ |__| / /\\/__/ *\n* \\/ \\ \\/ / / \\ \\ \\ /\\__\\ \\ \\ \\ / / / /\\/ / / *\n* \\ / / \\ \\ / / / \\ \\ / / / \\ /__/ *\n* / / / \\ \\/ / / \\ \\/ / / \\ \\__\\ *\n* / / / \\ / / \\ / / \\/__/ *\n* \\/__/ \\/__/ \\/__/ Apache Hudi CLI *\n* *\n===================================================================\n\nhudi->create --path /user/hive/warehouse/table1 --tableName hoodie_table_1 --tableType COPY_ON_WRITE\n.....\n"})}),"\n",(0,i.jsx)(_.p,{children:"To see the description of hudi table, use the command:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:hoodie_table_1->desc\n18/09/06 15:57:19 INFO timeline.HoodieActiveTimeline: Loaded instants []\n _________________________________________________________\n | Property | Value |\n |========================================================|\n | basePath | ... |\n | metaPath | ... |\n | fileSystem | hdfs |\n | hoodie.table.name | hoodie_table_1 |\n | hoodie.table.type | COPY_ON_WRITE |\n | hoodie.archivelog.folder| |\n"})}),"\n",(0,i.jsx)(_.p,{children:"Following is a sample command to connect to a Hudi table contains uber trips."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->connect --path /app/uber/trips\n\n16/10/05 23:20:37 INFO model.HoodieTableMetadata: All commits :HoodieCommits{commitList=[20161002045850, 20161002052915, 20161002055918, 20161002065317, 20161002075932, 20161002082904, 20161002085949, 20161002092936, 20161002105903, 20161002112938, 20161002123005, 20161002133002, 20161002155940, 20161002165924, 20161002172907, 20161002175905, 20161002190016, 20161002192954, 20161002195925, 20161002205935, 20161002215928, 20161002222938, 20161002225915, 20161002232906, 20161003003028, 20161003005958, 20161003012936, 20161003022924, 20161003025859, 20161003032854, 20161003042930, 20161003052911, 20161003055907, 20161003062946, 20161003065927, 20161003075924, 20161003082926, 20161003085925, 20161003092909, 20161003100010, 20161003102913, 20161003105850, 20161003112910, 20161003115851, 20161003122929, 20161003132931, 20161003142952, 20161003145856, 20161003152953, 20161003155912, 20161003162922, 20161003165852, 20161003172923, 20161003175923, 20161003195931, 20161003210118, 20161003212919, 20161003215928, 20161003223000, 20161003225858, 20161004003042, 20161004011345, 20161004015235, 20161004022234, 20161004063001, 20161004072402, 20161004074436, 20161004080224, 20161004082928, 20161004085857, 20161004105922, 20161004122927, 20161004142929, 20161004163026, 20161004175925, 20161004194411, 20161004203202, 20161004211210, 20161004214115, 20161004220437, 20161004223020, 20161004225321, 20161004231431, 20161004233643, 20161005010227, 20161005015927, 20161005022911, 20161005032958, 20161005035939, 20161005052904, 20161005070028, 20161005074429, 20161005081318, 20161005083455, 20161005085921, 20161005092901, 20161005095936, 20161005120158, 20161005123418, 20161005125911, 20161005133107, 20161005155908, 20161005163517, 20161005165855, 20161005180127, 20161005184226, 20161005191051, 20161005193234, 20161005203112, 20161005205920, 20161005212949, 20161005223034, 20161005225920]}\nMetadata for table trips loaded\n"})}),"\n",(0,i.jsx)(_.p,{children:"Once connected to the table, a lot of other commands become available. The shell has contextual autocomplete help (press TAB) and below is a list of all commands, few of which are reviewed in this section"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"hudi:trips->help\n* ! - Allows execution of operating system (OS) commands\n* // - Inline comment markers (start of line only)\n* ; - Inline comment markers (start of line only)\n* bootstrap index showmapping - Show bootstrap index mapping\n* bootstrap index showpartitions - Show bootstrap indexed partitions\n* bootstrap run - Run a bootstrap action for current Hudi table\n* clean showpartitions - Show partition level details of a clean\n* cleans refresh - Refresh table metadata\n* cleans run - run clean\n* cleans show - Show the cleans\n* clear - Clears the console\n* cls - Clears the console\n* clustering run - Run Clustering\n* clustering schedule - Schedule Clustering\n* clustering scheduleAndExecute - Run Clustering. Make a cluster plan first and execute that plan immediately\n* commit rollback - Rollback a commit\n* commits compare - Compare commits with another Hoodie table\n* commit show_write_stats - Show write stats of a commit\n* commit showfiles - Show file level details of a commit\n* commit showpartitions - Show partition level details of a commit\n* commits refresh - Refresh table metadata\n* commits show - Show the commits\n* commits showarchived - Show the archived commits\n* commits sync - Sync commits with another Hoodie table\n* compaction repair - Renames the files to make them consistent with the timeline as dictated by Hoodie metadata. Use when compaction unschedule fails partially.\n* compaction run - Run Compaction for given instant time\n* compaction schedule - Schedule Compaction\n* compaction scheduleAndExecute - Schedule compaction plan and execute this plan\n* compaction show - Shows compaction details for a specific compaction instant\n* compaction showarchived - Shows compaction details for a specific compaction instant\n* compactions show all - Shows all compactions that are in active timeline\n* compactions showarchived - Shows compaction details for specified time window\n* compaction unschedule - Unschedule Compaction\n* compaction unscheduleFileId - UnSchedule Compaction for a fileId\n* compaction validate - Validate Compaction\n* connect - Connect to a hoodie table\n* create - Create a hoodie table if not present\n* date - Displays the local date and time\n* desc - Describe Hoodie Table properties\n* downgrade table - Downgrades a table\n* exit - Exits the shell\n* export instants - Export Instants and their metadata from the Timeline\n* fetch table schema - Fetches latest table schema\n* hdfsparquetimport - Imports Parquet table to a hoodie table\n* help - List all commands usage\n* marker delete - Delete the marker\n* metadata create - Create the Metadata Table if it does not exist\n* metadata delete - Remove the Metadata Table\n* metadata init - Update the metadata table from commits since the creation\n* metadata list-files - Print a list of all files in a partition from the metadata\n* metadata list-partitions - List all partitions from metadata\n* metadata refresh - Refresh table metadata\n* metadata set - Set options for Metadata Table\n* metadata stats - Print stats about the metadata\n* metadata validate-files - Validate all files in all partitions from the metadata\n* quit - Exits the shell\n* refresh - Refresh table metadata\n* repair addpartitionmeta - Add partition metadata to a table, if not present\n* repair corrupted clean files - repair corrupted clean files\n* repair deduplicate - De-duplicate a partition path contains duplicates & produce repaired files to replace with\n* repair migrate-partition-meta - Migrate all partition meta file currently stored in text format to be stored in base file format. See HoodieTableConfig#PARTITION_METAFILE_USE_DATA_FORMAT.\n* repair overwrite-hoodie-props - Overwrite hoodie.properties with provided file. Risky operation. Proceed with caution!\n* savepoint create - Savepoint a commit\n* savepoint delete - Delete the savepoint\n* savepoint rollback - Savepoint a commit\n* savepoints refresh - Refresh table metadata\n* savepoints show - Show the savepoints\n* script - Parses the specified resource file and executes its commands\n* set - Set spark launcher env to cli\n* show archived commits - Read commits from archived files and show details\n* show archived commit stats - Read commits from archived files and show details\n* show env - Show spark launcher env by key\n* show envs all - Show spark launcher envs\n* show fsview all - Show entire file-system view\n* show fsview latest - Show latest file-system view\n* show logfile metadata - Read commit metadata from log files\n* show logfile records - Read records from log files\n* show rollback - Show details of a rollback instant\n* show rollbacks - List all rollback instants\n* stats filesizes - File Sizes. Display summary stats on sizes of files\n* stats wa - Write Amplification. Ratio of how many records were upserted to how many records were actually written\n* sync validate - Validate the sync by counting the number of records\n* system properties - Shows the shell's properties\n* table delete-configs - Delete the supplied table configs from the table.\n* table recover-configs - Recover table configs, from update/delete that failed midway.\n* table update-configs - Update the table configs with configs with provided file.\n* temp_delete - Delete view name\n* temp_query - query against created temp view\n* temp delete - Delete view name\n* temp query - query against created temp view\n* temps_show - Show all views name\n* temps show - Show all views name\n* upgrade table - Upgrades a table\n* utils loadClass - Load a class\n* version - Displays shell version\n\nhudi:trips->\n"})}),"\n",(0,i.jsx)(_.h3,{id:"inspecting-commits",children:"Inspecting Commits"}),"\n",(0,i.jsxs)(_.p,{children:["The task of upserting or inserting a batch of incoming records is known as a ",(0,i.jsx)(_.strong,{children:"commit"})," in Hudi. A commit provides basic atomicity guarantees such that only committed data is available for querying.\nEach commit has a monotonically increasing string/number called the ",(0,i.jsx)(_.strong,{children:"commit number"}),". Typically, this is the time at which we started the commit."]}),"\n",(0,i.jsx)(_.p,{children:"To view some basic information about the last 10 commits,"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:trips->commits show --sortBy "Total Bytes Written" --desc true --limit 10\n ________________________________________________________________________________________________________________________________________________________________________\n | CommitTime | Total Bytes Written| Total Files Added| Total Files Updated| Total Partitions Written| Total Records Written| Total Update Records Written| Total Errors|\n |=======================================================================================================================================================================|\n ....\n ....\n ....\n'})}),"\n",(0,i.jsx)(_.p,{children:"At the start of each write, Hudi also writes a .inflight commit to the .hoodie folder. You can use the timestamp there to estimate how long the commit has been inflight"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"$ hdfs dfs -ls /app/uber/trips/.hoodie/*.inflight\n-rw-r--r-- 3 vinoth supergroup 321984 2016-10-05 23:18 /app/uber/trips/.hoodie/20161005225920.inflight\n"})}),"\n",(0,i.jsx)(_.h3,{id:"drilling-down-to-a-specific-commit",children:"Drilling Down to a specific Commit"}),"\n",(0,i.jsx)(_.p,{children:"To understand how the writes spread across specific partiions,"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:trips->commit showpartitions --commit 20161005165855 --sortBy "Total Bytes Written" --desc true --limit 10\n __________________________________________________________________________________________________________________________________________\n | Partition Path| Total Files Added| Total Files Updated| Total Records Inserted| Total Records Updated| Total Bytes Written| Total Errors|\n |=========================================================================================================================================|\n ....\n ....\n'})}),"\n",(0,i.jsx)(_.p,{children:"If you need file level granularity , we can do the following"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:trips->commit showfiles --commit 20161005165855 --sortBy "Partition Path"\n ________________________________________________________________________________________________________________________________________________________\n | Partition Path| File ID | Previous Commit| Total Records Updated| Total Records Written| Total Bytes Written| Total Errors|\n |=======================================================================================================================================================|\n ....\n ....\n'})}),"\n",(0,i.jsx)(_.h3,{id:"filesystem-view",children:"FileSystem View"}),"\n",(0,i.jsx)(_.p,{children:"Hudi views each partition as a collection of file-groups with each file-group containing a list of file-slices in commit order (See concepts).\nThe below commands allow users to view the file-slices for a data-set."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:stock_ticks_mor->show fsview all\n ....\n _______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | Partition | FileId | Base-Instant | Data-File | Data-File Size| Num Delta Files| Total Delta File Size| Delta Files |\n |==============================================================================================================================================================================================================================================================================================================================================================================================================|\n | 2018/08/31| 111415c3-f26d-4639-86c8-f9956f245ac3| 20181002180759| hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/111415c3-f26d-4639-86c8-f9956f245ac3_0_20181002180759.parquet| 432.5 KB | 1 | 20.8 KB | [HoodieLogFile {hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/.111415c3-f26d-4639-86c8-f9956f245ac3_20181002180759.log.1}]|\n\n\n\nhudi:stock_ticks_mor->show fsview latest --partitionPath "2018/08/31"\n ......\n __________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | Partition | FileId | Base-Instant | Data-File | Data-File Size| Num Delta Files| Total Delta Size| Delta Size - compaction scheduled| Delta Size - compaction unscheduled| Delta To Base Ratio - compaction scheduled| Delta To Base Ratio - compaction unscheduled| Delta Files - compaction scheduled | Delta Files - compaction unscheduled|\n |=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================|\n | 2018/08/31| 111415c3-f26d-4639-86c8-f9956f245ac3| 20181002180759| hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/111415c3-f26d-4639-86c8-f9956f245ac3_0_20181002180759.parquet| 432.5 KB | 1 | 20.8 KB | 20.8 KB | 0.0 B | 0.0 B | 0.0 B | [HoodieLogFile {hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/.111415c3-f26d-4639-86c8-f9956f245ac3_20181002180759.log.1}]| [] |\n\n'})}),"\n",(0,i.jsx)(_.h3,{id:"statistics",children:"Statistics"}),"\n",(0,i.jsx)(_.p,{children:"Since Hudi directly manages file sizes for DFS table, it might be good to get an overall picture"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:trips->stats filesizes --partitionPath 2016/09/01 --sortBy "95th" --desc true --limit 10\n ________________________________________________________________________________________________\n | CommitTime | Min | 10th | 50th | avg | 95th | Max | NumFiles| StdDev |\n |===============================================================================================|\n | | 93.9 MB | 93.9 MB | 93.9 MB | 93.9 MB | 93.9 MB | 93.9 MB | 2 | 2.3 KB |\n ....\n ....\n'})}),"\n",(0,i.jsx)(_.p,{children:"In case of Hudi write taking much longer, it might be good to see the write amplification for any sudden increases"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->stats wa\n __________________________________________________________________________\n | CommitTime | Total Upserted| Total Written| Write Amplifiation Factor|\n |=========================================================================|\n ....\n ....\n"})}),"\n",(0,i.jsx)(_.h3,{id:"archived-commits",children:"Archived Commits"}),"\n",(0,i.jsx)(_.p,{children:"In order to limit the amount of growth of .commit files on DFS, Hudi archives older .commit files (with due respect to the cleaner policy) into a commits.archived file.\nThis is a sequence file that contains a mapping from commitNumber => json with raw information about the commit (same that is nicely rolled up above)."}),"\n",(0,i.jsx)(_.h3,{id:"compactions",children:"Compactions"}),"\n",(0,i.jsx)(_.p,{children:"To get an idea of the lag between compaction and writer applications, use the below command to list down all\npending compactions."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->compactions show all\n ___________________________________________________________________\n | Compaction Instant Time| State | Total FileIds to be Compacted|\n |==================================================================|\n | | REQUESTED| 35 |\n | | INFLIGHT | 27 |\n"})}),"\n",(0,i.jsx)(_.p,{children:"To inspect a specific compaction plan, use"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->compaction show --instant \n _________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | Partition Path| File Id | Base Instant | Data File Path | Total Delta Files| getMetrics |\n |================================================================================================================================================================================================================================================\n | 2018/07/17 | | | viewfs://ns-default/.../../UUID_.parquet | 1 | {TOTAL_LOG_FILES=1.0, TOTAL_IO_READ_MB=1230.0, TOTAL_LOG_FILES_SIZE=2.51255751E8, TOTAL_IO_WRITE_MB=991.0, TOTAL_IO_MB=2221.0}|\n\n"})}),"\n",(0,i.jsx)(_.p,{children:"To manually schedule or run a compaction, use the below command. This command uses spark launcher to perform compaction\noperations."}),"\n",(0,i.jsxs)(_.p,{children:[(0,i.jsx)(_.strong,{children:"NOTE:"})," Make sure no other application is scheduling compaction for this table concurrently\n{: .notice--info}"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->help compaction schedule\nKeyword: compaction schedule\nDescription: Schedule Compaction\n Keyword: sparkMemory\n Help: Spark executor memory\n Mandatory: false\n Default if specified: '__NULL__'\n Default if unspecified: '1G'\n\n* compaction schedule - Schedule Compaction\n"})}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->help compaction run\nKeyword: compaction run\nDescription: Run Compaction for given instant time\n Keyword: tableName\n Help: Table name\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: parallelism\n Help: Parallelism for hoodie compaction\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: schemaFilePath\n Help: Path for Avro schema file\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: sparkMemory\n Help: Spark executor memory\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: retry\n Help: Number of retries\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: compactionInstant\n Help: Base path for the target hoodie table\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n* compaction run - Run Compaction for given instant time\n"})}),"\n",(0,i.jsx)(_.h3,{id:"validate-compaction",children:"Validate Compaction"}),"\n",(0,i.jsx)(_.p,{children:"Validating a compaction plan : Check if all the files necessary for compactions are present and are valid"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:stock_ticks_mor->compaction validate --instant 20181005222611\n...\n\n COMPACTION PLAN VALID\n\n ___________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | File Id | Base Instant Time| Base Data File | Num Delta Files| Valid| Error|\n |==========================================================================================================================================================================================================================|\n | 05320e98-9a57-4c38-b809-a6beaaeb36bd| 20181005222445 | hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/05320e98-9a57-4c38-b809-a6beaaeb36bd_0_20181005222445.parquet| 1 | true | |\n\n\n\nhudi:stock_ticks_mor->compaction validate --instant 20181005222601\n\n COMPACTION PLAN INVALID\n\n _______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | File Id | Base Instant Time| Base Data File | Num Delta Files| Valid| Error |\n |=====================================================================================================================================================================================================================================================================================================|\n | 05320e98-9a57-4c38-b809-a6beaaeb36bd| 20181005222445 | hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/05320e98-9a57-4c38-b809-a6beaaeb36bd_0_20181005222445.parquet| 1 | false| All log files specified in compaction operation is not present. Missing .... |\n"})}),"\n",(0,i.jsxs)(_.p,{children:[(0,i.jsx)(_.strong,{children:"NOTE:"})," The following commands must be executed without any other writer/ingestion application running.\n{: .notice--warning}"]}),"\n",(0,i.jsx)(_.p,{children:"Sometimes, it becomes necessary to remove a fileId from a compaction-plan inorder to speed-up or unblock compaction\noperation. Any new log-files that happened on this file after the compaction got scheduled will be safely renamed\nso that are preserved. Hudi provides the following CLI to support it"}),"\n",(0,i.jsx)(_.h3,{id:"unscheduling-compaction",children:"Unscheduling Compaction"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->compaction unscheduleFileId --fileId \n....\nNo File renames needed to unschedule file from pending compaction. Operation successful.\n"})}),"\n",(0,i.jsx)(_.p,{children:"In other cases, an entire compaction plan needs to be reverted. This is supported by the following CLI"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->compaction unschedule --instant \n.....\nNo File renames needed to unschedule pending compaction. Operation successful.\n"})}),"\n",(0,i.jsx)(_.h3,{id:"repair-compaction",children:"Repair Compaction"}),"\n",(0,i.jsxs)(_.p,{children:["The above compaction unscheduling operations could sometimes fail partially (e",":g"," -> DFS temporarily unavailable). With\npartial failures, the compaction operation could become inconsistent with the state of file-slices. When you run\n",(0,i.jsx)(_.code,{children:"compaction validate"}),", you can notice invalid compaction operations if there is one. In these cases, the repair\ncommand comes to the rescue, it will rearrange the file-slices so that there is no loss and the file-slices are\nconsistent with the compaction plan"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:stock_ticks_mor->compaction repair --instant 20181005222611\n......\nCompaction successfully repaired\n.....\n"})}),"\n",(0,i.jsx)(_.h3,{id:"savepoint-and-restore",children:"Savepoint and Restore"}),"\n",(0,i.jsxs)(_.p,{children:['As the name suggest, "savepoint" saves the table as of the commit time, so that it lets you restore the table to this\nsavepoint at a later point in time if need be. You can read more about savepoints and restore ',(0,i.jsx)(_.a,{href:"disaster_recovery",children:"here"})]}),"\n",(0,i.jsx)(_.p,{children:"To trigger savepoint for a hudi table"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"connect --path /tmp/hudi_trips_cow/\ncommits show\nset --conf SPARK_HOME=\nsavepoint create --commit 20220128160245447 --sparkMaster local[2]\n"})}),"\n",(0,i.jsx)(_.p,{children:"To restore the table to one of the savepointed commit:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"connect --path /tmp/hudi_trips_cow/\ncommits show\nset --conf SPARK_HOME=\nsavepoints show\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 SavepointTime \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\n\u2551 20220128160245447 \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\nsavepoint rollback --savepoint 20220128160245447 --sparkMaster local[2]\n"})}),"\n",(0,i.jsx)(_.h3,{id:"upgrade-and-downgrade-table",children:"Upgrade and Downgrade Table"}),"\n",(0,i.jsx)(_.p,{children:"In case the user needs to downgrade the version of Hudi library used, the Hudi table needs to be manually downgraded\non the newer version of Hudi CLI before library downgrade. To downgrade a Hudi table through CLI, user needs to specify\nthe target Hudi table version as follows:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"connect --path \ndowngrade table --toVersion \n"})}),"\n",(0,i.jsx)(_.p,{children:"The following table shows the Hudi table versions corresponding to the Hudi release versions:"}),"\n",(0,i.jsxs)(_.table,{children:[(0,i.jsx)(_.thead,{children:(0,i.jsxs)(_.tr,{children:[(0,i.jsx)(_.th,{style:{textAlign:"left"},children:"Hudi Table Version"}),(0,i.jsx)(_.th,{style:{textAlign:"left"},children:"Hudi Release Version(s)"})]})}),(0,i.jsxs)(_.tbody,{children:[(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"FIVE"})," or ",(0,i.jsx)(_.code,{children:"5"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.12.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"FOUR"})," or ",(0,i.jsx)(_.code,{children:"4"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.11.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"THREE"})," or ",(0,i.jsx)(_.code,{children:"3"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.10.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"TWO"})," or ",(0,i.jsx)(_.code,{children:"2"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.9.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"ONE"})," or ",(0,i.jsx)(_.code,{children:"1"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.6.x - 0.8.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"ZERO"})," or ",(0,i.jsx)(_.code,{children:"0"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.5.x and below"})]})]})]}),"\n",(0,i.jsxs)(_.p,{children:["For example, to downgrade a table from version ",(0,i.jsx)(_.code,{children:"FIVE"}),"(",(0,i.jsx)(_.code,{children:"5"}),") (current version) to ",(0,i.jsx)(_.code,{children:"TWO"}),"(",(0,i.jsx)(_.code,{children:"2"}),"), you should run (use proper Spark master based\non your environment)"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"downgrade table --toVersion TWO --sparkMaster local[2]\n"})}),"\n",(0,i.jsx)(_.p,{children:"or"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"downgrade table --toVersion 2 --sparkMaster local[2]\n"})}),"\n",(0,i.jsxs)(_.p,{children:["You can verify the table version by looking at the ",(0,i.jsx)(_.code,{children:"hoodie.table.version"})," property in ",(0,i.jsx)(_.code,{children:".hoodie/hoodie.properties"})," under\nthe table path:"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-properties",children:"hoodie.table.version=2\n"})}),"\n",(0,i.jsx)(_.p,{children:"Hudi CLI also provides the ability to manually upgrade a Hudi table. To upgrade a Hudi table through CLI:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"upgrade table --toVersion \n"})}),"\n",(0,i.jsxs)(_.admonition,{type:"note",children:[(0,i.jsxs)(_.p,{children:["Table upgrade is automatically handled by the Hudi write client in different deployment modes such as DeltaStreamer\nafter upgrading the Hudi library so that the user does not have to do manual upgrade. Such automatic table upgrade\nis the ",(0,i.jsx)(_.strong,{children:"recommended"})," way in general, instead of using ",(0,i.jsx)(_.code,{children:"upgrade"})," CLI command."]}),(0,i.jsx)(_.p,{children:'Table upgrade from table version ONE to TWO requires key generator related configs such as\n"hoodie.datasource.write.recordkey.field", which is only available when user configures the write job. So the table\nupgrade from version ONE to TWO through CLI is not supported, and user should rely on the automatic upgrade in the write\nclient instead.'})]}),"\n",(0,i.jsx)(_.p,{children:"You may also run the upgrade command without specifying the target version. In such a case, the latest table version\ncorresponding to the library release version is used:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"upgrade table\n"})}),"\n",(0,i.jsx)(_.h3,{id:"change-hudi-table-type",children:"Change Hudi Table Type"}),"\n",(0,i.jsx)(_.p,{children:"There are cases we want to change the hudi table type. For example, change COW table to MOR for more efficient and\nlower latency ingestion; change MOR to COW for better read performance and compatibility with downstream engines.\nSo we offer the table command to perform this modification conveniently."}),"\n",(0,i.jsxs)(_.p,{children:["Changing ",(0,i.jsx)(_.strong,{children:"COW to MOR"}),", we can simply modify the ",(0,i.jsx)(_.code,{children:"hoodie.table.type"})," in ",(0,i.jsx)(_.code,{children:"hoodie.properties"})," to MERGE_ON_READ."]}),"\n",(0,i.jsxs)(_.p,{children:["While changing ",(0,i.jsx)(_.strong,{children:"MOR to COW"}),", we must make sure all the log files are compacted before modifying the table type,\nor it will cause data loss."]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"connect --path \ntable change-table-type \n"})}),"\n",(0,i.jsxs)(_.p,{children:["The parameter ",(0,i.jsx)(_.code,{children:"target_table_type"})," candidates are below:"]}),"\n",(0,i.jsxs)(_.table,{children:[(0,i.jsx)(_.thead,{children:(0,i.jsxs)(_.tr,{children:[(0,i.jsx)(_.th,{style:{textAlign:"left"},children:"target table type"}),(0,i.jsx)(_.th,{style:{textAlign:"left"},children:"comment"})]})}),(0,i.jsxs)(_.tbody,{children:[(0,i.jsxs)(_.tr,{children:[(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"MOR"}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"Change COW table to MERGE_ON_READ."})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"COW"}),(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:["Change MOR table to COPY_ON_WRITE. ",(0,i.jsx)("br",{}),"By default, changing to COW will ",(0,i.jsx)(_.strong,{children:"execute all pending compactions"})," and ",(0,i.jsx)(_.strong,{children:"perform a full compaction"})," if any log file left. Set ",(0,i.jsx)(_.code,{children:"--enable-compaction=false"})," will disable the default compaction. ",(0,i.jsx)("br",{}),"There are params can be set for the compaction operation:",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--parallelism"}),": Default ",(0,i.jsx)(_.code,{children:"3"}),". Parallelism for hoodie compaction",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--sparkMaster"}),": Default ",(0,i.jsx)(_.code,{children:"local"}),". Spark Master",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--sparkMemory"}),": Default ",(0,i.jsx)(_.code,{children:"4G"}),". Spark executor memory",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--retry"}),": Default ",(0,i.jsx)(_.code,{children:"1"}),". Number of retries",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--propsFilePath"}),": Default ",(0,i.jsx)(_.code,{children:" "}),". path to properties file on localfs or dfs with configurations for hoodie client for compacting",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--hoodieConfigs"}),": Default ",(0,i.jsx)(_.code,{children:" "}),". Any configuration that can be set in the properties file can be passed here in the form of an array"]})]})]})]}),"\n",(0,i.jsx)(_.p,{children:"Example below is changing MOR table to COW:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"connect --path /var/dataset/test_table_mor2cow\ndesc\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 Property \u2502 Value \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\n\u2551 basePath \u2502 /var/dataset/test_table_mor2cow \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 metaPath \u2502 /var/dataset/test_table_mor2cow/.hoodie \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 fileSystem \u2502 file \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.name \u2502 test_table \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.compaction.record.merger.strategy \u2502 eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.metadata.partitions \u2502 files \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.type \u2502 MERGE_ON_READ \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.metadata.partitions.inflight \u2502 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.archivelog.folder \u2502 archived \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.timeline.layout.version \u2502 1 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.checksum \u2502 2702201862 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.compaction.payload.type \u2502 HOODIE_AVRO \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.version \u2502 6 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.datasource.write.drop.partition.columns \u2502 false \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n\ntable change-table-type COW\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 Property \u2502 Old Value \u2502 New Value \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\n\u2551 hoodie.archivelog.folder \u2502 archived \u2502 archived \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.compaction.payload.type \u2502 HOODIE_AVRO \u2502 HOODIE_AVRO \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.compaction.record.merger.strategy \u2502 eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 \u2502 eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.datasource.write.drop.partition.columns \u2502 false \u2502 false \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.checksum \u2502 2702201862 \u2502 2702201862 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.metadata.partitions \u2502 files \u2502 files \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.metadata.partitions.inflight \u2502 \u2502 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.name \u2502 test_table \u2502 test_table \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.type \u2502 MERGE_ON_READ \u2502 COPY_ON_WRITE \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.version \u2502 6 \u2502 6 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.timeline.layout.version \u2502 1 \u2502 1 \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})})]})}function d(e={}){const{wrapper:_}={...(0,a.R)(),...e.components};return _?(0,i.jsx)(_,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},28453:(e,_,n)=>{n.d(_,{R:()=>o,x:()=>s});var t=n(96540);const i={},a=t.createContext(i);function o(e){const _=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(_):{..._,...e}}),[_,e])}function s(e){let _;return _=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(a.Provider,{value:_},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/1a20bc57.83de7b83.js b/content/assets/js/1a20bc57.83de7b83.js new file mode 100644 index 0000000000000..f02bd056618f3 --- /dev/null +++ b/content/assets/js/1a20bc57.83de7b83.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[59114],{46768:(e,_,n)=>{n.r(_),n.d(_,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>t,toc:()=>r});const t=JSON.parse('{"id":"cli","title":"CLI","description":"Local set up","source":"@site/docs/cli.md","sourceDirName":".","slug":"/cli","permalink":"/docs/next/cli","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/cli.md","tags":[],"version":"current","frontMatter":{"title":"CLI","keywords":["hudi","cli"],"last_modified_at":"2021-08-18T19:59:57.000Z"},"sidebar":"docs","previous":{"title":"SQL Procedures","permalink":"/docs/next/procedures"},"next":{"title":"Metrics","permalink":"/docs/next/metrics"}}');var i=n(74848),a=n(28453);const o={title:"CLI",keywords:["hudi","cli"],last_modified_at:new Date("2021-08-18T19:59:57.000Z")},s=void 0,l={},r=[{value:"Local set up",id:"local-set-up",level:3},{value:"Hudi CLI Bundle setup",id:"hudi-cli-bundle-setup",level:3},{value:"Base path",id:"base-path",level:3},{value:"Using Hudi-cli in S3",id:"using-hudi-cli-in-s3",level:3},{value:"Note: These AWS jar versions below are specific to Spark 3.2.0",id:"note-these-aws-jar-versions-below-are-specific-to-spark-320",level:4},{value:"Using hudi-cli on Google Dataproc",id:"using-hudi-cli-on-google-dataproc",level:3},{value:"Connect to a Kerberized cluster",id:"connect-to-a-kerberized-cluster",level:2},{value:"Using hudi-cli",id:"using-hudi-cli",level:2},{value:"Inspecting Commits",id:"inspecting-commits",level:3},{value:"Drilling Down to a specific Commit",id:"drilling-down-to-a-specific-commit",level:3},{value:"FileSystem View",id:"filesystem-view",level:3},{value:"Statistics",id:"statistics",level:3},{value:"Archived Commits",id:"archived-commits",level:3},{value:"Compactions",id:"compactions",level:3},{value:"Validate Compaction",id:"validate-compaction",level:3},{value:"Unscheduling Compaction",id:"unscheduling-compaction",level:3},{value:"Repair Compaction",id:"repair-compaction",level:3},{value:"Savepoint and Restore",id:"savepoint-and-restore",level:3},{value:"Upgrade and Downgrade Table",id:"upgrade-and-downgrade-table",level:3},{value:"Change Hudi Table Type",id:"change-hudi-table-type",level:3},{value:"Related Resources",id:"related-resources",level:2}];function c(e){const _={a:"a",admonition:"admonition",br:"br",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(_.h3,{id:"local-set-up",children:"Local set up"}),"\n",(0,i.jsxs)(_.p,{children:["Once hudi has been built, the shell can be fired by via ",(0,i.jsx)(_.code,{children:"cd hudi-cli && ./hudi-cli.sh"}),"."]}),"\n",(0,i.jsx)(_.h3,{id:"hudi-cli-bundle-setup",children:"Hudi CLI Bundle setup"}),"\n",(0,i.jsxs)(_.p,{children:["In release ",(0,i.jsx)(_.code,{children:"0.13.0"})," we have now added another way of launching the ",(0,i.jsx)(_.code,{children:"hudi cli"}),", which is using the ",(0,i.jsx)(_.code,{children:"hudi-cli-bundle"}),"."]}),"\n",(0,i.jsxs)(_.p,{children:["There are a couple of requirements when using this approach such as having ",(0,i.jsx)(_.code,{children:"spark"})," installed locally on your machine.\nIt is required to use a spark distribution with hadoop dependencies packaged such as ",(0,i.jsx)(_.code,{children:"spark-3.3.1-bin-hadoop2.tgz"})," from ",(0,i.jsx)(_.a,{href:"https://archive.apache.org/dist/spark/",children:"https://archive.apache.org/dist/spark/"}),".\nWe also recommend you set an env variable ",(0,i.jsx)(_.code,{children:"$SPARK_HOME"})," to the path of where spark is installed on your machine.\nOne important thing to note is that the ",(0,i.jsx)(_.code,{children:"hudi-spark-bundle"})," should also be present when using the ",(0,i.jsx)(_.code,{children:"hudi-cli-bundle"}),".",(0,i.jsx)(_.br,{}),"\n","To provide the locations of these bundle jars you can set them in your shell like so:\n",(0,i.jsx)(_.code,{children:"export CLI_BUNDLE_JAR="})," , ",(0,i.jsx)(_.code,{children:"export SPARK_BUNDLE_JAR="}),"."]}),"\n",(0,i.jsx)(_.p,{children:"For steps see below if you are not compiling the project and downloading the jars:"}),"\n",(0,i.jsxs)(_.ol,{children:["\n",(0,i.jsx)(_.li,{children:"Create an empty folder as a new directory"}),"\n",(0,i.jsx)(_.li,{children:"Copy the hudi-cli-bundle jars and hudi-spark*-bundle jars to this directory"}),"\n",(0,i.jsx)(_.li,{children:"Copy the following script and folder to this directory"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"packaging/hudi-cli-bundle/hudi-cli-with-bundle.sh\npackaging/hudi-cli-bundle/conf . the `conf` folder should be in this directory.\n"})}),"\n",(0,i.jsxs)(_.ol,{start:"4",children:["\n",(0,i.jsx)(_.li,{children:"Start Hudi CLI shell with environment variables set"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"export SPARK_HOME=\nexport CLI_BUNDLE_JAR=\nexport SPARK_BUNDLE_JAR=\n\n./hudi-cli-with-bundle.sh\n\n"})}),"\n",(0,i.jsx)(_.h3,{id:"base-path",children:"Base path"}),"\n",(0,i.jsxs)(_.p,{children:["A hudi table resides on DFS, in a location referred to as the ",(0,i.jsx)(_.code,{children:"basePath"})," and\nwe would need this location in order to connect to a Hudi table. Hudi library effectively manages this table internally, using ",(0,i.jsx)(_.code,{children:".hoodie"})," subfolder to track all metadata."]}),"\n",(0,i.jsx)(_.h3,{id:"using-hudi-cli-in-s3",children:"Using Hudi-cli in S3"}),"\n",(0,i.jsxs)(_.p,{children:["If you are using hudi that comes packaged with AWS EMR, you can find instructions to use hudi-cli ",(0,i.jsx)(_.a,{href:"https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hudi-cli.html",children:"here"}),".\nIf you are not using EMR, or would like to use latest hudi-cli from master, you can follow the below steps to access S3 dataset in your local environment (laptop)."]}),"\n",(0,i.jsx)(_.p,{children:"Build Hudi with corresponding Spark version, for eg, -Dspark3.1.x"}),"\n",(0,i.jsx)(_.p,{children:"Set the following environment variables."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"export AWS_REGION=us-east-2\nexport AWS_ACCESS_KEY_ID=\nexport AWS_SECRET_ACCESS_KEY=\nexport SPARK_HOME=\n"})}),"\n",(0,i.jsx)(_.p,{children:"Ensure you set the SPARK_HOME to your local spark home compatible to compiled hudi spark version above."}),"\n",(0,i.jsx)(_.p,{children:"Apart from these, we might need to add aws jars to class path so that accessing S3 is feasible from local.\nWe need two jars, namely, aws-java-sdk-bundle jar and hadoop-aws jar which you can find online.\nFor eg:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/3.2.0/hadoop-aws-3.2.0.jar -o /lib/spark-3.2.0-bin-hadoop3.2/jars/hadoop-aws-3.2.0.jar\nwget https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-bundle/1.11.375/aws-java-sdk-bundle-1.11.375.jar -o /lib/spark-3.2.0-bin-hadoop3.2/jars/aws-java-sdk-bundle-1.11.375.jar\n"})}),"\n",(0,i.jsx)(_.h4,{id:"note-these-aws-jar-versions-below-are-specific-to-spark-320",children:"Note: These AWS jar versions below are specific to Spark 3.2.0"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"export CLIENT_JAR=/lib/spark-3.2.0-bin-hadoop3.2/jars/aws-java-sdk-bundle-1.12.48.jar:/lib/spark-3.2.0-bin-hadoop3.2/jars/hadoop-aws-3.3.1.jar\n"})}),"\n",(0,i.jsx)(_.p,{children:"Once these are set, you are good to launch hudi-cli and access S3 dataset."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"./hudi-cli/hudi-cli.sh\n"})}),"\n",(0,i.jsx)(_.h3,{id:"using-hudi-cli-on-google-dataproc",children:"Using hudi-cli on Google Dataproc"}),"\n",(0,i.jsxs)(_.p,{children:[(0,i.jsx)(_.a,{href:"https://cloud.google.com/dataproc",children:"Dataproc"})," is Google's managed service for running Apache Hadoop, Apache Spark,\nApache Flink, Presto and many other frameworks, including Hudi. If you want to run the Hudi CLI on a Dataproc node\nwhich has not been launched with Hudi support enabled, you can use the steps below:"]}),"\n",(0,i.jsx)(_.p,{children:"These steps use Hudi version 0.13.0. If you want to use a different version you will have to edit the below commands\nappropriately:"}),"\n",(0,i.jsxs)(_.ol,{children:["\n",(0,i.jsx)(_.li,{children:"Once you've started the Dataproc cluster, you can ssh into it as follows:"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:'$ gcloud compute ssh --zone "YOUR_ZONE" "HOSTNAME_OF_MASTER_NODE" --project "YOUR_PROJECT"\n'})}),"\n",(0,i.jsxs)(_.ol,{start:"2",children:["\n",(0,i.jsx)(_.li,{children:"Download the Hudi CLI bundle"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"wget https://repo1.maven.org/maven2/org/apache/hudi/hudi-cli-bundle_2.12/0.13.0/hudi-cli-bundle_2.12-0.13.0.jar \n"})}),"\n",(0,i.jsxs)(_.ol,{start:"3",children:["\n",(0,i.jsx)(_.li,{children:"Download the Hudi Spark bundle"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"wget https://repo1.maven.org/maven2/org/apache/hudi/hudi-spark-bundle_2.12/0.13.0/hudi-spark-bundle_2.12-0.13.0.jar\n"})}),"\n",(0,i.jsxs)(_.ol,{start:"4",children:["\n",(0,i.jsx)(_.li,{children:"Download the shell script that launches Hudi CLI bundle"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"wget https://raw.githubusercontent.com/apache/hudi/release-0.13.0/packaging/hudi-cli-bundle/hudi-cli-with-bundle.sh\n"})}),"\n",(0,i.jsxs)(_.ol,{start:"5",children:["\n",(0,i.jsx)(_.li,{children:"Launch Hudi CLI bundle with appropriate environment variables as follows:"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"CLIENT_JAR=$DATAPROC_DIR/lib/gcs-connector.jar CLI_BUNDLE_JAR=hudi-cli-bundle_2.12-0.13.0.jar SPARK_BUNDLE_JAR=hudi-spark-bundle_2.12-0.13.0.jar ./hudi-cli-with-bundle.sh \n"})}),"\n",(0,i.jsxs)(_.ol,{start:"6",children:["\n",(0,i.jsxs)(_.li,{children:["\n",(0,i.jsxs)(_.p,{children:["hudi->connect --path gs://path_to_some_table",(0,i.jsx)(_.br,{}),"\n","Metadata for table some_table loaded"]}),"\n"]}),"\n",(0,i.jsxs)(_.li,{children:["\n",(0,i.jsxs)(_.p,{children:["hudi:some_table->commits show --limit 5",(0,i.jsx)(_.br,{}),"\n","This command should show the recent commits, if the above steps work correctly."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(_.h2,{id:"connect-to-a-kerberized-cluster",children:"Connect to a Kerberized cluster"}),"\n",(0,i.jsxs)(_.p,{children:["Before connecting to a Kerberized cluster, you can use ",(0,i.jsx)(_.strong,{children:"kerberos kinit"})," command. Following is the usage of this command."]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"hudi->help kerberos kinit\nNAME\n kerberos kinit - Perform Kerberos authentication\n\nSYNOPSIS\n kerberos kinit --krb5conf String [--principal String] [--keytab String]\n\nOPTIONS\n --krb5conf String\n Path to krb5.conf\n [Optional, default = /etc/krb5.conf]\n\n --principal String\n Kerberos principal\n [Mandatory]\n\n --keytab String\n Path to keytab\n [Mandatory]\n"})}),"\n",(0,i.jsx)(_.p,{children:"For example:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"hudi->kerberos kinit --principal user/host@DOMAIN --keytab /etc/security/keytabs/user.keytab\nPerform Kerberos authentication\nParameters:\n--krb5conf: /etc/krb5.conf\n--principal: user/host@DOMAIN\n--keytab: /etc/security/keytabs/user.keytab\nKerberos current user: user/host@DOMAIN (auth:KERBEROS)\nKerberos login user: user/host@DOMAIN (auth:KERBEROS)\nKerberos authentication success\n"})}),"\n",(0,i.jsx)(_.p,{children:'If you see "Kerberos authentication success" in the command output, it means Kerberos authentication has been successful.'}),"\n",(0,i.jsx)(_.h2,{id:"using-hudi-cli",children:"Using hudi-cli"}),"\n",(0,i.jsx)(_.p,{children:"To initialize a hudi table, use the following command."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"===================================================================\n* ___ ___ *\n* /\\__\\ ___ /\\ \\ ___ *\n* / / / /\\__\\ / \\ \\ /\\ \\ *\n* / /__/ / / / / /\\ \\ \\ \\ \\ \\ *\n* / \\ \\ ___ / / / / / \\ \\__\\ / \\__\\ *\n* / /\\ \\ /\\__\\ / /__/ ___ / /__/ \\ |__| / /\\/__/ *\n* \\/ \\ \\/ / / \\ \\ \\ /\\__\\ \\ \\ \\ / / / /\\/ / / *\n* \\ / / \\ \\ / / / \\ \\ / / / \\ /__/ *\n* / / / \\ \\/ / / \\ \\/ / / \\ \\__\\ *\n* / / / \\ / / \\ / / \\/__/ *\n* \\/__/ \\/__/ \\/__/ Apache Hudi CLI *\n* *\n===================================================================\n\nhudi->create --path /user/hive/warehouse/table1 --tableName hoodie_table_1 --tableType COPY_ON_WRITE\n.....\n"})}),"\n",(0,i.jsx)(_.p,{children:"To see the description of hudi table, use the command:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:hoodie_table_1->desc\n18/09/06 15:57:19 INFO timeline.HoodieActiveTimeline: Loaded instants []\n _________________________________________________________\n | Property | Value |\n |========================================================|\n | basePath | ... |\n | metaPath | ... |\n | fileSystem | hdfs |\n | hoodie.table.name | hoodie_table_1 |\n | hoodie.table.type | COPY_ON_WRITE |\n | hoodie.archivelog.folder| |\n"})}),"\n",(0,i.jsx)(_.p,{children:"Following is a sample command to connect to a Hudi table contains uber trips."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->connect --path /app/uber/trips\n\n16/10/05 23:20:37 INFO model.HoodieTableMetadata: All commits :HoodieCommits{commitList=[20161002045850, 20161002052915, 20161002055918, 20161002065317, 20161002075932, 20161002082904, 20161002085949, 20161002092936, 20161002105903, 20161002112938, 20161002123005, 20161002133002, 20161002155940, 20161002165924, 20161002172907, 20161002175905, 20161002190016, 20161002192954, 20161002195925, 20161002205935, 20161002215928, 20161002222938, 20161002225915, 20161002232906, 20161003003028, 20161003005958, 20161003012936, 20161003022924, 20161003025859, 20161003032854, 20161003042930, 20161003052911, 20161003055907, 20161003062946, 20161003065927, 20161003075924, 20161003082926, 20161003085925, 20161003092909, 20161003100010, 20161003102913, 20161003105850, 20161003112910, 20161003115851, 20161003122929, 20161003132931, 20161003142952, 20161003145856, 20161003152953, 20161003155912, 20161003162922, 20161003165852, 20161003172923, 20161003175923, 20161003195931, 20161003210118, 20161003212919, 20161003215928, 20161003223000, 20161003225858, 20161004003042, 20161004011345, 20161004015235, 20161004022234, 20161004063001, 20161004072402, 20161004074436, 20161004080224, 20161004082928, 20161004085857, 20161004105922, 20161004122927, 20161004142929, 20161004163026, 20161004175925, 20161004194411, 20161004203202, 20161004211210, 20161004214115, 20161004220437, 20161004223020, 20161004225321, 20161004231431, 20161004233643, 20161005010227, 20161005015927, 20161005022911, 20161005032958, 20161005035939, 20161005052904, 20161005070028, 20161005074429, 20161005081318, 20161005083455, 20161005085921, 20161005092901, 20161005095936, 20161005120158, 20161005123418, 20161005125911, 20161005133107, 20161005155908, 20161005163517, 20161005165855, 20161005180127, 20161005184226, 20161005191051, 20161005193234, 20161005203112, 20161005205920, 20161005212949, 20161005223034, 20161005225920]}\nMetadata for table trips loaded\n"})}),"\n",(0,i.jsx)(_.p,{children:"Once connected to the table, a lot of other commands become available. The shell has contextual autocomplete help (press TAB) and below is a list of all commands, few of which are reviewed in this section"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"hudi:trips->help\n* ! - Allows execution of operating system (OS) commands\n* // - Inline comment markers (start of line only)\n* ; - Inline comment markers (start of line only)\n* bootstrap index showmapping - Show bootstrap index mapping\n* bootstrap index showpartitions - Show bootstrap indexed partitions\n* bootstrap run - Run a bootstrap action for current Hudi table\n* clean showpartitions - Show partition level details of a clean\n* cleans refresh - Refresh table metadata\n* cleans run - run clean\n* cleans show - Show the cleans\n* clear - Clears the console\n* cls - Clears the console\n* clustering run - Run Clustering\n* clustering schedule - Schedule Clustering\n* clustering scheduleAndExecute - Run Clustering. Make a cluster plan first and execute that plan immediately\n* commit rollback - Rollback a commit\n* commits compare - Compare commits with another Hoodie table\n* commit show_write_stats - Show write stats of a commit\n* commit showfiles - Show file level details of a commit\n* commit showpartitions - Show partition level details of a commit\n* commits refresh - Refresh table metadata\n* commits show - Show the commits\n* commits showarchived - Show the archived commits\n* commits sync - Sync commits with another Hoodie table\n* compaction repair - Renames the files to make them consistent with the timeline as dictated by Hoodie metadata. Use when compaction unschedule fails partially.\n* compaction run - Run Compaction for given instant time\n* compaction schedule - Schedule Compaction\n* compaction scheduleAndExecute - Schedule compaction plan and execute this plan\n* compaction show - Shows compaction details for a specific compaction instant\n* compaction showarchived - Shows compaction details for a specific compaction instant\n* compactions show all - Shows all compactions that are in active timeline\n* compactions showarchived - Shows compaction details for specified time window\n* compaction unschedule - Unschedule Compaction\n* compaction unscheduleFileId - UnSchedule Compaction for a fileId\n* compaction validate - Validate Compaction\n* connect - Connect to a hoodie table\n* create - Create a hoodie table if not present\n* date - Displays the local date and time\n* desc - Describe Hoodie Table properties\n* downgrade table - Downgrades a table\n* exit - Exits the shell\n* export instants - Export Instants and their metadata from the Timeline\n* fetch table schema - Fetches latest table schema\n* hdfsparquetimport - Imports Parquet table to a hoodie table\n* help - List all commands usage\n* marker delete - Delete the marker\n* metadata create - Create the Metadata Table if it does not exist\n* metadata delete - Remove the Metadata Table\n* metadata init - Update the metadata table from commits since the creation\n* metadata list-files - Print a list of all files in a partition from the metadata\n* metadata list-partitions - List all partitions from metadata\n* metadata refresh - Refresh table metadata\n* metadata set - Set options for Metadata Table\n* metadata stats - Print stats about the metadata\n* metadata validate-files - Validate all files in all partitions from the metadata\n* quit - Exits the shell\n* refresh - Refresh table metadata\n* repair addpartitionmeta - Add partition metadata to a table, if not present\n* repair corrupted clean files - repair corrupted clean files\n* repair deduplicate - De-duplicate a partition path contains duplicates & produce repaired files to replace with\n* repair migrate-partition-meta - Migrate all partition meta file currently stored in text format to be stored in base file format. See HoodieTableConfig#PARTITION_METAFILE_USE_DATA_FORMAT.\n* repair overwrite-hoodie-props - Overwrite hoodie.properties with provided file. Risky operation. Proceed with caution!\n* savepoint create - Savepoint a commit\n* savepoint delete - Delete the savepoint\n* savepoint rollback - Savepoint a commit\n* savepoints refresh - Refresh table metadata\n* savepoints show - Show the savepoints\n* script - Parses the specified resource file and executes its commands\n* set - Set spark launcher env to cli\n* show archived commits - Read commits from archived files and show details\n* show archived commit stats - Read commits from archived files and show details\n* show env - Show spark launcher env by key\n* show envs all - Show spark launcher envs\n* show fsview all - Show entire file-system view\n* show fsview latest - Show latest file-system view\n* show logfile metadata - Read commit metadata from log files\n* show logfile records - Read records from log files\n* show rollback - Show details of a rollback instant\n* show rollbacks - List all rollback instants\n* stats filesizes - File Sizes. Display summary stats on sizes of files\n* stats wa - Write Amplification. Ratio of how many records were upserted to how many records were actually written\n* sync validate - Validate the sync by counting the number of records\n* system properties - Shows the shell's properties\n* table delete-configs - Delete the supplied table configs from the table.\n* table recover-configs - Recover table configs, from update/delete that failed midway.\n* table update-configs - Update the table configs with configs with provided file.\n* temp_delete - Delete view name\n* temp_query - query against created temp view\n* temp delete - Delete view name\n* temp query - query against created temp view\n* temps_show - Show all views name\n* temps show - Show all views name\n* upgrade table - Upgrades a table\n* utils loadClass - Load a class\n* version - Displays shell version\n\nhudi:trips->\n"})}),"\n",(0,i.jsx)(_.h3,{id:"inspecting-commits",children:"Inspecting Commits"}),"\n",(0,i.jsxs)(_.p,{children:["The task of upserting or inserting a batch of incoming records is known as a ",(0,i.jsx)(_.strong,{children:"commit"})," in Hudi. A commit provides basic atomicity guarantees such that only committed data is available for querying.\nEach commit has a monotonically increasing string/number called the ",(0,i.jsx)(_.strong,{children:"commit number"}),". Typically, this is the time at which we started the commit."]}),"\n",(0,i.jsx)(_.p,{children:"To view some basic information about the last 10 commits,"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:trips->commits show --sortBy "Total Bytes Written" --desc true --limit 10\n ________________________________________________________________________________________________________________________________________________________________________\n | CommitTime | Total Bytes Written| Total Files Added| Total Files Updated| Total Partitions Written| Total Records Written| Total Update Records Written| Total Errors|\n |=======================================================================================================================================================================|\n ....\n ....\n ....\n'})}),"\n",(0,i.jsx)(_.p,{children:"At the start of each write, Hudi also writes a .inflight commit to the .hoodie folder. You can use the timestamp there to estimate how long the commit has been inflight"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"$ hdfs dfs -ls /app/uber/trips/.hoodie/*.inflight\n-rw-r--r-- 3 vinoth supergroup 321984 2016-10-05 23:18 /app/uber/trips/.hoodie/20161005225920.inflight\n"})}),"\n",(0,i.jsx)(_.h3,{id:"drilling-down-to-a-specific-commit",children:"Drilling Down to a specific Commit"}),"\n",(0,i.jsx)(_.p,{children:"To understand how the writes spread across specific partiions,"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:trips->commit showpartitions --commit 20161005165855 --sortBy "Total Bytes Written" --desc true --limit 10\n __________________________________________________________________________________________________________________________________________\n | Partition Path| Total Files Added| Total Files Updated| Total Records Inserted| Total Records Updated| Total Bytes Written| Total Errors|\n |=========================================================================================================================================|\n ....\n ....\n'})}),"\n",(0,i.jsx)(_.p,{children:"If you need file level granularity , we can do the following"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:trips->commit showfiles --commit 20161005165855 --sortBy "Partition Path"\n ________________________________________________________________________________________________________________________________________________________\n | Partition Path| File ID | Previous Commit| Total Records Updated| Total Records Written| Total Bytes Written| Total Errors|\n |=======================================================================================================================================================|\n ....\n ....\n'})}),"\n",(0,i.jsx)(_.h3,{id:"filesystem-view",children:"FileSystem View"}),"\n",(0,i.jsx)(_.p,{children:"Hudi views each partition as a collection of file-groups with each file-group containing a list of file-slices in commit order (See concepts).\nThe below commands allow users to view the file-slices for a data-set."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:stock_ticks_mor->show fsview all\n ....\n _______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | Partition | FileId | Base-Instant | Data-File | Data-File Size| Num Delta Files| Total Delta File Size| Delta Files |\n |==============================================================================================================================================================================================================================================================================================================================================================================================================|\n | 2018/08/31| 111415c3-f26d-4639-86c8-f9956f245ac3| 20181002180759| hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/111415c3-f26d-4639-86c8-f9956f245ac3_0_20181002180759.parquet| 432.5 KB | 1 | 20.8 KB | [HoodieLogFile {hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/.111415c3-f26d-4639-86c8-f9956f245ac3_20181002180759.log.1}]|\n\n\n\nhudi:stock_ticks_mor->show fsview latest --partitionPath "2018/08/31"\n ......\n __________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | Partition | FileId | Base-Instant | Data-File | Data-File Size| Num Delta Files| Total Delta Size| Delta Size - compaction scheduled| Delta Size - compaction unscheduled| Delta To Base Ratio - compaction scheduled| Delta To Base Ratio - compaction unscheduled| Delta Files - compaction scheduled | Delta Files - compaction unscheduled|\n |=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================|\n | 2018/08/31| 111415c3-f26d-4639-86c8-f9956f245ac3| 20181002180759| hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/111415c3-f26d-4639-86c8-f9956f245ac3_0_20181002180759.parquet| 432.5 KB | 1 | 20.8 KB | 20.8 KB | 0.0 B | 0.0 B | 0.0 B | [HoodieLogFile {hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/.111415c3-f26d-4639-86c8-f9956f245ac3_20181002180759.log.1}]| [] |\n\n'})}),"\n",(0,i.jsx)(_.h3,{id:"statistics",children:"Statistics"}),"\n",(0,i.jsx)(_.p,{children:"Since Hudi directly manages file sizes for DFS table, it might be good to get an overall picture"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:trips->stats filesizes --partitionPath 2016/09/01 --sortBy "95th" --desc true --limit 10\n ________________________________________________________________________________________________\n | CommitTime | Min | 10th | 50th | avg | 95th | Max | NumFiles| StdDev |\n |===============================================================================================|\n | | 93.9 MB | 93.9 MB | 93.9 MB | 93.9 MB | 93.9 MB | 93.9 MB | 2 | 2.3 KB |\n ....\n ....\n'})}),"\n",(0,i.jsx)(_.p,{children:"In case of Hudi write taking much longer, it might be good to see the write amplification for any sudden increases"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->stats wa\n __________________________________________________________________________\n | CommitTime | Total Upserted| Total Written| Write Amplifiation Factor|\n |=========================================================================|\n ....\n ....\n"})}),"\n",(0,i.jsx)(_.h3,{id:"archived-commits",children:"Archived Commits"}),"\n",(0,i.jsx)(_.p,{children:"In order to limit the amount of growth of .commit files on DFS, Hudi archives older .commit files (with due respect to the cleaner policy) into a commits.archived file.\nThis is a sequence file that contains a mapping from commitNumber => json with raw information about the commit (same that is nicely rolled up above)."}),"\n",(0,i.jsx)(_.h3,{id:"compactions",children:"Compactions"}),"\n",(0,i.jsx)(_.p,{children:"To get an idea of the lag between compaction and writer applications, use the below command to list down all\npending compactions."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->compactions show all\n ___________________________________________________________________\n | Compaction Instant Time| State | Total FileIds to be Compacted|\n |==================================================================|\n | | REQUESTED| 35 |\n | | INFLIGHT | 27 |\n"})}),"\n",(0,i.jsx)(_.p,{children:"To inspect a specific compaction plan, use"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->compaction show --instant \n _________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | Partition Path| File Id | Base Instant | Data File Path | Total Delta Files| getMetrics |\n |================================================================================================================================================================================================================================================\n | 2018/07/17 | | | viewfs://ns-default/.../../UUID_.parquet | 1 | {TOTAL_LOG_FILES=1.0, TOTAL_IO_READ_MB=1230.0, TOTAL_LOG_FILES_SIZE=2.51255751E8, TOTAL_IO_WRITE_MB=991.0, TOTAL_IO_MB=2221.0}|\n\n"})}),"\n",(0,i.jsx)(_.p,{children:"To manually schedule or run a compaction, use the below command. This command uses spark launcher to perform compaction\noperations."}),"\n",(0,i.jsxs)(_.p,{children:[(0,i.jsx)(_.strong,{children:"NOTE:"})," Make sure no other application is scheduling compaction for this table concurrently\n{: .notice--info}"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->help compaction schedule\nKeyword: compaction schedule\nDescription: Schedule Compaction\n Keyword: sparkMemory\n Help: Spark executor memory\n Mandatory: false\n Default if specified: '__NULL__'\n Default if unspecified: '1G'\n\n* compaction schedule - Schedule Compaction\n"})}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->help compaction run\nKeyword: compaction run\nDescription: Run Compaction for given instant time\n Keyword: tableName\n Help: Table name\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: parallelism\n Help: Parallelism for hoodie compaction\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: schemaFilePath\n Help: Path for Avro schema file\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: sparkMemory\n Help: Spark executor memory\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: retry\n Help: Number of retries\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: compactionInstant\n Help: Base path for the target hoodie table\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n* compaction run - Run Compaction for given instant time\n"})}),"\n",(0,i.jsx)(_.h3,{id:"validate-compaction",children:"Validate Compaction"}),"\n",(0,i.jsx)(_.p,{children:"Validating a compaction plan : Check if all the files necessary for compactions are present and are valid"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:stock_ticks_mor->compaction validate --instant 20181005222611\n...\n\n COMPACTION PLAN VALID\n\n ___________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | File Id | Base Instant Time| Base Data File | Num Delta Files| Valid| Error|\n |==========================================================================================================================================================================================================================|\n | 05320e98-9a57-4c38-b809-a6beaaeb36bd| 20181005222445 | hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/05320e98-9a57-4c38-b809-a6beaaeb36bd_0_20181005222445.parquet| 1 | true | |\n\n\n\nhudi:stock_ticks_mor->compaction validate --instant 20181005222601\n\n COMPACTION PLAN INVALID\n\n _______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | File Id | Base Instant Time| Base Data File | Num Delta Files| Valid| Error |\n |=====================================================================================================================================================================================================================================================================================================|\n | 05320e98-9a57-4c38-b809-a6beaaeb36bd| 20181005222445 | hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/05320e98-9a57-4c38-b809-a6beaaeb36bd_0_20181005222445.parquet| 1 | false| All log files specified in compaction operation is not present. Missing .... |\n"})}),"\n",(0,i.jsxs)(_.p,{children:[(0,i.jsx)(_.strong,{children:"NOTE:"})," The following commands must be executed without any other writer/ingestion application running.\n{: .notice--warning}"]}),"\n",(0,i.jsx)(_.p,{children:"Sometimes, it becomes necessary to remove a fileId from a compaction-plan inorder to speed-up or unblock compaction\noperation. Any new log-files that happened on this file after the compaction got scheduled will be safely renamed\nso that are preserved. Hudi provides the following CLI to support it"}),"\n",(0,i.jsx)(_.h3,{id:"unscheduling-compaction",children:"Unscheduling Compaction"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->compaction unscheduleFileId --fileId \n....\nNo File renames needed to unschedule file from pending compaction. Operation successful.\n"})}),"\n",(0,i.jsx)(_.p,{children:"In other cases, an entire compaction plan needs to be reverted. This is supported by the following CLI"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->compaction unschedule --instant \n.....\nNo File renames needed to unschedule pending compaction. Operation successful.\n"})}),"\n",(0,i.jsx)(_.h3,{id:"repair-compaction",children:"Repair Compaction"}),"\n",(0,i.jsxs)(_.p,{children:["The above compaction unscheduling operations could sometimes fail partially (e",":g"," -> DFS temporarily unavailable). With\npartial failures, the compaction operation could become inconsistent with the state of file-slices. When you run\n",(0,i.jsx)(_.code,{children:"compaction validate"}),", you can notice invalid compaction operations if there is one. In these cases, the repair\ncommand comes to the rescue, it will rearrange the file-slices so that there is no loss and the file-slices are\nconsistent with the compaction plan"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:stock_ticks_mor->compaction repair --instant 20181005222611\n......\nCompaction successfully repaired\n.....\n"})}),"\n",(0,i.jsx)(_.h3,{id:"savepoint-and-restore",children:"Savepoint and Restore"}),"\n",(0,i.jsxs)(_.p,{children:['As the name suggest, "savepoint" saves the table as of the commit time, so that it lets you restore the table to this\nsavepoint at a later point in time if need be. You can read more about savepoints and restore ',(0,i.jsx)(_.a,{href:"disaster_recovery",children:"here"})]}),"\n",(0,i.jsx)(_.p,{children:"To trigger savepoint for a hudi table"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"connect --path /tmp/hudi_trips_cow/\ncommits show\nset --conf SPARK_HOME=\nsavepoint create --commit 20220128160245447 --sparkMaster local[2]\n"})}),"\n",(0,i.jsx)(_.p,{children:"To restore the table to one of the savepointed commit:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"connect --path /tmp/hudi_trips_cow/\ncommits show\nset --conf SPARK_HOME=\nsavepoints show\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 SavepointTime \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\n\u2551 20220128160245447 \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\nsavepoint rollback --savepoint 20220128160245447 --sparkMaster local[2]\n"})}),"\n",(0,i.jsx)(_.h3,{id:"upgrade-and-downgrade-table",children:"Upgrade and Downgrade Table"}),"\n",(0,i.jsx)(_.p,{children:"In case the user needs to downgrade the version of Hudi library used, the Hudi table needs to be manually downgraded\non the newer version of Hudi CLI before library downgrade. To downgrade a Hudi table through CLI, user needs to specify\nthe target Hudi table version as follows:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"connect --path \ndowngrade table --toVersion \n"})}),"\n",(0,i.jsx)(_.p,{children:"The following table shows the Hudi table versions corresponding to the Hudi release versions:"}),"\n",(0,i.jsxs)(_.table,{children:[(0,i.jsx)(_.thead,{children:(0,i.jsxs)(_.tr,{children:[(0,i.jsx)(_.th,{style:{textAlign:"left"},children:"Hudi Table Version"}),(0,i.jsx)(_.th,{style:{textAlign:"left"},children:"Hudi Release Version(s)"})]})}),(0,i.jsxs)(_.tbody,{children:[(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"FIVE"})," or ",(0,i.jsx)(_.code,{children:"5"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.12.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"FOUR"})," or ",(0,i.jsx)(_.code,{children:"4"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.11.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"THREE"})," or ",(0,i.jsx)(_.code,{children:"3"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.10.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"TWO"})," or ",(0,i.jsx)(_.code,{children:"2"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.9.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"ONE"})," or ",(0,i.jsx)(_.code,{children:"1"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.6.x - 0.8.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"ZERO"})," or ",(0,i.jsx)(_.code,{children:"0"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.5.x and below"})]})]})]}),"\n",(0,i.jsxs)(_.p,{children:["For example, to downgrade a table from version ",(0,i.jsx)(_.code,{children:"FIVE"}),"(",(0,i.jsx)(_.code,{children:"5"}),") (current version) to ",(0,i.jsx)(_.code,{children:"TWO"}),"(",(0,i.jsx)(_.code,{children:"2"}),"), you should run (use proper Spark master based\non your environment)"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"downgrade table --toVersion TWO --sparkMaster local[2]\n"})}),"\n",(0,i.jsx)(_.p,{children:"or"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"downgrade table --toVersion 2 --sparkMaster local[2]\n"})}),"\n",(0,i.jsxs)(_.p,{children:["You can verify the table version by looking at the ",(0,i.jsx)(_.code,{children:"hoodie.table.version"})," property in ",(0,i.jsx)(_.code,{children:".hoodie/hoodie.properties"})," under\nthe table path:"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-properties",children:"hoodie.table.version=2\n"})}),"\n",(0,i.jsx)(_.p,{children:"Hudi CLI also provides the ability to manually upgrade a Hudi table. To upgrade a Hudi table through CLI:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"upgrade table --toVersion \n"})}),"\n",(0,i.jsxs)(_.admonition,{type:"note",children:[(0,i.jsxs)(_.p,{children:["Table upgrade is automatically handled by the Hudi write client in different deployment modes such as DeltaStreamer\nafter upgrading the Hudi library so that the user does not have to do manual upgrade. Such automatic table upgrade\nis the ",(0,i.jsx)(_.strong,{children:"recommended"})," way in general, instead of using ",(0,i.jsx)(_.code,{children:"upgrade"})," CLI command."]}),(0,i.jsx)(_.p,{children:'Table upgrade from table version ONE to TWO requires key generator related configs such as\n"hoodie.datasource.write.recordkey.field", which is only available when user configures the write job. So the table\nupgrade from version ONE to TWO through CLI is not supported, and user should rely on the automatic upgrade in the write\nclient instead.'})]}),"\n",(0,i.jsx)(_.p,{children:"You may also run the upgrade command without specifying the target version. In such a case, the latest table version\ncorresponding to the library release version is used:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"upgrade table\n"})}),"\n",(0,i.jsx)(_.h3,{id:"change-hudi-table-type",children:"Change Hudi Table Type"}),"\n",(0,i.jsx)(_.p,{children:"There are cases we want to change the hudi table type. For example, change COW table to MOR for more efficient and\nlower latency ingestion; change MOR to COW for better read performance and compatibility with downstream engines.\nSo we offer the table command to perform this modification conveniently."}),"\n",(0,i.jsxs)(_.p,{children:["Changing ",(0,i.jsx)(_.strong,{children:"COW to MOR"}),", we can simply modify the ",(0,i.jsx)(_.code,{children:"hoodie.table.type"})," in ",(0,i.jsx)(_.code,{children:"hoodie.properties"})," to MERGE_ON_READ."]}),"\n",(0,i.jsxs)(_.p,{children:["While changing ",(0,i.jsx)(_.strong,{children:"MOR to COW"}),", we must make sure all the log files are compacted before modifying the table type,\nor it will cause data loss."]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"connect --path \ntable change-table-type \n"})}),"\n",(0,i.jsxs)(_.p,{children:["The parameter ",(0,i.jsx)(_.code,{children:"target_table_type"})," candidates are below:"]}),"\n",(0,i.jsxs)(_.table,{children:[(0,i.jsx)(_.thead,{children:(0,i.jsxs)(_.tr,{children:[(0,i.jsx)(_.th,{style:{textAlign:"left"},children:"target table type"}),(0,i.jsx)(_.th,{style:{textAlign:"left"},children:"comment"})]})}),(0,i.jsxs)(_.tbody,{children:[(0,i.jsxs)(_.tr,{children:[(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"MOR"}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"Change COW table to MERGE_ON_READ."})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"COW"}),(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:["Change MOR table to COPY_ON_WRITE. ",(0,i.jsx)("br",{}),"By default, changing to COW will ",(0,i.jsx)(_.strong,{children:"execute all pending compactions"})," and ",(0,i.jsx)(_.strong,{children:"perform a full compaction"})," if any log file left. Set ",(0,i.jsx)(_.code,{children:"--enable-compaction=false"})," will disable the default compaction. ",(0,i.jsx)("br",{}),"There are params can be set for the compaction operation:",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--parallelism"}),": Default ",(0,i.jsx)(_.code,{children:"3"}),". Parallelism for hoodie compaction",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--sparkMaster"}),": Default ",(0,i.jsx)(_.code,{children:"local"}),". Spark Master",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--sparkMemory"}),": Default ",(0,i.jsx)(_.code,{children:"4G"}),". Spark executor memory",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--retry"}),": Default ",(0,i.jsx)(_.code,{children:"1"}),". Number of retries",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--propsFilePath"}),": Default ",(0,i.jsx)(_.code,{children:" "}),". path to properties file on localfs or dfs with configurations for hoodie client for compacting",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--hoodieConfigs"}),": Default ",(0,i.jsx)(_.code,{children:" "}),". Any configuration that can be set in the properties file can be passed here in the form of an array"]})]})]})]}),"\n",(0,i.jsx)(_.p,{children:"Example below is changing MOR table to COW:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"connect --path /var/dataset/test_table_mor2cow\ndesc\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 Property \u2502 Value \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\n\u2551 basePath \u2502 /var/dataset/test_table_mor2cow \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 metaPath \u2502 /var/dataset/test_table_mor2cow/.hoodie \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 fileSystem \u2502 file \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.name \u2502 test_table \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.compaction.record.merger.strategy \u2502 eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.metadata.partitions \u2502 files \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.type \u2502 MERGE_ON_READ \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.metadata.partitions.inflight \u2502 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.archivelog.folder \u2502 archived \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.timeline.layout.version \u2502 1 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.checksum \u2502 2702201862 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.compaction.payload.type \u2502 HOODIE_AVRO \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.version \u2502 6 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.datasource.write.drop.partition.columns \u2502 false \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n\ntable change-table-type COW\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 Property \u2502 Old Value \u2502 New Value \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\n\u2551 hoodie.archivelog.folder \u2502 archived \u2502 archived \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.compaction.payload.type \u2502 HOODIE_AVRO \u2502 HOODIE_AVRO \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.compaction.record.merger.strategy \u2502 eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 \u2502 eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.datasource.write.drop.partition.columns \u2502 false \u2502 false \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.checksum \u2502 2702201862 \u2502 2702201862 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.metadata.partitions \u2502 files \u2502 files \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.metadata.partitions.inflight \u2502 \u2502 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.name \u2502 test_table \u2502 test_table \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.type \u2502 MERGE_ON_READ \u2502 COPY_ON_WRITE \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.version \u2502 6 \u2502 6 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.timeline.layout.version \u2502 1 \u2502 1 \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})}),"\n",(0,i.jsx)(_.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,i.jsx)("h3",{children:"Blogs"}),"\n",(0,i.jsxs)(_.ul,{children:["\n",(0,i.jsx)(_.li,{children:(0,i.jsx)(_.a,{href:"https://www.onehouse.ai/blog/getting-started-manage-your-hudi-tables-with-the-admin-hudi-cli-tool",children:"Getting Started: Manage your Hudi tables with the admin Hudi-CLI tool"})}),"\n"]})]})}function d(e={}){const{wrapper:_}={...(0,a.R)(),...e.components};return _?(0,i.jsx)(_,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},28453:(e,_,n)=>{n.d(_,{R:()=>o,x:()=>s});var t=n(96540);const i={},a=t.createContext(i);function o(e){const _=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(_):{..._,...e}}),[_,e])}function s(e){let _;return _=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(a.Provider,{value:_},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/2263a65b.8b774927.js b/content/assets/js/2263a65b.00a479c5.js similarity index 89% rename from content/assets/js/2263a65b.8b774927.js rename to content/assets/js/2263a65b.00a479c5.js index e7f03c91300ee..905d0f7dbe852 100644 --- a/content/assets/js/2263a65b.8b774927.js +++ b/content/assets/js/2263a65b.00a479c5.js @@ -1 +1 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[99502],{8946:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>s,contentTitle:()=>l,default:()=>u,frontMatter:()=>n,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"precommit_validator","title":"Data Quality","description":"Data quality refers to the overall accuracy, completeness, consistency, and validity of data. Ensuring data quality is vital for accurate analysis and reporting, as well as for compliance with regulations and maintaining trust in your organization\'s data infrastructure.","source":"@site/docs/precommit_validator.md","sourceDirName":".","slug":"/precommit_validator","permalink":"/docs/next/precommit_validator","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/precommit_validator.md","tags":[],"version":"current","frontMatter":{"title":"Data Quality","keywords":["hudi","quality","expectations","pre-commit validator"]},"sidebar":"docs","previous":{"title":"Exporter","permalink":"/docs/next/snapshot_exporter"},"next":{"title":"Post-commit Callback","permalink":"/docs/next/platform_services_post_commit_callback"}}');var o=t(74848),r=t(28453);const n={title:"Data Quality",keywords:["hudi","quality","expectations","pre-commit validator"]},l=void 0,s={},d=[{value:"SQL Query Single Result",id:"sql-query-single-result",level:2},{value:"SQL Query Equality",id:"sql-query-equality",level:2},{value:"SQL Query Inequality",id:"sql-query-inequality",level:2},{value:"Extend Custom Validator",id:"extend-custom-validator",level:2},{value:"Additional Monitoring with Notifications",id:"additional-monitoring-with-notifications",level:2},{value:"Related Resources",id:"related-resources",level:2}];function c(e){const a={a:"a",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.p,{children:"Data quality refers to the overall accuracy, completeness, consistency, and validity of data. Ensuring data quality is vital for accurate analysis and reporting, as well as for compliance with regulations and maintaining trust in your organization's data infrastructure."}),"\n",(0,o.jsxs)(a.p,{children:["Hudi offers ",(0,o.jsx)(a.strong,{children:"Pre-Commit Validators"})," that allow you to ensure that your data meets certain data quality expectations as you are writing with Hudi Streamer or Spark Datasource writers."]}),"\n",(0,o.jsxs)(a.p,{children:["To configure pre-commit validators, use this setting ",(0,o.jsx)(a.code,{children:"hoodie.precommit.validators="}),"."]}),"\n",(0,o.jsx)(a.p,{children:"Example:"}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-scala",children:'spark.write.format("hudi")\n .option("hoodie.precommit.validators", "org.apache.hudi.client.validator.SqlQueryEqualityPreCommitValidator")\n'})}),"\n",(0,o.jsx)(a.p,{children:"Today you can use any of these validators and even have the flexibility to extend your own:"}),"\n",(0,o.jsx)(a.h2,{id:"sql-query-single-result",children:"SQL Query Single Result"}),"\n",(0,o.jsx)(a.p,{children:(0,o.jsx)(a.a,{href:"https://github.com/apache/hudi/blob/bf5a52e51bbeaa089995335a0a4c55884792e505/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/client/validator/SqlQuerySingleResultPreCommitValidator.java",children:"org.apache.hudi.client.validator.SqlQuerySingleResultPreCommitValidator"})}),"\n",(0,o.jsx)(a.p,{children:"The SQL Query Single Result validator can be used to validate that a query on the table results in a specific value. This validator allows you to run a SQL query and abort the commit if it does not match the expected output."}),"\n",(0,o.jsxs)(a.p,{children:["Multiple queries can be separated by ",(0,o.jsx)(a.code,{children:";"})," delimiter. Include the expected result as part of the query separated by ",(0,o.jsx)(a.code,{children:"#"}),"."]}),"\n",(0,o.jsxs)(a.p,{children:["Syntax: ",(0,o.jsx)(a.code,{children:"query1#result1;query2#result2"})]}),"\n",(0,o.jsx)(a.p,{children:"Example:"}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-scala",children:'// In this example, we set up a validator that expects there is no row with `col` column as `null`\n\nimport org.apache.hudi.config.HoodiePreCommitValidatorConfig._\n\ndf.write.format("hudi").mode(Overwrite).\n option("hoodie.table.name", tableName).\n option("hoodie.precommit.validators", "org.apache.hudi.client.validator.SqlQuerySingleResultPreCommitValidator").\n option("hoodie.precommit.validators.single.value.sql.queries", "select count(*) from where col is null#0").\n save(basePath)\n'})}),"\n",(0,o.jsx)(a.h2,{id:"sql-query-equality",children:"SQL Query Equality"}),"\n",(0,o.jsx)(a.p,{children:(0,o.jsx)(a.a,{href:"https://github.com/apache/hudi/blob/bf5a52e51bbeaa089995335a0a4c55884792e505/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/client/validator/SqlQueryEqualityPreCommitValidator.java",children:"org.apache.hudi.client.validator.SqlQueryEqualityPreCommitValidator"})}),"\n",(0,o.jsx)(a.p,{children:"The SQL Query Equality validator runs a query before ingesting the data, then runs the same query after ingesting the data and confirms that both outputs match. This allows you to validate for equality of rows before and after the commit."}),"\n",(0,o.jsx)(a.p,{children:"This validator is useful when you want to verify that your query does not change a specific subset of the data. Some examples:"}),"\n",(0,o.jsxs)(a.ul,{children:["\n",(0,o.jsx)(a.li,{children:"Validate that the number of null fields is the same before and after your query"}),"\n",(0,o.jsx)(a.li,{children:"Validate that there are no duplicate records after your query runs"}),"\n",(0,o.jsx)(a.li,{children:"Validate that you are only updating the data, and no inserts slip through"}),"\n"]}),"\n",(0,o.jsx)(a.p,{children:"Example:"}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-scala",children:'// In this example, we set up a validator that expects no change of null rows with the new commit\n\nimport org.apache.hudi.config.HoodiePreCommitValidatorConfig._\n\ndf.write.format("hudi").mode(Overwrite).\n option("hoodie.table.name", tableName).\n option("hoodie.precommit.validators", "org.apache.hudi.client.validator.SqlQueryEqualityPreCommitValidator").\n option("hoodie.precommit.validators.equality.sql.queries", "select count(*) from where col is null").\n save(basePath)\n'})}),"\n",(0,o.jsx)(a.h2,{id:"sql-query-inequality",children:"SQL Query Inequality"}),"\n",(0,o.jsx)(a.p,{children:(0,o.jsx)(a.a,{href:"https://github.com/apache/hudi/blob/bf5a52e51bbeaa089995335a0a4c55884792e505/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/client/validator/SqlQueryInequalityPreCommitValidator.java",children:"org.apache.hudi.client.validator.SqlQueryInequalityPreCommitValidator"})}),"\n",(0,o.jsx)(a.p,{children:"The SQL Query Inquality validator runs a query before ingesting the data, then runs the same query after ingesting the data and confirms that both outputs DO NOT match. This allows you to confirm changes in the rows before and after the commit."}),"\n",(0,o.jsx)(a.p,{children:"Example:"}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-scala",children:'// In this example, we set up a validator that expects a change of null rows with the new commit\n\nimport org.apache.hudi.config.HoodiePreCommitValidatorConfig._\n\ndf.write.format("hudi").mode(Overwrite).\n option("hoodie.table.name", tableName).\n option("hoodie.precommit.validators", "org.apache.hudi.client.validator.SqlQueryInequalityPreCommitValidator").\n option("hoodie.precommit.validators.inequality.sql.queries", "select count(*) from where col is null").\n save(basePath)\n'})}),"\n",(0,o.jsx)(a.h2,{id:"extend-custom-validator",children:"Extend Custom Validator"}),"\n",(0,o.jsxs)(a.p,{children:["Users can also provide their own implementations by extending the abstract class ",(0,o.jsx)(a.a,{href:"https://github.com/apache/hudi/blob/bf5a52e51bbeaa089995335a0a4c55884792e505/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/client/validator/SparkPreCommitValidator.java",children:"SparkPreCommitValidator"}),"\nand overriding this method"]}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-java",children:"void validateRecordsBeforeAndAfter(Dataset before, \n Dataset after, \n Set partitionsAffected)\n"})}),"\n",(0,o.jsx)(a.h2,{id:"additional-monitoring-with-notifications",children:"Additional Monitoring with Notifications"}),"\n",(0,o.jsxs)(a.p,{children:["Hudi offers a ",(0,o.jsx)(a.a,{href:"platform_services_post_commit_callback",children:"commit notification service"})," that can be configured to trigger notifications about write commits."]}),"\n",(0,o.jsx)(a.p,{children:"The commit notification service can be combined with pre-commit validators to send a notification when a commit fails a validation. This is possible by passing details about the validation as a custom value to the HTTP endpoint."}),"\n",(0,o.jsx)(a.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,o.jsx)("h3",{children:"Videos"}),"\n",(0,o.jsxs)(a.ul,{children:["\n",(0,o.jsx)(a.li,{children:(0,o.jsx)(a.a,{href:"https://www.youtube.com/watch?v=KNzs9dj_Btc",children:"Learn About Apache Hudi Pre Commit Validator with Hands on Lab"})}),"\n"]})]})}function u(e={}){const{wrapper:a}={...(0,r.R)(),...e.components};return a?(0,o.jsx)(a,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},28453:(e,a,t)=>{t.d(a,{R:()=>n,x:()=>l});var i=t(96540);const o={},r=i.createContext(o);function n(e){const a=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function l(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:n(e.components),i.createElement(r.Provider,{value:a},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[99502],{8946:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>s,contentTitle:()=>l,default:()=>u,frontMatter:()=>n,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"precommit_validator","title":"Data Quality","description":"Data quality refers to the overall accuracy, completeness, consistency, and validity of data. Ensuring data quality is vital for accurate analysis and reporting, as well as for compliance with regulations and maintaining trust in your organization\'s data infrastructure.","source":"@site/docs/precommit_validator.md","sourceDirName":".","slug":"/precommit_validator","permalink":"/docs/next/precommit_validator","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/precommit_validator.md","tags":[],"version":"current","frontMatter":{"title":"Data Quality","keywords":["hudi","quality","expectations","pre-commit validator"]},"sidebar":"docs","previous":{"title":"Exporter","permalink":"/docs/next/snapshot_exporter"},"next":{"title":"Post-commit Callback","permalink":"/docs/next/platform_services_post_commit_callback"}}');var o=t(74848),r=t(28453);const n={title:"Data Quality",keywords:["hudi","quality","expectations","pre-commit validator"]},l=void 0,s={},d=[{value:"SQL Query Single Result",id:"sql-query-single-result",level:2},{value:"SQL Query Equality",id:"sql-query-equality",level:2},{value:"SQL Query Inequality",id:"sql-query-inequality",level:2},{value:"Extend Custom Validator",id:"extend-custom-validator",level:2},{value:"Additional Monitoring with Notifications",id:"additional-monitoring-with-notifications",level:2},{value:"Related Resources",id:"related-resources",level:2}];function c(e){const a={a:"a",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.p,{children:"Data quality refers to the overall accuracy, completeness, consistency, and validity of data. Ensuring data quality is vital for accurate analysis and reporting, as well as for compliance with regulations and maintaining trust in your organization's data infrastructure."}),"\n",(0,o.jsxs)(a.p,{children:["Hudi offers ",(0,o.jsx)(a.strong,{children:"Pre-Commit Validators"})," that allow you to ensure that your data meets certain data quality expectations as you are writing with Hudi Streamer or Spark Datasource writers."]}),"\n",(0,o.jsxs)(a.p,{children:["To configure pre-commit validators, use this setting ",(0,o.jsx)(a.code,{children:"hoodie.precommit.validators="}),"."]}),"\n",(0,o.jsx)(a.p,{children:"Example:"}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-scala",children:'spark.write.format("hudi")\n .option("hoodie.precommit.validators", "org.apache.hudi.client.validator.SqlQueryEqualityPreCommitValidator")\n'})}),"\n",(0,o.jsx)(a.p,{children:"Today you can use any of these validators and even have the flexibility to extend your own:"}),"\n",(0,o.jsx)(a.h2,{id:"sql-query-single-result",children:"SQL Query Single Result"}),"\n",(0,o.jsx)(a.p,{children:(0,o.jsx)(a.a,{href:"https://github.com/apache/hudi/blob/bf5a52e51bbeaa089995335a0a4c55884792e505/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/client/validator/SqlQuerySingleResultPreCommitValidator.java",children:"org.apache.hudi.client.validator.SqlQuerySingleResultPreCommitValidator"})}),"\n",(0,o.jsx)(a.p,{children:"The SQL Query Single Result validator can be used to validate that a query on the table results in a specific value. This validator allows you to run a SQL query and abort the commit if it does not match the expected output."}),"\n",(0,o.jsxs)(a.p,{children:["Multiple queries can be separated by ",(0,o.jsx)(a.code,{children:";"})," delimiter. Include the expected result as part of the query separated by ",(0,o.jsx)(a.code,{children:"#"}),"."]}),"\n",(0,o.jsxs)(a.p,{children:["Syntax: ",(0,o.jsx)(a.code,{children:"query1#result1;query2#result2"})]}),"\n",(0,o.jsx)(a.p,{children:"Example:"}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-scala",children:'// In this example, we set up a validator that expects there is no row with `col` column as `null`\n\nimport org.apache.hudi.config.HoodiePreCommitValidatorConfig._\n\ndf.write.format("hudi").mode(Overwrite).\n option("hoodie.table.name", tableName).\n option("hoodie.precommit.validators", "org.apache.hudi.client.validator.SqlQuerySingleResultPreCommitValidator").\n option("hoodie.precommit.validators.single.value.sql.queries", "select count(*) from where col is null#0").\n save(basePath)\n'})}),"\n",(0,o.jsx)(a.h2,{id:"sql-query-equality",children:"SQL Query Equality"}),"\n",(0,o.jsx)(a.p,{children:(0,o.jsx)(a.a,{href:"https://github.com/apache/hudi/blob/bf5a52e51bbeaa089995335a0a4c55884792e505/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/client/validator/SqlQueryEqualityPreCommitValidator.java",children:"org.apache.hudi.client.validator.SqlQueryEqualityPreCommitValidator"})}),"\n",(0,o.jsx)(a.p,{children:"The SQL Query Equality validator runs a query before ingesting the data, then runs the same query after ingesting the data and confirms that both outputs match. This allows you to validate for equality of rows before and after the commit."}),"\n",(0,o.jsx)(a.p,{children:"This validator is useful when you want to verify that your query does not change a specific subset of the data. Some examples:"}),"\n",(0,o.jsxs)(a.ul,{children:["\n",(0,o.jsx)(a.li,{children:"Validate that the number of null fields is the same before and after your query"}),"\n",(0,o.jsx)(a.li,{children:"Validate that there are no duplicate records after your query runs"}),"\n",(0,o.jsx)(a.li,{children:"Validate that you are only updating the data, and no inserts slip through"}),"\n"]}),"\n",(0,o.jsx)(a.p,{children:"Example:"}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-scala",children:'// In this example, we set up a validator that expects no change of null rows with the new commit\n\nimport org.apache.hudi.config.HoodiePreCommitValidatorConfig._\n\ndf.write.format("hudi").mode(Overwrite).\n option("hoodie.table.name", tableName).\n option("hoodie.precommit.validators", "org.apache.hudi.client.validator.SqlQueryEqualityPreCommitValidator").\n option("hoodie.precommit.validators.equality.sql.queries", "select count(*) from where col is null").\n save(basePath)\n'})}),"\n",(0,o.jsx)(a.h2,{id:"sql-query-inequality",children:"SQL Query Inequality"}),"\n",(0,o.jsx)(a.p,{children:(0,o.jsx)(a.a,{href:"https://github.com/apache/hudi/blob/bf5a52e51bbeaa089995335a0a4c55884792e505/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/client/validator/SqlQueryInequalityPreCommitValidator.java",children:"org.apache.hudi.client.validator.SqlQueryInequalityPreCommitValidator"})}),"\n",(0,o.jsx)(a.p,{children:"The SQL Query Inquality validator runs a query before ingesting the data, then runs the same query after ingesting the data and confirms that both outputs DO NOT match. This allows you to confirm changes in the rows before and after the commit."}),"\n",(0,o.jsx)(a.p,{children:"Example:"}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-scala",children:'// In this example, we set up a validator that expects a change of null rows with the new commit\n\nimport org.apache.hudi.config.HoodiePreCommitValidatorConfig._\n\ndf.write.format("hudi").mode(Overwrite).\n option("hoodie.table.name", tableName).\n option("hoodie.precommit.validators", "org.apache.hudi.client.validator.SqlQueryInequalityPreCommitValidator").\n option("hoodie.precommit.validators.inequality.sql.queries", "select count(*) from where col is null").\n save(basePath)\n'})}),"\n",(0,o.jsx)(a.h2,{id:"extend-custom-validator",children:"Extend Custom Validator"}),"\n",(0,o.jsxs)(a.p,{children:["Users can also provide their own implementations by extending the abstract class ",(0,o.jsx)(a.a,{href:"https://github.com/apache/hudi/blob/bf5a52e51bbeaa089995335a0a4c55884792e505/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/client/validator/SparkPreCommitValidator.java",children:"SparkPreCommitValidator"}),"\nand overriding this method"]}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-java",children:"void validateRecordsBeforeAndAfter(Dataset before, \n Dataset after, \n Set partitionsAffected)\n"})}),"\n",(0,o.jsx)(a.h2,{id:"additional-monitoring-with-notifications",children:"Additional Monitoring with Notifications"}),"\n",(0,o.jsxs)(a.p,{children:["Hudi offers a ",(0,o.jsx)(a.a,{href:"platform_services_post_commit_callback",children:"commit notification service"})," that can be configured to trigger notifications about write commits."]}),"\n",(0,o.jsx)(a.p,{children:"The commit notification service can be combined with pre-commit validators to send a notification when a commit fails a validation. This is possible by passing details about the validation as a custom value to the HTTP endpoint."}),"\n",(0,o.jsx)(a.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,o.jsx)("h3",{children:"Blogs"}),"\n",(0,o.jsxs)(a.ul,{children:["\n",(0,o.jsx)(a.li,{children:(0,o.jsx)(a.a,{href:"https://www.onehouse.ai/blog/apply-pre-commit-validation-for-data-quality-in-apache-hudi",children:"Apply Pre-Commit Validation for Data Quality in Apache Hudi"})}),"\n"]}),"\n",(0,o.jsx)("h3",{children:"Videos"}),"\n",(0,o.jsxs)(a.ul,{children:["\n",(0,o.jsx)(a.li,{children:(0,o.jsx)(a.a,{href:"https://www.youtube.com/watch?v=KNzs9dj_Btc",children:"Learn About Apache Hudi Pre Commit Validator with Hands on Lab"})}),"\n"]})]})}function u(e={}){const{wrapper:a}={...(0,r.R)(),...e.components};return a?(0,o.jsx)(a,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},28453:(e,a,t)=>{t.d(a,{R:()=>n,x:()=>l});var i=t(96540);const o={},r=i.createContext(o);function n(e){const a=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function l(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:n(e.components),i.createElement(r.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/45a5cd1f.789c1bc4.js b/content/assets/js/45a5cd1f.789c1bc4.js deleted file mode 100644 index ea3701a0a13a1..0000000000000 --- a/content/assets/js/45a5cd1f.789c1bc4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[94e3],{27515:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"concepts","title":"Concepts","description":"Apache Hudi (pronounced \u201cHudi\u201d) provides the following streaming primitives over hadoop compatible storages","source":"@site/docs/concepts.md","sourceDirName":".","slug":"/concepts","permalink":"/docs/next/concepts","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/concepts.md","tags":[],"version":"current","frontMatter":{"version":"0.6.0","title":"Concepts","keywords":["hudi","design","table","queries","timeline"],"summary":"Here we introduce some basic concepts & give a broad technical overview of Hudi","toc":true,"last_modified_at":"2019-12-30T19:59:57.000Z"}}');var s=i(74848),a=i(28453);const o={version:"0.6.0",title:"Concepts",keywords:["hudi","design","table","queries","timeline"],summary:"Here we introduce some basic concepts & give a broad technical overview of Hudi",toc:!0,last_modified_at:new Date("2019-12-30T19:59:57.000Z")},r=void 0,l={},d=[{value:"Timeline",id:"timeline",level:2},{value:"File management",id:"file-management",level:2},{value:"Index",id:"index",level:2},{value:"Table Types & Queries",id:"table-types--queries",level:2},{value:"Table Types",id:"table-types",level:3},{value:"Query types",id:"query-types",level:3},{value:"Copy On Write Table",id:"copy-on-write-table",level:2},{value:"Merge On Read Table",id:"merge-on-read-table",level:2}];function c(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"Apache Hudi (pronounced \u201cHudi\u201d) provides the following streaming primitives over hadoop compatible storages"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Update/Delete Records (how do I change records in a table?)"}),"\n",(0,s.jsx)(t.li,{children:"Change Streams (how do I fetch records that changed?)"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"In this section, we will discuss key concepts & terminologies that are important to understand, to be able to effectively use these primitives."}),"\n",(0,s.jsx)(t.h2,{id:"timeline",children:"Timeline"}),"\n",(0,s.jsxs)(t.p,{children:["At its core, Hudi maintains a ",(0,s.jsx)(t.code,{children:"timeline"})," of all actions performed on the table at different ",(0,s.jsx)(t.code,{children:"instants"})," of time that helps provide instantaneous views of the table,\nwhile also efficiently supporting retrieval of data in the order of arrival. A Hudi instant consists of the following components"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Instant action"})," : Type of action performed on the table"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Instant time"})," : Instant time is typically a timestamp (e.g: 20190117010349), which monotonically increases in the order of action's begin time."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"state"})," : current state of the instant"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Hudi guarantees that the actions performed on the timeline are atomic & timeline consistent based on the instant time."}),"\n",(0,s.jsx)(t.p,{children:"Key actions performed include"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"COMMITS"})," - A commit denotes an ",(0,s.jsx)(t.strong,{children:"atomic write"})," of a batch of records into a table."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"CLEANS"})," - Background activity that gets rid of older versions of files in the table, that are no longer needed."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"DELTA_COMMIT"})," - A delta commit refers to an ",(0,s.jsx)(t.strong,{children:"atomic write"})," of a batch of records into a MergeOnRead type table, where some/all of the data could be just written to delta logs."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"COMPACTION"})," - Background activity to reconcile differential data structures within Hudi e.g: moving updates from row based log files to columnar formats. Internally, compaction manifests as a special commit on the timeline"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"ROLLBACK"})," - Indicates that a commit/delta commit was unsuccessful & rolled back, removing any partial files produced during such a write"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"SAVEPOINT"}),' - Marks certain file groups as "saved", such that cleaner will not delete them. It helps restore the table to a point on the timeline, in case of disaster/data recovery scenarios.']}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Any given instant can be\nin one of the following states"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"REQUESTED"})," - Denotes an action has been scheduled, but has not initiated"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"INFLIGHT"})," - Denotes that the action is currently being performed"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"COMPLETED"})," - Denotes completion of an action on the timeline"]}),"\n"]}),"\n",(0,s.jsx)("figure",{children:(0,s.jsx)("img",{className:"docimage",src:"/assets/images/hudi_timeline.png",alt:"hudi_timeline.png"})}),"\n",(0,s.jsxs)(t.p,{children:["Example above shows upserts happenings between 10:00 and 10:20 on a Hudi table, roughly every 5 mins, leaving commit metadata on the Hudi timeline, along\nwith other background cleaning/compactions. One key observation to make is that the commit time indicates the ",(0,s.jsx)(t.code,{children:"arrival time"})," of the data (10:20AM), while the actual data\norganization reflects the actual time or ",(0,s.jsx)(t.code,{children:"event time"}),", the data was intended for (hourly buckets from 07:00). These are two key concepts when reasoning about tradeoffs between latency and completeness of data."]}),"\n",(0,s.jsx)(t.p,{children:"When there is late arriving data (data intended for 9:00 arriving >1 hr late at 10:20), we can see the upsert producing new data into even older time buckets/folders.\nWith the help of the timeline, an incremental query attempting to get all new data that was committed successfully since 10:00 hours, is able to very efficiently consume\nonly the changed files without say scanning all the time buckets > 07:00."}),"\n",(0,s.jsx)(t.h2,{id:"file-management",children:"File management"}),"\n",(0,s.jsxs)(t.p,{children:["Hudi organizes a table into a directory structure under a ",(0,s.jsx)(t.code,{children:"basepath"})," on DFS. Table is broken up into partitions, which are folders containing data files for that partition,\nvery similar to Hive tables. Each partition is uniquely identified by its ",(0,s.jsx)(t.code,{children:"partitionpath"}),", which is relative to the basepath."]}),"\n",(0,s.jsxs)(t.p,{children:["Within each partition, files are organized into ",(0,s.jsx)(t.code,{children:"file groups"}),", uniquely identified by a ",(0,s.jsx)(t.code,{children:"file id"}),". Each file group contains several\n",(0,s.jsx)(t.code,{children:"file slices"}),", where each slice contains a base file (",(0,s.jsx)(t.code,{children:"*.parquet"}),") produced at a certain commit/compaction instant time,\nalong with set of log files (",(0,s.jsx)(t.code,{children:"*.log.*"}),") that contain inserts/updates to the base file since the base file was produced.\nHudi adopts a MVCC design, where compaction action merges logs and base files to produce new file slices and cleaning action gets rid of\nunused/older file slices to reclaim space on DFS."]}),"\n",(0,s.jsx)(t.h2,{id:"index",children:"Index"}),"\n",(0,s.jsx)(t.p,{children:"Hudi provides efficient upserts, by mapping a given hoodie key (record key + partition path) consistently to a file id, via an indexing mechanism.\nThis mapping between record key and file group/file id, never changes once the first version of a record has been written to a file. In short, the\nmapped file group contains all versions of a group of records."}),"\n",(0,s.jsx)(t.h2,{id:"table-types--queries",children:"Table Types & Queries"}),"\n",(0,s.jsxs)(t.p,{children:["Hudi table types define how data is indexed & laid out on the DFS and how the above primitives and timeline activities are implemented on top of such organization (i.e how data is written).\nIn turn, ",(0,s.jsx)(t.code,{children:"query types"})," define how the underlying data is exposed to the queries (i.e how data is read)."]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Table Type"}),(0,s.jsx)(t.th,{children:"Supported Query types"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Copy On Write"}),(0,s.jsx)(t.td,{children:"Snapshot Queries + Incremental Queries"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Merge On Read"}),(0,s.jsx)(t.td,{children:"Snapshot Queries + Incremental Queries + Read Optimized Queries"})]})]})]}),"\n",(0,s.jsx)(t.h3,{id:"table-types",children:"Table Types"}),"\n",(0,s.jsx)(t.p,{children:"Hudi supports the following table types."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"#copy-on-write-table",children:"Copy On Write"})," : Stores data using exclusively columnar file formats (e.g parquet). Updates simply version & rewrite the files by performing a synchronous merge during write."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"#merge-on-read-table",children:"Merge On Read"})," : Stores data using a combination of columnar (e.g parquet) + row based (e.g avro) file formats. Updates are logged to delta files & later compacted to produce new versions of columnar files synchronously or asynchronously."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Following table summarizes the trade-offs between these two table types"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Trade-off"}),(0,s.jsx)(t.th,{children:"CopyOnWrite"}),(0,s.jsx)(t.th,{children:"MergeOnRead"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Data Latency"}),(0,s.jsx)(t.td,{children:"Higher"}),(0,s.jsx)(t.td,{children:"Lower"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Update cost (I/O)"}),(0,s.jsx)(t.td,{children:"Higher (rewrite entire parquet)"}),(0,s.jsx)(t.td,{children:"Lower (append to delta log)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Parquet File Size"}),(0,s.jsx)(t.td,{children:"Smaller (high update(I/0) cost)"}),(0,s.jsx)(t.td,{children:"Larger (low update cost)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Write Amplification"}),(0,s.jsx)(t.td,{children:"Higher"}),(0,s.jsx)(t.td,{children:"Lower (depending on compaction strategy)"})]})]})]}),"\n",(0,s.jsx)(t.h3,{id:"query-types",children:"Query types"}),"\n",(0,s.jsx)(t.p,{children:"Hudi supports the following query types"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Snapshot Queries"})," : Queries see the latest snapshot of the table as of a given commit or compaction action. In case of merge on read table, it exposes near-real time data(few mins) by merging\nthe base and delta files of the latest file slice on-the-fly. For copy on write table, it provides a drop-in replacement for existing parquet tables, while providing upsert/delete and other write side features."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Incremental Queries"})," : Queries only see new data written to the table, since a given commit/compaction. This effectively provides change streams to enable incremental data pipelines."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Read Optimized Queries"})," : Queries see the latest snapshot of table as of a given commit/compaction action. Exposes only the base/columnar files in latest file slices and guarantees the\nsame columnar query performance compared to a non-hudi columnar table."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Following table summarizes the trade-offs between the different query types."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Trade-off"}),(0,s.jsx)(t.th,{children:"Snapshot"}),(0,s.jsx)(t.th,{children:"Read Optimized"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Data Latency"}),(0,s.jsx)(t.td,{children:"Lower"}),(0,s.jsx)(t.td,{children:"Higher"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Query Latency"}),(0,s.jsx)(t.td,{children:"Higher (merge base / columnar file + row based delta / log files)"}),(0,s.jsx)(t.td,{children:"Lower (raw base / columnar file performance)"})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"copy-on-write-table",children:"Copy On Write Table"}),"\n",(0,s.jsx)(t.p,{children:"File slices in Copy-On-Write table only contain the base/columnar file and each commit produces new versions of base files.\nIn other words, we implicitly compact on every commit, such that only columnar data exists. As a result, the write amplification\n(number of bytes written for 1 byte of incoming data) is much higher, where read amplification is zero.\nThis is a much desired property for analytical workloads, which is predominantly read-heavy."}),"\n",(0,s.jsx)(t.p,{children:"Following illustrates how this works conceptually, when data written into copy-on-write table and two queries running on top of it."}),"\n",(0,s.jsx)("figure",{children:(0,s.jsx)("img",{className:"docimage",src:"/assets/images/hudi_cow.png",alt:"hudi_cow.png"})}),"\n",(0,s.jsxs)(t.p,{children:["As data gets written, updates to existing file groups produce a new slice for that file group stamped with the commit instant time,\nwhile inserts allocate a new file group and write its first slice for that file group. These file slices and their commit instant times are color coded above.\nSQL queries running against such a table (eg: ",(0,s.jsx)(t.code,{children:"select count(*)"})," counting the total records in that partition), first checks the timeline for the latest commit\nand filters all but latest file slices of each file group. As you can see, an old query does not see the current inflight commit's files color coded in pink,\nbut a new query starting after the commit picks up the new data. Thus queries are immune to any write failures/partial writes and only run on committed data."]}),"\n",(0,s.jsx)(t.p,{children:"The intention of copy on write table, is to fundamentally improve how tables are managed today through"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"First class support for atomically updating data at file-level, instead of rewriting whole tables/partitions"}),"\n",(0,s.jsx)(t.li,{children:"Ability to incremental consume changes, as opposed to wasteful scans or fumbling with heuristics"}),"\n",(0,s.jsx)(t.li,{children:"Tight control of file sizes to keep query performance excellent (small files hurt query performance considerably)."}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"merge-on-read-table",children:"Merge On Read Table"}),"\n",(0,s.jsx)(t.p,{children:"Merge on read table is a superset of copy on write, in the sense it still supports read optimized queries of the table by exposing only the base/columnar files in latest file slices.\nAdditionally, it stores incoming upserts for each file group, onto a row based delta log, to support snapshot queries by applying the delta log,\nonto the latest version of each file id on-the-fly during query time. Thus, this table type attempts to balance read and write amplification intelligently, to provide near real-time data.\nThe most significant change here, would be to the compactor, which now carefully chooses which delta log files need to be compacted onto\ntheir columnar base file, to keep the query performance in check (larger delta log files would incur longer merge times with merge data on query side)"}),"\n",(0,s.jsx)(t.p,{children:"Following illustrates how the table works, and shows two types of queries - snapshot query and read optimized query."}),"\n",(0,s.jsx)("figure",{children:(0,s.jsx)("img",{className:"docimage",src:"/assets/images/hudi_mor.png",alt:"hudi_mor.png"})}),"\n",(0,s.jsx)(t.p,{children:"There are lot of interesting things happening in this example, which bring out the subtleties in the approach."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"We now have commits every 1 minute or so, something we could not do in the other table type."}),"\n",(0,s.jsx)(t.li,{children:"Within each file id group, now there is an delta log file, which holds incoming updates to the records already present in the base columnar files. In the example, the delta log files hold\nall the data from 10:05 to 10:10. The base columnar files are still versioned with the commit, as before.\nThus, if one were to simply look at base files alone, then the table layout looks exactly like a copy on write table."}),"\n",(0,s.jsx)(t.li,{children:"A periodic compaction process reconciles these changes from the delta log and produces a new version of base file, just like what happened at 10:05 in the example."}),"\n",(0,s.jsx)(t.li,{children:"There are two ways of querying the same underlying table: Read Optimized query and Snapshot query, depending on whether we chose query performance or freshness of data."}),"\n",(0,s.jsx)(t.li,{children:"The semantics around when data from a commit is available to a query changes in a subtle way for a read optimized query. Note, that such a query\nrunning at 10:10, wont see data after 10:05 above, while a snapshot query always sees the freshest data."}),"\n",(0,s.jsx)(t.li,{children:"When we trigger compaction & what it decides to compact hold all the key to solving these hard problems. By implementing a compacting\nstrategy, where we aggressively compact the latest partitions compared to older partitions, we could ensure the read optimized queries see data\npublished within X minutes in a consistent fashion."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"The intention of merge on read table is to enable near real-time processing directly on top of DFS, as opposed to copying\ndata out to specialized systems, which may not be able to handle the data volume. There are also a few secondary side benefits to\nthis table such as reduced write amplification by avoiding synchronous merge of data, i.e, the amount of data written per 1 bytes of data in a batch"})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},28453:(e,t,i)=>{i.d(t,{R:()=>o,x:()=>r});var n=i(96540);const s={},a=n.createContext(s);function o(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/45a5cd1f.85a8b76e.js b/content/assets/js/45a5cd1f.85a8b76e.js new file mode 100644 index 0000000000000..83ed0fc809c71 --- /dev/null +++ b/content/assets/js/45a5cd1f.85a8b76e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[94e3],{27515:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"concepts","title":"Concepts","description":"Apache Hudi (pronounced \u201cHudi\u201d) provides the following streaming primitives over hadoop compatible storages","source":"@site/docs/concepts.md","sourceDirName":".","slug":"/concepts","permalink":"/docs/next/concepts","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/concepts.md","tags":[],"version":"current","frontMatter":{"version":"0.6.0","title":"Concepts","keywords":["hudi","design","table","queries","timeline"],"summary":"Here we introduce some basic concepts & give a broad technical overview of Hudi","toc":true,"last_modified_at":"2019-12-30T19:59:57.000Z"}}');var s=i(74848),a=i(28453);const o={version:"0.6.0",title:"Concepts",keywords:["hudi","design","table","queries","timeline"],summary:"Here we introduce some basic concepts & give a broad technical overview of Hudi",toc:!0,last_modified_at:new Date("2019-12-30T19:59:57.000Z")},r=void 0,l={},d=[{value:"Timeline",id:"timeline",level:2},{value:"File management",id:"file-management",level:2},{value:"Index",id:"index",level:2},{value:"Table Types & Queries",id:"table-types--queries",level:2},{value:"Table Types",id:"table-types",level:3},{value:"Query types",id:"query-types",level:3},{value:"Copy On Write Table",id:"copy-on-write-table",level:2},{value:"Merge On Read Table",id:"merge-on-read-table",level:2},{value:"Related Resources",id:"related-resources",level:2}];function c(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"Apache Hudi (pronounced \u201cHudi\u201d) provides the following streaming primitives over hadoop compatible storages"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Update/Delete Records (how do I change records in a table?)"}),"\n",(0,s.jsx)(t.li,{children:"Change Streams (how do I fetch records that changed?)"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"In this section, we will discuss key concepts & terminologies that are important to understand, to be able to effectively use these primitives."}),"\n",(0,s.jsx)(t.h2,{id:"timeline",children:"Timeline"}),"\n",(0,s.jsxs)(t.p,{children:["At its core, Hudi maintains a ",(0,s.jsx)(t.code,{children:"timeline"})," of all actions performed on the table at different ",(0,s.jsx)(t.code,{children:"instants"})," of time that helps provide instantaneous views of the table,\nwhile also efficiently supporting retrieval of data in the order of arrival. A Hudi instant consists of the following components"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Instant action"})," : Type of action performed on the table"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Instant time"})," : Instant time is typically a timestamp (e.g: 20190117010349), which monotonically increases in the order of action's begin time."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"state"})," : current state of the instant"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Hudi guarantees that the actions performed on the timeline are atomic & timeline consistent based on the instant time."}),"\n",(0,s.jsx)(t.p,{children:"Key actions performed include"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"COMMITS"})," - A commit denotes an ",(0,s.jsx)(t.strong,{children:"atomic write"})," of a batch of records into a table."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"CLEANS"})," - Background activity that gets rid of older versions of files in the table, that are no longer needed."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"DELTA_COMMIT"})," - A delta commit refers to an ",(0,s.jsx)(t.strong,{children:"atomic write"})," of a batch of records into a MergeOnRead type table, where some/all of the data could be just written to delta logs."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"COMPACTION"})," - Background activity to reconcile differential data structures within Hudi e.g: moving updates from row based log files to columnar formats. Internally, compaction manifests as a special commit on the timeline"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"ROLLBACK"})," - Indicates that a commit/delta commit was unsuccessful & rolled back, removing any partial files produced during such a write"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"SAVEPOINT"}),' - Marks certain file groups as "saved", such that cleaner will not delete them. It helps restore the table to a point on the timeline, in case of disaster/data recovery scenarios.']}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Any given instant can be\nin one of the following states"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"REQUESTED"})," - Denotes an action has been scheduled, but has not initiated"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"INFLIGHT"})," - Denotes that the action is currently being performed"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"COMPLETED"})," - Denotes completion of an action on the timeline"]}),"\n"]}),"\n",(0,s.jsx)("figure",{children:(0,s.jsx)("img",{className:"docimage",src:"/assets/images/hudi_timeline.png",alt:"hudi_timeline.png"})}),"\n",(0,s.jsxs)(t.p,{children:["Example above shows upserts happenings between 10:00 and 10:20 on a Hudi table, roughly every 5 mins, leaving commit metadata on the Hudi timeline, along\nwith other background cleaning/compactions. One key observation to make is that the commit time indicates the ",(0,s.jsx)(t.code,{children:"arrival time"})," of the data (10:20AM), while the actual data\norganization reflects the actual time or ",(0,s.jsx)(t.code,{children:"event time"}),", the data was intended for (hourly buckets from 07:00). These are two key concepts when reasoning about tradeoffs between latency and completeness of data."]}),"\n",(0,s.jsx)(t.p,{children:"When there is late arriving data (data intended for 9:00 arriving >1 hr late at 10:20), we can see the upsert producing new data into even older time buckets/folders.\nWith the help of the timeline, an incremental query attempting to get all new data that was committed successfully since 10:00 hours, is able to very efficiently consume\nonly the changed files without say scanning all the time buckets > 07:00."}),"\n",(0,s.jsx)(t.h2,{id:"file-management",children:"File management"}),"\n",(0,s.jsxs)(t.p,{children:["Hudi organizes a table into a directory structure under a ",(0,s.jsx)(t.code,{children:"basepath"})," on DFS. Table is broken up into partitions, which are folders containing data files for that partition,\nvery similar to Hive tables. Each partition is uniquely identified by its ",(0,s.jsx)(t.code,{children:"partitionpath"}),", which is relative to the basepath."]}),"\n",(0,s.jsxs)(t.p,{children:["Within each partition, files are organized into ",(0,s.jsx)(t.code,{children:"file groups"}),", uniquely identified by a ",(0,s.jsx)(t.code,{children:"file id"}),". Each file group contains several\n",(0,s.jsx)(t.code,{children:"file slices"}),", where each slice contains a base file (",(0,s.jsx)(t.code,{children:"*.parquet"}),") produced at a certain commit/compaction instant time,\nalong with set of log files (",(0,s.jsx)(t.code,{children:"*.log.*"}),") that contain inserts/updates to the base file since the base file was produced.\nHudi adopts a MVCC design, where compaction action merges logs and base files to produce new file slices and cleaning action gets rid of\nunused/older file slices to reclaim space on DFS."]}),"\n",(0,s.jsx)(t.h2,{id:"index",children:"Index"}),"\n",(0,s.jsx)(t.p,{children:"Hudi provides efficient upserts, by mapping a given hoodie key (record key + partition path) consistently to a file id, via an indexing mechanism.\nThis mapping between record key and file group/file id, never changes once the first version of a record has been written to a file. In short, the\nmapped file group contains all versions of a group of records."}),"\n",(0,s.jsx)(t.h2,{id:"table-types--queries",children:"Table Types & Queries"}),"\n",(0,s.jsxs)(t.p,{children:["Hudi table types define how data is indexed & laid out on the DFS and how the above primitives and timeline activities are implemented on top of such organization (i.e how data is written).\nIn turn, ",(0,s.jsx)(t.code,{children:"query types"})," define how the underlying data is exposed to the queries (i.e how data is read)."]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Table Type"}),(0,s.jsx)(t.th,{children:"Supported Query types"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Copy On Write"}),(0,s.jsx)(t.td,{children:"Snapshot Queries + Incremental Queries"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Merge On Read"}),(0,s.jsx)(t.td,{children:"Snapshot Queries + Incremental Queries + Read Optimized Queries"})]})]})]}),"\n",(0,s.jsx)(t.h3,{id:"table-types",children:"Table Types"}),"\n",(0,s.jsx)(t.p,{children:"Hudi supports the following table types."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"#copy-on-write-table",children:"Copy On Write"})," : Stores data using exclusively columnar file formats (e.g parquet). Updates simply version & rewrite the files by performing a synchronous merge during write."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"#merge-on-read-table",children:"Merge On Read"})," : Stores data using a combination of columnar (e.g parquet) + row based (e.g avro) file formats. Updates are logged to delta files & later compacted to produce new versions of columnar files synchronously or asynchronously."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Following table summarizes the trade-offs between these two table types"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Trade-off"}),(0,s.jsx)(t.th,{children:"CopyOnWrite"}),(0,s.jsx)(t.th,{children:"MergeOnRead"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Data Latency"}),(0,s.jsx)(t.td,{children:"Higher"}),(0,s.jsx)(t.td,{children:"Lower"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Update cost (I/O)"}),(0,s.jsx)(t.td,{children:"Higher (rewrite entire parquet)"}),(0,s.jsx)(t.td,{children:"Lower (append to delta log)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Parquet File Size"}),(0,s.jsx)(t.td,{children:"Smaller (high update(I/0) cost)"}),(0,s.jsx)(t.td,{children:"Larger (low update cost)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Write Amplification"}),(0,s.jsx)(t.td,{children:"Higher"}),(0,s.jsx)(t.td,{children:"Lower (depending on compaction strategy)"})]})]})]}),"\n",(0,s.jsx)(t.h3,{id:"query-types",children:"Query types"}),"\n",(0,s.jsx)(t.p,{children:"Hudi supports the following query types"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Snapshot Queries"})," : Queries see the latest snapshot of the table as of a given commit or compaction action. In case of merge on read table, it exposes near-real time data(few mins) by merging\nthe base and delta files of the latest file slice on-the-fly. For copy on write table, it provides a drop-in replacement for existing parquet tables, while providing upsert/delete and other write side features."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Incremental Queries"})," : Queries only see new data written to the table, since a given commit/compaction. This effectively provides change streams to enable incremental data pipelines."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Read Optimized Queries"})," : Queries see the latest snapshot of table as of a given commit/compaction action. Exposes only the base/columnar files in latest file slices and guarantees the\nsame columnar query performance compared to a non-hudi columnar table."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Following table summarizes the trade-offs between the different query types."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Trade-off"}),(0,s.jsx)(t.th,{children:"Snapshot"}),(0,s.jsx)(t.th,{children:"Read Optimized"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Data Latency"}),(0,s.jsx)(t.td,{children:"Lower"}),(0,s.jsx)(t.td,{children:"Higher"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Query Latency"}),(0,s.jsx)(t.td,{children:"Higher (merge base / columnar file + row based delta / log files)"}),(0,s.jsx)(t.td,{children:"Lower (raw base / columnar file performance)"})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"copy-on-write-table",children:"Copy On Write Table"}),"\n",(0,s.jsx)(t.p,{children:"File slices in Copy-On-Write table only contain the base/columnar file and each commit produces new versions of base files.\nIn other words, we implicitly compact on every commit, such that only columnar data exists. As a result, the write amplification\n(number of bytes written for 1 byte of incoming data) is much higher, where read amplification is zero.\nThis is a much desired property for analytical workloads, which is predominantly read-heavy."}),"\n",(0,s.jsx)(t.p,{children:"Following illustrates how this works conceptually, when data written into copy-on-write table and two queries running on top of it."}),"\n",(0,s.jsx)("figure",{children:(0,s.jsx)("img",{className:"docimage",src:"/assets/images/hudi_cow.png",alt:"hudi_cow.png"})}),"\n",(0,s.jsxs)(t.p,{children:["As data gets written, updates to existing file groups produce a new slice for that file group stamped with the commit instant time,\nwhile inserts allocate a new file group and write its first slice for that file group. These file slices and their commit instant times are color coded above.\nSQL queries running against such a table (eg: ",(0,s.jsx)(t.code,{children:"select count(*)"})," counting the total records in that partition), first checks the timeline for the latest commit\nand filters all but latest file slices of each file group. As you can see, an old query does not see the current inflight commit's files color coded in pink,\nbut a new query starting after the commit picks up the new data. Thus queries are immune to any write failures/partial writes and only run on committed data."]}),"\n",(0,s.jsx)(t.p,{children:"The intention of copy on write table, is to fundamentally improve how tables are managed today through"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"First class support for atomically updating data at file-level, instead of rewriting whole tables/partitions"}),"\n",(0,s.jsx)(t.li,{children:"Ability to incremental consume changes, as opposed to wasteful scans or fumbling with heuristics"}),"\n",(0,s.jsx)(t.li,{children:"Tight control of file sizes to keep query performance excellent (small files hurt query performance considerably)."}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"merge-on-read-table",children:"Merge On Read Table"}),"\n",(0,s.jsx)(t.p,{children:"Merge on read table is a superset of copy on write, in the sense it still supports read optimized queries of the table by exposing only the base/columnar files in latest file slices.\nAdditionally, it stores incoming upserts for each file group, onto a row based delta log, to support snapshot queries by applying the delta log,\nonto the latest version of each file id on-the-fly during query time. Thus, this table type attempts to balance read and write amplification intelligently, to provide near real-time data.\nThe most significant change here, would be to the compactor, which now carefully chooses which delta log files need to be compacted onto\ntheir columnar base file, to keep the query performance in check (larger delta log files would incur longer merge times with merge data on query side)"}),"\n",(0,s.jsx)(t.p,{children:"Following illustrates how the table works, and shows two types of queries - snapshot query and read optimized query."}),"\n",(0,s.jsx)("figure",{children:(0,s.jsx)("img",{className:"docimage",src:"/assets/images/hudi_mor.png",alt:"hudi_mor.png"})}),"\n",(0,s.jsx)(t.p,{children:"There are lot of interesting things happening in this example, which bring out the subtleties in the approach."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"We now have commits every 1 minute or so, something we could not do in the other table type."}),"\n",(0,s.jsx)(t.li,{children:"Within each file id group, now there is an delta log file, which holds incoming updates to the records already present in the base columnar files. In the example, the delta log files hold\nall the data from 10:05 to 10:10. The base columnar files are still versioned with the commit, as before.\nThus, if one were to simply look at base files alone, then the table layout looks exactly like a copy on write table."}),"\n",(0,s.jsx)(t.li,{children:"A periodic compaction process reconciles these changes from the delta log and produces a new version of base file, just like what happened at 10:05 in the example."}),"\n",(0,s.jsx)(t.li,{children:"There are two ways of querying the same underlying table: Read Optimized query and Snapshot query, depending on whether we chose query performance or freshness of data."}),"\n",(0,s.jsx)(t.li,{children:"The semantics around when data from a commit is available to a query changes in a subtle way for a read optimized query. Note, that such a query\nrunning at 10:10, wont see data after 10:05 above, while a snapshot query always sees the freshest data."}),"\n",(0,s.jsx)(t.li,{children:"When we trigger compaction & what it decides to compact hold all the key to solving these hard problems. By implementing a compacting\nstrategy, where we aggressively compact the latest partitions compared to older partitions, we could ensure the read optimized queries see data\npublished within X minutes in a consistent fashion."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"The intention of merge on read table is to enable near real-time processing directly on top of DFS, as opposed to copying\ndata out to specialized systems, which may not be able to handle the data volume. There are also a few secondary side benefits to\nthis table such as reduced write amplification by avoiding synchronous merge of data, i.e, the amount of data written per 1 bytes of data in a batch"}),"\n",(0,s.jsx)(t.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,s.jsx)("h3",{children:"Blogs"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://www.onehouse.ai/blog/comparing-apache-hudis-mor-and-cow-tables-use-cases-from-uber-and-shopee",children:"Comparing Apache Hudi's MOR and COW Tables: Use Cases from Uber and Shopee"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://www.onehouse.ai/blog/hudi-metafields-demystified",children:"Hudi Metafields demystified"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://medium.com/@simpsons/file-naming-conventions-in-apache-hudi-cd1cdd95f5e7",children:"File Naming conventions in Apache Hudi"})}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},28453:(e,t,i)=>{i.d(t,{R:()=>o,x:()=>r});var n=i(96540);const s={},a=n.createContext(s);function o(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/491d56e0.6e8fb4cd.js b/content/assets/js/491d56e0.6e8fb4cd.js new file mode 100644 index 0000000000000..3b77cb0bd134f --- /dev/null +++ b/content/assets/js/491d56e0.6e8fb4cd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[72907],{48105:(e,r,i)=>{i.r(r),i.d(r,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"record_merger","title":"Record Mergers","description":"Hudi handles mutations to records and streaming data, as we briefly touched upon in timeline ordering section.","source":"@site/docs/record_merger.md","sourceDirName":".","slug":"/record_merger","permalink":"/docs/next/record_merger","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/record_merger.md","tags":[],"version":"current","frontMatter":{"title":"Record Mergers","keywords":["hudi","merge","upsert","precombine"],"toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4},"sidebar":"docs","previous":{"title":"Key Generation","permalink":"/docs/next/key_generation"},"next":{"title":"Table Metadata","permalink":"/docs/next/metadata"}}');var o=i(74848),t=i(28453);const a={title:"Record Mergers",keywords:["hudi","merge","upsert","precombine"],toc:!0,toc_min_heading_level:2,toc_max_heading_level:4},s=void 0,d={},c=[{value:"COMMIT_TIME_ORDERING",id:"commit_time_ordering",level:3},{value:"EVENT_TIME_ORDERING",id:"event_time_ordering",level:3},{value:"CUSTOM",id:"custom",level:3},{value:"Record Merge Configs",id:"record-merge-configs",level:3},{value:"Record Payloads",id:"record-payloads",level:3},{value:"OverwriteWithLatestAvroPayload",id:"overwritewithlatestavropayload",level:4},{value:"DefaultHoodieRecordPayload",id:"defaulthoodierecordpayload",level:4},{value:"EventTimeAvroPayload",id:"eventtimeavropayload",level:4},{value:"OverwriteNonDefaultsWithLatestAvroPayload",id:"overwritenondefaultswithlatestavropayload",level:4},{value:"PartialUpdateAvroPayload",id:"partialupdateavropayload",level:4},{value:"Configs",id:"configs",level:4},{value:"Related Resources",id:"related-resources",level:2}];function l(e){const r={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(r.p,{children:["Hudi handles mutations to records and streaming data, as we briefly touched upon in ",(0,o.jsx)(r.a,{href:"timeline#ordering-of-actions",children:"timeline ordering"})," section.\nTo provide users full-fledged support for stream processing, Hudi goes all the way making the storage engine and the underlying storage format\nunderstand how to merge changes to the same record key, that may arrive even in different order at different times. With the rise of mobile applications\nand IoT, these scenarios have become the normal than an exception. For e.g. a social networking application uploading user events several hours after they happened,\nwhen the user connects to WiFi networks."]}),"\n",(0,o.jsx)(r.p,{children:"To achieve this, Hudi supports merge modes, which define how the base and log files are ordered in a file slice and further how different records with\nthe same record key within that file slice are merged consistently to produce the same deterministic results for snapshot queries, writers and table services. Specifically,\nthere are three merge modes supported as a table-level configuration, invoked in the following places."}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"(writing)"})," Combining multiple change records for the same record key while reading input data during writes. This is an optional optimization that\nreduces the number of records written to log files to improve query and write performance subsequently."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"(writing)"})," Merging final change record (partial/full update/delete) against existing record in storage for CoW tables."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"(compaction)"})," Compaction service merges all change records in log files against base files, respecting the merge mode."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"(query)"})," Merging change records in log files, after filtering/projections against base file for MoR table queries."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(r.p,{children:"Note that the merge mode should not be altered once the table is created to avoid inconsistent behavior due to compaction producing\ndifferent merge results when switching between the modes."}),"\n",(0,o.jsx)(r.h3,{id:"commit_time_ordering",children:"COMMIT_TIME_ORDERING"}),"\n",(0,o.jsx)(r.p,{children:"Here, we expect the input records to arrive in strict order such that arrival order is same as their\ndelta commit order on the table. Merging simply picks the record belonging to the latest write as the merged result. In relational data mode speak,\nthis provides overwrite semantics aligned with serializable writes on the timeline."}),"\n",(0,o.jsx)("figure",{children:(0,o.jsx)("img",{className:"docimage",src:i(38526).A,alt:"upsert_path.png"})}),"\n",(0,o.jsx)(r.p,{children:"In the example above, the writer process consumes a database change log, expected to be in strict order of a logical sequence number (lsn)\nthat denotes the ordering of the writes in the upstream database."}),"\n",(0,o.jsx)(r.h3,{id:"event_time_ordering",children:"EVENT_TIME_ORDERING"}),"\n",(0,o.jsxs)(r.p,{children:["This is the default merge mode. While commit time ordering provides a well-understood standard behavior, it's hardly sufficient. The commit time is unrelated to the actual\nordering of data that a user may care about and strict ordering of input in complex distributed systems is difficult to achieve.\nWith event time ordering, the merging picks the record with the highest value on a user specified ",(0,o.jsx)(r.em,{children:(0,o.jsx)(r.strong,{children:"ordering or precombine field"})})," as the merged result."]}),"\n",(0,o.jsx)("figure",{children:(0,o.jsx)("img",{className:"docimage",src:i(57159).A,alt:"upsert_path.png"})}),"\n",(0,o.jsxs)(r.p,{children:['In the example above, two microservices product change records about orders at different times, that can arrive out-of-order. As color coded,\nthis can lead to application-level inconsistent states in the table if simply merged in commit time order like a cancelled order being re-created or\na paid order moved back to just created state expecting payment again. Event time ordering helps by ignoring older state changes that arrive late and\navoiding order status from "jumping back" in time. Combined with ',(0,o.jsx)(r.a,{href:"concurrency_control#non-blocking-concurrency-control-mode",children:"non-blocking concurrency control"}),",\nthis provides a very powerful way for processing such data streams efficiently and correctly."]}),"\n",(0,o.jsx)(r.h3,{id:"custom",children:"CUSTOM"}),"\n",(0,o.jsx)(r.p,{children:'In some cases, even more control and customization may be needed. Extending the same example above, the two microservices could be updating two different\nset of columns "order_info" and "payment_info", along with order state. The merge logic is then expected to not only resolve the correct status, but merge\norder_info from the record in created state, into the record in cancelled state that already has payment_info fields populated with reasons payment failed.\nSuch reconciliation provide a simple denormalized data model for downstream consumption where queries (for e.g. fraud detection) can simply filter fields\nacross order_info and payment_info without costly self-join on each access.'}),"\n",(0,o.jsxs)(r.p,{children:["Hudi allows authoring of cross-language custom record mergers on top of a standard record merger API, that supports full and partial merges. The java APIs\nare sketched below at a high-level. It simply takes older/newer records in engine native formats and produces a merged record or returns empty to skip them entirely (e.g. soft deletes).\nRecord merger is configured using a ",(0,o.jsx)(r.code,{children:"hoodie.write.record.merge.strategy.id"})," write config whose value is an uuid, that is taken by the writer to persist in the table config, and is expected to be returned by ",(0,o.jsx)(r.code,{children:"getMergingStrategy()"}),"\nmethod below. Using this mechanism, Hudi can automatically deduce the record merger to use for the table across different language/engine runtimes."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-Java",children:"interface HoodieRecordMerger {\n\n Option> merge(HoodieRecord older, Schema oldSchema, \n HoodieRecord newer, Schema newSchema, \n TypedProperties props) {\n ...\n }\n\n Option> partialMerge(HoodieRecord older, Schema oldSchema, \n HoodieRecord newer, Schema newSchema, \n Schema readerSchema, TypedProperties props) {\n ...\n }\n \n HoodieRecordType getRecordType() {...}\n \n String getMergingStrategy(); {...}\n}\n"})}),"\n",(0,o.jsx)(r.h3,{id:"record-merge-configs",children:"Record Merge Configs"}),"\n",(0,o.jsx)(r.p,{children:"The record merge mode and optional record merge strategy ID and custom merge implementation classes can be specified using the below configs."}),"\n",(0,o.jsxs)(r.table,{children:[(0,o.jsx)(r.thead,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.th,{children:"Config Name"}),(0,o.jsx)(r.th,{children:"Default"}),(0,o.jsx)(r.th,{children:"Description"})]})}),(0,o.jsxs)(r.tbody,{children:[(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"hoodie.write.record.merge.mode"}),(0,o.jsx)(r.td,{children:"EVENT_TIME_ORDERING"}),(0,o.jsxs)(r.td,{children:["Determines the logic of merging different records with the same record key. Valid values: (1) ",(0,o.jsx)(r.code,{children:"COMMIT_TIME_ORDERING"}),": use commit time to merge records, i.e., the record from later commit overwrites the earlier record with the same key. (2) ",(0,o.jsx)(r.code,{children:"EVENT_TIME_ORDERING"})," (default): use event time as the ordering to merge records, i.e., the record with the larger event time overwrites the record with the smaller event time on the same key, regardless of commit time. The event time or preCombine field needs to be specified by the user. (3) ",(0,o.jsx)(r.code,{children:"CUSTOM"}),": use custom merging logic specified by the user.",(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Config Param: RECORD_MERGE_MODE"}),(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Since Version: 1.0.0"})]})]}),(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"hoodie.write.record.merge.strategy.id"}),(0,o.jsx)(r.td,{children:"N/A (Optional)"}),(0,o.jsxs)(r.td,{children:["ID of record merge strategy. When you specify this config, you also need to specify ",(0,o.jsx)(r.code,{children:"hoodie.write.record.merge.custom.implementation.classes"}),". Hudi picks the ",(0,o.jsx)(r.code,{children:"HoodieRecordMerger"})," implementation class from the list of classes in ",(0,o.jsx)(r.code,{children:"hoodie.write.record.merge.custom.implementation.classes"})," that has the specified merge strategy ID.",(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Config Param: RECORD_MERGE_STRATEGY_ID"}),(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Since Version: 0.13.0"})]})]}),(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"hoodie.write.record.merge.custom.implementation.classes"}),(0,o.jsx)(r.td,{children:"N/A (Optional)"}),(0,o.jsxs)(r.td,{children:["List of ",(0,o.jsx)(r.code,{children:"HoodieRecordMerger"})," implementations constituting Hudi's merging strategy based on the engine used. Hudi picks the ",(0,o.jsx)(r.code,{children:"HoodieRecordMerger"})," implementation class from this list based on the specified ",(0,o.jsx)(r.code,{children:"hoodie.write.record.merge.strategy.id"}),".",(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Config Param: RECORD_MERGE_IMPL_CLASSES"}),(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Since Version: 0.13.0"})]})]})]})]}),"\n",(0,o.jsx)(r.h3,{id:"record-payloads",children:"Record Payloads"}),"\n",(0,o.jsx)(r.admonition,{type:"caution",children:(0,o.jsx)(r.p,{children:"Going forward, we recommend users to migrate and use the record merger APIs and not write new payload implementations."})}),"\n",(0,o.jsx)(r.p,{children:"Record payload is an older abstraction/API for achieving similar record-level merge capabilities. While record payloads were very useful and popular,\nit had drawbacks like lower performance due to conversion of engine native record formats to Apache Avro for merging and lack of cross-language support.\nAs we shall see below, Hudi provides out-of-box support for different payloads for different use cases. Hudi implements fallback from\nrecord merger APIs to payload APIs internally, to provide backwards compatibility for existing payload implementations."}),"\n",(0,o.jsx)(r.h4,{id:"overwritewithlatestavropayload",children:"OverwriteWithLatestAvroPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.OverwriteWithLatestAvroPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["This is the default record payload implementation. It picks the record with the greatest value (determined by calling\n",(0,o.jsx)(r.code,{children:".compareTo()"})," on the value of precombine key) to break ties and simply picks the latest record while merging. This gives\nlatest-write-wins style semantics."]}),"\n",(0,o.jsx)(r.h4,{id:"defaulthoodierecordpayload",children:"DefaultHoodieRecordPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.DefaultHoodieRecordPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["While ",(0,o.jsx)(r.code,{children:"OverwriteWithLatestAvroPayload"})," precombines based on an ordering field and picks the latest record while merging,\n",(0,o.jsx)(r.code,{children:"DefaultHoodieRecordPayload"})," honors the ordering field for both precombinig and merging. Let's understand the difference with an example:"]}),"\n",(0,o.jsxs)(r.p,{children:["Let's say the ordering field is ",(0,o.jsx)(r.code,{children:"ts"})," and record key is ",(0,o.jsx)(r.code,{children:"id"})," and schema is:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:'{\n [\n {"name":"id","type":"string"},\n {"name":"ts","type":"long"},\n {"name":"name","type":"string"},\n {"name":"price","type":"string"}\n ]\n}\n'})}),"\n",(0,o.jsx)(r.p,{children:"Current record in storage:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 2 name_2 price_2\n"})}),"\n",(0,o.jsx)(r.p,{children:"Incoming record:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 1 name_1 price_1\n"})}),"\n",(0,o.jsxs)(r.p,{children:["Result data after merging using ",(0,o.jsx)(r.code,{children:"OverwriteWithLatestAvroPayload"})," (latest-write-wins):"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 1 name_1 price_1\n"})}),"\n",(0,o.jsxs)(r.p,{children:["Result data after merging using ",(0,o.jsx)(r.code,{children:"DefaultHoodieRecordPayload"})," (always honors ordering field):"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 2 name_2 price_2\n"})}),"\n",(0,o.jsx)(r.h4,{id:"eventtimeavropayload",children:"EventTimeAvroPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.EventTimeAvroPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["This is the default record payload for Flink based writing. Some use cases require merging records by event time and\nthus event time plays the role of an ordering field. This payload is particularly useful in the case of late-arriving data.\nFor such use cases, users need to set the ",(0,o.jsx)(r.a,{href:"/docs/configurations#RECORD_PAYLOAD",children:"payload event time field"})," configuration."]}),"\n",(0,o.jsx)(r.h4,{id:"overwritenondefaultswithlatestavropayload",children:"OverwriteNonDefaultsWithLatestAvroPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.OverwriteNonDefaultsWithLatestAvroPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["This payload is quite similar to ",(0,o.jsx)(r.code,{children:"OverwriteWithLatestAvroPayload"})," with slight difference while merging records. For\nprecombining, just like ",(0,o.jsx)(r.code,{children:"OverwriteWithLatestAvroPayload"}),", it picks the latest record for a key, based on an ordering\nfield. While merging, it overwrites the existing record on storage only for the specified ",(0,o.jsx)(r.strong,{children:"fields that don't equal\ndefault value"})," for that field."]}),"\n",(0,o.jsx)(r.h4,{id:"partialupdateavropayload",children:"PartialUpdateAvroPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.PartialUpdateAvroPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["This payload supports partial update. Typically, once the merge step resolves which record to pick, then the record on\nstorage is fully replaced by the resolved record. But, in some cases, the requirement is to update only certain fields\nand not replace the whole record. This is called partial update. ",(0,o.jsx)(r.code,{children:"PartialUpdateAvroPayload"})," provides out-of-box support\nfor such use cases. To illustrate the point, let us look at a simple example:"]}),"\n",(0,o.jsxs)(r.p,{children:["Let's say the ordering field is ",(0,o.jsx)(r.code,{children:"ts"})," and record key is ",(0,o.jsx)(r.code,{children:"id"})," and schema is:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:'{\n [\n {"name":"id","type":"string"},\n {"name":"ts","type":"long"},\n {"name":"name","type":"string"},\n {"name":"price","type":"string"}\n ]\n}\n'})}),"\n",(0,o.jsx)(r.p,{children:"Current record in storage:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 2 name_1 null\n"})}),"\n",(0,o.jsx)(r.p,{children:"Incoming record:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 1 null price_1\n"})}),"\n",(0,o.jsxs)(r.p,{children:["Result data after merging using ",(0,o.jsx)(r.code,{children:"PartialUpdateAvroPayload"}),":"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 2 name_1 price_1\n"})}),"\n",(0,o.jsx)(r.h4,{id:"configs",children:"Configs"}),"\n",(0,o.jsxs)(r.p,{children:["Payload class can be specified using the below configs. For more advanced configs refer ",(0,o.jsx)(r.a,{href:"https://hudi.apache.org/docs/configurations#RECORD_PAYLOAD",children:"here"})]}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.strong,{children:"Spark based configs:"})}),"\n",(0,o.jsxs)(r.table,{children:[(0,o.jsx)(r.thead,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.th,{children:"Config Name"}),(0,o.jsx)(r.th,{children:"Default"}),(0,o.jsx)(r.th,{children:"Description"})]})}),(0,o.jsx)(r.tbody,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"hoodie.datasource.write.payload.class"}),(0,o.jsx)(r.td,{children:"org.apache.hudi.common.model.OverwriteWithLatestAvroPayload (Optional)"}),(0,o.jsxs)(r.td,{children:["Payload class used. Override this, if you like to roll your own merge logic, when upserting/inserting. This will render any value set for PRECOMBINE_FIELD_OPT_VAL in-effective",(0,o.jsx)("br",{}),(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Config Param: WRITE_PAYLOAD_CLASS_NAME"})]})]})})]}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.strong,{children:"Flink based configs:"})}),"\n",(0,o.jsxs)(r.table,{children:[(0,o.jsx)(r.thead,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.th,{children:"Config Name"}),(0,o.jsx)(r.th,{children:"Default"}),(0,o.jsx)(r.th,{children:"Description"})]})}),(0,o.jsx)(r.tbody,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"payload.class"}),(0,o.jsx)(r.td,{children:"org.apache.hudi.common.model.EventTimeAvroPayload (Optional)"}),(0,o.jsxs)(r.td,{children:["Payload class used. Override this, if you like to roll your own merge logic, when upserting/inserting. This will render any value set for the option in-effective",(0,o.jsx)("br",{}),(0,o.jsx)("br",{})," ",(0,o.jsx)(r.code,{children:"Config Param: PAYLOAD_CLASS_NAME"})]})]})})]}),"\n",(0,o.jsxs)(r.p,{children:["There are also quite a few other implementations. Developers may be interested in looking at the hierarchy of ",(0,o.jsx)(r.code,{children:"HoodieRecordPayload"})," interface. For\nexample, ",(0,o.jsx)(r.a,{href:"https://github.com/apache/hudi/blob/e76dd102bcaf8aec5a932e7277ccdbfd73ce1a32/hudi-common/src/main/java/org/apache/hudi/common/model/debezium/MySqlDebeziumAvroPayload.java",children:(0,o.jsx)(r.code,{children:"MySqlDebeziumAvroPayload"})})," and ",(0,o.jsx)(r.a,{href:"https://github.com/apache/hudi/blob/e76dd102bcaf8aec5a932e7277ccdbfd73ce1a32/hudi-common/src/main/java/org/apache/hudi/common/model/debezium/PostgresDebeziumAvroPayload.java",children:(0,o.jsx)(r.code,{children:"PostgresDebeziumAvroPayload"})})," provides support for seamlessly applying changes\ncaptured via Debezium for MySQL and PostgresDB. ",(0,o.jsx)(r.a,{href:"https://github.com/apache/hudi/blob/e76dd102bcaf8aec5a932e7277ccdbfd73ce1a32/hudi-common/src/main/java/org/apache/hudi/common/model/AWSDmsAvroPayload.java",children:(0,o.jsx)(r.code,{children:"AWSDmsAvroPayload"})})," provides support for applying changes captured via Amazon Database Migration Service onto S3.\nFor full configurations, go ",(0,o.jsx)(r.a,{href:"/docs/configurations#RECORD_PAYLOAD",children:"here"})," and please check out ",(0,o.jsx)(r.a,{href:"faq_writing_tables/#can-i-implement-my-own-logic-for-how-input-records-are-merged-with-record-on-storage",children:"this FAQ"})," if you want to implement your own custom payloads."]}),"\n",(0,o.jsx)(r.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,o.jsx)("h3",{children:"Blogs"}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsx)(r.li,{children:(0,o.jsx)(r.a,{href:"https://medium.com/@simpsons/how-to-define-your-own-merge-logic-with-apache-hudi-622ee5ccab1e",children:"How to define your own merge logic with Apache Hudi"})}),"\n"]})]})}function h(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},38526:(e,r,i)=>{i.d(r,{A:()=>n});const n=i.p+"assets/images/commit-time-ordering-merge-mode-e9b6af3dcdb508053202617218f3ffe6.png"},57159:(e,r,i)=>{i.d(r,{A:()=>n});const n=i.p+"assets/images/event-time-ordering-merge-mode-c8164e035840388bf4290fa81ac6262a.png"},28453:(e,r,i)=>{i.d(r,{R:()=>a,x:()=>s});var n=i(96540);const o={},t=n.createContext(o);function a(e){const r=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function s(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(t.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/491d56e0.8897656e.js b/content/assets/js/491d56e0.8897656e.js deleted file mode 100644 index 6e93ff68aa610..0000000000000 --- a/content/assets/js/491d56e0.8897656e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[72907],{48105:(e,r,i)=>{i.r(r),i.d(r,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"record_merger","title":"Record Mergers","description":"Hudi handles mutations to records and streaming data, as we briefly touched upon in timeline ordering section.","source":"@site/docs/record_merger.md","sourceDirName":".","slug":"/record_merger","permalink":"/docs/next/record_merger","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/record_merger.md","tags":[],"version":"current","frontMatter":{"title":"Record Mergers","keywords":["hudi","merge","upsert","precombine"],"toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4},"sidebar":"docs","previous":{"title":"Key Generation","permalink":"/docs/next/key_generation"},"next":{"title":"Table Metadata","permalink":"/docs/next/metadata"}}');var o=i(74848),t=i(28453);const a={title:"Record Mergers",keywords:["hudi","merge","upsert","precombine"],toc:!0,toc_min_heading_level:2,toc_max_heading_level:4},s=void 0,d={},c=[{value:"COMMIT_TIME_ORDERING",id:"commit_time_ordering",level:3},{value:"EVENT_TIME_ORDERING",id:"event_time_ordering",level:3},{value:"CUSTOM",id:"custom",level:3},{value:"Record Merge Configs",id:"record-merge-configs",level:3},{value:"Record Payloads",id:"record-payloads",level:3},{value:"OverwriteWithLatestAvroPayload",id:"overwritewithlatestavropayload",level:4},{value:"DefaultHoodieRecordPayload",id:"defaulthoodierecordpayload",level:4},{value:"EventTimeAvroPayload",id:"eventtimeavropayload",level:4},{value:"OverwriteNonDefaultsWithLatestAvroPayload",id:"overwritenondefaultswithlatestavropayload",level:4},{value:"PartialUpdateAvroPayload",id:"partialupdateavropayload",level:4},{value:"Configs",id:"configs",level:4}];function l(e){const r={a:"a",admonition:"admonition",code:"code",em:"em",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(r.p,{children:["Hudi handles mutations to records and streaming data, as we briefly touched upon in ",(0,o.jsx)(r.a,{href:"timeline#ordering-of-actions",children:"timeline ordering"})," section.\nTo provide users full-fledged support for stream processing, Hudi goes all the way making the storage engine and the underlying storage format\nunderstand how to merge changes to the same record key, that may arrive even in different order at different times. With the rise of mobile applications\nand IoT, these scenarios have become the normal than an exception. For e.g. a social networking application uploading user events several hours after they happened,\nwhen the user connects to WiFi networks."]}),"\n",(0,o.jsx)(r.p,{children:"To achieve this, Hudi supports merge modes, which define how the base and log files are ordered in a file slice and further how different records with\nthe same record key within that file slice are merged consistently to produce the same deterministic results for snapshot queries, writers and table services. Specifically,\nthere are three merge modes supported as a table-level configuration, invoked in the following places."}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"(writing)"})," Combining multiple change records for the same record key while reading input data during writes. This is an optional optimization that\nreduces the number of records written to log files to improve query and write performance subsequently."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"(writing)"})," Merging final change record (partial/full update/delete) against existing record in storage for CoW tables."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"(compaction)"})," Compaction service merges all change records in log files against base files, respecting the merge mode."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"(query)"})," Merging change records in log files, after filtering/projections against base file for MoR table queries."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(r.p,{children:"Note that the merge mode should not be altered once the table is created to avoid inconsistent behavior due to compaction producing\ndifferent merge results when switching between the modes."}),"\n",(0,o.jsx)(r.h3,{id:"commit_time_ordering",children:"COMMIT_TIME_ORDERING"}),"\n",(0,o.jsx)(r.p,{children:"Here, we expect the input records to arrive in strict order such that arrival order is same as their\ndelta commit order on the table. Merging simply picks the record belonging to the latest write as the merged result. In relational data mode speak,\nthis provides overwrite semantics aligned with serializable writes on the timeline."}),"\n",(0,o.jsx)("figure",{children:(0,o.jsx)("img",{className:"docimage",src:i(38526).A,alt:"upsert_path.png"})}),"\n",(0,o.jsx)(r.p,{children:"In the example above, the writer process consumes a database change log, expected to be in strict order of a logical sequence number (lsn)\nthat denotes the ordering of the writes in the upstream database."}),"\n",(0,o.jsx)(r.h3,{id:"event_time_ordering",children:"EVENT_TIME_ORDERING"}),"\n",(0,o.jsxs)(r.p,{children:["This is the default merge mode. While commit time ordering provides a well-understood standard behavior, it's hardly sufficient. The commit time is unrelated to the actual\nordering of data that a user may care about and strict ordering of input in complex distributed systems is difficult to achieve.\nWith event time ordering, the merging picks the record with the highest value on a user specified ",(0,o.jsx)(r.em,{children:(0,o.jsx)(r.strong,{children:"ordering or precombine field"})})," as the merged result."]}),"\n",(0,o.jsx)("figure",{children:(0,o.jsx)("img",{className:"docimage",src:i(57159).A,alt:"upsert_path.png"})}),"\n",(0,o.jsxs)(r.p,{children:['In the example above, two microservices product change records about orders at different times, that can arrive out-of-order. As color coded,\nthis can lead to application-level inconsistent states in the table if simply merged in commit time order like a cancelled order being re-created or\na paid order moved back to just created state expecting payment again. Event time ordering helps by ignoring older state changes that arrive late and\navoiding order status from "jumping back" in time. Combined with ',(0,o.jsx)(r.a,{href:"concurrency_control#non-blocking-concurrency-control-mode",children:"non-blocking concurrency control"}),",\nthis provides a very powerful way for processing such data streams efficiently and correctly."]}),"\n",(0,o.jsx)(r.h3,{id:"custom",children:"CUSTOM"}),"\n",(0,o.jsx)(r.p,{children:'In some cases, even more control and customization may be needed. Extending the same example above, the two microservices could be updating two different\nset of columns "order_info" and "payment_info", along with order state. The merge logic is then expected to not only resolve the correct status, but merge\norder_info from the record in created state, into the record in cancelled state that already has payment_info fields populated with reasons payment failed.\nSuch reconciliation provide a simple denormalized data model for downstream consumption where queries (for e.g. fraud detection) can simply filter fields\nacross order_info and payment_info without costly self-join on each access.'}),"\n",(0,o.jsxs)(r.p,{children:["Hudi allows authoring of cross-language custom record mergers on top of a standard record merger API, that supports full and partial merges. The java APIs\nare sketched below at a high-level. It simply takes older/newer records in engine native formats and produces a merged record or returns empty to skip them entirely (e.g. soft deletes).\nRecord merger is configured using a ",(0,o.jsx)(r.code,{children:"hoodie.write.record.merge.strategy.id"})," write config whose value is an uuid, that is taken by the writer to persist in the table config, and is expected to be returned by ",(0,o.jsx)(r.code,{children:"getMergingStrategy()"}),"\nmethod below. Using this mechanism, Hudi can automatically deduce the record merger to use for the table across different language/engine runtimes."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-Java",children:"interface HoodieRecordMerger {\n\n Option> merge(HoodieRecord older, Schema oldSchema, \n HoodieRecord newer, Schema newSchema, \n TypedProperties props) {\n ...\n }\n\n Option> partialMerge(HoodieRecord older, Schema oldSchema, \n HoodieRecord newer, Schema newSchema, \n Schema readerSchema, TypedProperties props) {\n ...\n }\n \n HoodieRecordType getRecordType() {...}\n \n String getMergingStrategy(); {...}\n}\n"})}),"\n",(0,o.jsx)(r.h3,{id:"record-merge-configs",children:"Record Merge Configs"}),"\n",(0,o.jsx)(r.p,{children:"The record merge mode and optional record merge strategy ID and custom merge implementation classes can be specified using the below configs."}),"\n",(0,o.jsxs)(r.table,{children:[(0,o.jsx)(r.thead,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.th,{children:"Config Name"}),(0,o.jsx)(r.th,{children:"Default"}),(0,o.jsx)(r.th,{children:"Description"})]})}),(0,o.jsxs)(r.tbody,{children:[(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"hoodie.write.record.merge.mode"}),(0,o.jsx)(r.td,{children:"EVENT_TIME_ORDERING"}),(0,o.jsxs)(r.td,{children:["Determines the logic of merging different records with the same record key. Valid values: (1) ",(0,o.jsx)(r.code,{children:"COMMIT_TIME_ORDERING"}),": use commit time to merge records, i.e., the record from later commit overwrites the earlier record with the same key. (2) ",(0,o.jsx)(r.code,{children:"EVENT_TIME_ORDERING"})," (default): use event time as the ordering to merge records, i.e., the record with the larger event time overwrites the record with the smaller event time on the same key, regardless of commit time. The event time or preCombine field needs to be specified by the user. (3) ",(0,o.jsx)(r.code,{children:"CUSTOM"}),": use custom merging logic specified by the user.",(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Config Param: RECORD_MERGE_MODE"}),(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Since Version: 1.0.0"})]})]}),(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"hoodie.write.record.merge.strategy.id"}),(0,o.jsx)(r.td,{children:"N/A (Optional)"}),(0,o.jsxs)(r.td,{children:["ID of record merge strategy. When you specify this config, you also need to specify ",(0,o.jsx)(r.code,{children:"hoodie.write.record.merge.custom.implementation.classes"}),". Hudi picks the ",(0,o.jsx)(r.code,{children:"HoodieRecordMerger"})," implementation class from the list of classes in ",(0,o.jsx)(r.code,{children:"hoodie.write.record.merge.custom.implementation.classes"})," that has the specified merge strategy ID.",(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Config Param: RECORD_MERGE_STRATEGY_ID"}),(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Since Version: 0.13.0"})]})]}),(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"hoodie.write.record.merge.custom.implementation.classes"}),(0,o.jsx)(r.td,{children:"N/A (Optional)"}),(0,o.jsxs)(r.td,{children:["List of ",(0,o.jsx)(r.code,{children:"HoodieRecordMerger"})," implementations constituting Hudi's merging strategy based on the engine used. Hudi picks the ",(0,o.jsx)(r.code,{children:"HoodieRecordMerger"})," implementation class from this list based on the specified ",(0,o.jsx)(r.code,{children:"hoodie.write.record.merge.strategy.id"}),".",(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Config Param: RECORD_MERGE_IMPL_CLASSES"}),(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Since Version: 0.13.0"})]})]})]})]}),"\n",(0,o.jsx)(r.h3,{id:"record-payloads",children:"Record Payloads"}),"\n",(0,o.jsx)(r.admonition,{type:"caution",children:(0,o.jsx)(r.p,{children:"Going forward, we recommend users to migrate and use the record merger APIs and not write new payload implementations."})}),"\n",(0,o.jsx)(r.p,{children:"Record payload is an older abstraction/API for achieving similar record-level merge capabilities. While record payloads were very useful and popular,\nit had drawbacks like lower performance due to conversion of engine native record formats to Apache Avro for merging and lack of cross-language support.\nAs we shall see below, Hudi provides out-of-box support for different payloads for different use cases. Hudi implements fallback from\nrecord merger APIs to payload APIs internally, to provide backwards compatibility for existing payload implementations."}),"\n",(0,o.jsx)(r.h4,{id:"overwritewithlatestavropayload",children:"OverwriteWithLatestAvroPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.OverwriteWithLatestAvroPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["This is the default record payload implementation. It picks the record with the greatest value (determined by calling\n",(0,o.jsx)(r.code,{children:".compareTo()"})," on the value of precombine key) to break ties and simply picks the latest record while merging. This gives\nlatest-write-wins style semantics."]}),"\n",(0,o.jsx)(r.h4,{id:"defaulthoodierecordpayload",children:"DefaultHoodieRecordPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.DefaultHoodieRecordPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["While ",(0,o.jsx)(r.code,{children:"OverwriteWithLatestAvroPayload"})," precombines based on an ordering field and picks the latest record while merging,\n",(0,o.jsx)(r.code,{children:"DefaultHoodieRecordPayload"})," honors the ordering field for both precombinig and merging. Let's understand the difference with an example:"]}),"\n",(0,o.jsxs)(r.p,{children:["Let's say the ordering field is ",(0,o.jsx)(r.code,{children:"ts"})," and record key is ",(0,o.jsx)(r.code,{children:"id"})," and schema is:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:'{\n [\n {"name":"id","type":"string"},\n {"name":"ts","type":"long"},\n {"name":"name","type":"string"},\n {"name":"price","type":"string"}\n ]\n}\n'})}),"\n",(0,o.jsx)(r.p,{children:"Current record in storage:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 2 name_2 price_2\n"})}),"\n",(0,o.jsx)(r.p,{children:"Incoming record:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 1 name_1 price_1\n"})}),"\n",(0,o.jsxs)(r.p,{children:["Result data after merging using ",(0,o.jsx)(r.code,{children:"OverwriteWithLatestAvroPayload"})," (latest-write-wins):"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 1 name_1 price_1\n"})}),"\n",(0,o.jsxs)(r.p,{children:["Result data after merging using ",(0,o.jsx)(r.code,{children:"DefaultHoodieRecordPayload"})," (always honors ordering field):"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 2 name_2 price_2\n"})}),"\n",(0,o.jsx)(r.h4,{id:"eventtimeavropayload",children:"EventTimeAvroPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.EventTimeAvroPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["This is the default record payload for Flink based writing. Some use cases require merging records by event time and\nthus event time plays the role of an ordering field. This payload is particularly useful in the case of late-arriving data.\nFor such use cases, users need to set the ",(0,o.jsx)(r.a,{href:"/docs/configurations#RECORD_PAYLOAD",children:"payload event time field"})," configuration."]}),"\n",(0,o.jsx)(r.h4,{id:"overwritenondefaultswithlatestavropayload",children:"OverwriteNonDefaultsWithLatestAvroPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.OverwriteNonDefaultsWithLatestAvroPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["This payload is quite similar to ",(0,o.jsx)(r.code,{children:"OverwriteWithLatestAvroPayload"})," with slight difference while merging records. For\nprecombining, just like ",(0,o.jsx)(r.code,{children:"OverwriteWithLatestAvroPayload"}),", it picks the latest record for a key, based on an ordering\nfield. While merging, it overwrites the existing record on storage only for the specified ",(0,o.jsx)(r.strong,{children:"fields that don't equal\ndefault value"})," for that field."]}),"\n",(0,o.jsx)(r.h4,{id:"partialupdateavropayload",children:"PartialUpdateAvroPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.PartialUpdateAvroPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["This payload supports partial update. Typically, once the merge step resolves which record to pick, then the record on\nstorage is fully replaced by the resolved record. But, in some cases, the requirement is to update only certain fields\nand not replace the whole record. This is called partial update. ",(0,o.jsx)(r.code,{children:"PartialUpdateAvroPayload"})," provides out-of-box support\nfor such use cases. To illustrate the point, let us look at a simple example:"]}),"\n",(0,o.jsxs)(r.p,{children:["Let's say the ordering field is ",(0,o.jsx)(r.code,{children:"ts"})," and record key is ",(0,o.jsx)(r.code,{children:"id"})," and schema is:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:'{\n [\n {"name":"id","type":"string"},\n {"name":"ts","type":"long"},\n {"name":"name","type":"string"},\n {"name":"price","type":"string"}\n ]\n}\n'})}),"\n",(0,o.jsx)(r.p,{children:"Current record in storage:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 2 name_1 null\n"})}),"\n",(0,o.jsx)(r.p,{children:"Incoming record:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 1 null price_1\n"})}),"\n",(0,o.jsxs)(r.p,{children:["Result data after merging using ",(0,o.jsx)(r.code,{children:"PartialUpdateAvroPayload"}),":"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 2 name_1 price_1\n"})}),"\n",(0,o.jsx)(r.h4,{id:"configs",children:"Configs"}),"\n",(0,o.jsxs)(r.p,{children:["Payload class can be specified using the below configs. For more advanced configs refer ",(0,o.jsx)(r.a,{href:"https://hudi.apache.org/docs/configurations#RECORD_PAYLOAD",children:"here"})]}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.strong,{children:"Spark based configs:"})}),"\n",(0,o.jsxs)(r.table,{children:[(0,o.jsx)(r.thead,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.th,{children:"Config Name"}),(0,o.jsx)(r.th,{children:"Default"}),(0,o.jsx)(r.th,{children:"Description"})]})}),(0,o.jsx)(r.tbody,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"hoodie.datasource.write.payload.class"}),(0,o.jsx)(r.td,{children:"org.apache.hudi.common.model.OverwriteWithLatestAvroPayload (Optional)"}),(0,o.jsxs)(r.td,{children:["Payload class used. Override this, if you like to roll your own merge logic, when upserting/inserting. This will render any value set for PRECOMBINE_FIELD_OPT_VAL in-effective",(0,o.jsx)("br",{}),(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Config Param: WRITE_PAYLOAD_CLASS_NAME"})]})]})})]}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.strong,{children:"Flink based configs:"})}),"\n",(0,o.jsxs)(r.table,{children:[(0,o.jsx)(r.thead,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.th,{children:"Config Name"}),(0,o.jsx)(r.th,{children:"Default"}),(0,o.jsx)(r.th,{children:"Description"})]})}),(0,o.jsx)(r.tbody,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"payload.class"}),(0,o.jsx)(r.td,{children:"org.apache.hudi.common.model.EventTimeAvroPayload (Optional)"}),(0,o.jsxs)(r.td,{children:["Payload class used. Override this, if you like to roll your own merge logic, when upserting/inserting. This will render any value set for the option in-effective",(0,o.jsx)("br",{}),(0,o.jsx)("br",{})," ",(0,o.jsx)(r.code,{children:"Config Param: PAYLOAD_CLASS_NAME"})]})]})})]}),"\n",(0,o.jsxs)(r.p,{children:["There are also quite a few other implementations. Developers may be interested in looking at the hierarchy of ",(0,o.jsx)(r.code,{children:"HoodieRecordPayload"})," interface. For\nexample, ",(0,o.jsx)(r.a,{href:"https://github.com/apache/hudi/blob/e76dd102bcaf8aec5a932e7277ccdbfd73ce1a32/hudi-common/src/main/java/org/apache/hudi/common/model/debezium/MySqlDebeziumAvroPayload.java",children:(0,o.jsx)(r.code,{children:"MySqlDebeziumAvroPayload"})})," and ",(0,o.jsx)(r.a,{href:"https://github.com/apache/hudi/blob/e76dd102bcaf8aec5a932e7277ccdbfd73ce1a32/hudi-common/src/main/java/org/apache/hudi/common/model/debezium/PostgresDebeziumAvroPayload.java",children:(0,o.jsx)(r.code,{children:"PostgresDebeziumAvroPayload"})})," provides support for seamlessly applying changes\ncaptured via Debezium for MySQL and PostgresDB. ",(0,o.jsx)(r.a,{href:"https://github.com/apache/hudi/blob/e76dd102bcaf8aec5a932e7277ccdbfd73ce1a32/hudi-common/src/main/java/org/apache/hudi/common/model/AWSDmsAvroPayload.java",children:(0,o.jsx)(r.code,{children:"AWSDmsAvroPayload"})})," provides support for applying changes captured via Amazon Database Migration Service onto S3.\nFor full configurations, go ",(0,o.jsx)(r.a,{href:"/docs/configurations#RECORD_PAYLOAD",children:"here"})," and please check out ",(0,o.jsx)(r.a,{href:"faq_writing_tables/#can-i-implement-my-own-logic-for-how-input-records-are-merged-with-record-on-storage",children:"this FAQ"})," if you want to implement your own custom payloads."]})]})}function h(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},38526:(e,r,i)=>{i.d(r,{A:()=>n});const n=i.p+"assets/images/commit-time-ordering-merge-mode-e9b6af3dcdb508053202617218f3ffe6.png"},57159:(e,r,i)=>{i.d(r,{A:()=>n});const n=i.p+"assets/images/event-time-ordering-merge-mode-c8164e035840388bf4290fa81ac6262a.png"},28453:(e,r,i)=>{i.d(r,{R:()=>a,x:()=>s});var n=i(96540);const o={},t=n.createContext(o);function a(e){const r=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function s(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(t.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/5733876a.1a5c8931.js b/content/assets/js/5733876a.1a5c8931.js new file mode 100644 index 0000000000000..49da946c17646 --- /dev/null +++ b/content/assets/js/5733876a.1a5c8931.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[85973],{91855:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"writing_tables_streaming_writes","title":"Streaming Writes","description":"Spark Streaming","source":"@site/docs/writing_tables_streaming_writes.md","sourceDirName":".","slug":"/writing_tables_streaming_writes","permalink":"/docs/next/writing_tables_streaming_writes","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/writing_tables_streaming_writes.md","tags":[],"version":"current","frontMatter":{"title":"Streaming Writes","keywords":["hudi","spark","flink","streaming","processing"],"last_modified_at":"2024-03-13T19:59:57.000Z"},"sidebar":"docs","previous":{"title":"Batch Writes","permalink":"/docs/next/writing_data"},"next":{"title":"SQL Queries","permalink":"/docs/next/sql_queries"}}');var a=n(74848),i=n(28453),s=n(11470),o=n(19365);const l={title:"Streaming Writes",keywords:["hudi","spark","flink","streaming","processing"],last_modified_at:new Date("2024-03-13T19:59:57.000Z")},u=void 0,c={},d=[{value:"Spark Streaming",id:"spark-streaming",level:2},{value:"Related Resources",id:"related-resources",level:2}];function p(e){const t={a:"a",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h2,{id:"spark-streaming",children:"Spark Streaming"}),"\n",(0,a.jsx)(t.p,{children:"You can write Hudi tables using spark's structured streaming."}),"\n",(0,a.jsxs)(s.A,{groupId:"programming-language",defaultValue:"python",values:[{label:"Scala",value:"scala"},{label:"Python",value:"python"}],children:[(0,a.jsx)(o.A,{value:"scala",children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-scala",children:'// spark-shell\n// prepare to stream write to new table\nimport org.apache.spark.sql.streaming.Trigger\n\nval streamingTableName = "hudi_trips_cow_streaming"\nval baseStreamingPath = "file:///tmp/hudi_trips_cow_streaming"\nval checkpointLocation = "file:///tmp/checkpoints/hudi_trips_cow_streaming"\n\n// create streaming df\nval df = spark.readStream.\n format("hudi").\n load(basePath)\n\n// write stream to new hudi table\ndf.writeStream.format("hudi").\n options(getQuickstartWriteConfigs).\n option("hoodie.datasource.write.precombine.field", "ts").\n option("hoodie.datasource.write.recordkey.field", "uuid").\n option("hoodie.datasource.write.partitionpath.field", "partitionpath").\n option("hoodie.table.name", streamingTableName).\n outputMode("append").\n option("path", baseStreamingPath).\n option("checkpointLocation", checkpointLocation).\n trigger(Trigger.Once()).\n start()\n\n'})})}),(0,a.jsx)(o.A,{value:"python",children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-python",children:"# pyspark\n# prepare to stream write to new table\nstreamingTableName = \"hudi_trips_cow_streaming\"\nbaseStreamingPath = \"file:///tmp/hudi_trips_cow_streaming\"\ncheckpointLocation = \"file:///tmp/checkpoints/hudi_trips_cow_streaming\"\n\nhudi_streaming_options = {\n 'hoodie.table.name': streamingTableName,\n 'hoodie.datasource.write.recordkey.field': 'uuid',\n 'hoodie.datasource.write.partitionpath.field': 'partitionpath',\n 'hoodie.datasource.write.table.name': streamingTableName,\n 'hoodie.datasource.write.operation': 'upsert',\n 'hoodie.datasource.write.precombine.field': 'ts',\n 'hoodie.upsert.shuffle.parallelism': 2,\n 'hoodie.insert.shuffle.parallelism': 2\n}\n\n# create streaming df\ndf = spark.readStream \n .format(\"hudi\") \n .load(basePath)\n\n# write stream to new hudi table\ndf.writeStream.format(\"hudi\") \n .options(**hudi_streaming_options) \n .outputMode(\"append\") \n .option(\"path\", baseStreamingPath) \n .option(\"checkpointLocation\", checkpointLocation) \n .trigger(once=True) \n .start()\n\n"})})})]}),"\n",(0,a.jsx)(t.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,a.jsx)("h3",{children:"Blogs"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://www.onehouse.ai/blog/intro-to-hudi-and-flink",children:"An Introduction to the Hudi and Flink Integration"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://medium.com/@simpsons/bulk-insert-sort-modes-with-apache-hudi-c781e77841bc",children:"Bulk Insert Sort Modes with Apache Hudi"})}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(p,{...e})}):p(e)}},19365:(e,t,n)=>{n.d(t,{A:()=>s});n(96540);var r=n(34164);const a={tabItem:"tabItem_Ymn6"};var i=n(74848);function s(e){let{children:t,hidden:n,className:s}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,s),hidden:n,children:t})}},11470:(e,t,n)=>{n.d(t,{A:()=>x});var r=n(96540),a=n(34164),i=n(23104),s=n(56347),o=n(205),l=n(57485),u=n(31682),c=n(70679);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}(n);return function(e){const t=(0,u.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function h(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const a=(0,s.W6)(),i=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,l.aZ)(i),(0,r.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(a.location.search);t.set(i,e),a.replace({...a.location,search:t.toString()})}),[i,a])]}function f(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,i=p(e),[s,l]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:i}))),[u,d]=m({queryString:n,groupId:a}),[f,g]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,i]=(0,c.Dv)(n);return[a,(0,r.useCallback)((e=>{n&&i.set(e)}),[n,i])]}({groupId:a}),b=(()=>{const e=u??f;return h({value:e,tabValues:i})?e:null})();(0,o.A)((()=>{b&&l(b)}),[b]);return{selectedValue:s,selectValue:(0,r.useCallback)((e=>{if(!h({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),g(e)}),[d,g,i]),tabValues:i}}var g=n(92303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var w=n(74848);function v(e){let{className:t,block:n,selectedValue:r,selectValue:s,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:u}=(0,i.a_)(),c=e=>{const t=e.currentTarget,n=l.indexOf(t),a=o[n].value;a!==r&&(u(t),s(a))},d=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const n=l.indexOf(e.currentTarget)+1;t=l[n]??l[0];break}case"ArrowLeft":{const n=l.indexOf(e.currentTarget)-1;t=l[n]??l[l.length-1];break}}t?.focus()};return(0,w.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":n},t),children:o.map((e=>{let{value:t,label:n,attributes:i}=e;return(0,w.jsx)("li",{role:"tab",tabIndex:r===t?0:-1,"aria-selected":r===t,ref:e=>l.push(e),onKeyDown:d,onClick:c,...i,className:(0,a.A)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":r===t}),children:n??t},t)}))})}function _(e){let{lazy:t,children:n,selectedValue:i}=e;const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=s.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,w.jsx)("div",{className:"margin-top--md",children:s.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==i})))})}function k(e){const t=f(e);return(0,w.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,w.jsx)(v,{...t,...e}),(0,w.jsx)(_,{...t,...e})]})}function x(e){const t=(0,g.A)();return(0,w.jsx)(k,{...e,children:d(e.children)},String(t))}},28453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>o});var r=n(96540);const a={},i=r.createContext(a);function s(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/5733876a.b1b5df36.js b/content/assets/js/5733876a.b1b5df36.js deleted file mode 100644 index ded2a92ad9685..0000000000000 --- a/content/assets/js/5733876a.b1b5df36.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[85973],{91855:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>m,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"writing_tables_streaming_writes","title":"Streaming Writes","description":"Spark Streaming","source":"@site/docs/writing_tables_streaming_writes.md","sourceDirName":".","slug":"/writing_tables_streaming_writes","permalink":"/docs/next/writing_tables_streaming_writes","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/writing_tables_streaming_writes.md","tags":[],"version":"current","frontMatter":{"title":"Streaming Writes","keywords":["hudi","spark","flink","streaming","processing"],"last_modified_at":"2024-03-13T19:59:57.000Z"},"sidebar":"docs","previous":{"title":"Batch Writes","permalink":"/docs/next/writing_data"},"next":{"title":"SQL Queries","permalink":"/docs/next/sql_queries"}}');var n=a(74848),i=a(28453),s=a(11470),o=a(19365);const l={title:"Streaming Writes",keywords:["hudi","spark","flink","streaming","processing"],last_modified_at:new Date("2024-03-13T19:59:57.000Z")},u=void 0,c={},d=[{value:"Spark Streaming",id:"spark-streaming",level:2}];function p(e){const t={code:"code",h2:"h2",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h2,{id:"spark-streaming",children:"Spark Streaming"}),"\n",(0,n.jsx)(t.p,{children:"You can write Hudi tables using spark's structured streaming."}),"\n",(0,n.jsxs)(s.A,{groupId:"programming-language",defaultValue:"python",values:[{label:"Scala",value:"scala"},{label:"Python",value:"python"}],children:[(0,n.jsx)(o.A,{value:"scala",children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-scala",children:'// spark-shell\n// prepare to stream write to new table\nimport org.apache.spark.sql.streaming.Trigger\n\nval streamingTableName = "hudi_trips_cow_streaming"\nval baseStreamingPath = "file:///tmp/hudi_trips_cow_streaming"\nval checkpointLocation = "file:///tmp/checkpoints/hudi_trips_cow_streaming"\n\n// create streaming df\nval df = spark.readStream.\n format("hudi").\n load(basePath)\n\n// write stream to new hudi table\ndf.writeStream.format("hudi").\n options(getQuickstartWriteConfigs).\n option("hoodie.datasource.write.precombine.field", "ts").\n option("hoodie.datasource.write.recordkey.field", "uuid").\n option("hoodie.datasource.write.partitionpath.field", "partitionpath").\n option("hoodie.table.name", streamingTableName).\n outputMode("append").\n option("path", baseStreamingPath).\n option("checkpointLocation", checkpointLocation).\n trigger(Trigger.Once()).\n start()\n\n'})})}),(0,n.jsx)(o.A,{value:"python",children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:"# pyspark\n# prepare to stream write to new table\nstreamingTableName = \"hudi_trips_cow_streaming\"\nbaseStreamingPath = \"file:///tmp/hudi_trips_cow_streaming\"\ncheckpointLocation = \"file:///tmp/checkpoints/hudi_trips_cow_streaming\"\n\nhudi_streaming_options = {\n 'hoodie.table.name': streamingTableName,\n 'hoodie.datasource.write.recordkey.field': 'uuid',\n 'hoodie.datasource.write.partitionpath.field': 'partitionpath',\n 'hoodie.datasource.write.table.name': streamingTableName,\n 'hoodie.datasource.write.operation': 'upsert',\n 'hoodie.datasource.write.precombine.field': 'ts',\n 'hoodie.upsert.shuffle.parallelism': 2,\n 'hoodie.insert.shuffle.parallelism': 2\n}\n\n# create streaming df\ndf = spark.readStream \n .format(\"hudi\") \n .load(basePath)\n\n# write stream to new hudi table\ndf.writeStream.format(\"hudi\") \n .options(**hudi_streaming_options) \n .outputMode(\"append\") \n .option(\"path\", baseStreamingPath) \n .option(\"checkpointLocation\", checkpointLocation) \n .trigger(once=True) \n .start()\n\n"})})})]})]})}function m(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(p,{...e})}):p(e)}},19365:(e,t,a)=>{a.d(t,{A:()=>s});a(96540);var r=a(34164);const n={tabItem:"tabItem_Ymn6"};var i=a(74848);function s(e){let{children:t,hidden:a,className:s}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,r.A)(n.tabItem,s),hidden:a,children:t})}},11470:(e,t,a)=>{a.d(t,{A:()=>y});var r=a(96540),n=a(34164),i=a(23104),s=a(56347),o=a(205),l=a(57485),u=a(31682),c=a(70679);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function p(e){const{values:t,children:a}=e;return(0,r.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:a,attributes:r,default:n}}=e;return{value:t,label:a,attributes:r,default:n}}))}(a);return function(e){const t=(0,u.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function h(e){let{queryString:t=!1,groupId:a}=e;const n=(0,s.W6)(),i=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,l.aZ)(i),(0,r.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(n.location.search);t.set(i,e),n.replace({...n.location,search:t.toString()})}),[i,n])]}function f(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,i=p(e),[s,l]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=a.find((e=>e.default))??a[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:i}))),[u,d]=h({queryString:a,groupId:n}),[f,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,i]=(0,c.Dv)(a);return[n,(0,r.useCallback)((e=>{a&&i.set(e)}),[a,i])]}({groupId:n}),b=(()=>{const e=u??f;return m({value:e,tabValues:i})?e:null})();(0,o.A)((()=>{b&&l(b)}),[b]);return{selectedValue:s,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),g(e)}),[d,g,i]),tabValues:i}}var g=a(92303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var w=a(74848);function v(e){let{className:t,block:a,selectedValue:r,selectValue:s,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:u}=(0,i.a_)(),c=e=>{const t=e.currentTarget,a=l.indexOf(t),n=o[a].value;n!==r&&(u(t),s(n))},d=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=l.indexOf(e.currentTarget)+1;t=l[a]??l[0];break}case"ArrowLeft":{const a=l.indexOf(e.currentTarget)-1;t=l[a]??l[l.length-1];break}}t?.focus()};return(0,w.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,n.A)("tabs",{"tabs--block":a},t),children:o.map((e=>{let{value:t,label:a,attributes:i}=e;return(0,w.jsx)("li",{role:"tab",tabIndex:r===t?0:-1,"aria-selected":r===t,ref:e=>l.push(e),onKeyDown:d,onClick:c,...i,className:(0,n.A)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":r===t}),children:a??t},t)}))})}function _(e){let{lazy:t,children:a,selectedValue:i}=e;const s=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=s.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:(0,n.A)("margin-top--md",e.props.className)}):null}return(0,w.jsx)("div",{className:"margin-top--md",children:s.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==i})))})}function k(e){const t=f(e);return(0,w.jsxs)("div",{className:(0,n.A)("tabs-container",b.tabList),children:[(0,w.jsx)(v,{...t,...e}),(0,w.jsx)(_,{...t,...e})]})}function y(e){const t=(0,g.A)();return(0,w.jsx)(k,{...e,children:d(e.children)},String(t))}},28453:(e,t,a)=>{a.d(t,{R:()=>s,x:()=>o});var r=a(96540);const n={},i=r.createContext(n);function s(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/5e1c183f.30c1c2e5.js b/content/assets/js/5e1c183f.30c1c2e5.js new file mode 100644 index 0000000000000..52984c435f5fb --- /dev/null +++ b/content/assets/js/5e1c183f.30c1c2e5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[70253],{34886:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"markers","title":"Marker Mechanism","description":"Purpose of Markers","source":"@site/docs/markers.md","sourceDirName":".","slug":"/markers","permalink":"/docs/next/markers","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/markers.md","tags":[],"version":"current","frontMatter":{"title":"Marker Mechanism","toc":true},"sidebar":"docs","previous":{"title":"Auto Rollbacks","permalink":"/docs/next/rollbacks"},"next":{"title":"File Sizing","permalink":"/docs/next/file_sizing"}}');var a=t(74848),n=t(28453);const s={title:"Marker Mechanism",toc:!0},o=void 0,l={},c=[{value:"Purpose of Markers",id:"purpose-of-markers",level:2},{value:"Marker structure",id:"marker-structure",level:2},{value:"Marker Writing Options",id:"marker-writing-options",level:2},{value:"Direct Write Markers",id:"direct-write-markers",level:3},{value:"Timeline Server Markers (Default)",id:"timeline-server-markers-default",level:3},{value:"Marker Configuration Parameters",id:"marker-configuration-parameters",level:2},{value:"Related Resources",id:"related-resources",level:2}];function d(e){const r={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(r.h2,{id:"purpose-of-markers",children:"Purpose of Markers"}),"\n",(0,a.jsx)(r.p,{children:"A write operation can fail before it completes, leaving partial or corrupt data files on storage. Markers are used to track\nand cleanup any partial or failed write operations. As a write operation begins, a marker is created indicating\nthat a file write is in progress. When the write commit succeeds, the marker is deleted. If a write operation fails part\nway through, a marker is left behind which indicates that the file is incomplete. Two important operations that use markers include:"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"Removing duplicate/partial data files"}),":","\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsx)(r.li,{children:"In Spark, the Hudi write client delegates the data file writing to multiple executors. One executor can fail the task,\nleaving partial data files written, and Spark retries the task in this case until it succeeds."}),"\n",(0,a.jsx)(r.li,{children:"When speculative execution is enabled, there can also be multiple successful attempts at writing out the same data\ninto different files, only one of which is finally handed to the Spark driver process for committing.\nThe markers help efficiently identify the partial data files written, which contain duplicate data compared to the data\nfiles written by the successful trial later, and these duplicate data files are cleaned up when the commit is finalized."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"Rolling back failed commits"}),": If a write operation fails, the next write client will roll back the failed commit before proceeding with the new write. The rollback is done with the help of markers to identify the data files written as part of the failed commit."]}),"\n"]}),"\n",(0,a.jsx)(r.p,{children:"If we did not have markers to track the per-commit data files, we would have to list all files in the file system,\ncorrelate that with the files seen in timeline and then delete the ones that belong to partial write failures.\nAs you could imagine, this would be very costly in a very large installation of a datalake."}),"\n",(0,a.jsx)(r.h2,{id:"marker-structure",children:"Marker structure"}),"\n",(0,a.jsxs)(r.p,{children:["Each marker entry is composed of three parts, the data file name,\nthe marker extension (",(0,a.jsx)(r.code,{children:".marker"}),"), and the I/O operation created the file (",(0,a.jsx)(r.code,{children:"CREATE"})," - inserts, ",(0,a.jsx)(r.code,{children:"MERGE"})," - updates/deletes,\nor ",(0,a.jsx)(r.code,{children:"APPEND"})," - either). For example, the marker ",(0,a.jsx)(r.code,{children:"91245ce3-bb82-4f9f-969e-343364159174-0_140-579-0_20210820173605.parquet.marker.CREATE"})," indicates\nthat the corresponding data file is ",(0,a.jsx)(r.code,{children:"91245ce3-bb82-4f9f-969e-343364159174-0_140-579-0_20210820173605.parquet"})," and the I/O type is ",(0,a.jsx)(r.code,{children:"CREATE"}),"."]}),"\n",(0,a.jsx)(r.h2,{id:"marker-writing-options",children:"Marker Writing Options"}),"\n",(0,a.jsx)(r.p,{children:"There are two ways to write Markers:"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsx)(r.li,{children:"Directly writing markers to storage, which is a legacy configuration."}),"\n",(0,a.jsx)(r.li,{children:"Writing markers to the Timeline Server which batches marker requests before writing them to storage (Default). This option improves write performance of large files as described below."}),"\n"]}),"\n",(0,a.jsx)(r.h3,{id:"direct-write-markers",children:"Direct Write Markers"}),"\n",(0,a.jsxs)(r.p,{children:["Directly writing to storage creates a new marker file corresponding to each data file, with the marker filename as described above.\nThe marker file does not have any content, i.e., empty. Each marker file is written to storage in the same directory\nhierarchy, i.e., commit instant and partition path, under a temporary folder ",(0,a.jsx)(r.code,{children:".hoodie/.temp"})," under the base path of the Hudi table.\nFor example, the figure below shows one example of the marker files created and the corresponding data files when writing\ndata to the Hudi table. When getting or deleting all the marker file paths, the mechanism first lists all the paths\nunder the temporary folder, ",(0,a.jsx)(r.code,{children:".hoodie/.temp/"}),", and then does the operation."]}),"\n",(0,a.jsx)(r.p,{children:(0,a.jsx)(r.img,{alt:"An example of marker and data files in direct marker file mechanism",src:t(36995).A+"",width:"3440",height:"1444"})}),"\n",(0,a.jsxs)(r.p,{children:["While it's much efficient over scanning the entire table for uncommitted data files, as the number of data files to write\nincreases, so does the number of marker files to create. For large writes which need to write significant number of data\nfiles, e.g., 10K or more, this can create performance bottlenecks for cloud storage such as AWS S3. In AWS S3, each\nfile create and delete call triggers an HTTP request and there is ",(0,a.jsx)(r.a,{href:"https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html",children:"rate-limiting"}),"\non how many requests can be processed per second per prefix in a bucket. When the number of data files to write concurrently\nand the number of marker files is huge, the marker file operations could take up non-trivial time during the write operation,\nsometimes on the order of a few minutes or more."]}),"\n",(0,a.jsx)(r.h3,{id:"timeline-server-markers-default",children:"Timeline Server Markers (Default)"}),"\n",(0,a.jsx)(r.p,{children:"To address the performance bottleneck due to rate-limiting of AWS S3 explained above, we introduce a new marker mechanism\nleveraging the timeline server, which optimizes the marker-related latency for storage with non-trivial file I/O latency.\nIn the diagram below you can see the timeline-server-based marker mechanism delegates the marker creation and other marker-related\noperations from individual executors to the timeline server for centralized processing. The timeline server batches the\nmarker creation requests and writes the markers to a bounded set of files in the file system at configurable batch intervals (default 50ms).\nIn this way, the number of actual file operations and latency related to markers can be significantly reduced even with\na huge number of data files, leading to improved performance of large writes."}),"\n",(0,a.jsx)(r.p,{children:(0,a.jsx)(r.img,{alt:"Timeline-server-based marker mechanism",src:t(56542).A+"",width:"1200",height:"432"})}),"\n",(0,a.jsx)(r.p,{children:"Each marker creation request is handled asynchronously in the Javalin timeline server and queued before processing.\nFor every batch interval, the timeline server pulls the pending marker creation requests from the queue and\nwrites all markers to the next file in a round robin fashion. Inside the timeline server, such batch processing is\nmulti-threaded, designed and implemented to guarantee consistency and correctness. Both the batch interval and the batch\nconcurrency can be configured through the write options."}),"\n",(0,a.jsx)(r.p,{children:(0,a.jsx)(r.img,{alt:"Batched processing of marker creation requests",src:t(78660).A+"",width:"3184",height:"1168"})}),"\n",(0,a.jsx)(r.p,{children:"Note that the worker thread always checks whether the marker has already been created by comparing the marker name from\nthe request with the memory copy of all markers maintained at the timeline server. The underlying files storing the\nmarkers are only read upon the first marker request (lazy loading). The responses of requests are only sent back once the\nnew markers are flushed to the files, so that in the case of the timeline server failure, the timeline server can recover\nthe already created markers. These ensure consistency between storage and the in-memory copy, and improve the performance\nof processing marker requests."}),"\n",(0,a.jsxs)(r.p,{children:[(0,a.jsx)(r.strong,{children:"NOTE:"})," Timeline based markers are not yet supported for HDFS, however, users may barely notice performance challenges\nwith direct markers because the file system metadata is efficiently cached in memory and doesn't face the same rate-limiting as S3."]}),"\n",(0,a.jsx)(r.h2,{id:"marker-configuration-parameters",children:"Marker Configuration Parameters"}),"\n",(0,a.jsxs)(r.table,{children:[(0,a.jsx)(r.thead,{children:(0,a.jsxs)(r.tr,{children:[(0,a.jsx)(r.th,{children:"Property Name"}),(0,a.jsx)(r.th,{children:"Default"}),(0,a.jsx)(r.th,{style:{textAlign:"center"},children:"Meaning"})]})}),(0,a.jsxs)(r.tbody,{children:[(0,a.jsxs)(r.tr,{children:[(0,a.jsx)(r.td,{children:(0,a.jsx)(r.code,{children:"hoodie.write.markers.type"})}),(0,a.jsx)(r.td,{children:"timeline_server_based"}),(0,a.jsxs)(r.td,{style:{textAlign:"center"},children:["Marker type to use. Two modes are supported: (1) ",(0,a.jsx)(r.code,{children:"direct"}),": individual marker file corresponding to each data file is directly created by the executor; (2) ",(0,a.jsx)(r.code,{children:"timeline_server_based"}),": marker operations are all handled at the timeline service which serves as a proxy. New marker entries are batch processed and stored in a limited number of underlying files for efficiency."]})]}),(0,a.jsxs)(r.tr,{children:[(0,a.jsx)(r.td,{children:(0,a.jsx)(r.code,{children:"hoodie.markers.timeline_server_based.batch.num_threads"})}),(0,a.jsx)(r.td,{children:"20"}),(0,a.jsx)(r.td,{style:{textAlign:"center"},children:"Number of threads to use for batch processing marker creation requests at the timeline server."})]}),(0,a.jsxs)(r.tr,{children:[(0,a.jsx)(r.td,{children:(0,a.jsx)(r.code,{children:"hoodie.markers.timeline_server_based.batch.interval_ms"})}),(0,a.jsx)(r.td,{children:"50"}),(0,a.jsx)(r.td,{style:{textAlign:"center"},children:"The batch interval in milliseconds for marker creation batch processing."})]})]})]}),"\n",(0,a.jsx)(r.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,a.jsxs)(r.p,{children:[(0,a.jsx)("h3",{children:"Blogs"}),"\n",(0,a.jsx)(r.a,{href:"https://medium.com/@simpsons/timeline-server-in-apache-hudi-b5be25f85e47",children:"Timeline Server in Apache Hudi"})]})]})}function h(e={}){const{wrapper:r}={...(0,n.R)(),...e.components};return r?(0,a.jsx)(r,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},78660:(e,r,t)=>{t.d(r,{A:()=>i});const i=t.p+"assets/images/batched-marker-creation-e8455c544f3b11ceed810b663df59f7f.png"},36995:(e,r,t)=>{t.d(r,{A:()=>i});const i=t.p+"assets/images/direct-marker-file-mechanism-b97b82f80430598f1d6a9b96521bb1a0.png"},56542:(e,r,t)=>{t.d(r,{A:()=>i});const i=t.p+"assets/images/timeline-server-based-marker-mechanism-11d616800a7a241382c8a4ed647515a6.png"},28453:(e,r,t)=>{t.d(r,{R:()=>s,x:()=>o});var i=t(96540);const a={},n=i.createContext(a);function s(e){const r=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),i.createElement(n.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/5e1c183f.f5ded396.js b/content/assets/js/5e1c183f.f5ded396.js deleted file mode 100644 index d80b164e236b3..0000000000000 --- a/content/assets/js/5e1c183f.f5ded396.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[70253],{34886:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"markers","title":"Marker Mechanism","description":"Purpose of Markers","source":"@site/docs/markers.md","sourceDirName":".","slug":"/markers","permalink":"/docs/next/markers","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/markers.md","tags":[],"version":"current","frontMatter":{"title":"Marker Mechanism","toc":true},"sidebar":"docs","previous":{"title":"Auto Rollbacks","permalink":"/docs/next/rollbacks"},"next":{"title":"File Sizing","permalink":"/docs/next/file_sizing"}}');var a=t(74848),n=t(28453);const s={title:"Marker Mechanism",toc:!0},o=void 0,l={},c=[{value:"Purpose of Markers",id:"purpose-of-markers",level:2},{value:"Marker structure",id:"marker-structure",level:2},{value:"Marker Writing Options",id:"marker-writing-options",level:2},{value:"Direct Write Markers",id:"direct-write-markers",level:3},{value:"Timeline Server Markers (Default)",id:"timeline-server-markers-default",level:3},{value:"Marker Configuration Parameters",id:"marker-configuration-parameters",level:2}];function d(e){const r={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(r.h2,{id:"purpose-of-markers",children:"Purpose of Markers"}),"\n",(0,a.jsx)(r.p,{children:"A write operation can fail before it completes, leaving partial or corrupt data files on storage. Markers are used to track\nand cleanup any partial or failed write operations. As a write operation begins, a marker is created indicating\nthat a file write is in progress. When the write commit succeeds, the marker is deleted. If a write operation fails part\nway through, a marker is left behind which indicates that the file is incomplete. Two important operations that use markers include:"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"Removing duplicate/partial data files"}),":","\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsx)(r.li,{children:"In Spark, the Hudi write client delegates the data file writing to multiple executors. One executor can fail the task,\nleaving partial data files written, and Spark retries the task in this case until it succeeds."}),"\n",(0,a.jsx)(r.li,{children:"When speculative execution is enabled, there can also be multiple successful attempts at writing out the same data\ninto different files, only one of which is finally handed to the Spark driver process for committing.\nThe markers help efficiently identify the partial data files written, which contain duplicate data compared to the data\nfiles written by the successful trial later, and these duplicate data files are cleaned up when the commit is finalized."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"Rolling back failed commits"}),": If a write operation fails, the next write client will roll back the failed commit before proceeding with the new write. The rollback is done with the help of markers to identify the data files written as part of the failed commit."]}),"\n"]}),"\n",(0,a.jsx)(r.p,{children:"If we did not have markers to track the per-commit data files, we would have to list all files in the file system,\ncorrelate that with the files seen in timeline and then delete the ones that belong to partial write failures.\nAs you could imagine, this would be very costly in a very large installation of a datalake."}),"\n",(0,a.jsx)(r.h2,{id:"marker-structure",children:"Marker structure"}),"\n",(0,a.jsxs)(r.p,{children:["Each marker entry is composed of three parts, the data file name,\nthe marker extension (",(0,a.jsx)(r.code,{children:".marker"}),"), and the I/O operation created the file (",(0,a.jsx)(r.code,{children:"CREATE"})," - inserts, ",(0,a.jsx)(r.code,{children:"MERGE"})," - updates/deletes,\nor ",(0,a.jsx)(r.code,{children:"APPEND"})," - either). For example, the marker ",(0,a.jsx)(r.code,{children:"91245ce3-bb82-4f9f-969e-343364159174-0_140-579-0_20210820173605.parquet.marker.CREATE"})," indicates\nthat the corresponding data file is ",(0,a.jsx)(r.code,{children:"91245ce3-bb82-4f9f-969e-343364159174-0_140-579-0_20210820173605.parquet"})," and the I/O type is ",(0,a.jsx)(r.code,{children:"CREATE"}),"."]}),"\n",(0,a.jsx)(r.h2,{id:"marker-writing-options",children:"Marker Writing Options"}),"\n",(0,a.jsx)(r.p,{children:"There are two ways to write Markers:"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsx)(r.li,{children:"Directly writing markers to storage, which is a legacy configuration."}),"\n",(0,a.jsx)(r.li,{children:"Writing markers to the Timeline Server which batches marker requests before writing them to storage (Default). This option improves write performance of large files as described below."}),"\n"]}),"\n",(0,a.jsx)(r.h3,{id:"direct-write-markers",children:"Direct Write Markers"}),"\n",(0,a.jsxs)(r.p,{children:["Directly writing to storage creates a new marker file corresponding to each data file, with the marker filename as described above.\nThe marker file does not have any content, i.e., empty. Each marker file is written to storage in the same directory\nhierarchy, i.e., commit instant and partition path, under a temporary folder ",(0,a.jsx)(r.code,{children:".hoodie/.temp"})," under the base path of the Hudi table.\nFor example, the figure below shows one example of the marker files created and the corresponding data files when writing\ndata to the Hudi table. When getting or deleting all the marker file paths, the mechanism first lists all the paths\nunder the temporary folder, ",(0,a.jsx)(r.code,{children:".hoodie/.temp/"}),", and then does the operation."]}),"\n",(0,a.jsx)(r.p,{children:(0,a.jsx)(r.img,{alt:"An example of marker and data files in direct marker file mechanism",src:t(36995).A+"",width:"3440",height:"1444"})}),"\n",(0,a.jsxs)(r.p,{children:["While it's much efficient over scanning the entire table for uncommitted data files, as the number of data files to write\nincreases, so does the number of marker files to create. For large writes which need to write significant number of data\nfiles, e.g., 10K or more, this can create performance bottlenecks for cloud storage such as AWS S3. In AWS S3, each\nfile create and delete call triggers an HTTP request and there is ",(0,a.jsx)(r.a,{href:"https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html",children:"rate-limiting"}),"\non how many requests can be processed per second per prefix in a bucket. When the number of data files to write concurrently\nand the number of marker files is huge, the marker file operations could take up non-trivial time during the write operation,\nsometimes on the order of a few minutes or more."]}),"\n",(0,a.jsx)(r.h3,{id:"timeline-server-markers-default",children:"Timeline Server Markers (Default)"}),"\n",(0,a.jsx)(r.p,{children:"To address the performance bottleneck due to rate-limiting of AWS S3 explained above, we introduce a new marker mechanism\nleveraging the timeline server, which optimizes the marker-related latency for storage with non-trivial file I/O latency.\nIn the diagram below you can see the timeline-server-based marker mechanism delegates the marker creation and other marker-related\noperations from individual executors to the timeline server for centralized processing. The timeline server batches the\nmarker creation requests and writes the markers to a bounded set of files in the file system at configurable batch intervals (default 50ms).\nIn this way, the number of actual file operations and latency related to markers can be significantly reduced even with\na huge number of data files, leading to improved performance of large writes."}),"\n",(0,a.jsx)(r.p,{children:(0,a.jsx)(r.img,{alt:"Timeline-server-based marker mechanism",src:t(56542).A+"",width:"1200",height:"432"})}),"\n",(0,a.jsx)(r.p,{children:"Each marker creation request is handled asynchronously in the Javalin timeline server and queued before processing.\nFor every batch interval, the timeline server pulls the pending marker creation requests from the queue and\nwrites all markers to the next file in a round robin fashion. Inside the timeline server, such batch processing is\nmulti-threaded, designed and implemented to guarantee consistency and correctness. Both the batch interval and the batch\nconcurrency can be configured through the write options."}),"\n",(0,a.jsx)(r.p,{children:(0,a.jsx)(r.img,{alt:"Batched processing of marker creation requests",src:t(78660).A+"",width:"3184",height:"1168"})}),"\n",(0,a.jsx)(r.p,{children:"Note that the worker thread always checks whether the marker has already been created by comparing the marker name from\nthe request with the memory copy of all markers maintained at the timeline server. The underlying files storing the\nmarkers are only read upon the first marker request (lazy loading). The responses of requests are only sent back once the\nnew markers are flushed to the files, so that in the case of the timeline server failure, the timeline server can recover\nthe already created markers. These ensure consistency between storage and the in-memory copy, and improve the performance\nof processing marker requests."}),"\n",(0,a.jsxs)(r.p,{children:[(0,a.jsx)(r.strong,{children:"NOTE:"})," Timeline based markers are not yet supported for HDFS, however, users may barely notice performance challenges\nwith direct markers because the file system metadata is efficiently cached in memory and doesn't face the same rate-limiting as S3."]}),"\n",(0,a.jsx)(r.h2,{id:"marker-configuration-parameters",children:"Marker Configuration Parameters"}),"\n",(0,a.jsxs)(r.table,{children:[(0,a.jsx)(r.thead,{children:(0,a.jsxs)(r.tr,{children:[(0,a.jsx)(r.th,{children:"Property Name"}),(0,a.jsx)(r.th,{children:"Default"}),(0,a.jsx)(r.th,{style:{textAlign:"center"},children:"Meaning"})]})}),(0,a.jsxs)(r.tbody,{children:[(0,a.jsxs)(r.tr,{children:[(0,a.jsx)(r.td,{children:(0,a.jsx)(r.code,{children:"hoodie.write.markers.type"})}),(0,a.jsx)(r.td,{children:"timeline_server_based"}),(0,a.jsxs)(r.td,{style:{textAlign:"center"},children:["Marker type to use. Two modes are supported: (1) ",(0,a.jsx)(r.code,{children:"direct"}),": individual marker file corresponding to each data file is directly created by the executor; (2) ",(0,a.jsx)(r.code,{children:"timeline_server_based"}),": marker operations are all handled at the timeline service which serves as a proxy. New marker entries are batch processed and stored in a limited number of underlying files for efficiency."]})]}),(0,a.jsxs)(r.tr,{children:[(0,a.jsx)(r.td,{children:(0,a.jsx)(r.code,{children:"hoodie.markers.timeline_server_based.batch.num_threads"})}),(0,a.jsx)(r.td,{children:"20"}),(0,a.jsx)(r.td,{style:{textAlign:"center"},children:"Number of threads to use for batch processing marker creation requests at the timeline server."})]}),(0,a.jsxs)(r.tr,{children:[(0,a.jsx)(r.td,{children:(0,a.jsx)(r.code,{children:"hoodie.markers.timeline_server_based.batch.interval_ms"})}),(0,a.jsx)(r.td,{children:"50"}),(0,a.jsx)(r.td,{style:{textAlign:"center"},children:"The batch interval in milliseconds for marker creation batch processing."})]})]})]})]})}function h(e={}){const{wrapper:r}={...(0,n.R)(),...e.components};return r?(0,a.jsx)(r,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},78660:(e,r,t)=>{t.d(r,{A:()=>i});const i=t.p+"assets/images/batched-marker-creation-e8455c544f3b11ceed810b663df59f7f.png"},36995:(e,r,t)=>{t.d(r,{A:()=>i});const i=t.p+"assets/images/direct-marker-file-mechanism-b97b82f80430598f1d6a9b96521bb1a0.png"},56542:(e,r,t)=>{t.d(r,{A:()=>i});const i=t.p+"assets/images/timeline-server-based-marker-mechanism-11d616800a7a241382c8a4ed647515a6.png"},28453:(e,r,t)=>{t.d(r,{R:()=>s,x:()=>o});var i=t(96540);const a={},n=i.createContext(a);function s(e){const r=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),i.createElement(n.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/782eae4d.0b1c0a0d.js b/content/assets/js/782eae4d.bd5caa0e.js similarity index 95% rename from content/assets/js/782eae4d.0b1c0a0d.js rename to content/assets/js/782eae4d.bd5caa0e.js index 833e3b02b5548..10cb27d2e7262 100644 --- a/content/assets/js/782eae4d.0b1c0a0d.js +++ b/content/assets/js/782eae4d.bd5caa0e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[34543],{97568:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>o});const n=JSON.parse('{"id":"metadata","title":"Table Metadata","description":"Hudi tracks metadata about a table to remove bottlenecks in achieving great read/write performance, specifically on cloud storage.","source":"@site/docs/metadata.md","sourceDirName":".","slug":"/metadata","permalink":"/docs/next/metadata","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/metadata.md","tags":[],"version":"current","frontMatter":{"title":"Table Metadata","keywords":["hudi","metadata","S3","GCS","file listings","statistics"]},"sidebar":"docs","previous":{"title":"Record Mergers","permalink":"/docs/next/record_merger"},"next":{"title":"Indexes","permalink":"/docs/next/indexes"}}');var i=a(74848),s=a(28453);const r={title:"Table Metadata",keywords:["hudi","metadata","S3","GCS","file listings","statistics"]},l=void 0,d={},o=[{value:"Metadata Table",id:"metadata-table",level:2},{value:"Types of table metadata",id:"types-of-table-metadata",level:2},{value:"Metadata Tracking on Writers",id:"metadata-tracking-on-writers",level:2},{value:"Leveraging metadata during queries",id:"leveraging-metadata-during-queries",level:2},{value:"files index",id:"files-index",level:3},{value:"column_stats index and data skipping",id:"column_stats-index-and-data-skipping",level:3},{value:"Concurrency Control for Metadata Table",id:"concurrency-control-for-metadata-table",level:2},{value:"Related Resources",id:"related-resources",level:2}];function c(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"Hudi tracks metadata about a table to remove bottlenecks in achieving great read/write performance, specifically on cloud storage."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Avoid list operations to obtain set of files in a table"}),": A fundamental need for any engine that wants to read or write Hudi tables is\nto know all the files/objects that are part of the table, by performing listing of table partitions/folders. Unlike many distributed file systems,\nsuch operation scales poorly on cloud storage taking few seconds or even many minutes on large tables. This is particularly amplified when tables\nare large and partitioned multiple levels deep. Hudi tracks the file listings so they are readily available for readers/writers without listing the folders\ncontaining the data files."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Expose columns statistics for better query planning and faster queries"}),": Query engines rely on techniques such as partitioning and data skipping\nto cut down on the amount of irrelevant data scanned for query planning and execution. During query planning phase, file footer statistics like column value ranges,\nnull counts are read from all data files to determine if a particular file needs to be read to satisfy the query. This approach is expensive since reading\nfooters from all files can increase cloud storage API costs and even be subject to throttling issues for larger tables. Hudi enables relevant query predicates to\nbe efficiently evaluated on operate on column statistics without incurring these costs."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"metadata-table",children:"Metadata Table"}),"\n",(0,i.jsxs)(t.p,{children:["Hudi employs a special ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.em,{children:"metadata table"})}),", within each table to provide these capabilities. The metadata table implemented as a single\ninternal Hudi Merge-On-Read table that hosts different types of table metadata in each partition. This is similar to common practices in databases where metadata\nis tracked using internal tables. This approach provides the following advantages."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Scalable"}),": The table metadata must scale to large sizes as well (see ",(0,i.jsx)(t.a,{href:"https://vldb.org/pvldb/vol14/p3083-edara.pdf",children:"Big Metadata paper"})," from Google).\nDifferent types of indexes should be easily integrated to support various use cases with consistent management of metadata. By implementing metadata using the\nsame storage format and engine used for data, Hudi is able to scale to even TBs of metadata with built-in table services for managing metadata."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Flexible"}),": The foundational framework for multi-modal indexing is built to enable and disable new indexes as needed. The\n",(0,i.jsx)(t.a,{href:"https://www.onehouse.ai/blog/asynchronous-indexing-using-hudi",children:"async indexing"})," protocol index building alongside regular writers without impacting the write latency."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"transactional updates"}),": Tables data, metadata and indexes must be upto-date and consistent with each other as writes happen or table services are performed. and table metadata must be always up-to-date and in sync with the data table.\nThe data and metadata table's timelines share a parent-child relationship, to ensure they are always in sync with each other. Furthermore, the MoR table storage helps absorb fast changes to metadata from streaming writes without requiring\nrewriting of all table metadata on each write."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Fast lookups"}),": By employing a SSTable like base file format (HFile) in the metadata table, query engines are able to efficiently perform lookup scans for only specific parts of\nmetadata needed. For e.g. query accessing only 10 out of 100 columns in a table can read stats about only the 10 columns it's interested in, during down planning time and costs.\nFurther, these metadata can also be served via a centralized/embedded timeline server which caches the metadata, further reducing the latency of the lookup from executors."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.img,{alt:"Metadata Table Mechanics",src:a(73633).A+"",width:"1280",height:"720"}),"\n",(0,i.jsx)("p",{align:"center",children:"Figure: Mechanics for Metadata Table in Hudi"})]}),"\n",(0,i.jsx)(t.h2,{id:"types-of-table-metadata",children:"Types of table metadata"}),"\n",(0,i.jsx)(t.p,{children:"Following are the different types of metadata currently supported."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.a,{href:"https://cwiki.apache.org/confluence/display/HUDI/RFC+-+15%3A+HUDI+File+Listing+Improvements",children:"files listings"})})}),":\nStored as ",(0,i.jsx)(t.em,{children:"files"})," partition in the metadata table. Contains file information such as file name, size, and active state\nfor each partition in the data table, along with list of all partitions in the table. Improves the files listing performance\nby avoiding direct storage calls such as ",(0,i.jsx)(t.em,{children:"exists, listStatus"})," and ",(0,i.jsx)(t.em,{children:"listFiles"})," on the data table."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/rfc/rfc-27/rfc-27.md",children:"column statistics"})})}),": Stored as ",(0,i.jsx)(t.em,{children:"column_stats"}),"\npartition in the metadata table. Contains the statistics for a set of tracked columns, such as min and max values, total values,\nnull counts, size, etc., for all data files and are used while serving queries with predicates matching interested\ncolumns. This is heavily used by techniques like ",(0,i.jsx)(t.a,{href:"https://www.onehouse.ai/blog/hudis-column-stats-index-and-data-skipping-feature-help-speed-up-queries-by-an-orders-of-magnitude",children:"data skipping"})," to speed up queries by orders of magnitude, by skipping\nirrelevant files."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:"Partition Statistics"})}),": Partition stats index aggregates statistics at the partition level for the columns tracked by\nthe column statistics for which it is enabled. This helps in efficient partition pruning by skipping entire folders very quickly,\neven without examining column statistics at the file level. The partition stats index is stored in ",(0,i.jsx)(t.em,{children:"partition_stats"})," partition in the metadata table.\nPartition stats index can be enabled using the following configs (note it is required to specify the columns for which stats should be aggregated)."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["To try out these features, refer to the ",(0,i.jsx)(t.a,{href:"sql_ddl#create-partition-stats-index",children:"SQL guide"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"metadata-tracking-on-writers",children:"Metadata Tracking on Writers"}),"\n",(0,i.jsxs)(t.p,{children:["Following are based basic configs that are needed to enable metadata tracking. For advanced configs please refer\n",(0,i.jsx)(t.a,{href:"configurations#Metadata-Configs",children:"here"}),"."]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Config Name"}),(0,i.jsx)(t.th,{children:"Default"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"hoodie.metadata.enable"}),(0,i.jsx)(t.td,{children:"true (Optional) Enabled on the write side"}),(0,i.jsxs)(t.td,{children:["Enable the internal metadata table serving file listings. For 0.10.1 and prior releases, metadata table is disabled by default and needs to be explicitly enabled.",(0,i.jsx)("br",{}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Config Param: ENABLE"}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Since Version: 0.7.0"})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"hoodie.metadata.index.column.stats.enable"}),(0,i.jsx)(t.td,{children:"false (Optional)"}),(0,i.jsxs)(t.td,{children:["Enable column statistics tracking of files under metadata table. When enabled, metadata table will have a partition to store the column ranges and will be used for pruning files during data skipping.",(0,i.jsx)("br",{}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Config Param: ENABLE_METADATA_INDEX_COLUMN_STATS"}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Since Version: 0.11.0"})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"hoodie.metadata.index.column.stats.columns"}),(0,i.jsx)(t.td,{children:"all columns in the table"}),(0,i.jsx)(t.td,{children:"Comma separated list of columns to track column statistics on."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"hoodie.metadata.index.partition.stats.enable"}),(0,i.jsx)(t.td,{children:"false (Optional)"}),(0,i.jsx)(t.td,{children:"Enable the partition stats tracking, on the same columns tracked by column stats metadata."})]})]})]}),"\n",(0,i.jsxs)(t.p,{children:["For Flink, following are the basic configs of interest to enable metadata tracking. Please refer\n",(0,i.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations#Flink-Options",children:"here"})," for advanced configs"]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Config Name"}),(0,i.jsx)(t.th,{children:"Default"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsx)(t.tbody,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"metadata.enabled"}),(0,i.jsx)(t.td,{children:"true (Optional)"}),(0,i.jsxs)(t.td,{children:["Enable the internal metadata table which serves table metadata like level file listings, default enabled",(0,i.jsx)("br",{}),(0,i.jsx)("br",{})," ",(0,i.jsx)(t.code,{children:"Config Param: METADATA_ENABLED"})]})]})})]}),"\n",(0,i.jsx)(t.admonition,{type:"note",children:(0,i.jsx)(t.p,{children:"If you turn off the metadata table after enabling, be sure to wait for a few commits so that the metadata table is fully\ncleaned up, before re-enabling the metadata table again."})}),"\n",(0,i.jsx)(t.h2,{id:"leveraging-metadata-during-queries",children:"Leveraging metadata during queries"}),"\n",(0,i.jsx)(t.h3,{id:"files-index",children:"files index"}),"\n",(0,i.jsxs)(t.p,{children:["Metadata based listing using ",(0,i.jsx)(t.em,{children:"files_index"})," can be leveraged on the read side by setting appropriate configs/session properties\nfrom different engines as shown below:"]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Readers"}),(0,i.jsx)(t.th,{children:"Config"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Spark DataSource, Spark SQL, Strucured Streaming"}),(0,i.jsx)(t.td,{children:"hoodie.metadata.enable"}),(0,i.jsxs)(t.td,{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," enables use of the spark file index implementation for Hudi, that speeds up listing of large tables.",(0,i.jsx)("br",{})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Flink DataStream, Flink SQL"}),(0,i.jsx)(t.td,{children:"metadata.enabled"}),(0,i.jsxs)(t.td,{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," from DDL uses the internal metadata table to serves table metadata like level file listings"]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Presto"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"https://prestodb.io/docs/current/connector/hudi.html",children:"hudi.metadata-table-enabled"})}),(0,i.jsxs)(t.td,{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," fetches the list of file names and sizes from Hudi\u2019s metadata table rather than storage."]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Trino"}),(0,i.jsx)(t.td,{children:"N/A"}),(0,i.jsxs)(t.td,{children:["Support for reading from the metadata table ",(0,i.jsx)(t.a,{href:"https://issues.apache.org/jira/browse/HUDI-7020",children:"has been dropped in Trino 419"}),"."]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Athena"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"https://docs.aws.amazon.com/athena/latest/ug/querying-hudi.html",children:"hudi.metadata-listing-enabled"})}),(0,i.jsxs)(t.td,{children:["When this table property is set to ",(0,i.jsx)(t.code,{children:"TRUE"})," enables the Hudi metadata table and the related file listing functionality"]})]})]})]}),"\n",(0,i.jsx)(t.h3,{id:"column_stats-index-and-data-skipping",children:"column_stats index and data skipping"}),"\n",(0,i.jsx)(t.p,{children:"Enabling metadata table and column stats index is a prerequisite to enabling data skipping capabilities. Following are the\ncorresponding configs across Spark and Flink readers."}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Readers"}),(0,i.jsx)(t.th,{children:"Config"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Spark DataSource, Spark SQL, Strucured Streaming"}),(0,i.jsx)(t.td,{children:(0,i.jsxs)("ul",{children:[(0,i.jsx)("li",{children:(0,i.jsx)(t.code,{children:"hoodie.metadata.enable"})}),(0,i.jsx)("li",{children:(0,i.jsx)(t.code,{children:"hoodie.enable.data.skipping"})})]})}),(0,i.jsx)(t.td,{children:(0,i.jsxs)("ul",{children:[(0,i.jsxs)("li",{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," enables use of the spark file index implementation for Hudi, that speeds up listing of large tables."]}),(0,i.jsxs)("li",{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," enables data-skipping allowing queries to leverage indexes to reduce the search space by skipping over files ",(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Config Param: ENABLE_DATA_SKIPPING"}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Since Version: 0.10.0"})," ",(0,i.jsx)("br",{})]})]})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Flink DataStream, Flink SQL"}),(0,i.jsx)(t.td,{children:(0,i.jsxs)("ul",{children:[(0,i.jsx)("li",{children:(0,i.jsx)(t.code,{children:"metadata.enabled"})}),(0,i.jsx)("li",{children:(0,i.jsx)(t.code,{children:"read.data.skipping.enabled"})})]})}),(0,i.jsx)(t.td,{children:(0,i.jsxs)("ul",{children:[(0,i.jsxs)("li",{children:[" When set to ",(0,i.jsx)(t.code,{children:"true"})," from DDL uses the internal metadata table to serves table metadata like level file listings"]}),(0,i.jsxs)("li",{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," enables data-skipping allowing queries to leverage indexes to reduce the search space byskipping over files"]})]})})]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"concurrency-control-for-metadata-table",children:"Concurrency Control for Metadata Table"}),"\n",(0,i.jsxs)(t.p,{children:["To ensure that metadata table stays up to date and table metadata is tracked safely across concurrent write and\ntable operations, there are some additional considerations. If async table services are enabled for the table (i.e. running a separate compaction (",(0,i.jsx)(t.code,{children:"HoodieCompactor"}),") or\nclustering (",(0,i.jsx)(t.code,{children:"HoodieClusteringJob"}),") job), even with just a single writer, lock providers\nmust be configured. Please refer to ",(0,i.jsx)(t.a,{href:"concurrency_control",children:"concurrency control"})," for more details."]}),"\n",(0,i.jsxs)(t.p,{children:["Before enabling metadata table for the first time, all writers on the same table must and table services must be stopped.\nIf your current deployment model is ",(0,i.jsx)(t.a,{href:"concurrency_control#full-on-multi-writer--async-table-services",children:"multi-writer"})," along with a lock\nprovider and other required configs set for every writer as follows, there is no additional configuration required. You\ncan bring up the writers sequentially after stopping the writers for enabling metadata table. Applying the proper\nconfigurations to only a subset of writers or table services is unsafe and can lead to loss of data. So, please ensure you enable\nmetadata table across all writers."]}),"\n",(0,i.jsx)(t.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,i.jsx)("h3",{children:"Blogs"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://medium.com/@simpsons/table-service-deployment-models-in-apache-hudi-9cfa5a44addf",children:"Table service deployment models in Apache Hudi"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://www.onehouse.ai/blog/introducing-multi-modal-index-for-the-lakehouse-in-apache-hudi",children:"Multi Modal Indexing for the Data Lakehouse"})}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},73633:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/metadata_table_anim-4d6225cef4c2e0937805288146eaf6ad.gif"},28453:(e,t,a)=>{a.d(t,{R:()=>r,x:()=>l});var n=a(96540);const i={},s=n.createContext(i);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[34543],{97568:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>o});const n=JSON.parse('{"id":"metadata","title":"Table Metadata","description":"Hudi tracks metadata about a table to remove bottlenecks in achieving great read/write performance, specifically on cloud storage.","source":"@site/docs/metadata.md","sourceDirName":".","slug":"/metadata","permalink":"/docs/next/metadata","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/metadata.md","tags":[],"version":"current","frontMatter":{"title":"Table Metadata","keywords":["hudi","metadata","S3","GCS","file listings","statistics"]},"sidebar":"docs","previous":{"title":"Record Mergers","permalink":"/docs/next/record_merger"},"next":{"title":"Indexes","permalink":"/docs/next/indexes"}}');var i=a(74848),s=a(28453);const r={title:"Table Metadata",keywords:["hudi","metadata","S3","GCS","file listings","statistics"]},l=void 0,d={},o=[{value:"Metadata Table",id:"metadata-table",level:2},{value:"Types of table metadata",id:"types-of-table-metadata",level:2},{value:"Metadata Tracking on Writers",id:"metadata-tracking-on-writers",level:2},{value:"Leveraging metadata during queries",id:"leveraging-metadata-during-queries",level:2},{value:"files index",id:"files-index",level:3},{value:"column_stats index and data skipping",id:"column_stats-index-and-data-skipping",level:3},{value:"Concurrency Control for Metadata Table",id:"concurrency-control-for-metadata-table",level:2},{value:"Related Resources",id:"related-resources",level:2}];function c(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"Hudi tracks metadata about a table to remove bottlenecks in achieving great read/write performance, specifically on cloud storage."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Avoid list operations to obtain set of files in a table"}),": A fundamental need for any engine that wants to read or write Hudi tables is\nto know all the files/objects that are part of the table, by performing listing of table partitions/folders. Unlike many distributed file systems,\nsuch operation scales poorly on cloud storage taking few seconds or even many minutes on large tables. This is particularly amplified when tables\nare large and partitioned multiple levels deep. Hudi tracks the file listings so they are readily available for readers/writers without listing the folders\ncontaining the data files."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Expose columns statistics for better query planning and faster queries"}),": Query engines rely on techniques such as partitioning and data skipping\nto cut down on the amount of irrelevant data scanned for query planning and execution. During query planning phase, file footer statistics like column value ranges,\nnull counts are read from all data files to determine if a particular file needs to be read to satisfy the query. This approach is expensive since reading\nfooters from all files can increase cloud storage API costs and even be subject to throttling issues for larger tables. Hudi enables relevant query predicates to\nbe efficiently evaluated on operate on column statistics without incurring these costs."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"metadata-table",children:"Metadata Table"}),"\n",(0,i.jsxs)(t.p,{children:["Hudi employs a special ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.em,{children:"metadata table"})}),", within each table to provide these capabilities. The metadata table implemented as a single\ninternal Hudi Merge-On-Read table that hosts different types of table metadata in each partition. This is similar to common practices in databases where metadata\nis tracked using internal tables. This approach provides the following advantages."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Scalable"}),": The table metadata must scale to large sizes as well (see ",(0,i.jsx)(t.a,{href:"https://vldb.org/pvldb/vol14/p3083-edara.pdf",children:"Big Metadata paper"})," from Google).\nDifferent types of indexes should be easily integrated to support various use cases with consistent management of metadata. By implementing metadata using the\nsame storage format and engine used for data, Hudi is able to scale to even TBs of metadata with built-in table services for managing metadata."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Flexible"}),": The foundational framework for multi-modal indexing is built to enable and disable new indexes as needed. The\n",(0,i.jsx)(t.a,{href:"https://www.onehouse.ai/blog/asynchronous-indexing-using-hudi",children:"async indexing"})," protocol index building alongside regular writers without impacting the write latency."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"transactional updates"}),": Tables data, metadata and indexes must be upto-date and consistent with each other as writes happen or table services are performed. and table metadata must be always up-to-date and in sync with the data table.\nThe data and metadata table's timelines share a parent-child relationship, to ensure they are always in sync with each other. Furthermore, the MoR table storage helps absorb fast changes to metadata from streaming writes without requiring\nrewriting of all table metadata on each write."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Fast lookups"}),": By employing a SSTable like base file format (HFile) in the metadata table, query engines are able to efficiently perform lookup scans for only specific parts of\nmetadata needed. For e.g. query accessing only 10 out of 100 columns in a table can read stats about only the 10 columns it's interested in, during down planning time and costs.\nFurther, these metadata can also be served via a centralized/embedded timeline server which caches the metadata, further reducing the latency of the lookup from executors."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.img,{alt:"Metadata Table Mechanics",src:a(73633).A+"",width:"1280",height:"720"}),"\n",(0,i.jsx)("p",{align:"center",children:"Figure: Mechanics for Metadata Table in Hudi"})]}),"\n",(0,i.jsx)(t.h2,{id:"types-of-table-metadata",children:"Types of table metadata"}),"\n",(0,i.jsx)(t.p,{children:"Following are the different types of metadata currently supported."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.a,{href:"https://cwiki.apache.org/confluence/display/HUDI/RFC+-+15%3A+HUDI+File+Listing+Improvements",children:"files listings"})})}),":\nStored as ",(0,i.jsx)(t.em,{children:"files"})," partition in the metadata table. Contains file information such as file name, size, and active state\nfor each partition in the data table, along with list of all partitions in the table. Improves the files listing performance\nby avoiding direct storage calls such as ",(0,i.jsx)(t.em,{children:"exists, listStatus"})," and ",(0,i.jsx)(t.em,{children:"listFiles"})," on the data table."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/rfc/rfc-27/rfc-27.md",children:"column statistics"})})}),": Stored as ",(0,i.jsx)(t.em,{children:"column_stats"}),"\npartition in the metadata table. Contains the statistics for a set of tracked columns, such as min and max values, total values,\nnull counts, size, etc., for all data files and are used while serving queries with predicates matching interested\ncolumns. This is heavily used by techniques like ",(0,i.jsx)(t.a,{href:"https://www.onehouse.ai/blog/hudis-column-stats-index-and-data-skipping-feature-help-speed-up-queries-by-an-orders-of-magnitude",children:"data skipping"})," to speed up queries by orders of magnitude, by skipping\nirrelevant files."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:"Partition Statistics"})}),": Partition stats index aggregates statistics at the partition level for the columns tracked by\nthe column statistics for which it is enabled. This helps in efficient partition pruning by skipping entire folders very quickly,\neven without examining column statistics at the file level. The partition stats index is stored in ",(0,i.jsx)(t.em,{children:"partition_stats"})," partition in the metadata table.\nPartition stats index can be enabled using the following configs (note it is required to specify the columns for which stats should be aggregated)."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["To try out these features, refer to the ",(0,i.jsx)(t.a,{href:"sql_ddl#create-partition-stats-index",children:"SQL guide"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"metadata-tracking-on-writers",children:"Metadata Tracking on Writers"}),"\n",(0,i.jsxs)(t.p,{children:["Following are based basic configs that are needed to enable metadata tracking. For advanced configs please refer\n",(0,i.jsx)(t.a,{href:"configurations#Metadata-Configs",children:"here"}),"."]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Config Name"}),(0,i.jsx)(t.th,{children:"Default"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"hoodie.metadata.enable"}),(0,i.jsx)(t.td,{children:"true (Optional) Enabled on the write side"}),(0,i.jsxs)(t.td,{children:["Enable the internal metadata table serving file listings. For 0.10.1 and prior releases, metadata table is disabled by default and needs to be explicitly enabled.",(0,i.jsx)("br",{}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Config Param: ENABLE"}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Since Version: 0.7.0"})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"hoodie.metadata.index.column.stats.enable"}),(0,i.jsx)(t.td,{children:"false (Optional)"}),(0,i.jsxs)(t.td,{children:["Enable column statistics tracking of files under metadata table. When enabled, metadata table will have a partition to store the column ranges and will be used for pruning files during data skipping.",(0,i.jsx)("br",{}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Config Param: ENABLE_METADATA_INDEX_COLUMN_STATS"}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Since Version: 0.11.0"})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"hoodie.metadata.index.column.stats.columns"}),(0,i.jsx)(t.td,{children:"all columns in the table"}),(0,i.jsx)(t.td,{children:"Comma separated list of columns to track column statistics on."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"hoodie.metadata.index.partition.stats.enable"}),(0,i.jsx)(t.td,{children:"false (Optional)"}),(0,i.jsx)(t.td,{children:"Enable the partition stats tracking, on the same columns tracked by column stats metadata."})]})]})]}),"\n",(0,i.jsxs)(t.p,{children:["For Flink, following are the basic configs of interest to enable metadata tracking. Please refer\n",(0,i.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations#Flink-Options",children:"here"})," for advanced configs"]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Config Name"}),(0,i.jsx)(t.th,{children:"Default"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsx)(t.tbody,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"metadata.enabled"}),(0,i.jsx)(t.td,{children:"true (Optional)"}),(0,i.jsxs)(t.td,{children:["Enable the internal metadata table which serves table metadata like level file listings, default enabled",(0,i.jsx)("br",{}),(0,i.jsx)("br",{})," ",(0,i.jsx)(t.code,{children:"Config Param: METADATA_ENABLED"})]})]})})]}),"\n",(0,i.jsx)(t.admonition,{type:"note",children:(0,i.jsx)(t.p,{children:"If you turn off the metadata table after enabling, be sure to wait for a few commits so that the metadata table is fully\ncleaned up, before re-enabling the metadata table again."})}),"\n",(0,i.jsx)(t.h2,{id:"leveraging-metadata-during-queries",children:"Leveraging metadata during queries"}),"\n",(0,i.jsx)(t.h3,{id:"files-index",children:"files index"}),"\n",(0,i.jsxs)(t.p,{children:["Metadata based listing using ",(0,i.jsx)(t.em,{children:"files_index"})," can be leveraged on the read side by setting appropriate configs/session properties\nfrom different engines as shown below:"]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Readers"}),(0,i.jsx)(t.th,{children:"Config"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Spark DataSource, Spark SQL, Strucured Streaming"}),(0,i.jsx)(t.td,{children:"hoodie.metadata.enable"}),(0,i.jsxs)(t.td,{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," enables use of the spark file index implementation for Hudi, that speeds up listing of large tables.",(0,i.jsx)("br",{})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Flink DataStream, Flink SQL"}),(0,i.jsx)(t.td,{children:"metadata.enabled"}),(0,i.jsxs)(t.td,{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," from DDL uses the internal metadata table to serves table metadata like level file listings"]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Presto"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"https://prestodb.io/docs/current/connector/hudi.html",children:"hudi.metadata-table-enabled"})}),(0,i.jsxs)(t.td,{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," fetches the list of file names and sizes from Hudi\u2019s metadata table rather than storage."]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Trino"}),(0,i.jsx)(t.td,{children:"N/A"}),(0,i.jsxs)(t.td,{children:["Support for reading from the metadata table ",(0,i.jsx)(t.a,{href:"https://issues.apache.org/jira/browse/HUDI-7020",children:"has been dropped in Trino 419"}),"."]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Athena"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"https://docs.aws.amazon.com/athena/latest/ug/querying-hudi.html",children:"hudi.metadata-listing-enabled"})}),(0,i.jsxs)(t.td,{children:["When this table property is set to ",(0,i.jsx)(t.code,{children:"TRUE"})," enables the Hudi metadata table and the related file listing functionality"]})]})]})]}),"\n",(0,i.jsx)(t.h3,{id:"column_stats-index-and-data-skipping",children:"column_stats index and data skipping"}),"\n",(0,i.jsx)(t.p,{children:"Enabling metadata table and column stats index is a prerequisite to enabling data skipping capabilities. Following are the\ncorresponding configs across Spark and Flink readers."}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Readers"}),(0,i.jsx)(t.th,{children:"Config"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Spark DataSource, Spark SQL, Strucured Streaming"}),(0,i.jsx)(t.td,{children:(0,i.jsxs)("ul",{children:[(0,i.jsx)("li",{children:(0,i.jsx)(t.code,{children:"hoodie.metadata.enable"})}),(0,i.jsx)("li",{children:(0,i.jsx)(t.code,{children:"hoodie.enable.data.skipping"})})]})}),(0,i.jsx)(t.td,{children:(0,i.jsxs)("ul",{children:[(0,i.jsxs)("li",{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," enables use of the spark file index implementation for Hudi, that speeds up listing of large tables."]}),(0,i.jsxs)("li",{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," enables data-skipping allowing queries to leverage indexes to reduce the search space by skipping over files ",(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Config Param: ENABLE_DATA_SKIPPING"}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Since Version: 0.10.0"})," ",(0,i.jsx)("br",{})]})]})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Flink DataStream, Flink SQL"}),(0,i.jsx)(t.td,{children:(0,i.jsxs)("ul",{children:[(0,i.jsx)("li",{children:(0,i.jsx)(t.code,{children:"metadata.enabled"})}),(0,i.jsx)("li",{children:(0,i.jsx)(t.code,{children:"read.data.skipping.enabled"})})]})}),(0,i.jsx)(t.td,{children:(0,i.jsxs)("ul",{children:[(0,i.jsxs)("li",{children:[" When set to ",(0,i.jsx)(t.code,{children:"true"})," from DDL uses the internal metadata table to serves table metadata like level file listings"]}),(0,i.jsxs)("li",{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," enables data-skipping allowing queries to leverage indexes to reduce the search space byskipping over files"]})]})})]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"concurrency-control-for-metadata-table",children:"Concurrency Control for Metadata Table"}),"\n",(0,i.jsxs)(t.p,{children:["To ensure that metadata table stays up to date and table metadata is tracked safely across concurrent write and\ntable operations, there are some additional considerations. If async table services are enabled for the table (i.e. running a separate compaction (",(0,i.jsx)(t.code,{children:"HoodieCompactor"}),") or\nclustering (",(0,i.jsx)(t.code,{children:"HoodieClusteringJob"}),") job), even with just a single writer, lock providers\nmust be configured. Please refer to ",(0,i.jsx)(t.a,{href:"concurrency_control",children:"concurrency control"})," for more details."]}),"\n",(0,i.jsxs)(t.p,{children:["Before enabling metadata table for the first time, all writers on the same table must and table services must be stopped.\nIf your current deployment model is ",(0,i.jsx)(t.a,{href:"concurrency_control#full-on-multi-writer--async-table-services",children:"multi-writer"})," along with a lock\nprovider and other required configs set for every writer as follows, there is no additional configuration required. You\ncan bring up the writers sequentially after stopping the writers for enabling metadata table. Applying the proper\nconfigurations to only a subset of writers or table services is unsafe and can lead to loss of data. So, please ensure you enable\nmetadata table across all writers."]}),"\n",(0,i.jsx)(t.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,i.jsx)("h3",{children:"Blogs"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://medium.com/@simpsons/table-service-deployment-models-in-apache-hudi-9cfa5a44addf",children:"Table service deployment models in Apache Hudi"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://www.onehouse.ai/blog/introducing-multi-modal-index-for-the-lakehouse-in-apache-hudi",children:"Multi Modal Indexing for the Data Lakehouse"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://www.onehouse.ai/blog/how-to-optimize-performance-for-your-open-data-lakehouse",children:"How to Optimize Performance for Your Open Data Lakehouse"})}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},73633:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/metadata_table_anim-4d6225cef4c2e0937805288146eaf6ad.gif"},28453:(e,t,a)=>{a.d(t,{R:()=>r,x:()=>l});var n=a(96540);const i={},s=n.createContext(i);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/b93a682d.187bd928.js b/content/assets/js/b93a682d.56cd85f4.js similarity index 89% rename from content/assets/js/b93a682d.187bd928.js rename to content/assets/js/b93a682d.56cd85f4.js index 0101c2ac91947..cd585f6af79c8 100644 --- a/content/assets/js/b93a682d.187bd928.js +++ b/content/assets/js/b93a682d.56cd85f4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[97476],{79280:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"cleaning","title":"Cleaning","description":"Background","source":"@site/docs/cleaning.md","sourceDirName":".","slug":"/cleaning","permalink":"/docs/next/cleaning","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/cleaning.md","tags":[],"version":"current","frontMatter":{"title":"Cleaning","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4},"sidebar":"docs","previous":{"title":"Streaming Reads","permalink":"/docs/next/reading_tables_streaming_reads"},"next":{"title":"Compaction","permalink":"/docs/next/compaction"}}');var s=i(74848),o=i(28453);const t={title:"Cleaning",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4},r=void 0,l={},c=[{value:"Background",id:"background",level:2},{value:"Cleaning Retention Policies",id:"cleaning-retention-policies",level:3},{value:"Configs",id:"configs",level:3},{value:"Ways to trigger Cleaning",id:"ways-to-trigger-cleaning",level:3},{value:"Inline",id:"inline",level:4},{value:"Async",id:"async",level:4},{value:"Run independently",id:"run-independently",level:4},{value:"CLI",id:"cli",level:4},{value:"Related Resources",id:"related-resources",level:2}];function d(e){const n={a:"a",br:"br",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"background",children:"Background"}),"\n",(0,s.jsxs)(n.p,{children:["Cleaning is a table service employed by Hudi to reclaim space occupied by older versions of data and keep storage costs\nin check. Apache Hudi provides snapshot isolation between writers and readers by managing multiple versioned files with ",(0,s.jsx)(n.strong,{children:"MVCC"}),"\nconcurrency. These file versions provide history and enable time travel and rollbacks, but it is important to manage\nhow much history you keep to balance your costs. Cleaning service plays a crucial role in manging the tradeoff between\nretaining long history of data and the associated storage costs."]}),"\n",(0,s.jsxs)(n.p,{children:["Hudi enables ",(0,s.jsx)(n.a,{href:"/docs/configurations/#hoodiecleanautomatic",children:"Automatic Hudi cleaning"})," by default. Cleaning is invoked\nimmediately after each commit, to delete older file slices. It's recommended to leave this enabled to ensure metadata\nand data storage growth is bounded. Cleaner can also be scheduled after every few commits instead of after every commit by\nconfiguring ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations#hoodiecleanmaxcommits",children:"hoodie.clean.max.commits"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"cleaning-retention-policies",children:"Cleaning Retention Policies"}),"\n",(0,s.jsx)(n.p,{children:"When cleaning old files, you should be careful not to remove files that are being actively used by long running queries."}),"\n",(0,s.jsx)(n.p,{children:"For spark based:"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.cleaner.policy"}),(0,s.jsx)(n.td,{children:"KEEP_LATEST_COMMITS (Optional)"}),(0,s.jsxs)(n.td,{children:["org.apache.hudi.common.model.HoodieCleaningPolicy: Cleaning policy to be used. ",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: CLEANER_POLICY"})]})]})})]}),"\n",(0,s.jsxs)(n.p,{children:["The corresponding config for Flink based engine is ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanpolicy",children:(0,s.jsx)(n.code,{children:"clean.policy"})}),"."]}),"\n",(0,s.jsx)(n.p,{children:"Hudi cleaner currently supports the below cleaning policies to keep a certain number of commits or file versions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"KEEP_LATEST_COMMITS"}),": This is the default policy. This is a temporal cleaning policy that ensures the effect of\nhaving lookback into all the changes that happened in the last X commits. Suppose a writer is ingesting data\ninto a Hudi dataset every 30 minutes and the longest running query can take 5 hours to finish, then the user should\nretain atleast the last 10 commits. With such a configuration, we ensure that the oldest version of a file is kept on\ndisk for at least 5 hours, thereby preventing the longest running query from failing at any point in time. Incremental\ncleaning is also possible using this policy.\nNumber of commits to retain can be configured by ",(0,s.jsx)(n.a,{href:"https://analytics.google.com/analytics/web/#/p300324801/reports/intelligenthome",children:(0,s.jsx)(n.code,{children:"hoodie.cleaner.commits.retained"})}),".\nThe corresponding Flink related config is ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanretain_commits",children:(0,s.jsx)(n.code,{children:"clean.retain_commits"})}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"KEEP_LATEST_FILE_VERSIONS"}),": This policy has the effect of keeping N number of file versions irrespective of time.\nThis policy is useful when it is known how many MAX versions of the file does one want to keep at any given time.\nTo achieve the same behaviour as before of preventing long running queries from failing, one should do their calculations\nbased on data patterns. Alternatively, this policy is also useful if a user just wants to maintain 1 latest version of the file.\nNumber of file versions to retain can be configured by ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#hoodiecleanerfileversionsretained",children:(0,s.jsx)(n.code,{children:"hoodie.cleaner.fileversions.retained"})}),".\nThe corresponding Flink related config is ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanretain_file_versions",children:(0,s.jsx)(n.code,{children:"clean.retain_file_versions"})}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"KEEP_LATEST_BY_HOURS"}),": This policy clean up based on hours.It is simple and useful when knowing that you want to\nkeep files at any given time. Corresponding to commits with commit times older than the configured number of hours to\nbe retained are cleaned. Currently you can configure by parameter ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#hoodiecleanerhoursretained",children:(0,s.jsx)(n.code,{children:"hoodie.cleaner.hours.retained"})}),".\nThe corresponding Flink related config is ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanretain_hours",children:(0,s.jsx)(n.code,{children:"clean.retain_hours"})}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"configs",children:"Configs"}),"\n",(0,s.jsxs)(n.p,{children:["For details about all possible configurations and their default values see the ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/next/configurations/#Clean-Configs",children:"configuration docs"}),".\nFor Flink related configs refer ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/next/configurations/#FLINK_SQL",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"ways-to-trigger-cleaning",children:"Ways to trigger Cleaning"}),"\n",(0,s.jsx)(n.h4,{id:"inline",children:"Inline"}),"\n",(0,s.jsxs)(n.p,{children:["By default, in Spark based writing, cleaning is run inline after every commit using the default policy of ",(0,s.jsx)(n.code,{children:"KEEP_LATEST_COMMITS"}),". It's recommended\nto keep this enabled, to ensure metadata and data storage growth is bounded. To enable this, users do not have to set any configs. Following are the relevant basic configs."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.clean.automatic"}),(0,s.jsx)(n.td,{children:"true (Optional)"}),(0,s.jsxs)(n.td,{children:["When enabled, the cleaner table service is invoked immediately after each commit, to delete older file slices. It's recommended to enable this, to ensure metadata and data storage growth is bounded.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: AUTO_CLEAN"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.cleaner.commits.retained"}),(0,s.jsx)(n.td,{children:"10 (Optional)"}),(0,s.jsxs)(n.td,{children:["Number of commits to retain, without cleaning. This will be retained for num_of_commits * time_between_commits (scheduled). This also directly translates into how much data retention the table supports for incremental queries.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: CLEANER_COMMITS_RETAINED"})]})]})]})]}),"\n",(0,s.jsx)(n.h4,{id:"async",children:"Async"}),"\n",(0,s.jsxs)(n.p,{children:["In case you wish to run the cleaner service asynchronously along with writing, please enable the ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations#hoodiecleanasync",children:(0,s.jsx)(n.code,{children:"hoodie.clean.async"})})," as shown below:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:"hoodie.clean.automatic=true\nhoodie.clean.async=true\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For Flink based writing, this is the default mode of cleaning. Please refer to ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanasyncenabled",children:(0,s.jsx)(n.code,{children:"clean.async.enabled"})})," for details."]}),"\n",(0,s.jsx)(n.h4,{id:"run-independently",children:"Run independently"}),"\n",(0,s.jsx)(n.p,{children:"Hoodie Cleaner can also be run as a separate process. Following is the command for running the cleaner independently:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'spark-submit --master local \\\n --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n --class org.apache.hudi.utilities.HoodieCleaner `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` --help\n Usage:
[options]\n Options:\n --help, -h\n\n --hoodie-conf\n Any configuration that can be set in the properties file (using the CLI\n parameter "--props") can also be passed command line using this\n parameter. This can be repeated\n Default: []\n --props\n path to properties file on localfs or dfs, with configurations for\n hoodie client for cleaning\n --spark-master\n spark master to use.\n Default: local[2]\n * --target-base-path\n base path for the hoodie table to be cleaner.\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Some examples to run the cleaner.",(0,s.jsx)(n.br,{}),"\n","Keep the latest 10 commits"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"spark-submit --master local \\\n --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n --class org.apache.hudi.utilities.HoodieCleaner `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` \\\n --target-base-path /path/to/hoodie_table \\\n --hoodie-conf hoodie.cleaner.policy=KEEP_LATEST_COMMITS \\\n --hoodie-conf hoodie.cleaner.commits.retained=10 \\\n --hoodie-conf hoodie.cleaner.parallelism=200\n"})}),"\n",(0,s.jsx)(n.p,{children:"Keep the latest 3 file versions"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"spark-submit --master local \\\n --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n --class org.apache.hudi.utilities.HoodieCleaner `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` \\\n --hoodie-conf hoodie.cleaner.policy=KEEP_LATEST_FILE_VERSIONS \\\n --hoodie-conf hoodie.cleaner.fileversions.retained=3 \\\n --hoodie-conf hoodie.cleaner.parallelism=200\n"})}),"\n",(0,s.jsx)(n.p,{children:"Clean commits older than 24 hours"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"spark-submit --master local \\\n --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n --class org.apache.hudi.utilities.HoodieCleaner `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` \\\n --target-base-path /path/to/hoodie_table \\\n --hoodie-conf hoodie.cleaner.policy=KEEP_LATEST_BY_HOURS \\\n --hoodie-conf hoodie.cleaner.hours.retained=24 \\\n --hoodie-conf hoodie.cleaner.parallelism=200\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note: The parallelism takes the min value of number of partitions to clean and ",(0,s.jsx)(n.code,{children:"hoodie.cleaner.parallelism"}),"."]}),"\n",(0,s.jsx)(n.h4,{id:"cli",children:"CLI"}),"\n",(0,s.jsxs)(n.p,{children:["You can also use ",(0,s.jsx)(n.a,{href:"/docs/cli",children:"Hudi CLI"})," to run Hoodie Cleaner."]}),"\n",(0,s.jsx)(n.p,{children:"CLI provides the below commands for cleaner service:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"cleans show"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"clean showpartitions"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"cleans run"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example of cleaner keeping the latest 10 commits"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"cleans run --sparkMaster local --hoodieConfigs hoodie.cleaner.policy=KEEP_LATEST_COMMITS hoodie.cleaner.commits.retained=3 hoodie.cleaner.parallelism=200\n"})}),"\n",(0,s.jsxs)(n.p,{children:["You can find more details and the relevant code for these commands in ",(0,s.jsx)(n.a,{href:"https://github.com/apache/hudi/blob/master/hudi-cli/src/main/java/org/apache/hudi/cli/commands/CleansCommand.java",children:(0,s.jsx)(n.code,{children:"org.apache.hudi.cli.commands.CleansCommand"})})," class."]}),"\n",(0,s.jsx)(n.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,s.jsx)("h3",{children:"Videos"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://youtu.be/mUvRhJDoO3w",children:"Cleaner Service: Save up to 40% on data lake storage costs | Hudi Labs"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://www.youtube.com/watch?v=CEzgFtmVjx4",children:"Efficient Data Lake Management with Apache Hudi Cleaner: Benefits of Scheduling Data Cleaning #1"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://www.youtube.com/watch?v=RbBF9Ys2GqM",children:"Efficient Data Lake Management with Apache Hudi Cleaner: Benefits of Scheduling Data Cleaning #2"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>t,x:()=>r});var a=i(96540);const s={},o=a.createContext(s);function t(e){const n=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),a.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[97476],{79280:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"cleaning","title":"Cleaning","description":"Background","source":"@site/docs/cleaning.md","sourceDirName":".","slug":"/cleaning","permalink":"/docs/next/cleaning","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/cleaning.md","tags":[],"version":"current","frontMatter":{"title":"Cleaning","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4},"sidebar":"docs","previous":{"title":"Streaming Reads","permalink":"/docs/next/reading_tables_streaming_reads"},"next":{"title":"Compaction","permalink":"/docs/next/compaction"}}');var s=i(74848),o=i(28453);const t={title:"Cleaning",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4},l=void 0,r={},c=[{value:"Background",id:"background",level:2},{value:"Cleaning Retention Policies",id:"cleaning-retention-policies",level:3},{value:"Configs",id:"configs",level:3},{value:"Ways to trigger Cleaning",id:"ways-to-trigger-cleaning",level:3},{value:"Inline",id:"inline",level:4},{value:"Async",id:"async",level:4},{value:"Run independently",id:"run-independently",level:4},{value:"CLI",id:"cli",level:4},{value:"Related Resources",id:"related-resources",level:2}];function d(e){const n={a:"a",br:"br",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"background",children:"Background"}),"\n",(0,s.jsxs)(n.p,{children:["Cleaning is a table service employed by Hudi to reclaim space occupied by older versions of data and keep storage costs\nin check. Apache Hudi provides snapshot isolation between writers and readers by managing multiple versioned files with ",(0,s.jsx)(n.strong,{children:"MVCC"}),"\nconcurrency. These file versions provide history and enable time travel and rollbacks, but it is important to manage\nhow much history you keep to balance your costs. Cleaning service plays a crucial role in manging the tradeoff between\nretaining long history of data and the associated storage costs."]}),"\n",(0,s.jsxs)(n.p,{children:["Hudi enables ",(0,s.jsx)(n.a,{href:"/docs/configurations/#hoodiecleanautomatic",children:"Automatic Hudi cleaning"})," by default. Cleaning is invoked\nimmediately after each commit, to delete older file slices. It's recommended to leave this enabled to ensure metadata\nand data storage growth is bounded. Cleaner can also be scheduled after every few commits instead of after every commit by\nconfiguring ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations#hoodiecleanmaxcommits",children:"hoodie.clean.max.commits"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"cleaning-retention-policies",children:"Cleaning Retention Policies"}),"\n",(0,s.jsx)(n.p,{children:"When cleaning old files, you should be careful not to remove files that are being actively used by long running queries."}),"\n",(0,s.jsx)(n.p,{children:"For spark based:"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.cleaner.policy"}),(0,s.jsx)(n.td,{children:"KEEP_LATEST_COMMITS (Optional)"}),(0,s.jsxs)(n.td,{children:["org.apache.hudi.common.model.HoodieCleaningPolicy: Cleaning policy to be used. ",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: CLEANER_POLICY"})]})]})})]}),"\n",(0,s.jsxs)(n.p,{children:["The corresponding config for Flink based engine is ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanpolicy",children:(0,s.jsx)(n.code,{children:"clean.policy"})}),"."]}),"\n",(0,s.jsx)(n.p,{children:"Hudi cleaner currently supports the below cleaning policies to keep a certain number of commits or file versions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"KEEP_LATEST_COMMITS"}),": This is the default policy. This is a temporal cleaning policy that ensures the effect of\nhaving lookback into all the changes that happened in the last X commits. Suppose a writer is ingesting data\ninto a Hudi dataset every 30 minutes and the longest running query can take 5 hours to finish, then the user should\nretain atleast the last 10 commits. With such a configuration, we ensure that the oldest version of a file is kept on\ndisk for at least 5 hours, thereby preventing the longest running query from failing at any point in time. Incremental\ncleaning is also possible using this policy.\nNumber of commits to retain can be configured by ",(0,s.jsx)(n.a,{href:"https://analytics.google.com/analytics/web/#/p300324801/reports/intelligenthome",children:(0,s.jsx)(n.code,{children:"hoodie.cleaner.commits.retained"})}),".\nThe corresponding Flink related config is ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanretain_commits",children:(0,s.jsx)(n.code,{children:"clean.retain_commits"})}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"KEEP_LATEST_FILE_VERSIONS"}),": This policy has the effect of keeping N number of file versions irrespective of time.\nThis policy is useful when it is known how many MAX versions of the file does one want to keep at any given time.\nTo achieve the same behaviour as before of preventing long running queries from failing, one should do their calculations\nbased on data patterns. Alternatively, this policy is also useful if a user just wants to maintain 1 latest version of the file.\nNumber of file versions to retain can be configured by ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#hoodiecleanerfileversionsretained",children:(0,s.jsx)(n.code,{children:"hoodie.cleaner.fileversions.retained"})}),".\nThe corresponding Flink related config is ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanretain_file_versions",children:(0,s.jsx)(n.code,{children:"clean.retain_file_versions"})}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"KEEP_LATEST_BY_HOURS"}),": This policy clean up based on hours.It is simple and useful when knowing that you want to\nkeep files at any given time. Corresponding to commits with commit times older than the configured number of hours to\nbe retained are cleaned. Currently you can configure by parameter ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#hoodiecleanerhoursretained",children:(0,s.jsx)(n.code,{children:"hoodie.cleaner.hours.retained"})}),".\nThe corresponding Flink related config is ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanretain_hours",children:(0,s.jsx)(n.code,{children:"clean.retain_hours"})}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"configs",children:"Configs"}),"\n",(0,s.jsxs)(n.p,{children:["For details about all possible configurations and their default values see the ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/next/configurations/#Clean-Configs",children:"configuration docs"}),".\nFor Flink related configs refer ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/next/configurations/#FLINK_SQL",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"ways-to-trigger-cleaning",children:"Ways to trigger Cleaning"}),"\n",(0,s.jsx)(n.h4,{id:"inline",children:"Inline"}),"\n",(0,s.jsxs)(n.p,{children:["By default, in Spark based writing, cleaning is run inline after every commit using the default policy of ",(0,s.jsx)(n.code,{children:"KEEP_LATEST_COMMITS"}),". It's recommended\nto keep this enabled, to ensure metadata and data storage growth is bounded. To enable this, users do not have to set any configs. Following are the relevant basic configs."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.clean.automatic"}),(0,s.jsx)(n.td,{children:"true (Optional)"}),(0,s.jsxs)(n.td,{children:["When enabled, the cleaner table service is invoked immediately after each commit, to delete older file slices. It's recommended to enable this, to ensure metadata and data storage growth is bounded.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: AUTO_CLEAN"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.cleaner.commits.retained"}),(0,s.jsx)(n.td,{children:"10 (Optional)"}),(0,s.jsxs)(n.td,{children:["Number of commits to retain, without cleaning. This will be retained for num_of_commits * time_between_commits (scheduled). This also directly translates into how much data retention the table supports for incremental queries.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: CLEANER_COMMITS_RETAINED"})]})]})]})]}),"\n",(0,s.jsx)(n.h4,{id:"async",children:"Async"}),"\n",(0,s.jsxs)(n.p,{children:["In case you wish to run the cleaner service asynchronously along with writing, please enable the ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations#hoodiecleanasync",children:(0,s.jsx)(n.code,{children:"hoodie.clean.async"})})," as shown below:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:"hoodie.clean.automatic=true\nhoodie.clean.async=true\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For Flink based writing, this is the default mode of cleaning. Please refer to ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanasyncenabled",children:(0,s.jsx)(n.code,{children:"clean.async.enabled"})})," for details."]}),"\n",(0,s.jsx)(n.h4,{id:"run-independently",children:"Run independently"}),"\n",(0,s.jsx)(n.p,{children:"Hoodie Cleaner can also be run as a separate process. Following is the command for running the cleaner independently:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'spark-submit --master local \\\n --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n --class org.apache.hudi.utilities.HoodieCleaner `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` --help\n Usage:
[options]\n Options:\n --help, -h\n\n --hoodie-conf\n Any configuration that can be set in the properties file (using the CLI\n parameter "--props") can also be passed command line using this\n parameter. This can be repeated\n Default: []\n --props\n path to properties file on localfs or dfs, with configurations for\n hoodie client for cleaning\n --spark-master\n spark master to use.\n Default: local[2]\n * --target-base-path\n base path for the hoodie table to be cleaner.\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Some examples to run the cleaner.",(0,s.jsx)(n.br,{}),"\n","Keep the latest 10 commits"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"spark-submit --master local \\\n --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n --class org.apache.hudi.utilities.HoodieCleaner `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` \\\n --target-base-path /path/to/hoodie_table \\\n --hoodie-conf hoodie.cleaner.policy=KEEP_LATEST_COMMITS \\\n --hoodie-conf hoodie.cleaner.commits.retained=10 \\\n --hoodie-conf hoodie.cleaner.parallelism=200\n"})}),"\n",(0,s.jsx)(n.p,{children:"Keep the latest 3 file versions"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"spark-submit --master local \\\n --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n --class org.apache.hudi.utilities.HoodieCleaner `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` \\\n --hoodie-conf hoodie.cleaner.policy=KEEP_LATEST_FILE_VERSIONS \\\n --hoodie-conf hoodie.cleaner.fileversions.retained=3 \\\n --hoodie-conf hoodie.cleaner.parallelism=200\n"})}),"\n",(0,s.jsx)(n.p,{children:"Clean commits older than 24 hours"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"spark-submit --master local \\\n --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n --class org.apache.hudi.utilities.HoodieCleaner `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` \\\n --target-base-path /path/to/hoodie_table \\\n --hoodie-conf hoodie.cleaner.policy=KEEP_LATEST_BY_HOURS \\\n --hoodie-conf hoodie.cleaner.hours.retained=24 \\\n --hoodie-conf hoodie.cleaner.parallelism=200\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note: The parallelism takes the min value of number of partitions to clean and ",(0,s.jsx)(n.code,{children:"hoodie.cleaner.parallelism"}),"."]}),"\n",(0,s.jsx)(n.h4,{id:"cli",children:"CLI"}),"\n",(0,s.jsxs)(n.p,{children:["You can also use ",(0,s.jsx)(n.a,{href:"/docs/cli",children:"Hudi CLI"})," to run Hoodie Cleaner."]}),"\n",(0,s.jsx)(n.p,{children:"CLI provides the below commands for cleaner service:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"cleans show"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"clean showpartitions"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"cleans run"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example of cleaner keeping the latest 10 commits"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"cleans run --sparkMaster local --hoodieConfigs hoodie.cleaner.policy=KEEP_LATEST_COMMITS hoodie.cleaner.commits.retained=3 hoodie.cleaner.parallelism=200\n"})}),"\n",(0,s.jsxs)(n.p,{children:["You can find more details and the relevant code for these commands in ",(0,s.jsx)(n.a,{href:"https://github.com/apache/hudi/blob/master/hudi-cli/src/main/java/org/apache/hudi/cli/commands/CleansCommand.java",children:(0,s.jsx)(n.code,{children:"org.apache.hudi.cli.commands.CleansCommand"})})," class."]}),"\n",(0,s.jsx)(n.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,s.jsx)("h3",{children:"Blogs"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://medium.com/@simpsons/cleaner-and-archival-in-apache-hudi-9e15b08b2933",children:"Cleaner and Archival in Apache Hudi"})}),"\n"]}),"\n",(0,s.jsx)("h3",{children:"Videos"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://youtu.be/mUvRhJDoO3w",children:"Cleaner Service: Save up to 40% on data lake storage costs | Hudi Labs"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://www.youtube.com/watch?v=CEzgFtmVjx4",children:"Efficient Data Lake Management with Apache Hudi Cleaner: Benefits of Scheduling Data Cleaning #1"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://www.youtube.com/watch?v=RbBF9Ys2GqM",children:"Efficient Data Lake Management with Apache Hudi Cleaner: Benefits of Scheduling Data Cleaning #2"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>t,x:()=>l});var a=i(96540);const s={},o=a.createContext(s);function t(e){const n=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),a.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/ba47c136.0223e146.js b/content/assets/js/ba47c136.a55b1584.js similarity index 96% rename from content/assets/js/ba47c136.0223e146.js rename to content/assets/js/ba47c136.a55b1584.js index d8950723b8d09..ea5336dc68bd9 100644 --- a/content/assets/js/ba47c136.0223e146.js +++ b/content/assets/js/ba47c136.a55b1584.js @@ -1 +1 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[97424],{90430:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>o,contentTitle:()=>a,default:()=>c,frontMatter:()=>d,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"key_generation","title":"Key Generation","description":"Hudi needs some way to point to records in the table, so that base/log files can be merged efficiently for updates/deletes,","source":"@site/docs/key_generation.md","sourceDirName":".","slug":"/key_generation","permalink":"/docs/next/key_generation","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/key_generation.md","tags":[],"version":"current","frontMatter":{"title":"Key Generation","summary":"In this page, we describe key generation in Hudi.","toc":true,"last_modified_at":null},"sidebar":"docs","previous":{"title":"Table & Query Types","permalink":"/docs/next/table_types"},"next":{"title":"Record Mergers","permalink":"/docs/next/record_merger"}}');var n=i(74848),s=i(28453);const d={title:"Key Generation",summary:"In this page, we describe key generation in Hudi.",toc:!0,last_modified_at:null},a=void 0,o={},l=[{value:"Key Generators",id:"key-generators",level:2},{value:"SIMPLE",id:"simple",level:3},{value:"COMPLEX",id:"complex",level:3},{value:"NON_PARTITION",id:"non_partition",level:3},{value:"CUSTOM",id:"custom",level:3},{value:"TIMESTAMP",id:"timestamp",level:3},{value:"Timestamp is GMT",id:"timestamp-is-gmt",level:4},{value:"Timestamp is DATE_STRING",id:"timestamp-is-date_string",level:4},{value:"Scalar examples",id:"scalar-examples",level:4},{value:"ISO8601WithMsZ with Single Input format",id:"iso8601withmsz-with-single-input-format",level:4},{value:"ISO8601WithMsZ with Multiple Input formats",id:"iso8601withmsz-with-multiple-input-formats",level:4},{value:"ISO8601NoMs with offset using multiple input formats",id:"iso8601noms-with-offset-using-multiple-input-formats",level:4},{value:"Input as short date string and expect date in date format",id:"input-as-short-date-string-and-expect-date-in-date-format",level:4},{value:"Related Resources",id:"related-resources",level:2}];function h(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"Hudi needs some way to point to records in the table, so that base/log files can be merged efficiently for updates/deletes,\nindex entries can reference these rows and records can move around within the table from clustering without side effects.\nIn fact, most databases adopt similar techniques. Every record in Hudi is uniquely identified a pair of record key and an optional\npartition path that can limit the scope of the key's uniqueness (non-global indexing). For tables with a global index, records are\nidentified by just the record key such that uniqueness is applied across partitions."}),"\n",(0,n.jsxs)(t.p,{children:["Using keys, Hudi can impose partition/table level uniqueness integrity constraint as well as enable fast updates and deletes on records. Record keys are materialized in a\nspecial ",(0,n.jsx)(t.code,{children:"_hoodie_record_key"})," field in the table, to ensure key uniqueness is maintained even when the record generation is changed\nduring the table's lifetime. Without materialization, there are no guarantees that the past data written for a new key is unique across the table."]}),"\n",(0,n.jsx)(t.p,{children:"Hudi offers many ways to generate record keys from the input data during writes."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["For Java client/Spark/Flink writers, Hudi provides built-in key generator classes (described below) as well as an ",(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-common/src/main/java/org/apache/hudi/keygen/KeyGenerator.java",children:"interface"}),"\nto write custom implementations."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["SQL engines offer options to pass in key fields and use ",(0,n.jsx)(t.code,{children:"PARTITIONED BY"})," clauses to control partitioning."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"By default, Hudi auto-generates keys for INSERT, BULK_INSERT write operations, that are efficient\nfor compute, storage and read to meet the uniqueness requirements of the primary key. Auto generated keys are highly\ncompressible compared to UUIDs costing about $0.023 per GB in cloud storage and 3-10x computationally lighter to generate\nthan base64/uuid encoded keys."}),"\n",(0,n.jsx)(t.h2,{id:"key-generators",children:"Key Generators"}),"\n",(0,n.jsx)(t.p,{children:"Hudi provides several key generators out of the box for JVM users can use based on their need, while having a pluggable\ninterface for users to implement and use their own."}),"\n",(0,n.jsx)(t.p,{children:"Before diving into different types of key generators, let\u2019s go over some of the common configs relevant to key generators."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Default"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.recordkey.field"}),(0,n.jsx)(t.td,{children:"N/A (Optional)"}),(0,n.jsxs)(t.td,{children:["Record key field. Value to be used as the ",(0,n.jsx)(t.code,{children:"recordKey"})," component of ",(0,n.jsx)(t.code,{children:"HoodieKey"}),". ",(0,n.jsxs)("ul",{children:[(0,n.jsxs)("li",{children:["When configured, actual value will be obtained by invoking .toString() on the field value. Nested fields can be specified using the dot notation eg: ",(0,n.jsx)(t.code,{children:"a.b.c"}),". "]}),(0,n.jsx)("li",{children:"When not configured record key will be automatically generated by Hudi. This feature is handy for use cases like log ingestion that do not have a naturally present record key."})]})," ",(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: RECORDKEY_FIELD_NAME"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.partitionpath.field"}),(0,n.jsx)(t.td,{children:"N/A (Optional)"}),(0,n.jsxs)(t.td,{children:["Partition path field. Value to be used at the partitionPath component of HoodieKey. This needs to be specified if a partitioned table is desired. Actual value obtained by invoking .toString()",(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: PARTITIONPATH_FIELD_NAME"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.keygenerator.type"}),(0,n.jsx)(t.td,{children:"SIMPLE"}),(0,n.jsxs)(t.td,{children:["String representing key generator type ",(0,n.jsx)("br",{}),(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: KEYGENERATOR_TYPE"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.keygenerator.class"}),(0,n.jsx)(t.td,{children:"N/A (Optional)"}),(0,n.jsxs)(t.td,{children:["Key generator class, that implements ",(0,n.jsx)(t.code,{children:"org.apache.hudi.keygen.KeyGenerator"})," extract a key out of incoming records. ",(0,n.jsxs)("ul",{children:[(0,n.jsx)("li",{children:"When set, the configured value takes precedence to be in effect and automatic inference is not triggered."}),(0,n.jsxs)("li",{children:["When not configured, if ",(0,n.jsx)(t.code,{children:"hoodie.datasource.write.keygenerator.type"})," is set, the configured value is used else automatic inference is triggered."]}),(0,n.jsx)("li",{children:"In case of auto generated record keys, if neither the key generator class nor type are configured, Hudi will also auto infer the partitioning. for eg, if partition field is not configured, hudi will assume its non-partitioned. "})]})," ",(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: KEYGENERATOR_CLASS_NAME"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.hive_style_partitioning"}),(0,n.jsx)(t.td,{children:"false (Optional)"}),(0,n.jsxs)(t.td,{children:["Flag to indicate whether to use Hive style partitioning. If set true, the names of partition folders follow = format. By default false (the names of partition folders are only partition values)",(0,n.jsx)("br",{}),(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: HIVE_STYLE_PARTITIONING_ENABLE"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.partitionpath.urlencode"}),(0,n.jsx)(t.td,{children:"false (Optional)"}),(0,n.jsxs)(t.td,{children:["Should we url encode the partition path value, before creating the folder structure.",(0,n.jsx)("br",{}),(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: URL_ENCODE_PARTITIONING"})]})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["For all advanced configs refer ",(0,n.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations#KEY_GENERATOR",children:"here"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"simple",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/SimpleKeyGenerator.java",children:"SIMPLE"})}),"\n",(0,n.jsx)(t.p,{children:"This is the most commonly used option. Record key is generated from two fields from the schema, one for record key and one for partition path. Values are interpreted as is from dataframe and converted to string."}),"\n",(0,n.jsx)(t.h3,{id:"complex",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/ComplexKeyGenerator.java",children:"COMPLEX"})}),"\n",(0,n.jsxs)(t.p,{children:["Both record key and partition paths comprise one or more than one field by name(combination of multiple fields). Fields\nare expected to be comma separated in the config value. For example ",(0,n.jsx)(t.code,{children:'"Hoodie.datasource.write.recordkey.field" : \u201ccol1,col4\u201d'})]}),"\n",(0,n.jsx)(t.h3,{id:"non_partition",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/NonpartitionedKeyGenerator.java",children:"NON_PARTITION"})}),"\n",(0,n.jsx)(t.p,{children:"If your hudi dataset is not partitioned, you could use this \u201cNonpartitionedKeyGenerator\u201d which will return an empty\npartition for all records. In other words, all records go to the same partition (which is empty \u201c\u201d)"}),"\n",(0,n.jsx)(t.h3,{id:"custom",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/CustomKeyGenerator.java",children:"CUSTOM"})}),"\n",(0,n.jsx)(t.p,{children:"This is a generic implementation of KeyGenerator where users are able to leverage the benefits of SimpleKeyGenerator,\nComplexKeyGenerator and TimestampBasedKeyGenerator all at the same time. One can configure record key and partition\npaths as a single field or a combination of fields."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"hoodie.datasource.write.recordkey.field\nhoodie.datasource.write.partitionpath.field\nhoodie.datasource.write.keygenerator.class=org.apache.hudi.keygen.CustomKeyGenerator\n"})}),"\n",(0,n.jsxs)(t.p,{children:["This keyGenerator is particularly useful if you want to define\ncomplex partition paths involving regular fields and timestamp based fields. It expects value for prop ",(0,n.jsx)(t.code,{children:'"hoodie.datasource.write.partitionpath.field"'}),'\nin a specific format. The format should be "field1',":PartitionKeyType1",",field2",":PartitionKeyType2",'..."']}),"\n",(0,n.jsxs)(t.p,{children:["The complete partition path is created as\n",(0,n.jsx)(t.code,{children:"/ "}),"\nand so on. Each partition key type could either be SIMPLE or TIMESTAMP."]}),"\n",(0,n.jsxs)(t.p,{children:["Example config value: ",(0,n.jsx)(t.code,{children:"\u201cfield_3:simple,field_5:timestamp\u201d"})]}),"\n",(0,n.jsx)(t.p,{children:"RecordKey config value is either single field incase of SimpleKeyGenerator or a comma separate field names if referring to ComplexKeyGenerator.\nExample:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"hoodie.datasource.write.recordkey.field=field1,field2\n"})}),"\n",(0,n.jsxs)(t.p,{children:["This will create your record key in the format ",(0,n.jsx)(t.code,{children:"field1:value1,field2:value2"})," and so on, otherwise you can specify only one field in case of simple record keys. ",(0,n.jsx)(t.code,{children:"CustomKeyGenerator"})," class defines an enum ",(0,n.jsx)(t.code,{children:"PartitionKeyType"})," for configuring partition paths. It can take two possible values - SIMPLE and TIMESTAMP.\nThe value for ",(0,n.jsx)(t.code,{children:"hoodie.datasource.write.partitionpath.field"})," property in case of partitioned tables needs to be provided in the format ",(0,n.jsx)(t.code,{children:"field1:PartitionKeyType1,field2:PartitionKeyType2"})," and so on. For example, if you want to create partition path using 2 fields ",(0,n.jsx)(t.code,{children:"country"})," and ",(0,n.jsx)(t.code,{children:"date"})," where the latter has timestamp based values and needs to be customised in a given format, you can specify the following"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"hoodie.datasource.write.partitionpath.field=country:SIMPLE,date:TIMESTAMP\n"})}),"\n",(0,n.jsxs)(t.p,{children:["This will create the partition path in the format ",(0,n.jsx)(t.code,{children:"/"})," or ",(0,n.jsx)(t.code,{children:"country=/date="})," depending on whether you want hive style partitioning or not."]}),"\n",(0,n.jsx)(t.h3,{id:"timestamp",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/TimestampBasedKeyGenerator.java",children:"TIMESTAMP"})}),"\n",(0,n.jsx)(t.p,{children:"This key generator relies on timestamps for the partition field. The field values are interpreted as timestamps\nand not just converted to string while generating partition path value for records. Record key is same as before where it is chosen by\nfield name. Users are expected to set few more configs to use this KeyGenerator."}),"\n",(0,n.jsx)(t.p,{children:"Configs to be set:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Default"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.keygen.timebased.timestamp.type"}),(0,n.jsxs)(t.td,{children:["N/A ",(0,n.jsx)(t.strong,{children:"(Required)"})]}),(0,n.jsx)(t.td,{children:"Required only when the key generator is TimestampBasedKeyGenerator. One of the timestamp types supported(UNIX_TIMESTAMP, DATE_STRING, MIXED, EPOCHMILLISECONDS, SCALAR)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.keygen.timebased.output.dateformat"}),(0,n.jsx)(t.td,{children:'"" (Optional)'}),(0,n.jsxs)(t.td,{children:["Output date format such as ",(0,n.jsx)(t.code,{children:"yyyy-MM-dd'T'HH:mm:ss.SSSZ"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.keygen.timebased.timezone"}),(0,n.jsx)(t.td,{children:'"UTC" (Optional)'}),(0,n.jsxs)(t.td,{children:["Timezone of both input and output timestamp if they are the same, such as ",(0,n.jsx)(t.code,{children:"UTC"}),". Please use ",(0,n.jsx)(t.code,{children:"hoodie.keygen.timebased.input.timezone"})," and ",(0,n.jsx)(t.code,{children:"hoodie.keygen.timebased.output.timezone"})," instead if the input and output timezones are different."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.keygen.timebased.input.dateformat"}),(0,n.jsx)(t.td,{children:'"" (Optional)'}),(0,n.jsxs)(t.td,{children:["Input date format such as ",(0,n.jsx)(t.code,{children:"yyyy-MM-dd'T'HH:mm:ss.SSSZ"}),"."]})]})]})]}),"\n",(0,n.jsx)(t.p,{children:"Let's go over some example values for TimestampBasedKeyGenerator."}),"\n",(0,n.jsx)(t.h4,{id:"timestamp-is-gmt",children:"Timestamp is GMT"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"EPOCHMILLISECONDS"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyy-MM-dd hh"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timezone"})}),(0,n.jsx)(t.td,{children:'"GMT+8:00"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["Input Field value: \u201c1578283932000L\u201d ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c2020-01-06 12\u201d"]}),"\n",(0,n.jsxs)(t.p,{children:["If input field value is null for some rows. ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c1970-01-01 08\u201d"]}),"\n",(0,n.jsx)(t.h4,{id:"timestamp-is-date_string",children:"Timestamp is DATE_STRING"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyy-MM-dd hh"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timezone"})}),(0,n.jsx)(t.td,{children:'"GMT+8:00"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:['"yyyy-MM-dd hh:mm',":ss",'"']})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["Input field value: \u201c2020-01-06 12:12:12\u201d ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c2020-01-06 12\u201d"]}),"\n",(0,n.jsxs)(t.p,{children:["If input field value is null for some rows. ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c1970-01-01 12:00:00\u201d"]}),"\n",(0,n.jsx)("br",{}),"\n",(0,n.jsx)(t.h4,{id:"scalar-examples",children:"Scalar examples"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"SCALAR"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyy-MM-dd hh"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timezone"})}),(0,n.jsx)(t.td,{children:'"GMT"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.scalar.time.unit"})}),(0,n.jsx)(t.td,{children:'"days"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["Input field value: \u201c20000L\u201d ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c2024-10-04 12\u201d"]}),"\n",(0,n.jsxs)(t.p,{children:["If input field value is null. ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c1970-01-02 12\u201d"]}),"\n",(0,n.jsx)(t.h4,{id:"iso8601withmsz-with-single-input-format",children:"ISO8601WithMsZ with Single Input format"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:["\"yyyy-MM-dd'T'HH:mm",":ss",'.SSSZ"']})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat.list.delimiter.regex"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.timezone"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyyMMddHH"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.timezone"})}),(0,n.jsx)(t.td,{children:'"GMT"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:['Input field value: "2020-04-01T13:01:33.428Z" ',(0,n.jsx)("br",{}),'\nPartition path generated from key generator: "2020040113"']}),"\n",(0,n.jsx)(t.h4,{id:"iso8601withmsz-with-multiple-input-formats",children:"ISO8601WithMsZ with Multiple Input formats"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:["\"yyyy-MM-dd'T'HH:mm",":ssZ",",yyyy-MM-dd'T'HH:mm",":ss",'.SSSZ"']})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat.list.delimiter.regex"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.timezone"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyyMMddHH"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.timezone"})}),(0,n.jsx)(t.td,{children:'"UTC"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:['Input field value: "2020-04-01T13:01:33.428Z" ',(0,n.jsx)("br",{}),'\nPartition path generated from key generator: "2020040113"']}),"\n",(0,n.jsx)(t.h4,{id:"iso8601noms-with-offset-using-multiple-input-formats",children:"ISO8601NoMs with offset using multiple input formats"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:["\"yyyy-MM-dd'T'HH:mm",":ssZ",",yyyy-MM-dd'T'HH:mm",":ss",'.SSSZ"']})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat.list.delimiter.regex"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.timezone"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyyMMddHH"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.timezone"})}),(0,n.jsx)(t.td,{children:'"UTC"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:['Input field value: "2020-04-01T13:01:33-',(0,n.jsx)(t.strong,{children:"05:00"}),'" ',(0,n.jsx)("br",{}),'\nPartition path generated from key generator: "2020040118"']}),"\n",(0,n.jsx)(t.h4,{id:"input-as-short-date-string-and-expect-date-in-date-format",children:"Input as short date string and expect date in date format"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:["\"yyyy-MM-dd'T'HH:mm",":ssZ",",yyyy-MM-dd'T'HH:mm",":ss",'.SSSZ,yyyyMMdd"']})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat.list.delimiter.regex"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.timezone"})}),(0,n.jsx)(t.td,{children:'"UTC"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"MM/dd/yyyy"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.timezone"})}),(0,n.jsx)(t.td,{children:'"UTC"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:['Input field value: "20200401" ',(0,n.jsx)("br",{}),'\nPartition path generated from key generator: "04/01/2020"']}),"\n",(0,n.jsx)(t.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://www.onehouse.ai/blog/hudi-metafields-demystified",children:"Hudi metafields demystified"})}),"\n"]})]})}function c(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},28453:(e,t,i)=>{i.d(t,{R:()=>d,x:()=>a});var r=i(96540);const n={},s=r.createContext(n);function d(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[97424],{90430:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>o,contentTitle:()=>a,default:()=>c,frontMatter:()=>d,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"key_generation","title":"Key Generation","description":"Hudi needs some way to point to records in the table, so that base/log files can be merged efficiently for updates/deletes,","source":"@site/docs/key_generation.md","sourceDirName":".","slug":"/key_generation","permalink":"/docs/next/key_generation","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/key_generation.md","tags":[],"version":"current","frontMatter":{"title":"Key Generation","summary":"In this page, we describe key generation in Hudi.","toc":true,"last_modified_at":null},"sidebar":"docs","previous":{"title":"Table & Query Types","permalink":"/docs/next/table_types"},"next":{"title":"Record Mergers","permalink":"/docs/next/record_merger"}}');var n=i(74848),s=i(28453);const d={title:"Key Generation",summary:"In this page, we describe key generation in Hudi.",toc:!0,last_modified_at:null},a=void 0,o={},l=[{value:"Key Generators",id:"key-generators",level:2},{value:"SIMPLE",id:"simple",level:3},{value:"COMPLEX",id:"complex",level:3},{value:"NON_PARTITION",id:"non_partition",level:3},{value:"CUSTOM",id:"custom",level:3},{value:"TIMESTAMP",id:"timestamp",level:3},{value:"Timestamp is GMT",id:"timestamp-is-gmt",level:4},{value:"Timestamp is DATE_STRING",id:"timestamp-is-date_string",level:4},{value:"Scalar examples",id:"scalar-examples",level:4},{value:"ISO8601WithMsZ with Single Input format",id:"iso8601withmsz-with-single-input-format",level:4},{value:"ISO8601WithMsZ with Multiple Input formats",id:"iso8601withmsz-with-multiple-input-formats",level:4},{value:"ISO8601NoMs with offset using multiple input formats",id:"iso8601noms-with-offset-using-multiple-input-formats",level:4},{value:"Input as short date string and expect date in date format",id:"input-as-short-date-string-and-expect-date-in-date-format",level:4},{value:"Related Resources",id:"related-resources",level:2}];function h(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"Hudi needs some way to point to records in the table, so that base/log files can be merged efficiently for updates/deletes,\nindex entries can reference these rows and records can move around within the table from clustering without side effects.\nIn fact, most databases adopt similar techniques. Every record in Hudi is uniquely identified a pair of record key and an optional\npartition path that can limit the scope of the key's uniqueness (non-global indexing). For tables with a global index, records are\nidentified by just the record key such that uniqueness is applied across partitions."}),"\n",(0,n.jsxs)(t.p,{children:["Using keys, Hudi can impose partition/table level uniqueness integrity constraint as well as enable fast updates and deletes on records. Record keys are materialized in a\nspecial ",(0,n.jsx)(t.code,{children:"_hoodie_record_key"})," field in the table, to ensure key uniqueness is maintained even when the record generation is changed\nduring the table's lifetime. Without materialization, there are no guarantees that the past data written for a new key is unique across the table."]}),"\n",(0,n.jsx)(t.p,{children:"Hudi offers many ways to generate record keys from the input data during writes."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["For Java client/Spark/Flink writers, Hudi provides built-in key generator classes (described below) as well as an ",(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-common/src/main/java/org/apache/hudi/keygen/KeyGenerator.java",children:"interface"}),"\nto write custom implementations."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["SQL engines offer options to pass in key fields and use ",(0,n.jsx)(t.code,{children:"PARTITIONED BY"})," clauses to control partitioning."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"By default, Hudi auto-generates keys for INSERT, BULK_INSERT write operations, that are efficient\nfor compute, storage and read to meet the uniqueness requirements of the primary key. Auto generated keys are highly\ncompressible compared to UUIDs costing about $0.023 per GB in cloud storage and 3-10x computationally lighter to generate\nthan base64/uuid encoded keys."}),"\n",(0,n.jsx)(t.h2,{id:"key-generators",children:"Key Generators"}),"\n",(0,n.jsx)(t.p,{children:"Hudi provides several key generators out of the box for JVM users can use based on their need, while having a pluggable\ninterface for users to implement and use their own."}),"\n",(0,n.jsx)(t.p,{children:"Before diving into different types of key generators, let\u2019s go over some of the common configs relevant to key generators."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Default"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.recordkey.field"}),(0,n.jsx)(t.td,{children:"N/A (Optional)"}),(0,n.jsxs)(t.td,{children:["Record key field. Value to be used as the ",(0,n.jsx)(t.code,{children:"recordKey"})," component of ",(0,n.jsx)(t.code,{children:"HoodieKey"}),". ",(0,n.jsxs)("ul",{children:[(0,n.jsxs)("li",{children:["When configured, actual value will be obtained by invoking .toString() on the field value. Nested fields can be specified using the dot notation eg: ",(0,n.jsx)(t.code,{children:"a.b.c"}),". "]}),(0,n.jsx)("li",{children:"When not configured record key will be automatically generated by Hudi. This feature is handy for use cases like log ingestion that do not have a naturally present record key."})]})," ",(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: RECORDKEY_FIELD_NAME"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.partitionpath.field"}),(0,n.jsx)(t.td,{children:"N/A (Optional)"}),(0,n.jsxs)(t.td,{children:["Partition path field. Value to be used at the partitionPath component of HoodieKey. This needs to be specified if a partitioned table is desired. Actual value obtained by invoking .toString()",(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: PARTITIONPATH_FIELD_NAME"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.keygenerator.type"}),(0,n.jsx)(t.td,{children:"SIMPLE"}),(0,n.jsxs)(t.td,{children:["String representing key generator type ",(0,n.jsx)("br",{}),(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: KEYGENERATOR_TYPE"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.keygenerator.class"}),(0,n.jsx)(t.td,{children:"N/A (Optional)"}),(0,n.jsxs)(t.td,{children:["Key generator class, that implements ",(0,n.jsx)(t.code,{children:"org.apache.hudi.keygen.KeyGenerator"})," extract a key out of incoming records. ",(0,n.jsxs)("ul",{children:[(0,n.jsx)("li",{children:"When set, the configured value takes precedence to be in effect and automatic inference is not triggered."}),(0,n.jsxs)("li",{children:["When not configured, if ",(0,n.jsx)(t.code,{children:"hoodie.datasource.write.keygenerator.type"})," is set, the configured value is used else automatic inference is triggered."]}),(0,n.jsx)("li",{children:"In case of auto generated record keys, if neither the key generator class nor type are configured, Hudi will also auto infer the partitioning. for eg, if partition field is not configured, hudi will assume its non-partitioned. "})]})," ",(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: KEYGENERATOR_CLASS_NAME"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.hive_style_partitioning"}),(0,n.jsx)(t.td,{children:"false (Optional)"}),(0,n.jsxs)(t.td,{children:["Flag to indicate whether to use Hive style partitioning. If set true, the names of partition folders follow = format. By default false (the names of partition folders are only partition values)",(0,n.jsx)("br",{}),(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: HIVE_STYLE_PARTITIONING_ENABLE"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.partitionpath.urlencode"}),(0,n.jsx)(t.td,{children:"false (Optional)"}),(0,n.jsxs)(t.td,{children:["Should we url encode the partition path value, before creating the folder structure.",(0,n.jsx)("br",{}),(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: URL_ENCODE_PARTITIONING"})]})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["For all advanced configs refer ",(0,n.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations#KEY_GENERATOR",children:"here"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"simple",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/SimpleKeyGenerator.java",children:"SIMPLE"})}),"\n",(0,n.jsx)(t.p,{children:"This is the most commonly used option. Record key is generated from two fields from the schema, one for record key and one for partition path. Values are interpreted as is from dataframe and converted to string."}),"\n",(0,n.jsx)(t.h3,{id:"complex",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/ComplexKeyGenerator.java",children:"COMPLEX"})}),"\n",(0,n.jsxs)(t.p,{children:["Both record key and partition paths comprise one or more than one field by name(combination of multiple fields). Fields\nare expected to be comma separated in the config value. For example ",(0,n.jsx)(t.code,{children:'"Hoodie.datasource.write.recordkey.field" : \u201ccol1,col4\u201d'})]}),"\n",(0,n.jsx)(t.h3,{id:"non_partition",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/NonpartitionedKeyGenerator.java",children:"NON_PARTITION"})}),"\n",(0,n.jsx)(t.p,{children:"If your hudi dataset is not partitioned, you could use this \u201cNonpartitionedKeyGenerator\u201d which will return an empty\npartition for all records. In other words, all records go to the same partition (which is empty \u201c\u201d)"}),"\n",(0,n.jsx)(t.h3,{id:"custom",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/CustomKeyGenerator.java",children:"CUSTOM"})}),"\n",(0,n.jsx)(t.p,{children:"This is a generic implementation of KeyGenerator where users are able to leverage the benefits of SimpleKeyGenerator,\nComplexKeyGenerator and TimestampBasedKeyGenerator all at the same time. One can configure record key and partition\npaths as a single field or a combination of fields."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"hoodie.datasource.write.recordkey.field\nhoodie.datasource.write.partitionpath.field\nhoodie.datasource.write.keygenerator.class=org.apache.hudi.keygen.CustomKeyGenerator\n"})}),"\n",(0,n.jsxs)(t.p,{children:["This keyGenerator is particularly useful if you want to define\ncomplex partition paths involving regular fields and timestamp based fields. It expects value for prop ",(0,n.jsx)(t.code,{children:'"hoodie.datasource.write.partitionpath.field"'}),'\nin a specific format. The format should be "field1',":PartitionKeyType1",",field2",":PartitionKeyType2",'..."']}),"\n",(0,n.jsxs)(t.p,{children:["The complete partition path is created as\n",(0,n.jsx)(t.code,{children:"/ "}),"\nand so on. Each partition key type could either be SIMPLE or TIMESTAMP."]}),"\n",(0,n.jsxs)(t.p,{children:["Example config value: ",(0,n.jsx)(t.code,{children:"\u201cfield_3:simple,field_5:timestamp\u201d"})]}),"\n",(0,n.jsx)(t.p,{children:"RecordKey config value is either single field incase of SimpleKeyGenerator or a comma separate field names if referring to ComplexKeyGenerator.\nExample:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"hoodie.datasource.write.recordkey.field=field1,field2\n"})}),"\n",(0,n.jsxs)(t.p,{children:["This will create your record key in the format ",(0,n.jsx)(t.code,{children:"field1:value1,field2:value2"})," and so on, otherwise you can specify only one field in case of simple record keys. ",(0,n.jsx)(t.code,{children:"CustomKeyGenerator"})," class defines an enum ",(0,n.jsx)(t.code,{children:"PartitionKeyType"})," for configuring partition paths. It can take two possible values - SIMPLE and TIMESTAMP.\nThe value for ",(0,n.jsx)(t.code,{children:"hoodie.datasource.write.partitionpath.field"})," property in case of partitioned tables needs to be provided in the format ",(0,n.jsx)(t.code,{children:"field1:PartitionKeyType1,field2:PartitionKeyType2"})," and so on. For example, if you want to create partition path using 2 fields ",(0,n.jsx)(t.code,{children:"country"})," and ",(0,n.jsx)(t.code,{children:"date"})," where the latter has timestamp based values and needs to be customised in a given format, you can specify the following"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"hoodie.datasource.write.partitionpath.field=country:SIMPLE,date:TIMESTAMP\n"})}),"\n",(0,n.jsxs)(t.p,{children:["This will create the partition path in the format ",(0,n.jsx)(t.code,{children:"/"})," or ",(0,n.jsx)(t.code,{children:"country=/date="})," depending on whether you want hive style partitioning or not."]}),"\n",(0,n.jsx)(t.h3,{id:"timestamp",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/TimestampBasedKeyGenerator.java",children:"TIMESTAMP"})}),"\n",(0,n.jsx)(t.p,{children:"This key generator relies on timestamps for the partition field. The field values are interpreted as timestamps\nand not just converted to string while generating partition path value for records. Record key is same as before where it is chosen by\nfield name. Users are expected to set few more configs to use this KeyGenerator."}),"\n",(0,n.jsx)(t.p,{children:"Configs to be set:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Default"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.keygen.timebased.timestamp.type"}),(0,n.jsxs)(t.td,{children:["N/A ",(0,n.jsx)(t.strong,{children:"(Required)"})]}),(0,n.jsx)(t.td,{children:"Required only when the key generator is TimestampBasedKeyGenerator. One of the timestamp types supported(UNIX_TIMESTAMP, DATE_STRING, MIXED, EPOCHMILLISECONDS, SCALAR)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.keygen.timebased.output.dateformat"}),(0,n.jsx)(t.td,{children:'"" (Optional)'}),(0,n.jsxs)(t.td,{children:["Output date format such as ",(0,n.jsx)(t.code,{children:"yyyy-MM-dd'T'HH:mm:ss.SSSZ"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.keygen.timebased.timezone"}),(0,n.jsx)(t.td,{children:'"UTC" (Optional)'}),(0,n.jsxs)(t.td,{children:["Timezone of both input and output timestamp if they are the same, such as ",(0,n.jsx)(t.code,{children:"UTC"}),". Please use ",(0,n.jsx)(t.code,{children:"hoodie.keygen.timebased.input.timezone"})," and ",(0,n.jsx)(t.code,{children:"hoodie.keygen.timebased.output.timezone"})," instead if the input and output timezones are different."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.keygen.timebased.input.dateformat"}),(0,n.jsx)(t.td,{children:'"" (Optional)'}),(0,n.jsxs)(t.td,{children:["Input date format such as ",(0,n.jsx)(t.code,{children:"yyyy-MM-dd'T'HH:mm:ss.SSSZ"}),"."]})]})]})]}),"\n",(0,n.jsx)(t.p,{children:"Let's go over some example values for TimestampBasedKeyGenerator."}),"\n",(0,n.jsx)(t.h4,{id:"timestamp-is-gmt",children:"Timestamp is GMT"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"EPOCHMILLISECONDS"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyy-MM-dd hh"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timezone"})}),(0,n.jsx)(t.td,{children:'"GMT+8:00"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["Input Field value: \u201c1578283932000L\u201d ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c2020-01-06 12\u201d"]}),"\n",(0,n.jsxs)(t.p,{children:["If input field value is null for some rows. ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c1970-01-01 08\u201d"]}),"\n",(0,n.jsx)(t.h4,{id:"timestamp-is-date_string",children:"Timestamp is DATE_STRING"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyy-MM-dd hh"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timezone"})}),(0,n.jsx)(t.td,{children:'"GMT+8:00"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:['"yyyy-MM-dd hh:mm',":ss",'"']})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["Input field value: \u201c2020-01-06 12:12:12\u201d ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c2020-01-06 12\u201d"]}),"\n",(0,n.jsxs)(t.p,{children:["If input field value is null for some rows. ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c1970-01-01 12:00:00\u201d"]}),"\n",(0,n.jsx)("br",{}),"\n",(0,n.jsx)(t.h4,{id:"scalar-examples",children:"Scalar examples"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"SCALAR"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyy-MM-dd hh"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timezone"})}),(0,n.jsx)(t.td,{children:'"GMT"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.scalar.time.unit"})}),(0,n.jsx)(t.td,{children:'"days"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["Input field value: \u201c20000L\u201d ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c2024-10-04 12\u201d"]}),"\n",(0,n.jsxs)(t.p,{children:["If input field value is null. ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c1970-01-02 12\u201d"]}),"\n",(0,n.jsx)(t.h4,{id:"iso8601withmsz-with-single-input-format",children:"ISO8601WithMsZ with Single Input format"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:["\"yyyy-MM-dd'T'HH:mm",":ss",'.SSSZ"']})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat.list.delimiter.regex"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.timezone"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyyMMddHH"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.timezone"})}),(0,n.jsx)(t.td,{children:'"GMT"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:['Input field value: "2020-04-01T13:01:33.428Z" ',(0,n.jsx)("br",{}),'\nPartition path generated from key generator: "2020040113"']}),"\n",(0,n.jsx)(t.h4,{id:"iso8601withmsz-with-multiple-input-formats",children:"ISO8601WithMsZ with Multiple Input formats"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:["\"yyyy-MM-dd'T'HH:mm",":ssZ",",yyyy-MM-dd'T'HH:mm",":ss",'.SSSZ"']})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat.list.delimiter.regex"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.timezone"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyyMMddHH"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.timezone"})}),(0,n.jsx)(t.td,{children:'"UTC"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:['Input field value: "2020-04-01T13:01:33.428Z" ',(0,n.jsx)("br",{}),'\nPartition path generated from key generator: "2020040113"']}),"\n",(0,n.jsx)(t.h4,{id:"iso8601noms-with-offset-using-multiple-input-formats",children:"ISO8601NoMs with offset using multiple input formats"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:["\"yyyy-MM-dd'T'HH:mm",":ssZ",",yyyy-MM-dd'T'HH:mm",":ss",'.SSSZ"']})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat.list.delimiter.regex"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.timezone"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyyMMddHH"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.timezone"})}),(0,n.jsx)(t.td,{children:'"UTC"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:['Input field value: "2020-04-01T13:01:33-',(0,n.jsx)(t.strong,{children:"05:00"}),'" ',(0,n.jsx)("br",{}),'\nPartition path generated from key generator: "2020040118"']}),"\n",(0,n.jsx)(t.h4,{id:"input-as-short-date-string-and-expect-date-in-date-format",children:"Input as short date string and expect date in date format"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:["\"yyyy-MM-dd'T'HH:mm",":ssZ",",yyyy-MM-dd'T'HH:mm",":ss",'.SSSZ,yyyyMMdd"']})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat.list.delimiter.regex"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.timezone"})}),(0,n.jsx)(t.td,{children:'"UTC"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"MM/dd/yyyy"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.timezone"})}),(0,n.jsx)(t.td,{children:'"UTC"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:['Input field value: "20200401" ',(0,n.jsx)("br",{}),'\nPartition path generated from key generator: "04/01/2020"']}),"\n",(0,n.jsx)(t.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,n.jsx)("h3",{children:"Blogs"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://www.onehouse.ai/blog/hudi-metafields-demystified",children:"Hudi metafields demystified"})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://medium.com/@simpsons/primary-key-and-partition-generators-with-apache-hudi-f0e4d71d9d26",children:"Primary key and Partition Generators with Apache Hudi"})}),"\n"]})]})}function c(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},28453:(e,t,i)=>{i.d(t,{R:()=>d,x:()=>a});var r=i(96540);const n={},s=r.createContext(n);function d(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/ea8366f8.49359600.js b/content/assets/js/ea8366f8.60a4a0cc.js similarity index 98% rename from content/assets/js/ea8366f8.49359600.js rename to content/assets/js/ea8366f8.60a4a0cc.js index 511a371eb8233..ba963690d05f3 100644 --- a/content/assets/js/ea8366f8.49359600.js +++ b/content/assets/js/ea8366f8.60a4a0cc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[23700],{49188:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"concurrency_control","title":"Concurrency Control","description":"Concurrency control defines how different writers/readers/table services coordinate access to a Hudi table. Hudi ensures atomic writes, by way of publishing commits atomically to the timeline,","source":"@site/docs/concurrency_control.md","sourceDirName":".","slug":"/concurrency_control","permalink":"/docs/next/concurrency_control","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/concurrency_control.md","tags":[],"version":"current","frontMatter":{"title":"Concurrency Control","summary":"In this page, we will discuss how to perform concurrent writes to Hudi Tables.","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4,"last_modified_at":"2021-03-19T19:59:57.000Z"},"sidebar":"docs","previous":{"title":"Indexes","permalink":"/docs/next/indexes"},"next":{"title":"Schema Evolution","permalink":"/docs/next/schema_evolution"}}');var r=t(74848),o=t(28453);const s={title:"Concurrency Control",summary:"In this page, we will discuss how to perform concurrent writes to Hudi Tables.",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4,last_modified_at:new Date("2021-03-19T19:59:57.000Z")},a=void 0,c={},l=[{value:"Distributed Locking",id:"distributed-locking",level:2},{value:"Zookeeper based",id:"zookeeper-based",level:4},{value:"HiveMetastore based",id:"hivemetastore-based",level:4},{value:"Amazon DynamoDB based",id:"amazon-dynamodb-based",level:4},{value:"FileSystem based (not for production use)",id:"filesystem-based-not-for-production-use",level:4},{value:"Simple Single writer + table services",id:"simple-single-writer--table-services",level:2},{value:"Inline table services",id:"inline-table-services",level:3},{value:"Async table services",id:"async-table-services",level:3},{value:"Full-on Multi-writer + Async table services",id:"full-on-multi-writer--async-table-services",level:2},{value:"Multi Writer Guarantees",id:"multi-writer-guarantees",level:4},{value:"Non-Blocking Concurrency Control",id:"non-blocking-concurrency-control",level:2},{value:"Early conflict Detection",id:"early-conflict-detection",level:2},{value:"Enabling Multi Writing",id:"enabling-multi-writing",level:2},{value:"Multi Writing via Hudi Streamer",id:"multi-writing-via-hudi-streamer",level:3},{value:"Multi Writing via Spark Datasource Writer",id:"multi-writing-via-spark-datasource-writer",level:3},{value:"Disabling Multi Writing",id:"disabling-multi-writing",level:2},{value:"OCC Best Practices",id:"occ-best-practices",level:2},{value:"Caveats",id:"caveats",level:2},{value:"Related Resources",id:"related-resources",level:2}];function d(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",mdxAdmonitionTitle:"mdxAdmonitionTitle",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(i.p,{children:["Concurrency control defines how different writers/readers/table services coordinate access to a Hudi table. Hudi ensures atomic writes, by way of publishing commits atomically to the timeline,\nstamped with an instant time that denotes the time at which the action is deemed to have occurred. Unlike general purpose file version control, Hudi draws clear distinction between\nwriter processes that issue ",(0,r.jsx)(i.a,{href:"write_operations",children:"write operations"})," and table services that (re)write data/metadata to optimize/perform bookkeeping and\nreaders (that execute queries and read data)."]}),"\n",(0,r.jsx)(i.p,{children:"Hudi provides"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Snapshot isolation"})," between all three types of processes, meaning they all operate on a consistent snapshot of the table."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Optimistic concurrency control (OCC)"})," between writers to provide standard relational database semantics."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Multiversion Concurrency Control (MVCC)"})," based concurrency control between writers and table-services and between different table services."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Non-blocking Concurrency Control (NBCC)"})," between writers, to provide streaming semantics and avoiding live-locks/starvation between writers."]}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"In this section, we will discuss the different concurrency controls supported by Hudi and how they are leveraged to provide flexible deployment models for single and multiple writer scenarios.\nWe\u2019ll also describe ways to ingest data into a Hudi Table from multiple writers using different writers, like Hudi Streamer, Hudi datasource, Spark Structured Streaming and Spark SQL."}),"\n",(0,r.jsxs)(i.admonition,{type:"note",children:[(0,r.jsx)(i.p,{children:"If there is only one process performing writing AND async/inline table services on the table, you can\navoid the overhead of a distributed lock requirement by configuring the in process lock provider."}),(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-properties",children:"hoodie.write.lock.provider=org.apache.hudi.client.transaction.lock.InProcessLockProvider\n"})})]}),"\n",(0,r.jsx)(i.h2,{id:"distributed-locking",children:"Distributed Locking"}),"\n",(0,r.jsxs)(i.p,{children:["A pre-requisite for distributed co-ordination in Hudi, like many other distributed database systems is a distributed lock provider, that different processes can use to plan, schedule and\nexecute actions on the Hudi timeline in a concurrent fashion. Locks are also used to ",(0,r.jsx)(i.a,{href:"timeline#truetime-generation",children:"generate TrueTime"}),", as discussed before."]}),"\n",(0,r.jsx)(i.p,{children:"External locking is typically used in conjunction with optimistic concurrency control\nbecause it provides a way to prevent conflicts that might occur when two or more transactions (commits in our case) attempt to modify the same resource concurrently.\nWhen a transaction attempts to modify a resource that is currently locked by another transaction, it must wait until the lock is released before proceeding."}),"\n",(0,r.jsx)(i.p,{children:"In case of multi-writing in Hudi, the locks are acquired on the Hudi table for a very short duration during specific phases (such as just before committing the writes or before scheduling table services) instead of locking for the entire span of time. This approach allows multiple writers to work on the same table simultaneously, increasing concurrency and avoids conflicts."}),"\n",(0,r.jsxs)(i.p,{children:["There are 4 different lock providers that require different configurations to be set. Please refer to comprehensive locking configs ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/next/configurations#LOCK",children:"here"}),"."]}),"\n",(0,r.jsx)(i.h4,{id:"zookeeper-based",children:"Zookeeper based"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.provider=org.apache.hudi.client.transaction.lock.ZookeeperBasedLockProvider\n"})}),"\n",(0,r.jsx)(i.p,{children:"Following are the basic configs required to setup this lock provider:"}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Config Name"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.zookeeper.base_path"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["The base path on Zookeeper under which to create lock related ZNodes. This should be same for all concurrent writers to the same table",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: ZK_BASE_PATH"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.zookeeper.port"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["Zookeeper port to connect to.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: ZK_PORT"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.zookeeper.url"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["Zookeeper URL to connect to.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: ZK_CONNECT_URL"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]})]})]}),"\n",(0,r.jsx)(i.h4,{id:"hivemetastore-based",children:"HiveMetastore based"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.provider=org.apache.hudi.hive.transaction.lock.HiveMetastoreBasedLockProvider\n"})}),"\n",(0,r.jsx)(i.p,{children:"Following are the basic configs required to setup this lock provider:"}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Config Name"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.hivemetastore.database"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["For Hive based lock provider, the Hive database to acquire lock against",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: HIVE_DATABASE_NAME"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.hivemetastore.table"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["For Hive based lock provider, the Hive table to acquire lock against",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: HIVE_TABLE_NAME"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]})]})]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.code,{children:"The HiveMetastore URI's are picked up from the hadoop configuration file loaded during runtime."})}),"\n",(0,r.jsx)(i.h4,{id:"amazon-dynamodb-based",children:"Amazon DynamoDB based"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.provider=org.apache.hudi.aws.transaction.lock.DynamoDBBasedLockProvider\n"})}),"\n",(0,r.jsxs)(i.p,{children:["Amazon DynamoDB based lock provides a simple way to support multi writing across different clusters. You can refer to the\n",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations#DynamoDB-based-Locks-Configurations",children:"DynamoDB based Locks Configurations"}),"\nsection for the details of each related configuration knob. Following are the basic configs required to setup this lock provider:"]}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Config Name"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"})]})}),(0,r.jsx)(i.tbody,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.dynamodb.endpoint_url"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["For DynamoDB based lock provider, the url endpoint used for Amazon DynamoDB service. Useful for development with a local dynamodb instance.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: DYNAMODB_ENDPOINT_URL"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.10.1"})]})]})})]}),"\n",(0,r.jsxs)(i.p,{children:["For advanced configs refer ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/next/configurations#DynamoDB-based-Locks-Configurations",children:"here"})]}),"\n",(0,r.jsxs)(i.p,{children:["When using the DynamoDB-based lock provider, the name of the DynamoDB table acting as the lock table for Hudi is\nspecified by the config ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.table"}),". This DynamoDB table is automatically created by Hudi, so you\ndon't have to create the table yourself. If you want to use an existing DynamoDB table, make sure that an attribute with\nthe name ",(0,r.jsx)(i.code,{children:"key"})," is present in the table. The ",(0,r.jsx)(i.code,{children:"key"})," attribute should be the partition key of the DynamoDB table. The\nconfig ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.partition_key"})," specifies the value to put for the ",(0,r.jsx)(i.code,{children:"key"})," attribute (not the attribute\nname), which is used for the lock on the same table. By default, ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.partition_key"})," is set to\nthe table name, so that multiple writers writing to the same table share the same lock. If you customize the name, make\nsure it's the same across multiple writers."]}),"\n",(0,r.jsx)(i.p,{children:"Also, to set up the credentials for accessing AWS resources, customers can pass the following props to Hudi jobs:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.aws.access.key\nhoodie.aws.secret.key\nhoodie.aws.session.token\n"})}),"\n",(0,r.jsxs)(i.p,{children:["If not configured, Hudi falls back to use ",(0,r.jsx)(i.a,{href:"https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/DefaultAWSCredentialsProviderChain.html",children:"DefaultAWSCredentialsProviderChain"}),"."]}),"\n",(0,r.jsx)(i.p,{children:"IAM policy for your service instance will need to add the following permissions:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-json",children:'{\n "Sid":"DynamoDBLocksTable",\n "Effect": "Allow",\n "Action": [\n "dynamodb:CreateTable",\n "dynamodb:DeleteItem",\n "dynamodb:DescribeTable",\n "dynamodb:GetItem",\n "dynamodb:PutItem",\n "dynamodb:Scan",\n "dynamodb:UpdateItem"\n ],\n "Resource": "arn:${Partition}:dynamodb:${Region}:${Account}:table/${TableName}"\n}\n'})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.code,{children:"TableName"})," : same as ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.partition_key"})]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.code,{children:"Region"}),": same as ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.region"})]}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"AWS SDK dependencies are not bundled with Hudi from v0.10.x and will need to be added to your classpath.\nAdd the following Maven packages (check the latest versions at time of install):"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"com.amazonaws:dynamodb-lock-client\ncom.amazonaws:aws-java-sdk-dynamodb\ncom.amazonaws:aws-java-sdk-core\n"})}),"\n",(0,r.jsx)(i.h4,{id:"filesystem-based-not-for-production-use",children:"FileSystem based (not for production use)"}),"\n",(0,r.jsx)(i.p,{children:"FileSystem based lock provider supports multiple writers cross different jobs/applications based on atomic create/delete operations of the underlying filesystem."}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.provider=org.apache.hudi.client.transaction.lock.FileSystemBasedLockProvider\n"})}),"\n",(0,r.jsxs)(i.p,{children:["When using the FileSystem based lock provider, by default, the lock file will store into ",(0,r.jsx)(i.code,{children:"hoodie.base.path"}),"+",(0,r.jsx)(i.code,{children:"/.hoodie/lock"}),". You may use a custom folder to store the lock file by specifying ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.filesystem.path"}),"."]}),"\n",(0,r.jsxs)(i.p,{children:["In case the lock cannot release during job crash, you can set ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.filesystem.expire"})," (lock will never expire by default) to a desired expire time in minutes. You may also delete lock file manually in such situation."]}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsx)(i.p,{children:"FileSystem based lock provider is not supported with cloud storage like S3 or GCS."})}),"\n",(0,r.jsx)(i.h2,{id:"simple-single-writer--table-services",children:"Simple Single writer + table services"}),"\n",(0,r.jsx)(i.p,{children:"Data lakehouse pipelines tend to be predominantly single writer, with the most common need for distributed co-ordination on a table coming from table management. For e.g. a Apache Flink\njob producing fast writes into a table, requiring regular file-size management or cleaning. Hudi's storage engine and platform tools provide a lot of support for such common scenarios."}),"\n",(0,r.jsx)(i.h3,{id:"inline-table-services",children:"Inline table services"}),"\n",(0,r.jsx)(i.p,{children:"This is the simplest form of concurrency, meaning there is no concurrency at all in the write processes. In this model, Hudi eliminates the need for concurrency control and maximizes throughput by supporting these table services out-of-box and running inline after every write to the table. Execution plans are idempotent, persisted to the timeline and auto-recover from failures. For most simple use-cases, this means just writing is sufficient to get a well-managed table that needs no concurrency control."}),"\n",(0,r.jsxs)(i.p,{children:["There is no actual concurrent writing in this model. ",(0,r.jsx)(i.strong,{children:"MVCC"})," is leveraged to provide snapshot isolation guarantees between ingestion writer and multiple readers and also between multiple table service writers and readers. Writes to the table either from ingestion or from table services produce versioned data that are available to readers only after the writes are committed. Until then, readers can access only the previous version of the data."]}),"\n",(0,r.jsx)(i.p,{children:"A single writer with all table services such as cleaning, clustering, compaction, etc can be configured to be inline (such as Hudi Streamer sync-once mode and Spark Datasource with default configs) without any additional configs."}),"\n",(0,r.jsx)(i.h3,{id:"async-table-services",children:"Async table services"}),"\n",(0,r.jsxs)(i.p,{children:["Hudi provides the option of running the table services in an async fashion, where most of the heavy lifting (e.g actually rewriting the columnar data by compaction service) is done asynchronously. In this model, the async deployment eliminates any repeated wasteful retries and optimizes the table using clustering techniques while a single writer consumes the writes to the table without having to be blocked by such table services. This model avoids the need for taking an ",(0,r.jsx)(i.a,{href:"#external-locking-and-lock-providers",children:"external lock"})," to control concurrency and avoids the need to separately orchestrate and monitor offline table services jobs.."]}),"\n",(0,r.jsxs)(i.p,{children:["A single writer along with async table services runs in the same process. For example, you can have a Hudi Streamer in continuous mode write to a MOR table using async compaction; you can use Spark Streaming (where ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/compaction",children:"compaction"})," is async by default), and you can use Flink streaming or your own job setup and enable async table services inside the same writer."]}),"\n",(0,r.jsxs)(i.p,{children:["Hudi leverages ",(0,r.jsx)(i.strong,{children:"MVCC"})," in this model to support running any number of table service jobs concurrently, without any concurrency conflict. This is made possible by ensuring Hudi 's ingestion writer and async table services coordinate among themselves to ensure no conflicts and avoid race conditions. The same single write guarantees described in Model A above can be achieved in this model as well.\nWith this model users don't need to spin up different spark jobs and manage the orchestration among it. For larger deployments, this model can ease the operational burden significantly while getting the table services running without blocking the writers."]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Single Writer Guarantees"})}),"\n",(0,r.jsxs)(i.p,{children:["In this model, the following are the guarantees on ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/write_operations/",children:"write operations"})," to expect:"]}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"UPSERT Guarantee"}),": The target table will NEVER show duplicates."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"INSERT Guarantee"}),": The target table wilL NEVER have duplicates if dedup: ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations#hoodiedatasourcewriteinsertdropduplicates",children:(0,r.jsx)(i.code,{children:"hoodie.datasource.write.insert.drop.duplicates"})})," & ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations/#hoodiecombinebeforeinsert",children:(0,r.jsx)(i.code,{children:"hoodie.combine.before.insert"})}),", is enabled."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"BULK_INSERT Guarantee"}),": The target table will NEVER have duplicates if dedup: ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations#hoodiedatasourcewriteinsertdropduplicates",children:(0,r.jsx)(i.code,{children:"hoodie.datasource.write.insert.drop.duplicates"})})," & ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations/#hoodiecombinebeforeinsert",children:(0,r.jsx)(i.code,{children:"hoodie.combine.before.insert"})}),", is enabled."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"INCREMENTAL QUERY Guarantee"}),": Data consumption and checkpoints are NEVER out of order."]}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"full-on-multi-writer--async-table-services",children:"Full-on Multi-writer + Async table services"}),"\n",(0,r.jsxs)(i.p,{children:["Hudi has introduced a new concurrency mode ",(0,r.jsx)(i.code,{children:"NON_BLOCKING_CONCURRENCY_CONTROL"}),", where unlike OCC, multiple writers can\noperate on the table with non-blocking conflict resolution. The writers can write into the same file group with the\nconflicts resolved automatically by the query reader and the compactor. The new concurrency mode is currently\navailable for preview in version 1.0.0-beta only. You can read more about it under section ",(0,r.jsx)(i.a,{href:"#model-c-multi-writer",children:"Model C: Multi-writer"}),"."]}),"\n",(0,r.jsx)(i.p,{children:"It is not always possible to serialize all write operations to a table (such as UPSERT, INSERT or DELETE) into the same write process and therefore, multi-writing capability may be required.\nIn multi-writing, disparate distributed processes run in parallel or overlapping time windows to write to the same table. In such cases, an external locking mechanism is a must to safely\ncoordinate concurrent accesses. Here are few different scenarios that would all fall under multi-writing:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Multiple ingestion writers to the same table",":For"," instance, two Spark Datasource writers working on different sets of partitions form a source kafka topic."]}),"\n",(0,r.jsx)(i.li,{children:"Multiple ingestion writers to the same table, including one writer with async table services: For example, a Hudi Streamer with async compaction for regular ingestion & a Spark Datasource writer for backfilling."}),"\n",(0,r.jsx)(i.li,{children:"A single ingestion writer and a separate compaction (HoodieCompactor) or clustering (HoodieClusteringJob) job apart from the ingestion writer: This is considered as multi-writing as they are not running in the same process."}),"\n"]}),"\n",(0,r.jsxs)(i.p,{children:["Hudi's concurrency model intelligently differentiates actual writing to the table from table services that manage or optimize the table. Hudi offers similar ",(0,r.jsx)(i.strong,{children:"optimistic concurrency control across multiple writers"}),", but ",(0,r.jsx)(i.strong,{children:"table services can still execute completely lock-free and async"})," as long as they run in the same process as one of the writers.\nFor multi-writing, Hudi leverages file level optimistic concurrency control(OCC). For example, when two writers write to non overlapping files, both writes are allowed to succeed. However, when the writes from different writers overlap (touch the same set of files), only one of them will succeed. Please note that this feature is currently experimental and requires external lock providers to acquire locks briefly at critical sections during the write. More on lock providers below."]}),"\n",(0,r.jsx)(i.h4,{id:"multi-writer-guarantees",children:"Multi Writer Guarantees"}),"\n",(0,r.jsx)(i.p,{children:"With multiple writers using OCC, these are the write guarantees to expect:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"UPSERT Guarantee"}),": The target table will NEVER show duplicates."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"INSERT Guarantee"}),": The target table MIGHT have duplicates even if dedup is enabled."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"BULK_INSERT Guarantee"}),": The target table MIGHT have duplicates even if dedup is enabled."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"INCREMENTAL PULL Guarantee"}),": Data consumption and checkpoints are NEVER out of order. If there are inflight commits\n(due to multi-writing), incremental queries will not expose the completed commits following the inflight commits."]}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"non-blocking-concurrency-control",children:"Non-Blocking Concurrency Control"}),"\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.code,{children:"NON_BLOCKING_CONCURRENCY_CONTROL"}),", offers the same set of guarantees as mentioned in the case of OCC but without\nexplicit locks for serializing the writes. Lock is only needed for writing the commit metadata to the Hudi timeline. The\ncompletion time for the commits reflects the serialization order and file slicing is done based on completion time.\nMultiple writers can operate on the table with non-blocking conflict resolution. The writers can write into the same\nfile group with the conflicts resolved automatically by the query reader and the compactor. The new concurrency mode is\ncurrently available for preview in version 1.0.0-beta only with the caveat that conflict resolution is not supported yet\nbetween clustering and ingestion. It works for compaction and ingestion, and we can see an example of that with Flink\nwriters ",(0,r.jsx)(i.a,{href:"sql_dml#non-blocking-concurrency-control-experimental",children:"here"}),"."]}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.code,{children:"NON_BLOCKING_CONCURRENCY_CONTROL"})," between ingestion writer and table service writer is not yet supported for clustering.\nPlease use ",(0,r.jsx)(i.code,{children:"OPTIMISTIC_CONCURRENCY_CONTROL"})," for clustering."]})}),"\n",(0,r.jsx)(i.h2,{id:"early-conflict-detection",children:"Early conflict Detection"}),"\n",(0,r.jsx)(i.p,{children:"Multi writing using OCC allows multiple writers to concurrently write and atomically commit to the Hudi table if there is no overlapping data file to be written, to guarantee data consistency, integrity and correctness. Prior to 0.13.0 release, as the OCC (optimistic concurrency control) name suggests, each writer will optimistically proceed with ingestion and towards the end, just before committing will go about conflict resolution flow to deduce overlapping writes and abort one if need be. But this could result in lot of compute waste, since the aborted commit will have to retry from beginning. With 0.13.0, Hudi introduced early conflict deduction leveraging markers in hudi to deduce the conflicts eagerly and abort early in the write lifecyle instead of doing it in the end. For large scale deployments, this might avoid wasting lot o compute resources if there could be overlapping concurrent writers."}),"\n",(0,r.jsxs)(i.p,{children:["To improve the concurrency control, the ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/releases/release-0.13.0#early-conflict-detection-for-multi-writer",children:"0.13.0 release"})," introduced a new feature, early conflict detection in OCC, to detect the conflict during the data writing phase and abort the writing early on once a conflict is detected, using Hudi's marker mechanism. Hudi can now stop a conflicting writer much earlier because of the early conflict detection and release computing resources necessary to cluster, improving resource utilization."]}),"\n",(0,r.jsxs)(i.p,{children:["By default, this feature is turned off. To try this out, a user needs to set ",(0,r.jsx)(i.code,{children:"hoodie.write.concurrency.early.conflict.detection.enable"})," to true, when using OCC for concurrency control (Refer ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/next/configurations#Write-Configurations-advanced-configs",children:"configs"})," page for all relevant configs)."]}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsxs)(i.p,{children:["Early conflict Detection in OCC is an ",(0,r.jsx)(i.strong,{children:"EXPERIMENTAL"})," feature"]})}),"\n",(0,r.jsx)(i.h2,{id:"enabling-multi-writing",children:"Enabling Multi Writing"}),"\n",(0,r.jsx)(i.p,{children:"The following properties are needed to be set appropriately to turn on optimistic concurrency control to achieve multi writing."}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.concurrency.mode=optimistic_concurrency_control\nhoodie.write.lock.provider=\nhoodie.cleaner.policy.failed.writes=LAZY\n"})}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Config Name"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.concurrency.mode"}),(0,r.jsx)(i.td,{children:"SINGLE_WRITER (Optional)"}),(0,r.jsxs)(i.td,{children:[(0,r.jsx)("u",{children:(0,r.jsx)(i.a,{href:"https://github.com/apache/hudi/blob/00ece7bce0a4a8d0019721a28049723821e01842/hudi-common/src/main/java/org/apache/hudi/common/model/WriteConcurrencyMode.java",children:"Concurrency modes"})})," for write operations.",(0,r.jsx)("br",{}),"Possible values:",(0,r.jsx)("br",{}),(0,r.jsxs)("ul",{children:[(0,r.jsxs)("li",{children:[(0,r.jsx)(i.code,{children:"SINGLE_WRITER"}),": Only one active writer to the table. Maximizes throughput."]}),(0,r.jsxs)("li",{children:[(0,r.jsx)(i.code,{children:"OPTIMISTIC_CONCURRENCY_CONTROL"}),": Multiple writers can operate on the table with lazy conflict resolution using locks. This means that only one writer succeeds if multiple writers write to the same file group."]}),(0,r.jsxs)("li",{children:[(0,r.jsx)(i.code,{children:"NON_BLOCKING_CONCURRENCY_CONTROL"}),": Multiple writers can operate on the table with non-blocking conflict resolution. The writers can write into the same file group with the conflicts resolved automatically by the query reader and the compactor."]})]}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: WRITE_CONCURRENCY_MODE"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.provider"}),(0,r.jsx)(i.td,{children:"org.apache.hudi.client.transaction.lock.ZookeeperBasedLockProvider (Optional)"}),(0,r.jsxs)(i.td,{children:["Lock provider class name, user can provide their own implementation of LockProvider which should be subclass of org.apache.hudi.common.lock.LockProvider",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: LOCK_PROVIDER_CLASS_NAME"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.cleaner.policy.failed.writes"}),(0,r.jsx)(i.td,{children:"EAGER (Optional)"}),(0,r.jsxs)(i.td,{children:["org.apache.hudi.common.model.HoodieFailedWritesCleaningPolicy: Policy that controls how to clean up failed writes. Hudi will delete any files written by failed writes to re-claim space. EAGER(default): Clean failed writes inline after every write operation. LAZY: Clean failed writes lazily after heartbeat timeout when the cleaning service runs. This policy is required when multi-writers are enabled. NEVER: Never clean failed writes.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: FAILED_WRITES_CLEANER_POLICY"})]})]})]})]}),"\n",(0,r.jsx)(i.h3,{id:"multi-writing-via-hudi-streamer",children:"Multi Writing via Hudi Streamer"}),"\n",(0,r.jsxs)(i.p,{children:["The ",(0,r.jsx)(i.code,{children:"HoodieStreamer"})," utility (part of hudi-utilities-slim-bundle) provides ways to ingest from different sources such as DFS or Kafka, with the following capabilities."]}),"\n",(0,r.jsx)(i.p,{children:"Using optimistic_concurrency_control via Hudi Streamer requires adding the above configs to the properties file that can be passed to the\njob. For example below, adding the configs to kafka-source.properties file and passing them to Hudi Streamer will enable optimistic concurrency.\nA Hudi Streamer job can then be triggered as follows:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-java",children:'[hoodie]$ spark-submit \\\n --jars "packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar,packaging/hudi-spark-bundle/target/hudi-spark3.5-bundle_2.12-1.0.0.jar" \\\n --class org.apache.hudi.utilities.streamer.HoodieStreamer `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` \\\n --props file://${PWD}/hudi-utilities/src/test/resources/streamer-config/kafka-source.properties \\\n --schemaprovider-class org.apache.hudi.utilities.schema.SchemaRegistryProvider \\\n --source-class org.apache.hudi.utilities.sources.AvroKafkaSource \\\n --source-ordering-field impresssiontime \\\n --target-base-path file:\\/\\/\\/tmp/hudi-streamer-op \\ \n --target-table tableName \\\n --op BULK_INSERT\n'})}),"\n",(0,r.jsx)(i.h3,{id:"multi-writing-via-spark-datasource-writer",children:"Multi Writing via Spark Datasource Writer"}),"\n",(0,r.jsxs)(i.p,{children:["The ",(0,r.jsx)(i.code,{children:"hudi-spark"})," module offers the DataSource API to write (and read) a Spark DataFrame into a Hudi table."]}),"\n",(0,r.jsx)(i.p,{children:"Following is an example of how to use optimistic_concurrency_control via spark datasource"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-java",children:'inputDF.write.format("hudi")\n .options(getQuickstartWriteConfigs)\n .option("hoodie.datasource.write.precombine.field", "ts")\n .option("hoodie.cleaner.policy.failed.writes", "LAZY")\n .option("hoodie.write.concurrency.mode", "optimistic_concurrency_control")\n .option("hoodie.write.lock.zookeeper.url", "zookeeper")\n .option("hoodie.write.lock.zookeeper.port", "2181")\n .option("hoodie.write.lock.zookeeper.base_path", "/test")\n .option("hoodie.datasource.write.recordkey.field", "uuid")\n .option("hoodie.datasource.write.partitionpath.field", "partitionpath")\n .option("hoodie.table.name", tableName)\n .mode(Overwrite)\n .save(basePath)\n'})}),"\n",(0,r.jsx)(i.h2,{id:"disabling-multi-writing",children:"Disabling Multi Writing"}),"\n",(0,r.jsx)(i.p,{children:"Remove the following settings that were used to enable multi-writer or override with default values."}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.concurrency.mode=single_writer\nhoodie.cleaner.policy.failed.writes=EAGER\n"})}),"\n",(0,r.jsx)(i.h2,{id:"occ-best-practices",children:"OCC Best Practices"}),"\n",(0,r.jsx)(i.p,{children:"Concurrent Writing to Hudi tables requires acquiring a lock with one of the lock providers mentioned above. Due to several reasons you might want to configure retries to allow your application to acquire the lock."}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsx)(i.li,{children:"Network connectivity or excessive load on servers increasing time for lock acquisition resulting in timeouts"}),"\n",(0,r.jsx)(i.li,{children:"Running a large number of concurrent jobs that are writing to the same hudi table can result in contention during lock acquisition can cause timeouts"}),"\n",(0,r.jsx)(i.li,{children:"In some scenarios of conflict resolution, Hudi commit operations might take upto 10's of seconds while the lock is being held. This can result in timeouts for other jobs waiting to acquire a lock."}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"Set the correct native lock provider client retries."}),"\n",(0,r.jsxs)(i.admonition,{type:"note",children:[(0,r.jsx)(i.mdxAdmonitionTitle,{}),(0,r.jsx)(i.p,{children:"Please note that sometimes these settings are set on the server once and all clients inherit the same configs. Please check your settings before enabling optimistic concurrency."})]}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.wait_time_ms\nhoodie.write.lock.num_retries\n"})}),"\n",(0,r.jsx)(i.p,{children:"Set the correct hudi client retries for Zookeeper & HiveMetastore. This is useful in cases when native client retry settings cannot be changed. Please note that these retries will happen in addition to any native client retries that you may have set."}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.client.wait_time_ms\nhoodie.write.lock.client.num_retries\n"})}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.em,{children:"Setting the right values for these depends on a case by case basis; some defaults have been provided for general cases."})}),"\n",(0,r.jsx)(i.h2,{id:"caveats",children:"Caveats"}),"\n",(0,r.jsxs)(i.p,{children:["If you are using the ",(0,r.jsx)(i.code,{children:"WriteClient"})," API, please note that multiple writes to the table need to be initiated from 2 different instances of the write client.\nIt is ",(0,r.jsx)(i.strong,{children:"NOT"})," recommended to use the same instance of the write client to perform multi writing."]}),"\n",(0,r.jsx)(i.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,r.jsx)("h3",{children:"Videos"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://youtu.be/JP0orl9_0yQ",children:"Hands on Lab with using DynamoDB as lock table for Apache Hudi Data Lakes"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/blog/2024/12/06/non-blocking-concurrency-control",children:"Non Blocking Concurrency Control Flink Demo"})}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},28453:(e,i,t)=>{t.d(i,{R:()=>s,x:()=>a});var n=t(96540);const r={},o=n.createContext(r);function s(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[23700],{49188:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"concurrency_control","title":"Concurrency Control","description":"Concurrency control defines how different writers/readers/table services coordinate access to a Hudi table. Hudi ensures atomic writes, by way of publishing commits atomically to the timeline,","source":"@site/docs/concurrency_control.md","sourceDirName":".","slug":"/concurrency_control","permalink":"/docs/next/concurrency_control","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/concurrency_control.md","tags":[],"version":"current","frontMatter":{"title":"Concurrency Control","summary":"In this page, we will discuss how to perform concurrent writes to Hudi Tables.","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4,"last_modified_at":"2021-03-19T19:59:57.000Z"},"sidebar":"docs","previous":{"title":"Indexes","permalink":"/docs/next/indexes"},"next":{"title":"Schema Evolution","permalink":"/docs/next/schema_evolution"}}');var r=t(74848),o=t(28453);const s={title:"Concurrency Control",summary:"In this page, we will discuss how to perform concurrent writes to Hudi Tables.",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4,last_modified_at:new Date("2021-03-19T19:59:57.000Z")},a=void 0,c={},l=[{value:"Distributed Locking",id:"distributed-locking",level:2},{value:"Zookeeper based",id:"zookeeper-based",level:4},{value:"HiveMetastore based",id:"hivemetastore-based",level:4},{value:"Amazon DynamoDB based",id:"amazon-dynamodb-based",level:4},{value:"FileSystem based (not for production use)",id:"filesystem-based-not-for-production-use",level:4},{value:"Simple Single writer + table services",id:"simple-single-writer--table-services",level:2},{value:"Inline table services",id:"inline-table-services",level:3},{value:"Async table services",id:"async-table-services",level:3},{value:"Full-on Multi-writer + Async table services",id:"full-on-multi-writer--async-table-services",level:2},{value:"Multi Writer Guarantees",id:"multi-writer-guarantees",level:4},{value:"Non-Blocking Concurrency Control",id:"non-blocking-concurrency-control",level:2},{value:"Early conflict Detection",id:"early-conflict-detection",level:2},{value:"Enabling Multi Writing",id:"enabling-multi-writing",level:2},{value:"Multi Writing via Hudi Streamer",id:"multi-writing-via-hudi-streamer",level:3},{value:"Multi Writing via Spark Datasource Writer",id:"multi-writing-via-spark-datasource-writer",level:3},{value:"Disabling Multi Writing",id:"disabling-multi-writing",level:2},{value:"OCC Best Practices",id:"occ-best-practices",level:2},{value:"Caveats",id:"caveats",level:2},{value:"Related Resources",id:"related-resources",level:2}];function d(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",mdxAdmonitionTitle:"mdxAdmonitionTitle",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(i.p,{children:["Concurrency control defines how different writers/readers/table services coordinate access to a Hudi table. Hudi ensures atomic writes, by way of publishing commits atomically to the timeline,\nstamped with an instant time that denotes the time at which the action is deemed to have occurred. Unlike general purpose file version control, Hudi draws clear distinction between\nwriter processes that issue ",(0,r.jsx)(i.a,{href:"write_operations",children:"write operations"})," and table services that (re)write data/metadata to optimize/perform bookkeeping and\nreaders (that execute queries and read data)."]}),"\n",(0,r.jsx)(i.p,{children:"Hudi provides"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Snapshot isolation"})," between all three types of processes, meaning they all operate on a consistent snapshot of the table."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Optimistic concurrency control (OCC)"})," between writers to provide standard relational database semantics."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Multiversion Concurrency Control (MVCC)"})," based concurrency control between writers and table-services and between different table services."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Non-blocking Concurrency Control (NBCC)"})," between writers, to provide streaming semantics and avoiding live-locks/starvation between writers."]}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"In this section, we will discuss the different concurrency controls supported by Hudi and how they are leveraged to provide flexible deployment models for single and multiple writer scenarios.\nWe\u2019ll also describe ways to ingest data into a Hudi Table from multiple writers using different writers, like Hudi Streamer, Hudi datasource, Spark Structured Streaming and Spark SQL."}),"\n",(0,r.jsxs)(i.admonition,{type:"note",children:[(0,r.jsx)(i.p,{children:"If there is only one process performing writing AND async/inline table services on the table, you can\navoid the overhead of a distributed lock requirement by configuring the in process lock provider."}),(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-properties",children:"hoodie.write.lock.provider=org.apache.hudi.client.transaction.lock.InProcessLockProvider\n"})})]}),"\n",(0,r.jsx)(i.h2,{id:"distributed-locking",children:"Distributed Locking"}),"\n",(0,r.jsxs)(i.p,{children:["A pre-requisite for distributed co-ordination in Hudi, like many other distributed database systems is a distributed lock provider, that different processes can use to plan, schedule and\nexecute actions on the Hudi timeline in a concurrent fashion. Locks are also used to ",(0,r.jsx)(i.a,{href:"timeline#truetime-generation",children:"generate TrueTime"}),", as discussed before."]}),"\n",(0,r.jsx)(i.p,{children:"External locking is typically used in conjunction with optimistic concurrency control\nbecause it provides a way to prevent conflicts that might occur when two or more transactions (commits in our case) attempt to modify the same resource concurrently.\nWhen a transaction attempts to modify a resource that is currently locked by another transaction, it must wait until the lock is released before proceeding."}),"\n",(0,r.jsx)(i.p,{children:"In case of multi-writing in Hudi, the locks are acquired on the Hudi table for a very short duration during specific phases (such as just before committing the writes or before scheduling table services) instead of locking for the entire span of time. This approach allows multiple writers to work on the same table simultaneously, increasing concurrency and avoids conflicts."}),"\n",(0,r.jsxs)(i.p,{children:["There are 4 different lock providers that require different configurations to be set. Please refer to comprehensive locking configs ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/next/configurations#LOCK",children:"here"}),"."]}),"\n",(0,r.jsx)(i.h4,{id:"zookeeper-based",children:"Zookeeper based"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.provider=org.apache.hudi.client.transaction.lock.ZookeeperBasedLockProvider\n"})}),"\n",(0,r.jsx)(i.p,{children:"Following are the basic configs required to setup this lock provider:"}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Config Name"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.zookeeper.base_path"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["The base path on Zookeeper under which to create lock related ZNodes. This should be same for all concurrent writers to the same table",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: ZK_BASE_PATH"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.zookeeper.port"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["Zookeeper port to connect to.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: ZK_PORT"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.zookeeper.url"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["Zookeeper URL to connect to.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: ZK_CONNECT_URL"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]})]})]}),"\n",(0,r.jsx)(i.h4,{id:"hivemetastore-based",children:"HiveMetastore based"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.provider=org.apache.hudi.hive.transaction.lock.HiveMetastoreBasedLockProvider\n"})}),"\n",(0,r.jsx)(i.p,{children:"Following are the basic configs required to setup this lock provider:"}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Config Name"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.hivemetastore.database"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["For Hive based lock provider, the Hive database to acquire lock against",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: HIVE_DATABASE_NAME"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.hivemetastore.table"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["For Hive based lock provider, the Hive table to acquire lock against",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: HIVE_TABLE_NAME"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]})]})]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.code,{children:"The HiveMetastore URI's are picked up from the hadoop configuration file loaded during runtime."})}),"\n",(0,r.jsx)(i.h4,{id:"amazon-dynamodb-based",children:"Amazon DynamoDB based"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.provider=org.apache.hudi.aws.transaction.lock.DynamoDBBasedLockProvider\n"})}),"\n",(0,r.jsxs)(i.p,{children:["Amazon DynamoDB based lock provides a simple way to support multi writing across different clusters. You can refer to the\n",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations#DynamoDB-based-Locks-Configurations",children:"DynamoDB based Locks Configurations"}),"\nsection for the details of each related configuration knob. Following are the basic configs required to setup this lock provider:"]}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Config Name"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"})]})}),(0,r.jsx)(i.tbody,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.dynamodb.endpoint_url"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["For DynamoDB based lock provider, the url endpoint used for Amazon DynamoDB service. Useful for development with a local dynamodb instance.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: DYNAMODB_ENDPOINT_URL"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.10.1"})]})]})})]}),"\n",(0,r.jsxs)(i.p,{children:["For advanced configs refer ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/next/configurations#DynamoDB-based-Locks-Configurations",children:"here"})]}),"\n",(0,r.jsxs)(i.p,{children:["When using the DynamoDB-based lock provider, the name of the DynamoDB table acting as the lock table for Hudi is\nspecified by the config ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.table"}),". This DynamoDB table is automatically created by Hudi, so you\ndon't have to create the table yourself. If you want to use an existing DynamoDB table, make sure that an attribute with\nthe name ",(0,r.jsx)(i.code,{children:"key"})," is present in the table. The ",(0,r.jsx)(i.code,{children:"key"})," attribute should be the partition key of the DynamoDB table. The\nconfig ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.partition_key"})," specifies the value to put for the ",(0,r.jsx)(i.code,{children:"key"})," attribute (not the attribute\nname), which is used for the lock on the same table. By default, ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.partition_key"})," is set to\nthe table name, so that multiple writers writing to the same table share the same lock. If you customize the name, make\nsure it's the same across multiple writers."]}),"\n",(0,r.jsx)(i.p,{children:"Also, to set up the credentials for accessing AWS resources, customers can pass the following props to Hudi jobs:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.aws.access.key\nhoodie.aws.secret.key\nhoodie.aws.session.token\n"})}),"\n",(0,r.jsxs)(i.p,{children:["If not configured, Hudi falls back to use ",(0,r.jsx)(i.a,{href:"https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/DefaultAWSCredentialsProviderChain.html",children:"DefaultAWSCredentialsProviderChain"}),"."]}),"\n",(0,r.jsx)(i.p,{children:"IAM policy for your service instance will need to add the following permissions:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-json",children:'{\n "Sid":"DynamoDBLocksTable",\n "Effect": "Allow",\n "Action": [\n "dynamodb:CreateTable",\n "dynamodb:DeleteItem",\n "dynamodb:DescribeTable",\n "dynamodb:GetItem",\n "dynamodb:PutItem",\n "dynamodb:Scan",\n "dynamodb:UpdateItem"\n ],\n "Resource": "arn:${Partition}:dynamodb:${Region}:${Account}:table/${TableName}"\n}\n'})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.code,{children:"TableName"})," : same as ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.partition_key"})]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.code,{children:"Region"}),": same as ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.region"})]}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"AWS SDK dependencies are not bundled with Hudi from v0.10.x and will need to be added to your classpath.\nAdd the following Maven packages (check the latest versions at time of install):"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"com.amazonaws:dynamodb-lock-client\ncom.amazonaws:aws-java-sdk-dynamodb\ncom.amazonaws:aws-java-sdk-core\n"})}),"\n",(0,r.jsx)(i.h4,{id:"filesystem-based-not-for-production-use",children:"FileSystem based (not for production use)"}),"\n",(0,r.jsx)(i.p,{children:"FileSystem based lock provider supports multiple writers cross different jobs/applications based on atomic create/delete operations of the underlying filesystem."}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.provider=org.apache.hudi.client.transaction.lock.FileSystemBasedLockProvider\n"})}),"\n",(0,r.jsxs)(i.p,{children:["When using the FileSystem based lock provider, by default, the lock file will store into ",(0,r.jsx)(i.code,{children:"hoodie.base.path"}),"+",(0,r.jsx)(i.code,{children:"/.hoodie/lock"}),". You may use a custom folder to store the lock file by specifying ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.filesystem.path"}),"."]}),"\n",(0,r.jsxs)(i.p,{children:["In case the lock cannot release during job crash, you can set ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.filesystem.expire"})," (lock will never expire by default) to a desired expire time in minutes. You may also delete lock file manually in such situation."]}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsx)(i.p,{children:"FileSystem based lock provider is not supported with cloud storage like S3 or GCS."})}),"\n",(0,r.jsx)(i.h2,{id:"simple-single-writer--table-services",children:"Simple Single writer + table services"}),"\n",(0,r.jsx)(i.p,{children:"Data lakehouse pipelines tend to be predominantly single writer, with the most common need for distributed co-ordination on a table coming from table management. For e.g. a Apache Flink\njob producing fast writes into a table, requiring regular file-size management or cleaning. Hudi's storage engine and platform tools provide a lot of support for such common scenarios."}),"\n",(0,r.jsx)(i.h3,{id:"inline-table-services",children:"Inline table services"}),"\n",(0,r.jsx)(i.p,{children:"This is the simplest form of concurrency, meaning there is no concurrency at all in the write processes. In this model, Hudi eliminates the need for concurrency control and maximizes throughput by supporting these table services out-of-box and running inline after every write to the table. Execution plans are idempotent, persisted to the timeline and auto-recover from failures. For most simple use-cases, this means just writing is sufficient to get a well-managed table that needs no concurrency control."}),"\n",(0,r.jsxs)(i.p,{children:["There is no actual concurrent writing in this model. ",(0,r.jsx)(i.strong,{children:"MVCC"})," is leveraged to provide snapshot isolation guarantees between ingestion writer and multiple readers and also between multiple table service writers and readers. Writes to the table either from ingestion or from table services produce versioned data that are available to readers only after the writes are committed. Until then, readers can access only the previous version of the data."]}),"\n",(0,r.jsx)(i.p,{children:"A single writer with all table services such as cleaning, clustering, compaction, etc can be configured to be inline (such as Hudi Streamer sync-once mode and Spark Datasource with default configs) without any additional configs."}),"\n",(0,r.jsx)(i.h3,{id:"async-table-services",children:"Async table services"}),"\n",(0,r.jsxs)(i.p,{children:["Hudi provides the option of running the table services in an async fashion, where most of the heavy lifting (e.g actually rewriting the columnar data by compaction service) is done asynchronously. In this model, the async deployment eliminates any repeated wasteful retries and optimizes the table using clustering techniques while a single writer consumes the writes to the table without having to be blocked by such table services. This model avoids the need for taking an ",(0,r.jsx)(i.a,{href:"#external-locking-and-lock-providers",children:"external lock"})," to control concurrency and avoids the need to separately orchestrate and monitor offline table services jobs.."]}),"\n",(0,r.jsxs)(i.p,{children:["A single writer along with async table services runs in the same process. For example, you can have a Hudi Streamer in continuous mode write to a MOR table using async compaction; you can use Spark Streaming (where ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/compaction",children:"compaction"})," is async by default), and you can use Flink streaming or your own job setup and enable async table services inside the same writer."]}),"\n",(0,r.jsxs)(i.p,{children:["Hudi leverages ",(0,r.jsx)(i.strong,{children:"MVCC"})," in this model to support running any number of table service jobs concurrently, without any concurrency conflict. This is made possible by ensuring Hudi 's ingestion writer and async table services coordinate among themselves to ensure no conflicts and avoid race conditions. The same single write guarantees described in Model A above can be achieved in this model as well.\nWith this model users don't need to spin up different spark jobs and manage the orchestration among it. For larger deployments, this model can ease the operational burden significantly while getting the table services running without blocking the writers."]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Single Writer Guarantees"})}),"\n",(0,r.jsxs)(i.p,{children:["In this model, the following are the guarantees on ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/write_operations/",children:"write operations"})," to expect:"]}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"UPSERT Guarantee"}),": The target table will NEVER show duplicates."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"INSERT Guarantee"}),": The target table wilL NEVER have duplicates if dedup: ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations#hoodiedatasourcewriteinsertdropduplicates",children:(0,r.jsx)(i.code,{children:"hoodie.datasource.write.insert.drop.duplicates"})})," & ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations/#hoodiecombinebeforeinsert",children:(0,r.jsx)(i.code,{children:"hoodie.combine.before.insert"})}),", is enabled."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"BULK_INSERT Guarantee"}),": The target table will NEVER have duplicates if dedup: ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations#hoodiedatasourcewriteinsertdropduplicates",children:(0,r.jsx)(i.code,{children:"hoodie.datasource.write.insert.drop.duplicates"})})," & ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations/#hoodiecombinebeforeinsert",children:(0,r.jsx)(i.code,{children:"hoodie.combine.before.insert"})}),", is enabled."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"INCREMENTAL QUERY Guarantee"}),": Data consumption and checkpoints are NEVER out of order."]}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"full-on-multi-writer--async-table-services",children:"Full-on Multi-writer + Async table services"}),"\n",(0,r.jsxs)(i.p,{children:["Hudi has introduced a new concurrency mode ",(0,r.jsx)(i.code,{children:"NON_BLOCKING_CONCURRENCY_CONTROL"}),", where unlike OCC, multiple writers can\noperate on the table with non-blocking conflict resolution. The writers can write into the same file group with the\nconflicts resolved automatically by the query reader and the compactor. The new concurrency mode is currently\navailable for preview in version 1.0.0-beta only. You can read more about it under section ",(0,r.jsx)(i.a,{href:"#model-c-multi-writer",children:"Model C: Multi-writer"}),"."]}),"\n",(0,r.jsx)(i.p,{children:"It is not always possible to serialize all write operations to a table (such as UPSERT, INSERT or DELETE) into the same write process and therefore, multi-writing capability may be required.\nIn multi-writing, disparate distributed processes run in parallel or overlapping time windows to write to the same table. In such cases, an external locking mechanism is a must to safely\ncoordinate concurrent accesses. Here are few different scenarios that would all fall under multi-writing:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Multiple ingestion writers to the same table",":For"," instance, two Spark Datasource writers working on different sets of partitions form a source kafka topic."]}),"\n",(0,r.jsx)(i.li,{children:"Multiple ingestion writers to the same table, including one writer with async table services: For example, a Hudi Streamer with async compaction for regular ingestion & a Spark Datasource writer for backfilling."}),"\n",(0,r.jsx)(i.li,{children:"A single ingestion writer and a separate compaction (HoodieCompactor) or clustering (HoodieClusteringJob) job apart from the ingestion writer: This is considered as multi-writing as they are not running in the same process."}),"\n"]}),"\n",(0,r.jsxs)(i.p,{children:["Hudi's concurrency model intelligently differentiates actual writing to the table from table services that manage or optimize the table. Hudi offers similar ",(0,r.jsx)(i.strong,{children:"optimistic concurrency control across multiple writers"}),", but ",(0,r.jsx)(i.strong,{children:"table services can still execute completely lock-free and async"})," as long as they run in the same process as one of the writers.\nFor multi-writing, Hudi leverages file level optimistic concurrency control(OCC). For example, when two writers write to non overlapping files, both writes are allowed to succeed. However, when the writes from different writers overlap (touch the same set of files), only one of them will succeed. Please note that this feature is currently experimental and requires external lock providers to acquire locks briefly at critical sections during the write. More on lock providers below."]}),"\n",(0,r.jsx)(i.h4,{id:"multi-writer-guarantees",children:"Multi Writer Guarantees"}),"\n",(0,r.jsx)(i.p,{children:"With multiple writers using OCC, these are the write guarantees to expect:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"UPSERT Guarantee"}),": The target table will NEVER show duplicates."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"INSERT Guarantee"}),": The target table MIGHT have duplicates even if dedup is enabled."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"BULK_INSERT Guarantee"}),": The target table MIGHT have duplicates even if dedup is enabled."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"INCREMENTAL PULL Guarantee"}),": Data consumption and checkpoints are NEVER out of order. If there are inflight commits\n(due to multi-writing), incremental queries will not expose the completed commits following the inflight commits."]}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"non-blocking-concurrency-control",children:"Non-Blocking Concurrency Control"}),"\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.code,{children:"NON_BLOCKING_CONCURRENCY_CONTROL"}),", offers the same set of guarantees as mentioned in the case of OCC but without\nexplicit locks for serializing the writes. Lock is only needed for writing the commit metadata to the Hudi timeline. The\ncompletion time for the commits reflects the serialization order and file slicing is done based on completion time.\nMultiple writers can operate on the table with non-blocking conflict resolution. The writers can write into the same\nfile group with the conflicts resolved automatically by the query reader and the compactor. The new concurrency mode is\ncurrently available for preview in version 1.0.0-beta only with the caveat that conflict resolution is not supported yet\nbetween clustering and ingestion. It works for compaction and ingestion, and we can see an example of that with Flink\nwriters ",(0,r.jsx)(i.a,{href:"sql_dml#non-blocking-concurrency-control-experimental",children:"here"}),"."]}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.code,{children:"NON_BLOCKING_CONCURRENCY_CONTROL"})," between ingestion writer and table service writer is not yet supported for clustering.\nPlease use ",(0,r.jsx)(i.code,{children:"OPTIMISTIC_CONCURRENCY_CONTROL"})," for clustering."]})}),"\n",(0,r.jsx)(i.h2,{id:"early-conflict-detection",children:"Early conflict Detection"}),"\n",(0,r.jsx)(i.p,{children:"Multi writing using OCC allows multiple writers to concurrently write and atomically commit to the Hudi table if there is no overlapping data file to be written, to guarantee data consistency, integrity and correctness. Prior to 0.13.0 release, as the OCC (optimistic concurrency control) name suggests, each writer will optimistically proceed with ingestion and towards the end, just before committing will go about conflict resolution flow to deduce overlapping writes and abort one if need be. But this could result in lot of compute waste, since the aborted commit will have to retry from beginning. With 0.13.0, Hudi introduced early conflict deduction leveraging markers in hudi to deduce the conflicts eagerly and abort early in the write lifecyle instead of doing it in the end. For large scale deployments, this might avoid wasting lot o compute resources if there could be overlapping concurrent writers."}),"\n",(0,r.jsxs)(i.p,{children:["To improve the concurrency control, the ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/releases/release-0.13.0#early-conflict-detection-for-multi-writer",children:"0.13.0 release"})," introduced a new feature, early conflict detection in OCC, to detect the conflict during the data writing phase and abort the writing early on once a conflict is detected, using Hudi's marker mechanism. Hudi can now stop a conflicting writer much earlier because of the early conflict detection and release computing resources necessary to cluster, improving resource utilization."]}),"\n",(0,r.jsxs)(i.p,{children:["By default, this feature is turned off. To try this out, a user needs to set ",(0,r.jsx)(i.code,{children:"hoodie.write.concurrency.early.conflict.detection.enable"})," to true, when using OCC for concurrency control (Refer ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/next/configurations#Write-Configurations-advanced-configs",children:"configs"})," page for all relevant configs)."]}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsxs)(i.p,{children:["Early conflict Detection in OCC is an ",(0,r.jsx)(i.strong,{children:"EXPERIMENTAL"})," feature"]})}),"\n",(0,r.jsx)(i.h2,{id:"enabling-multi-writing",children:"Enabling Multi Writing"}),"\n",(0,r.jsx)(i.p,{children:"The following properties are needed to be set appropriately to turn on optimistic concurrency control to achieve multi writing."}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.concurrency.mode=optimistic_concurrency_control\nhoodie.write.lock.provider=\nhoodie.cleaner.policy.failed.writes=LAZY\n"})}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Config Name"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.concurrency.mode"}),(0,r.jsx)(i.td,{children:"SINGLE_WRITER (Optional)"}),(0,r.jsxs)(i.td,{children:[(0,r.jsx)("u",{children:(0,r.jsx)(i.a,{href:"https://github.com/apache/hudi/blob/00ece7bce0a4a8d0019721a28049723821e01842/hudi-common/src/main/java/org/apache/hudi/common/model/WriteConcurrencyMode.java",children:"Concurrency modes"})})," for write operations.",(0,r.jsx)("br",{}),"Possible values:",(0,r.jsx)("br",{}),(0,r.jsxs)("ul",{children:[(0,r.jsxs)("li",{children:[(0,r.jsx)(i.code,{children:"SINGLE_WRITER"}),": Only one active writer to the table. Maximizes throughput."]}),(0,r.jsxs)("li",{children:[(0,r.jsx)(i.code,{children:"OPTIMISTIC_CONCURRENCY_CONTROL"}),": Multiple writers can operate on the table with lazy conflict resolution using locks. This means that only one writer succeeds if multiple writers write to the same file group."]}),(0,r.jsxs)("li",{children:[(0,r.jsx)(i.code,{children:"NON_BLOCKING_CONCURRENCY_CONTROL"}),": Multiple writers can operate on the table with non-blocking conflict resolution. The writers can write into the same file group with the conflicts resolved automatically by the query reader and the compactor."]})]}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: WRITE_CONCURRENCY_MODE"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.provider"}),(0,r.jsx)(i.td,{children:"org.apache.hudi.client.transaction.lock.ZookeeperBasedLockProvider (Optional)"}),(0,r.jsxs)(i.td,{children:["Lock provider class name, user can provide their own implementation of LockProvider which should be subclass of org.apache.hudi.common.lock.LockProvider",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: LOCK_PROVIDER_CLASS_NAME"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.cleaner.policy.failed.writes"}),(0,r.jsx)(i.td,{children:"EAGER (Optional)"}),(0,r.jsxs)(i.td,{children:["org.apache.hudi.common.model.HoodieFailedWritesCleaningPolicy: Policy that controls how to clean up failed writes. Hudi will delete any files written by failed writes to re-claim space. EAGER(default): Clean failed writes inline after every write operation. LAZY: Clean failed writes lazily after heartbeat timeout when the cleaning service runs. This policy is required when multi-writers are enabled. NEVER: Never clean failed writes.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: FAILED_WRITES_CLEANER_POLICY"})]})]})]})]}),"\n",(0,r.jsx)(i.h3,{id:"multi-writing-via-hudi-streamer",children:"Multi Writing via Hudi Streamer"}),"\n",(0,r.jsxs)(i.p,{children:["The ",(0,r.jsx)(i.code,{children:"HoodieStreamer"})," utility (part of hudi-utilities-slim-bundle) provides ways to ingest from different sources such as DFS or Kafka, with the following capabilities."]}),"\n",(0,r.jsx)(i.p,{children:"Using optimistic_concurrency_control via Hudi Streamer requires adding the above configs to the properties file that can be passed to the\njob. For example below, adding the configs to kafka-source.properties file and passing them to Hudi Streamer will enable optimistic concurrency.\nA Hudi Streamer job can then be triggered as follows:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-java",children:'[hoodie]$ spark-submit \\\n --jars "packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar,packaging/hudi-spark-bundle/target/hudi-spark3.5-bundle_2.12-1.0.0.jar" \\\n --class org.apache.hudi.utilities.streamer.HoodieStreamer `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` \\\n --props file://${PWD}/hudi-utilities/src/test/resources/streamer-config/kafka-source.properties \\\n --schemaprovider-class org.apache.hudi.utilities.schema.SchemaRegistryProvider \\\n --source-class org.apache.hudi.utilities.sources.AvroKafkaSource \\\n --source-ordering-field impresssiontime \\\n --target-base-path file:\\/\\/\\/tmp/hudi-streamer-op \\ \n --target-table tableName \\\n --op BULK_INSERT\n'})}),"\n",(0,r.jsx)(i.h3,{id:"multi-writing-via-spark-datasource-writer",children:"Multi Writing via Spark Datasource Writer"}),"\n",(0,r.jsxs)(i.p,{children:["The ",(0,r.jsx)(i.code,{children:"hudi-spark"})," module offers the DataSource API to write (and read) a Spark DataFrame into a Hudi table."]}),"\n",(0,r.jsx)(i.p,{children:"Following is an example of how to use optimistic_concurrency_control via spark datasource"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-java",children:'inputDF.write.format("hudi")\n .options(getQuickstartWriteConfigs)\n .option("hoodie.datasource.write.precombine.field", "ts")\n .option("hoodie.cleaner.policy.failed.writes", "LAZY")\n .option("hoodie.write.concurrency.mode", "optimistic_concurrency_control")\n .option("hoodie.write.lock.zookeeper.url", "zookeeper")\n .option("hoodie.write.lock.zookeeper.port", "2181")\n .option("hoodie.write.lock.zookeeper.base_path", "/test")\n .option("hoodie.datasource.write.recordkey.field", "uuid")\n .option("hoodie.datasource.write.partitionpath.field", "partitionpath")\n .option("hoodie.table.name", tableName)\n .mode(Overwrite)\n .save(basePath)\n'})}),"\n",(0,r.jsx)(i.h2,{id:"disabling-multi-writing",children:"Disabling Multi Writing"}),"\n",(0,r.jsx)(i.p,{children:"Remove the following settings that were used to enable multi-writer or override with default values."}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.concurrency.mode=single_writer\nhoodie.cleaner.policy.failed.writes=EAGER\n"})}),"\n",(0,r.jsx)(i.h2,{id:"occ-best-practices",children:"OCC Best Practices"}),"\n",(0,r.jsx)(i.p,{children:"Concurrent Writing to Hudi tables requires acquiring a lock with one of the lock providers mentioned above. Due to several reasons you might want to configure retries to allow your application to acquire the lock."}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsx)(i.li,{children:"Network connectivity or excessive load on servers increasing time for lock acquisition resulting in timeouts"}),"\n",(0,r.jsx)(i.li,{children:"Running a large number of concurrent jobs that are writing to the same hudi table can result in contention during lock acquisition can cause timeouts"}),"\n",(0,r.jsx)(i.li,{children:"In some scenarios of conflict resolution, Hudi commit operations might take upto 10's of seconds while the lock is being held. This can result in timeouts for other jobs waiting to acquire a lock."}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"Set the correct native lock provider client retries."}),"\n",(0,r.jsxs)(i.admonition,{type:"note",children:[(0,r.jsx)(i.mdxAdmonitionTitle,{}),(0,r.jsx)(i.p,{children:"Please note that sometimes these settings are set on the server once and all clients inherit the same configs. Please check your settings before enabling optimistic concurrency."})]}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.wait_time_ms\nhoodie.write.lock.num_retries\n"})}),"\n",(0,r.jsx)(i.p,{children:"Set the correct hudi client retries for Zookeeper & HiveMetastore. This is useful in cases when native client retry settings cannot be changed. Please note that these retries will happen in addition to any native client retries that you may have set."}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.client.wait_time_ms\nhoodie.write.lock.client.num_retries\n"})}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.em,{children:"Setting the right values for these depends on a case by case basis; some defaults have been provided for general cases."})}),"\n",(0,r.jsx)(i.h2,{id:"caveats",children:"Caveats"}),"\n",(0,r.jsxs)(i.p,{children:["If you are using the ",(0,r.jsx)(i.code,{children:"WriteClient"})," API, please note that multiple writes to the table need to be initiated from 2 different instances of the write client.\nIt is ",(0,r.jsx)(i.strong,{children:"NOT"})," recommended to use the same instance of the write client to perform multi writing."]}),"\n",(0,r.jsx)(i.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,r.jsx)("h3",{children:"Blogs"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://www.onehouse.ai/blog/lakehouse-concurrency-control-are-we-too-optimistic",children:"Data Lakehouse Concurrency Control"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://medium.com/@simpsons/multi-writer-support-with-apache-hudi-e1b75dca29e6",children:"Multi-writer support with Apache Hudi"})}),"\n"]}),"\n",(0,r.jsx)("h3",{children:"Videos"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://youtu.be/JP0orl9_0yQ",children:"Hands on Lab with using DynamoDB as lock table for Apache Hudi Data Lakes"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/blog/2024/12/06/non-blocking-concurrency-control",children:"Non Blocking Concurrency Control Flink Demo"})}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},28453:(e,i,t)=>{t.d(i,{R:()=>s,x:()=>a});var n=t(96540);const r={},o=n.createContext(r);function s(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/ed47441b.65b131bc.js b/content/assets/js/ed47441b.65b131bc.js new file mode 100644 index 0000000000000..575bf16644668 --- /dev/null +++ b/content/assets/js/ed47441b.65b131bc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[71590],{29697:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"azure_hoodie","title":"Microsoft Azure","description":"In this page, we explain how to use Hudi on Microsoft Azure.","source":"@site/docs/azure_hoodie.md","sourceDirName":".","slug":"/azure_hoodie","permalink":"/docs/next/azure_hoodie","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/azure_hoodie.md","tags":[],"version":"current","frontMatter":{"title":"Microsoft Azure","keywords":["hudi","hive","azure","spark","presto"],"summary":"In this page, we go over how to configure Hudi with Azure filesystem.","last_modified_at":"2020-05-25T23:00:57.000Z"},"sidebar":"docs","previous":{"title":"Alibaba Cloud","permalink":"/docs/next/oss_hoodie"},"next":{"title":"Tencent Cloud","permalink":"/docs/next/cos_hoodie"}}');var a=t(74848),i=t(28453);const o={title:"Microsoft Azure",keywords:["hudi","hive","azure","spark","presto"],summary:"In this page, we go over how to configure Hudi with Azure filesystem.",last_modified_at:new Date("2020-05-25T23:00:57.000Z")},r=void 0,d={},c=[{value:"Disclaimer",id:"disclaimer",level:2},{value:"Supported Storage System",id:"supported-storage-system",level:2},{value:"Verified Combination of Spark and storage system",id:"verified-combination-of-spark-and-storage-system",level:2},{value:"HDInsight Spark2.4 on Azure Data Lake Storage Gen 2",id:"hdinsight-spark24-on-azure-data-lake-storage-gen-2",level:4},{value:"Databricks Spark2.4 on Azure Data Lake Storage Gen 2",id:"databricks-spark24-on-azure-data-lake-storage-gen-2",level:4},{value:"Related Resources",id:"related-resources",level:2}];function l(e){const n={a:"a",code:"code",h2:"h2",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.p,{children:"In this page, we explain how to use Hudi on Microsoft Azure."}),"\n",(0,a.jsx)(n.h2,{id:"disclaimer",children:"Disclaimer"}),"\n",(0,a.jsx)(n.p,{children:"This page is maintained by the Hudi community.\nIf the information is inaccurate or you have additional information to add.\nPlease feel free to create a JIRA ticket. Contribution is highly appreciated."}),"\n",(0,a.jsx)(n.h2,{id:"supported-storage-system",children:"Supported Storage System"}),"\n",(0,a.jsx)(n.p,{children:"There are two storage systems support Hudi ."}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Azure Blob Storage"}),"\n",(0,a.jsx)(n.li,{children:"Azure Data Lake Gen 2"}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"verified-combination-of-spark-and-storage-system",children:"Verified Combination of Spark and storage system"}),"\n",(0,a.jsx)(n.h4,{id:"hdinsight-spark24-on-azure-data-lake-storage-gen-2",children:"HDInsight Spark2.4 on Azure Data Lake Storage Gen 2"}),"\n",(0,a.jsx)(n.p,{children:"This combination works out of the box. No extra config needed."}),"\n",(0,a.jsx)(n.h4,{id:"databricks-spark24-on-azure-data-lake-storage-gen-2",children:"Databricks Spark2.4 on Azure Data Lake Storage Gen 2"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Import Hudi jar to databricks workspace"}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Mount the file system to dbutils."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-scala",children:'dbutils.fs.mount(\n source = "abfss://xxx@xxx.dfs.core.windows.net",\n mountPoint = "/mountpoint",\n extraConfigs = configs)\n'})}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"When writing Hudi dataset, use abfss URL"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-scala",children:'inputDF.write\n .format("org.apache.hudi")\n .options(opts)\n .mode(SaveMode.Append)\n .save("abfss://<>.dfs.core.windows.net/hudi-tables/customer")\n'})}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"When reading Hudi dataset, use the mounting point"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-scala",children:'spark.read\n .format("org.apache.hudi")\n .load("/mountpoint/hudi-tables/customer")\n'})}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,a.jsx)("h3",{children:"Blogs"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"https://www.onehouse.ai/blog/how-to-use-apache-hudi-with-databricks",children:"How to use Apache Hudi with Databricks"})}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>r});var s=t(96540);const a={},i=s.createContext(a);function o(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/ed47441b.c9f8c1ee.js b/content/assets/js/ed47441b.c9f8c1ee.js deleted file mode 100644 index fe1bee36f6371..0000000000000 --- a/content/assets/js/ed47441b.c9f8c1ee.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[71590],{29697:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"azure_hoodie","title":"Microsoft Azure","description":"In this page, we explain how to use Hudi on Microsoft Azure.","source":"@site/docs/azure_hoodie.md","sourceDirName":".","slug":"/azure_hoodie","permalink":"/docs/next/azure_hoodie","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/azure_hoodie.md","tags":[],"version":"current","frontMatter":{"title":"Microsoft Azure","keywords":["hudi","hive","azure","spark","presto"],"summary":"In this page, we go over how to configure Hudi with Azure filesystem.","last_modified_at":"2020-05-25T23:00:57.000Z"},"sidebar":"docs","previous":{"title":"Alibaba Cloud","permalink":"/docs/next/oss_hoodie"},"next":{"title":"Tencent Cloud","permalink":"/docs/next/cos_hoodie"}}');var a=t(74848),i=t(28453);const o={title:"Microsoft Azure",keywords:["hudi","hive","azure","spark","presto"],summary:"In this page, we go over how to configure Hudi with Azure filesystem.",last_modified_at:new Date("2020-05-25T23:00:57.000Z")},r=void 0,d={},c=[{value:"Disclaimer",id:"disclaimer",level:2},{value:"Supported Storage System",id:"supported-storage-system",level:2},{value:"Verified Combination of Spark and storage system",id:"verified-combination-of-spark-and-storage-system",level:2},{value:"HDInsight Spark2.4 on Azure Data Lake Storage Gen 2",id:"hdinsight-spark24-on-azure-data-lake-storage-gen-2",level:4},{value:"Databricks Spark2.4 on Azure Data Lake Storage Gen 2",id:"databricks-spark24-on-azure-data-lake-storage-gen-2",level:4}];function l(e){const n={code:"code",h2:"h2",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.p,{children:"In this page, we explain how to use Hudi on Microsoft Azure."}),"\n",(0,a.jsx)(n.h2,{id:"disclaimer",children:"Disclaimer"}),"\n",(0,a.jsx)(n.p,{children:"This page is maintained by the Hudi community.\nIf the information is inaccurate or you have additional information to add.\nPlease feel free to create a JIRA ticket. Contribution is highly appreciated."}),"\n",(0,a.jsx)(n.h2,{id:"supported-storage-system",children:"Supported Storage System"}),"\n",(0,a.jsx)(n.p,{children:"There are two storage systems support Hudi ."}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Azure Blob Storage"}),"\n",(0,a.jsx)(n.li,{children:"Azure Data Lake Gen 2"}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"verified-combination-of-spark-and-storage-system",children:"Verified Combination of Spark and storage system"}),"\n",(0,a.jsx)(n.h4,{id:"hdinsight-spark24-on-azure-data-lake-storage-gen-2",children:"HDInsight Spark2.4 on Azure Data Lake Storage Gen 2"}),"\n",(0,a.jsx)(n.p,{children:"This combination works out of the box. No extra config needed."}),"\n",(0,a.jsx)(n.h4,{id:"databricks-spark24-on-azure-data-lake-storage-gen-2",children:"Databricks Spark2.4 on Azure Data Lake Storage Gen 2"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Import Hudi jar to databricks workspace"}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Mount the file system to dbutils."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-scala",children:'dbutils.fs.mount(\n source = "abfss://xxx@xxx.dfs.core.windows.net",\n mountPoint = "/mountpoint",\n extraConfigs = configs)\n'})}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"When writing Hudi dataset, use abfss URL"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-scala",children:'inputDF.write\n .format("org.apache.hudi")\n .options(opts)\n .mode(SaveMode.Append)\n .save("abfss://<>.dfs.core.windows.net/hudi-tables/customer")\n'})}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"When reading Hudi dataset, use the mounting point"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-scala",children:'spark.read\n .format("org.apache.hudi")\n .load("/mountpoint/hudi-tables/customer")\n'})}),"\n"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>r});var s=t(96540);const a={},i=s.createContext(a);function o(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/edefc60b.660e3035.js b/content/assets/js/edefc60b.660e3035.js new file mode 100644 index 0000000000000..2e53a96829af7 --- /dev/null +++ b/content/assets/js/edefc60b.660e3035.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[73624],{96496:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"performance","title":"Performance","description":"Optimized DFS Access","source":"@site/docs/performance.md","sourceDirName":".","slug":"/performance","permalink":"/docs/next/performance","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/performance.md","tags":[],"version":"current","frontMatter":{"title":"Performance","keywords":["hudi","index","storage","compaction","cleaning","implementation"],"toc":false,"last_modified_at":"2019-12-30T19:59:57.000Z"},"sidebar":"docs","previous":{"title":"Bootstrapping","permalink":"/docs/next/migration_guide"},"next":{"title":"Deployment","permalink":"/docs/next/deployment"}}');var a=i(74848),s=i(28453);const o={title:"Performance",keywords:["hudi","index","storage","compaction","cleaning","implementation"],toc:!1,last_modified_at:new Date("2019-12-30T19:59:57.000Z")},r=void 0,l={},d=[{value:"Optimized DFS Access",id:"optimized-dfs-access",level:2},{value:"Performance Optimizations",id:"performance-optimizations",level:2},{value:"Write Path",id:"write-path",level:3},{value:"Bulk Insert",id:"bulk-insert",level:4},{value:"Upserts",id:"upserts",level:4},{value:"Indexing",id:"indexing",level:4},{value:"Read Path",id:"read-path",level:3},{value:"Data Skipping",id:"data-skipping",level:4},{value:"Related Resources",id:"related-resources",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"optimized-dfs-access",children:"Optimized DFS Access"}),"\n",(0,a.jsx)(n.p,{children:"Hudi also performs several key storage management functions on the data stored in a Hudi table. A key aspect of storing data on DFS is managing file sizes and counts\nand reclaiming storage space. For e.g HDFS is infamous for its handling of small files, which exerts memory/RPC pressure on the Name Node and can potentially destabilize\nthe entire cluster. In general, query engines provide much better performance on adequately sized columnar files, since they can effectively amortize cost of obtaining\ncolumn statistics etc. Even on some cloud data stores, there is often cost to listing directories with large number of small files."}),"\n",(0,a.jsx)(n.p,{children:"Here are some ways to efficiently manage the storage of your Hudi tables."}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["The ",(0,a.jsx)(n.a,{href:"/docs/configurations/#hoodieparquetsmallfilelimit",children:"small file handling feature"})," in Hudi, profiles incoming workload\nand distributes inserts to existing file groups instead of creating new file groups, which can lead to small files."]}),"\n",(0,a.jsxs)(n.li,{children:["Cleaner can be ",(0,a.jsx)(n.a,{href:"/docs/configurations#hoodiecleanercommitsretained",children:"configured"})," to clean up older file slices, more or less aggressively depending on maximum time for queries to run & lookback needed for incremental pull"]}),"\n",(0,a.jsxs)(n.li,{children:["User can also tune the size of the ",(0,a.jsx)(n.a,{href:"/docs/configurations#hoodieparquetmaxfilesize",children:"base/parquet file"}),", ",(0,a.jsx)(n.a,{href:"/docs/configurations#hoodielogfilemaxsize",children:"log files"})," & expected ",(0,a.jsx)(n.a,{href:"/docs/configurations#hoodieparquetcompressionratio",children:"compression ratio"}),",\nsuch that sufficient number of inserts are grouped into the same file group, resulting in well sized base files ultimately."]}),"\n",(0,a.jsxs)(n.li,{children:["Intelligently tuning the ",(0,a.jsx)(n.a,{href:"/docs/configurations#hoodiebulkinsertshuffleparallelism",children:"bulk insert parallelism"}),", can again in nicely sized initial file groups. It is in fact critical to get this right, since the file groups\nonce created cannot be changed without re-clustering the table. Writes will simply expand given file groups with new updates/inserts as explained before."]}),"\n",(0,a.jsxs)(n.li,{children:["For workloads with heavy updates, the ",(0,a.jsx)(n.a,{href:"/docs/concepts#merge-on-read-table",children:"merge-on-read table"})," provides a nice mechanism for ingesting quickly into smaller files and then later merging them into larger base files via compaction."]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"performance-optimizations",children:"Performance Optimizations"}),"\n",(0,a.jsx)(n.p,{children:"In this section, we go over some real world performance numbers for Hudi upserts, incremental pull and compare them against\nthe conventional alternatives for achieving these tasks."}),"\n",(0,a.jsx)(n.h3,{id:"write-path",children:"Write Path"}),"\n",(0,a.jsx)(n.h4,{id:"bulk-insert",children:"Bulk Insert"}),"\n",(0,a.jsx)(n.p,{children:"Write configurations in Hudi are optimized for incremental upserts by default. In fact, the default write operation type is UPSERT as well.\nFor simple append-only use case to bulk load the data, following set of configurations are recommended for optimal writing:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"-- Use \u201cbulk-insert\u201d write-operation instead of default \u201cupsert\u201d\nhoodie.datasource.write.operation = BULK_INSERT\n-- Disable populating meta columns and metadata, and enable virtual keys\nhoodie.populate.meta.fields = false\nhoodie.metadata.enable = false\n-- Enable snappy compression codec for lesser CPU cycles (but more storage overhead)\nhoodie.parquet.compression.codec = snappy\n"})}),"\n",(0,a.jsx)(n.p,{children:"For ingesting via spark-sql"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"-- Use \u201cbulk-insert\u201d write-operation instead of default \u201cupsert\u201d\nhoodie.sql.insert.mode = non-strict,\nhoodie.sql.bulk.insert.enable = true,\n-- Disable populating meta columns and metadata, and enable virtual keys\nhoodie.populate.meta.fields = false\nhoodie.metadata.enable = false\n-- Enable snappy compression codec for lesser CPU cycles (but more storage overhead)\nhoodie.parquet.compression.codec = snappy\n"})}),"\n",(0,a.jsxs)(n.p,{children:["We recently benchmarked Hudi against TPC-DS workload.\nPlease check out ",(0,a.jsx)(n.a,{href:"/blog/2022/06/29/Apache-Hudi-vs-Delta-Lake-transparent-tpc-ds-lakehouse-performance-benchmarks",children:"our blog"})," for more details."]}),"\n",(0,a.jsx)(n.h4,{id:"upserts",children:"Upserts"}),"\n",(0,a.jsx)(n.p,{children:"Following shows the speed up obtained for NoSQL database ingestion, from incrementally upserting on a Hudi table on the copy-on-write storage,\non 5 tables ranging from small to huge (as opposed to bulk loading the tables)"}),"\n",(0,a.jsx)("figure",{children:(0,a.jsx)("img",{className:"docimage",src:i(63490).A,alt:"hudi_upsert_perf1.png"})}),"\n",(0,a.jsx)(n.p,{children:"Given Hudi can build the table incrementally, it opens doors for also scheduling ingesting more frequently thus reducing latency, with\nsignificant savings on the overall compute cost."}),"\n",(0,a.jsx)("figure",{children:(0,a.jsx)("img",{className:"docimage",src:i(19577).A,alt:"hudi_upsert_perf2.png"})}),"\n",(0,a.jsxs)(n.p,{children:["Hudi upserts have been stress tested upto 4TB in a single commit across the t1 table.\nSee ",(0,a.jsx)(n.a,{href:"https://cwiki.apache.org/confluence/display/HUDI/Tuning+Guide",children:"here"})," for some tuning tips."]}),"\n",(0,a.jsx)(n.h4,{id:"indexing",children:"Indexing"}),"\n",(0,a.jsx)(n.p,{children:"In order to efficiently upsert data, Hudi needs to classify records in a write batch into inserts & updates (tagged with the file group\nit belongs to). In order to speed this operation, Hudi employs a pluggable index mechanism that stores a mapping between recordKey and\nthe file group id it belongs to. By default, Hudi uses a built in index that uses file ranges and bloom filters to accomplish this, with\nupto 10x speed up over a spark join to do the same."}),"\n",(0,a.jsxs)(n.p,{children:["Hudi provides best indexing performance when you model the recordKey to be monotonically increasing (e.g timestamp prefix), leading to range pruning filtering\nout a lot of files for comparison. Even for UUID based keys, there are ",(0,a.jsx)(n.a,{href:"https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/",children:"known techniques"})," to achieve this.\nFor e.g , with 100M timestamp prefixed keys (5% updates, 95% inserts) on a event table with 80B keys/3 partitions/11416 files/10TB data, Hudi index achieves a\n",(0,a.jsx)(n.strong,{children:"~7X (2880 secs vs 440 secs) speed up"})," over vanilla spark join. Even for a challenging workload like an '100% update' database ingestion workload spanning\n3.25B UUID keys/30 partitions/6180 files using 300 cores, Hudi indexing offers a ",(0,a.jsx)(n.strong,{children:"80-100% speedup"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"read-path",children:"Read Path"}),"\n",(0,a.jsx)(n.h4,{id:"data-skipping",children:"Data Skipping"}),"\n",(0,a.jsx)(n.p,{children:"Data Skipping is a technique (originally introduced in Hudi 0.10) that leverages metadata to very effectively prune the search space of a query,\nby eliminating files that cannot possibly contain data matching the query's filters. By maintaining this metadata in the internal Hudi metadata table,\nHudi avoids reading file footers to obtain this information, which can be costly for queries spanning tens of thousands of files."}),"\n",(0,a.jsxs)(n.p,{children:["Data Skipping leverages metadata table's ",(0,a.jsx)(n.code,{children:"col_stats"})," partition bearing column-level statistics (such as min-value, max-value, count of null-values in the column, etc)\nfor every file of the Hudi table. This then allows Hudi for every incoming query instead of enumerating every file in the table and reading its corresponding metadata\n(for ex, Parquet footers) for analysis whether it could contain any data matching the query filters, to simply do a query against a Column Stats Index\nin the Metadata Table (which in turn is a Hudi table itself) and within seconds (even for TBs scale tables, with 10s of thousands of files) obtain the list\nof ",(0,a.jsx)(n.em,{children:"all the files that might potentially contain the data"})," matching query's filters with crucial property that files that could be ruled out as not containing such data\n(based on their column-level statistics) will be stripped out. See ",(0,a.jsx)(n.a,{href:"https://github.com/apache/hudi/blob/master/rfc/rfc-27/rfc-27.md",children:"RFC-27"})," for detailed design."]}),"\n",(0,a.jsx)(n.p,{children:"Partitioning can be considered a coarse form of indexing and data skipping using the col_stats partition can be thought of as a range index, that databases use to identify potential\nblocks of data interesting to a query. Unlike partition pruning for tables using physical partitioning where records in the dataset are organized into a folder structure based\non some column's value, data skipping using col_stats delivers a logical/virtual partitioning."}),"\n",(0,a.jsx)(n.p,{children:"For very large tables (1Tb+, 10s of 1000s of files), Data skipping could"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Substantially improve query execution runtime ",(0,a.jsx)(n.strong,{children:"10x"})," as compared to the same query on the same dataset but w/o Data Skipping enabled."]}),"\n",(0,a.jsx)(n.li,{children:"Help avoid hitting Cloud Storages throttling limits (for issuing too many requests, for ex, AWS limits # of requests / sec that could be issued based on the object's prefix which considerably complicates things for partitioned tables)"}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"To unlock the power of Data Skipping you will need to"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Enable Metadata Table along with Column Stats Index on the ",(0,a.jsx)(n.em,{children:"write path"})," (See ",(0,a.jsx)(n.a,{href:"/docs/metadata_indexing",children:"Metadata Indexing"}),"), using ",(0,a.jsx)(n.code,{children:"hoodie.metadata.enable=true"})," (to enable Metadata Table on the write path, enabled by default)"]}),"\n",(0,a.jsxs)(n.li,{children:["Enable Data Skipping in your queries, using ",(0,a.jsx)(n.code,{children:"hoodie.metadata.index.column.stats.enable=true"})," (to enable Column Stats Index being populated on the write path, disabled by default)"]}),"\n"]}),"\n",(0,a.jsx)(n.admonition,{type:"note",children:(0,a.jsxs)(n.p,{children:["If you're planning on enabling Column Stats Index for already existing table, please check out the ",(0,a.jsx)(n.a,{href:"/docs/metadata_indexing",children:"Metadata Indexing"})," guide on how to build Metadata Table Indices (such as Column Stats Index) for existing tables."]})}),"\n",(0,a.jsxs)(n.p,{children:["To enable Data Skipping in your queries make sure to set following properties to ",(0,a.jsx)(n.code,{children:"true"})," (on the read path):"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"hoodie.enable.data.skipping"})," (to control data skipping, enabled by default)"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"hoodie.metadata.enable"})," (to enable metadata table use on the read path, enabled by default)"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"hoodie.metadata.index.column.stats.enable"})," (to enable column stats index use on the read path)"]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,a.jsx)("h3",{children:"Blogs"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"https://www.onehouse.ai/blog/hudis-column-stats-index-and-data-skipping-feature-help-speed-up-queries-by-an-orders-of-magnitude",children:"Hudi\u2019s Column Stats Index and Data Skipping feature help speed up queries by an orders of magnitude!"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"https://www.onehouse.ai/blog/top-3-things-you-can-do-to-get-fast-upsert-performance-in-apache-hudi",children:"Top 3 Things You Can Do to Get Fast Upsert Performance in Apache Hudi"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},63490:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/hudi_upsert_perf1-8f41921dacb5fb026f1e5457f8c47aa6.png"},19577:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/hudi_upsert_perf2-d4bfcab4e9e8d942a02b712797ee2755.png"},28453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>r});var t=i(96540);const a={},s=t.createContext(a);function o(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/edefc60b.7161ba9d.js b/content/assets/js/edefc60b.7161ba9d.js deleted file mode 100644 index 5a45151b5031c..0000000000000 --- a/content/assets/js/edefc60b.7161ba9d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[73624],{96496:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"performance","title":"Performance","description":"Optimized DFS Access","source":"@site/docs/performance.md","sourceDirName":".","slug":"/performance","permalink":"/docs/next/performance","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/performance.md","tags":[],"version":"current","frontMatter":{"title":"Performance","keywords":["hudi","index","storage","compaction","cleaning","implementation"],"toc":false,"last_modified_at":"2019-12-30T19:59:57.000Z"},"sidebar":"docs","previous":{"title":"Bootstrapping","permalink":"/docs/next/migration_guide"},"next":{"title":"Deployment","permalink":"/docs/next/deployment"}}');var a=i(74848),s=i(28453);const o={title:"Performance",keywords:["hudi","index","storage","compaction","cleaning","implementation"],toc:!1,last_modified_at:new Date("2019-12-30T19:59:57.000Z")},r=void 0,l={},d=[{value:"Optimized DFS Access",id:"optimized-dfs-access",level:2},{value:"Performance Optimizations",id:"performance-optimizations",level:2},{value:"Write Path",id:"write-path",level:3},{value:"Bulk Insert",id:"bulk-insert",level:4},{value:"Upserts",id:"upserts",level:4},{value:"Indexing",id:"indexing",level:4},{value:"Read Path",id:"read-path",level:3},{value:"Data Skipping",id:"data-skipping",level:4}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"optimized-dfs-access",children:"Optimized DFS Access"}),"\n",(0,a.jsx)(n.p,{children:"Hudi also performs several key storage management functions on the data stored in a Hudi table. A key aspect of storing data on DFS is managing file sizes and counts\nand reclaiming storage space. For e.g HDFS is infamous for its handling of small files, which exerts memory/RPC pressure on the Name Node and can potentially destabilize\nthe entire cluster. In general, query engines provide much better performance on adequately sized columnar files, since they can effectively amortize cost of obtaining\ncolumn statistics etc. Even on some cloud data stores, there is often cost to listing directories with large number of small files."}),"\n",(0,a.jsx)(n.p,{children:"Here are some ways to efficiently manage the storage of your Hudi tables."}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["The ",(0,a.jsx)(n.a,{href:"/docs/configurations/#hoodieparquetsmallfilelimit",children:"small file handling feature"})," in Hudi, profiles incoming workload\nand distributes inserts to existing file groups instead of creating new file groups, which can lead to small files."]}),"\n",(0,a.jsxs)(n.li,{children:["Cleaner can be ",(0,a.jsx)(n.a,{href:"/docs/configurations#hoodiecleanercommitsretained",children:"configured"})," to clean up older file slices, more or less aggressively depending on maximum time for queries to run & lookback needed for incremental pull"]}),"\n",(0,a.jsxs)(n.li,{children:["User can also tune the size of the ",(0,a.jsx)(n.a,{href:"/docs/configurations#hoodieparquetmaxfilesize",children:"base/parquet file"}),", ",(0,a.jsx)(n.a,{href:"/docs/configurations#hoodielogfilemaxsize",children:"log files"})," & expected ",(0,a.jsx)(n.a,{href:"/docs/configurations#hoodieparquetcompressionratio",children:"compression ratio"}),",\nsuch that sufficient number of inserts are grouped into the same file group, resulting in well sized base files ultimately."]}),"\n",(0,a.jsxs)(n.li,{children:["Intelligently tuning the ",(0,a.jsx)(n.a,{href:"/docs/configurations#hoodiebulkinsertshuffleparallelism",children:"bulk insert parallelism"}),", can again in nicely sized initial file groups. It is in fact critical to get this right, since the file groups\nonce created cannot be changed without re-clustering the table. Writes will simply expand given file groups with new updates/inserts as explained before."]}),"\n",(0,a.jsxs)(n.li,{children:["For workloads with heavy updates, the ",(0,a.jsx)(n.a,{href:"/docs/concepts#merge-on-read-table",children:"merge-on-read table"})," provides a nice mechanism for ingesting quickly into smaller files and then later merging them into larger base files via compaction."]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"performance-optimizations",children:"Performance Optimizations"}),"\n",(0,a.jsx)(n.p,{children:"In this section, we go over some real world performance numbers for Hudi upserts, incremental pull and compare them against\nthe conventional alternatives for achieving these tasks."}),"\n",(0,a.jsx)(n.h3,{id:"write-path",children:"Write Path"}),"\n",(0,a.jsx)(n.h4,{id:"bulk-insert",children:"Bulk Insert"}),"\n",(0,a.jsx)(n.p,{children:"Write configurations in Hudi are optimized for incremental upserts by default. In fact, the default write operation type is UPSERT as well.\nFor simple append-only use case to bulk load the data, following set of configurations are recommended for optimal writing:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"-- Use \u201cbulk-insert\u201d write-operation instead of default \u201cupsert\u201d\nhoodie.datasource.write.operation = BULK_INSERT\n-- Disable populating meta columns and metadata, and enable virtual keys\nhoodie.populate.meta.fields = false\nhoodie.metadata.enable = false\n-- Enable snappy compression codec for lesser CPU cycles (but more storage overhead)\nhoodie.parquet.compression.codec = snappy\n"})}),"\n",(0,a.jsx)(n.p,{children:"For ingesting via spark-sql"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"-- Use \u201cbulk-insert\u201d write-operation instead of default \u201cupsert\u201d\nhoodie.sql.insert.mode = non-strict,\nhoodie.sql.bulk.insert.enable = true,\n-- Disable populating meta columns and metadata, and enable virtual keys\nhoodie.populate.meta.fields = false\nhoodie.metadata.enable = false\n-- Enable snappy compression codec for lesser CPU cycles (but more storage overhead)\nhoodie.parquet.compression.codec = snappy\n"})}),"\n",(0,a.jsxs)(n.p,{children:["We recently benchmarked Hudi against TPC-DS workload.\nPlease check out ",(0,a.jsx)(n.a,{href:"/blog/2022/06/29/Apache-Hudi-vs-Delta-Lake-transparent-tpc-ds-lakehouse-performance-benchmarks",children:"our blog"})," for more details."]}),"\n",(0,a.jsx)(n.h4,{id:"upserts",children:"Upserts"}),"\n",(0,a.jsx)(n.p,{children:"Following shows the speed up obtained for NoSQL database ingestion, from incrementally upserting on a Hudi table on the copy-on-write storage,\non 5 tables ranging from small to huge (as opposed to bulk loading the tables)"}),"\n",(0,a.jsx)("figure",{children:(0,a.jsx)("img",{className:"docimage",src:i(63490).A,alt:"hudi_upsert_perf1.png"})}),"\n",(0,a.jsx)(n.p,{children:"Given Hudi can build the table incrementally, it opens doors for also scheduling ingesting more frequently thus reducing latency, with\nsignificant savings on the overall compute cost."}),"\n",(0,a.jsx)("figure",{children:(0,a.jsx)("img",{className:"docimage",src:i(19577).A,alt:"hudi_upsert_perf2.png"})}),"\n",(0,a.jsxs)(n.p,{children:["Hudi upserts have been stress tested upto 4TB in a single commit across the t1 table.\nSee ",(0,a.jsx)(n.a,{href:"https://cwiki.apache.org/confluence/display/HUDI/Tuning+Guide",children:"here"})," for some tuning tips."]}),"\n",(0,a.jsx)(n.h4,{id:"indexing",children:"Indexing"}),"\n",(0,a.jsx)(n.p,{children:"In order to efficiently upsert data, Hudi needs to classify records in a write batch into inserts & updates (tagged with the file group\nit belongs to). In order to speed this operation, Hudi employs a pluggable index mechanism that stores a mapping between recordKey and\nthe file group id it belongs to. By default, Hudi uses a built in index that uses file ranges and bloom filters to accomplish this, with\nupto 10x speed up over a spark join to do the same."}),"\n",(0,a.jsxs)(n.p,{children:["Hudi provides best indexing performance when you model the recordKey to be monotonically increasing (e.g timestamp prefix), leading to range pruning filtering\nout a lot of files for comparison. Even for UUID based keys, there are ",(0,a.jsx)(n.a,{href:"https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/",children:"known techniques"})," to achieve this.\nFor e.g , with 100M timestamp prefixed keys (5% updates, 95% inserts) on a event table with 80B keys/3 partitions/11416 files/10TB data, Hudi index achieves a\n",(0,a.jsx)(n.strong,{children:"~7X (2880 secs vs 440 secs) speed up"})," over vanilla spark join. Even for a challenging workload like an '100% update' database ingestion workload spanning\n3.25B UUID keys/30 partitions/6180 files using 300 cores, Hudi indexing offers a ",(0,a.jsx)(n.strong,{children:"80-100% speedup"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"read-path",children:"Read Path"}),"\n",(0,a.jsx)(n.h4,{id:"data-skipping",children:"Data Skipping"}),"\n",(0,a.jsx)(n.p,{children:"Data Skipping is a technique (originally introduced in Hudi 0.10) that leverages metadata to very effectively prune the search space of a query,\nby eliminating files that cannot possibly contain data matching the query's filters. By maintaining this metadata in the internal Hudi metadata table,\nHudi avoids reading file footers to obtain this information, which can be costly for queries spanning tens of thousands of files."}),"\n",(0,a.jsxs)(n.p,{children:["Data Skipping leverages metadata table's ",(0,a.jsx)(n.code,{children:"col_stats"})," partition bearing column-level statistics (such as min-value, max-value, count of null-values in the column, etc)\nfor every file of the Hudi table. This then allows Hudi for every incoming query instead of enumerating every file in the table and reading its corresponding metadata\n(for ex, Parquet footers) for analysis whether it could contain any data matching the query filters, to simply do a query against a Column Stats Index\nin the Metadata Table (which in turn is a Hudi table itself) and within seconds (even for TBs scale tables, with 10s of thousands of files) obtain the list\nof ",(0,a.jsx)(n.em,{children:"all the files that might potentially contain the data"})," matching query's filters with crucial property that files that could be ruled out as not containing such data\n(based on their column-level statistics) will be stripped out. See ",(0,a.jsx)(n.a,{href:"https://github.com/apache/hudi/blob/master/rfc/rfc-27/rfc-27.md",children:"RFC-27"})," for detailed design."]}),"\n",(0,a.jsx)(n.p,{children:"Partitioning can be considered a coarse form of indexing and data skipping using the col_stats partition can be thought of as a range index, that databases use to identify potential\nblocks of data interesting to a query. Unlike partition pruning for tables using physical partitioning where records in the dataset are organized into a folder structure based\non some column's value, data skipping using col_stats delivers a logical/virtual partitioning."}),"\n",(0,a.jsx)(n.p,{children:"For very large tables (1Tb+, 10s of 1000s of files), Data skipping could"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Substantially improve query execution runtime ",(0,a.jsx)(n.strong,{children:"10x"})," as compared to the same query on the same dataset but w/o Data Skipping enabled."]}),"\n",(0,a.jsx)(n.li,{children:"Help avoid hitting Cloud Storages throttling limits (for issuing too many requests, for ex, AWS limits # of requests / sec that could be issued based on the object's prefix which considerably complicates things for partitioned tables)"}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"To unlock the power of Data Skipping you will need to"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Enable Metadata Table along with Column Stats Index on the ",(0,a.jsx)(n.em,{children:"write path"})," (See ",(0,a.jsx)(n.a,{href:"/docs/metadata_indexing",children:"Metadata Indexing"}),"), using ",(0,a.jsx)(n.code,{children:"hoodie.metadata.enable=true"})," (to enable Metadata Table on the write path, enabled by default)"]}),"\n",(0,a.jsxs)(n.li,{children:["Enable Data Skipping in your queries, using ",(0,a.jsx)(n.code,{children:"hoodie.metadata.index.column.stats.enable=true"})," (to enable Column Stats Index being populated on the write path, disabled by default)"]}),"\n"]}),"\n",(0,a.jsx)(n.admonition,{type:"note",children:(0,a.jsxs)(n.p,{children:["If you're planning on enabling Column Stats Index for already existing table, please check out the ",(0,a.jsx)(n.a,{href:"/docs/metadata_indexing",children:"Metadata Indexing"})," guide on how to build Metadata Table Indices (such as Column Stats Index) for existing tables."]})}),"\n",(0,a.jsxs)(n.p,{children:["To enable Data Skipping in your queries make sure to set following properties to ",(0,a.jsx)(n.code,{children:"true"})," (on the read path):"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"hoodie.enable.data.skipping"})," (to control data skipping, enabled by default)"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"hoodie.metadata.enable"})," (to enable metadata table use on the read path, enabled by default)"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"hoodie.metadata.index.column.stats.enable"})," (to enable column stats index use on the read path)"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},63490:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/hudi_upsert_perf1-8f41921dacb5fb026f1e5457f8c47aa6.png"},19577:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/hudi_upsert_perf2-d4bfcab4e9e8d942a02b712797ee2755.png"},28453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>r});var t=i(96540);const a={},s=t.createContext(a);function o(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/effd3c61.65cd727e.js b/content/assets/js/effd3c61.65cd727e.js new file mode 100644 index 0000000000000..236c482f244e1 --- /dev/null +++ b/content/assets/js/effd3c61.65cd727e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[8889],{6989:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"timeline","title":"Timeline","description":"Changes to table state (writes, table services, schema changes, etc) are recorded as actions_** in the Hudi timeline_. The Hudi timeline is a log of all actions performed","source":"@site/docs/timeline.md","sourceDirName":".","slug":"/timeline","permalink":"/docs/next/timeline","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/timeline.md","tags":[],"version":"current","frontMatter":{"title":"Timeline","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4},"sidebar":"docs","previous":{"title":"Apache Hudi Stack","permalink":"/docs/next/hudi_stack"},"next":{"title":"Storage Layouts","permalink":"/docs/next/storage_layouts"}}');var s=i(74848),a=i(28453);const r={title:"Timeline",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4},o=void 0,l={},c=[{value:"Action Types",id:"action-types",level:3},{value:"State Transitions",id:"state-transitions",level:3},{value:"TrueTime Generation",id:"truetime-generation",level:3},{value:"Ordering of Actions",id:"ordering-of-actions",level:3},{value:"Timeline Components",id:"timeline-components",level:3},{value:"Active Timeline",id:"active-timeline",level:4},{value:"LSM Timeline History",id:"lsm-timeline-history",level:4},{value:"Timeline Archival Configs",id:"timeline-archival-configs",level:3},{value:"Spark configs",id:"spark-configs",level:4},{value:"Flink Options",id:"flink-options",level:4},{value:"Related Resources",id:"related-resources",level:2}];function d(e){const t={a:"a",br:"br",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["Changes to table state (writes, table services, schema changes, etc) are recorded as ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"actions"})})," in the Hudi ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"timeline"})}),". The Hudi timeline is a log of all actions performed\non the table at different ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"instants"})})," (points in time). It is a key component of Hudi's architecture, acting as a source of truth for the state of the table. All instant times\nused on the timeline follow ",(0,s.jsx)(t.a,{href:"https://research.google/pubs/spanner-truetime-and-the-cap-theorem/",children:"TrueTime"})," semantics, and are monotonically increasing globally across various\nprocesses involved. See TrueTime section below for more details."]}),"\n",(0,s.jsx)(t.p,{children:"Each action has the following attributes associated with it."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"requested instant"})," : Instant time representing when the action was requested on the timeline and acts as the transaction id. An immutable plan for the action should be generated before the action is requested."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"completed instant"})," : Instant time representing when the action was completed on the timeline. All relevant changes to table data/metadata should be made before the action is completed."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"state"})," : state of the action. valid states are ",(0,s.jsx)(t.code,{children:"REQUESTED"}),", ",(0,s.jsx)(t.code,{children:"INFLIGHT"})," and ",(0,s.jsx)(t.code,{children:"COMPLETED"})," during an action's lifecycle."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"type"})," : the kind of action performed. See below for full list of actions."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"Timeline actions",src:i(57050).A+"",width:"817",height:"424"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: Actions in the timeline"})]}),"\n",(0,s.jsx)(t.h3,{id:"action-types",children:"Action Types"}),"\n",(0,s.jsx)(t.p,{children:"Following are the valid action types."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"COMMIT"})," - Write operation denoting an atomic write of a batch of records into a base files in the table."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"DELTA_COMMIT"})," - Write operation denoting an atomic write of a batch of records into merge-on-read type table, where some/all of the data could be just written to delta logs."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"REPLACE_COMMIT"})," - Write operation that atomically replaces a set of file groups in the table with another. Used for implementing batch write operations like ",(0,s.jsx)(t.em,{children:"insert_overwrite"}),", ",(0,s.jsx)(t.em,{children:"delete_partition"})," etc, as well as table services\nlike clustering."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"CLEANS"})," - Table service that removes older file slices that are no longer needed from the table, by deleting those files."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"COMPACTION"})," - Table service to reconcile differential data between base and delta files, by merging delta files into base files."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"LOGCOMPACTION"})," - Table service to merge multiple small log files into a bigger log file in the same file slice."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"CLUSTERING"})," - Table service to rewrite existing file groups with optimized sort order or storage layouts, as new file groups in the table."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"INDEXING"})," - Table service to build an index of a requested type on a column of the table, consistent with the state of the table at the completed instant in face of ongoing writes."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"ROLLBACK"})," - Indicates that an unsuccessful write operation was rolled back, removing any partial/uncommitted files produced during such a write from storage."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"SAVEPOINT"}),' - Marks certain file slices as "saved", such that cleaner will not delete them. It helps restore the table to a point on the timeline, in case of disaster/data recovery scenarios or perform time-travel queries as of those instants.']}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"RESTORE"})," - Restores a table to a given savepoint on the timeline, in case of disaster/data recovery scenarios."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["In some cases, action types in the completed state may be different from requested/inflight states, but still tracked by the same requested instant. For e.g. ",(0,s.jsx)(t.em,{children:"CLUSTERING"})," as in requested/inflight state,\nbecomes ",(0,s.jsx)(t.em,{children:"REPLACE_COMMIT"})," in completed state. Compactions complete as ",(0,s.jsx)(t.em,{children:"COMMIT"})," action on the timeline producing new base files. In general, multiple write operations from the storage engine\nmay map to the same action on the timeline."]}),"\n",(0,s.jsx)(t.h3,{id:"state-transitions",children:"State Transitions"}),"\n",(0,s.jsxs)(t.p,{children:["Actions go through state transitions on the timeline, with each transition recorded by a file of the pattern ",(0,s.jsx)(t.code,{children:".."}),"(for other states) or\n",(0,s.jsx)(t.code,{children:"_."})," (for COMPLETED state). Hudi guarantees that the state transitions are atomic and timeline consistent based on the instant time.\nAtomicity is achieved by relying on the atomic operations on the underlying storage (e.g. PUT calls to S3/Cloud Storage)."]}),"\n",(0,s.jsx)(t.p,{children:"Valid state transitions are as follows:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"[ ] -> REQUESTED"})," - Denotes an action has been scheduled, but has not initiated by any process yet.\nNote that the process requesting the action can be different from the process that will perform/complete the action."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"REQUESTED -> INFLIGHT"})," - Denotes that the action is currently being performed by some process."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"INFLIGHT -> REQUESTED"})," or ",(0,s.jsx)(t.code,{children:"INFLIGHT -> INFLIGHT"})," - A process can safely fail many times while performing the action."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"INFLIGHT -> COMPLETED"})," - Denotes that the action has been completed successfully."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["The current state of an action on the timeline is the highest state recorded for that action on the timeline, with states ordered as ",(0,s.jsx)(t.code,{children:"REQUESTED < INFLIGHT < COMPLETED"}),"."]}),"\n",(0,s.jsx)(t.h3,{id:"truetime-generation",children:"TrueTime Generation"}),"\n",(0,s.jsxs)(t.p,{children:["Time in distributed systems has been studied literally for ",(0,s.jsx)(t.a,{href:"https://lamport.azurewebsites.net/pubs/chandy.pdf",children:"decades"}),". Google Spanner\u2019s\n",(0,s.jsx)(t.a,{href:"https://research.google/pubs/spanner-truetime-and-the-cap-theorem/",children:"TrueTime"})," API addresses the challenges of managing time in distributed systems by providing a globally\nsynchronized clock with bounded uncertainty. Traditional systems struggle with clock drift and lack of a consistent timeline, but TrueTime ensures that all nodes operate with\na common notion of time, defined by a strict interval of uncertainty. This enables Spanner to achieve external consistency in distributed transactions, allowing it to assign\ntimestamps with confidence that no other operation in the past or future will conflict, solving age-old issues of clock synchronization and causality. Several OLTP databases\nlike Spanner, ",(0,s.jsx)(t.a,{href:"https://www.cockroachlabs.com/blog/living-without-atomic-clocks/",children:"CockroachDB"})," rely on TrueTime."]}),"\n",(0,s.jsx)(t.p,{children:"Hudi uses these semantics for instant times on the timeline, to provide unique monotonically increasing instant values. TrueTime can be generated by a single shared time generator\nprocess or by having each process generate its own time and waiting for time >= maximum expected clock drift across all processes within a distributed lock. Locking ensures only one\nprocess is generating time at a time and waiting ensures enough time passes such that any new time generated is guaranteed to be greater than the previous time."}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"Timeline actions",src:i(94200).A+"",width:"704",height:"511"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: TrueTime generation for processes A & B"})]}),"\n",(0,s.jsxs)(t.p,{children:["The figure above shows how time generated by process A and B are monotonically increasing, even though process B has a lower local clock than A at the start, by waiting for uncertainty window of x ms to pass.",(0,s.jsx)(t.br,{}),"\n","In fact, given Hudi targets transaction durations > 1 second, we can afford to operate with a much higher uncertainty bound (> 100ms) guaranteeing extremely high fidelity time generation."]}),"\n",(0,s.jsx)(t.h3,{id:"ordering-of-actions",children:"Ordering of Actions"}),"\n",(0,s.jsx)(t.p,{children:"Thus, actions appear on the timeline as an interval starting at the requested instant and ending at the completed instant. Such actions can be ordered by completion time to"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Commit time ordering"})," : To obtain serializable execution order of writes performed consistent with typical relational databases, the actions can be ordered by completed instant."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Event time ordering"}),": Data lakehouses ultimately deal with streams of data (CDC, events, slowly changing data etc), where ordering is dependent on business fields in\nthe data. In such cases, actions can be ordered by commit time, while the records themselves are further merged in order of a specified event time field."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Hudi relies on ordering of requested instants of certain actions against completed instants of other actions, to implement non-blocking table service operations or concurrent streaming model\nwrites with event time ordering."}),"\n",(0,s.jsx)(t.h3,{id:"timeline-components",children:"Timeline Components"}),"\n",(0,s.jsx)(t.h4,{id:"active-timeline",children:"Active Timeline"}),"\n",(0,s.jsxs)(t.p,{children:["Hudi implements the timeline as a Log Structured Merge (",(0,s.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Log-structured_merge-tree",children:"LSM"}),") tree under the ",(0,s.jsx)(t.code,{children:".hoodie/timeline"})," directory. Unlike typical LSM implementations,\nthe memory component and the write-ahead-log are at once replaced by ",(0,s.jsx)(t.a,{href:"https://avro.apache.org/",children:"avro"})," serialized files containing individual actions (",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"active timeline"})}),") for high durability and inter-process co-ordination.\nAll actions on the Hudi table are created in the active timeline a new entry and periodically actions are archived from the active timeline to the LSM structure (timeline history).\nAs the name suggests active timeline is consulted all the time to build a consistent view of data and archiving completed actions ensures reads on the timeline does not incur unnecessary latencies\nas timeline grows. The key invariant around such archiving is that any side effects from completed/pending actions (e.g. uncommitted files) are removed from storage, before archiving them."]}),"\n",(0,s.jsx)(t.h4,{id:"lsm-timeline-history",children:"LSM Timeline History"}),"\n",(0,s.jsxs)(t.p,{children:["As mentioned above, active timeline has limited log history to be fast, while archived timeline is expensive to access\nduring reads or writes, especially with high write throughput. To overcome this limitation, Hudi introduced the LSM (\nlog-structured merge) tree based timeline. Completed actions, their plans and completion metadata are stored in a more\nscalable LSM tree based archived timeline organized in an ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"history"})})," storage folder under the ",(0,s.jsx)(t.code,{children:".hoodie/timeline"})," metadata\npath. It consists of Apache Parquet files with action instant data and bookkeeping metadata files, in the following\nmanner."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"/.hoodie/timeline/history/ \t\t\t\t\t\n\u251c\u2500\u2500 _version_ \t\t\t\t\t <-- stores the manifest version that is current\n\u251c\u2500\u2500 manifest_1 <-- manifests store list of files in timeline\n\u251c\u2500\u2500 manifest_2 <-- compactions, cleaning, writes produce new manifest files\n\u251c\u2500\u2500 ... \n\u251c\u2500\u2500 manifest_ <-- there can be many manifest files at any given time\n\u251c\u2500\u2500 __.parquet <-- files storing actual action details\n"})}),"\n",(0,s.jsx)(t.p,{children:"One can read more about the details of LSM timeline in Hudi 1.0 specs. To understand it better, here is an example."}),"\n",(0,s.jsx)("figure",{children:(0,s.jsx)("img",{className:"docimage",src:i(91140).A,alt:"lsm_tree.png"})}),"\n",(0,s.jsxs)(t.p,{children:["In the above figure, each level is a tree sorted by instant times. We can see that for a bunch of commits the metadata\nis stored in a parquet file. As and when more commits are accumulated, they get compacted and pushed down to lower level\nof the tree. Each new operation to the timeline yields a new snapshot version. The advantage of such a structure is that\nwe can keep the top level in memory if needed, and still load the remaining levels efficiently from the disk if we need to walk\nback longer history. The LSM timeline compaction frequency is controlled by",(0,s.jsx)(t.code,{children:"hoodie.timeline.compaction.batch.size"})," i.e.\nfor every ",(0,s.jsx)(t.em,{children:"N"})," parquet files in the current level, they are merged and flush as a compacted file in the next level."]}),"\n",(0,s.jsx)(t.h3,{id:"timeline-archival-configs",children:"Timeline Archival Configs"}),"\n",(0,s.jsx)(t.p,{children:"Basic configurations that control archival."}),"\n",(0,s.jsx)(t.h4,{id:"spark-configs",children:"Spark configs"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.keep.max.commits"}),(0,s.jsx)(t.td,{children:"30 (Optional)"}),(0,s.jsx)(t.td,{children:"Archiving service moves older entries from timeline into an archived log after each write, to keep the metadata overhead constant, even as the table size grows. This config controls the maximum number of instants to retain in the active timeline."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.keep.min.commits"}),(0,s.jsx)(t.td,{children:"20 (Optional)"}),(0,s.jsx)(t.td,{children:"Similar to hoodie.keep.max.commits, but controls the minimum number of instants to retain in the active timeline."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.timeline.compaction.batch.size"}),(0,s.jsx)(t.td,{children:"10 (Optional)"}),(0,s.jsx)(t.td,{children:"Controls the number of parquet files to compact in a single compaction run at the current level of the LSM tree."})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["For more advanced configs refer ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations#Archival-Configs-advanced-configs",children:"here"}),"."]}),"\n",(0,s.jsx)(t.h4,{id:"flink-options",children:"Flink Options"}),"\n",(0,s.jsx)(t.p,{children:"Flink jobs using the SQL can be configured through the options in WITH clause. The actual datasource level configs are listed below."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"archive.max_commits"}),(0,s.jsx)(t.td,{children:"50 (Optional)"}),(0,s.jsxs)(t.td,{children:["Max number of commits to keep before archiving older commits into a sequential log, default 50",(0,s.jsx)("br",{}),(0,s.jsx)("br",{})," ",(0,s.jsx)(t.code,{children:"Config Param: ARCHIVE_MAX_COMMITS"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"archive.min_commits"}),(0,s.jsx)(t.td,{children:"40 (Optional)"}),(0,s.jsxs)(t.td,{children:["Min number of commits to keep before archiving older commits into a sequential log, default 40",(0,s.jsx)("br",{}),(0,s.jsx)("br",{})," ",(0,s.jsx)(t.code,{children:"Config Param: ARCHIVE_MIN_COMMITS"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.timeline.compaction.batch.size"}),(0,s.jsx)(t.td,{children:"10 (Optional)"}),(0,s.jsx)(t.td,{children:"Controls the number of parquet files to compact in a single compaction run at the current level of the LSM tree."})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["Refer ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations#Flink-Options",children:"here"})," for more details."]}),"\n",(0,s.jsx)(t.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,s.jsx)("h3",{children:"Blogs"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://medium.com/@simpsons/hoodie-timeline-foundational-pillar-for-acid-transactions-be871399cbae",children:"Apache Hudi Timeline: Foundational pillar for ACID transactions"})}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},91140:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/lsm_tree-0a069798a1196c1c71330abcb7ff3581.png"},57050:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/hudi-timeline-actions-e56d0d9fad5645d9910f2591ad7775de.png"},94200:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/hudi-timeline-truetime-4cb47da19e5344580d5ebdcdce3d6cf2.png"},28453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>o});var n=i(96540);const s={},a=n.createContext(s);function r(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/effd3c61.86b477eb.js b/content/assets/js/effd3c61.86b477eb.js deleted file mode 100644 index 0db4aeda8e20f..0000000000000 --- a/content/assets/js/effd3c61.86b477eb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[8889],{6989:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"timeline","title":"Timeline","description":"Changes to table state (writes, table services, schema changes, etc) are recorded as actions_** in the Hudi timeline_. The Hudi timeline is a log of all actions performed","source":"@site/docs/timeline.md","sourceDirName":".","slug":"/timeline","permalink":"/docs/next/timeline","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/timeline.md","tags":[],"version":"current","frontMatter":{"title":"Timeline","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4},"sidebar":"docs","previous":{"title":"Apache Hudi Stack","permalink":"/docs/next/hudi_stack"},"next":{"title":"Storage Layouts","permalink":"/docs/next/storage_layouts"}}');var s=i(74848),a=i(28453);const r={title:"Timeline",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4},o=void 0,l={},c=[{value:"Action Types",id:"action-types",level:3},{value:"State Transitions",id:"state-transitions",level:3},{value:"TrueTime Generation",id:"truetime-generation",level:3},{value:"Ordering of Actions",id:"ordering-of-actions",level:3},{value:"Timeline Components",id:"timeline-components",level:3},{value:"Active Timeline",id:"active-timeline",level:4},{value:"LSM Timeline History",id:"lsm-timeline-history",level:4},{value:"Timeline Archival Configs",id:"timeline-archival-configs",level:3},{value:"Spark configs",id:"spark-configs",level:4},{value:"Flink Options",id:"flink-options",level:4}];function d(e){const t={a:"a",br:"br",code:"code",em:"em",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["Changes to table state (writes, table services, schema changes, etc) are recorded as ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"actions"})})," in the Hudi ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"timeline"})}),". The Hudi timeline is a log of all actions performed\non the table at different ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"instants"})})," (points in time). It is a key component of Hudi's architecture, acting as a source of truth for the state of the table. All instant times\nused on the timeline follow ",(0,s.jsx)(t.a,{href:"https://research.google/pubs/spanner-truetime-and-the-cap-theorem/",children:"TrueTime"})," semantics, and are monotonically increasing globally across various\nprocesses involved. See TrueTime section below for more details."]}),"\n",(0,s.jsx)(t.p,{children:"Each action has the following attributes associated with it."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"requested instant"})," : Instant time representing when the action was requested on the timeline and acts as the transaction id. An immutable plan for the action should be generated before the action is requested."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"completed instant"})," : Instant time representing when the action was completed on the timeline. All relevant changes to table data/metadata should be made before the action is completed."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"state"})," : state of the action. valid states are ",(0,s.jsx)(t.code,{children:"REQUESTED"}),", ",(0,s.jsx)(t.code,{children:"INFLIGHT"})," and ",(0,s.jsx)(t.code,{children:"COMPLETED"})," during an action's lifecycle."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"type"})," : the kind of action performed. See below for full list of actions."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"Timeline actions",src:i(57050).A+"",width:"817",height:"424"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: Actions in the timeline"})]}),"\n",(0,s.jsx)(t.h3,{id:"action-types",children:"Action Types"}),"\n",(0,s.jsx)(t.p,{children:"Following are the valid action types."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"COMMIT"})," - Write operation denoting an atomic write of a batch of records into a base files in the table."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"DELTA_COMMIT"})," - Write operation denoting an atomic write of a batch of records into merge-on-read type table, where some/all of the data could be just written to delta logs."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"REPLACE_COMMIT"})," - Write operation that atomically replaces a set of file groups in the table with another. Used for implementing batch write operations like ",(0,s.jsx)(t.em,{children:"insert_overwrite"}),", ",(0,s.jsx)(t.em,{children:"delete_partition"})," etc, as well as table services\nlike clustering."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"CLEANS"})," - Table service that removes older file slices that are no longer needed from the table, by deleting those files."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"COMPACTION"})," - Table service to reconcile differential data between base and delta files, by merging delta files into base files."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"LOGCOMPACTION"})," - Table service to merge multiple small log files into a bigger log file in the same file slice."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"CLUSTERING"})," - Table service to rewrite existing file groups with optimized sort order or storage layouts, as new file groups in the table."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"INDEXING"})," - Table service to build an index of a requested type on a column of the table, consistent with the state of the table at the completed instant in face of ongoing writes."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"ROLLBACK"})," - Indicates that an unsuccessful write operation was rolled back, removing any partial/uncommitted files produced during such a write from storage."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"SAVEPOINT"}),' - Marks certain file slices as "saved", such that cleaner will not delete them. It helps restore the table to a point on the timeline, in case of disaster/data recovery scenarios or perform time-travel queries as of those instants.']}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"RESTORE"})," - Restores a table to a given savepoint on the timeline, in case of disaster/data recovery scenarios."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["In some cases, action types in the completed state may be different from requested/inflight states, but still tracked by the same requested instant. For e.g. ",(0,s.jsx)(t.em,{children:"CLUSTERING"})," as in requested/inflight state,\nbecomes ",(0,s.jsx)(t.em,{children:"REPLACE_COMMIT"})," in completed state. Compactions complete as ",(0,s.jsx)(t.em,{children:"COMMIT"})," action on the timeline producing new base files. In general, multiple write operations from the storage engine\nmay map to the same action on the timeline."]}),"\n",(0,s.jsx)(t.h3,{id:"state-transitions",children:"State Transitions"}),"\n",(0,s.jsxs)(t.p,{children:["Actions go through state transitions on the timeline, with each transition recorded by a file of the pattern ",(0,s.jsx)(t.code,{children:".."}),"(for other states) or\n",(0,s.jsx)(t.code,{children:"_."})," (for COMPLETED state). Hudi guarantees that the state transitions are atomic and timeline consistent based on the instant time.\nAtomicity is achieved by relying on the atomic operations on the underlying storage (e.g. PUT calls to S3/Cloud Storage)."]}),"\n",(0,s.jsx)(t.p,{children:"Valid state transitions are as follows:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"[ ] -> REQUESTED"})," - Denotes an action has been scheduled, but has not initiated by any process yet.\nNote that the process requesting the action can be different from the process that will perform/complete the action."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"REQUESTED -> INFLIGHT"})," - Denotes that the action is currently being performed by some process."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"INFLIGHT -> REQUESTED"})," or ",(0,s.jsx)(t.code,{children:"INFLIGHT -> INFLIGHT"})," - A process can safely fail many times while performing the action."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"INFLIGHT -> COMPLETED"})," - Denotes that the action has been completed successfully."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["The current state of an action on the timeline is the highest state recorded for that action on the timeline, with states ordered as ",(0,s.jsx)(t.code,{children:"REQUESTED < INFLIGHT < COMPLETED"}),"."]}),"\n",(0,s.jsx)(t.h3,{id:"truetime-generation",children:"TrueTime Generation"}),"\n",(0,s.jsxs)(t.p,{children:["Time in distributed systems has been studied literally for ",(0,s.jsx)(t.a,{href:"https://lamport.azurewebsites.net/pubs/chandy.pdf",children:"decades"}),". Google Spanner\u2019s\n",(0,s.jsx)(t.a,{href:"https://research.google/pubs/spanner-truetime-and-the-cap-theorem/",children:"TrueTime"})," API addresses the challenges of managing time in distributed systems by providing a globally\nsynchronized clock with bounded uncertainty. Traditional systems struggle with clock drift and lack of a consistent timeline, but TrueTime ensures that all nodes operate with\na common notion of time, defined by a strict interval of uncertainty. This enables Spanner to achieve external consistency in distributed transactions, allowing it to assign\ntimestamps with confidence that no other operation in the past or future will conflict, solving age-old issues of clock synchronization and causality. Several OLTP databases\nlike Spanner, ",(0,s.jsx)(t.a,{href:"https://www.cockroachlabs.com/blog/living-without-atomic-clocks/",children:"CockroachDB"})," rely on TrueTime."]}),"\n",(0,s.jsx)(t.p,{children:"Hudi uses these semantics for instant times on the timeline, to provide unique monotonically increasing instant values. TrueTime can be generated by a single shared time generator\nprocess or by having each process generate its own time and waiting for time >= maximum expected clock drift across all processes within a distributed lock. Locking ensures only one\nprocess is generating time at a time and waiting ensures enough time passes such that any new time generated is guaranteed to be greater than the previous time."}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"Timeline actions",src:i(94200).A+"",width:"704",height:"511"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: TrueTime generation for processes A & B"})]}),"\n",(0,s.jsxs)(t.p,{children:["The figure above shows how time generated by process A and B are monotonically increasing, even though process B has a lower local clock than A at the start, by waiting for uncertainty window of x ms to pass.",(0,s.jsx)(t.br,{}),"\n","In fact, given Hudi targets transaction durations > 1 second, we can afford to operate with a much higher uncertainty bound (> 100ms) guaranteeing extremely high fidelity time generation."]}),"\n",(0,s.jsx)(t.h3,{id:"ordering-of-actions",children:"Ordering of Actions"}),"\n",(0,s.jsx)(t.p,{children:"Thus, actions appear on the timeline as an interval starting at the requested instant and ending at the completed instant. Such actions can be ordered by completion time to"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Commit time ordering"})," : To obtain serializable execution order of writes performed consistent with typical relational databases, the actions can be ordered by completed instant."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Event time ordering"}),": Data lakehouses ultimately deal with streams of data (CDC, events, slowly changing data etc), where ordering is dependent on business fields in\nthe data. In such cases, actions can be ordered by commit time, while the records themselves are further merged in order of a specified event time field."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Hudi relies on ordering of requested instants of certain actions against completed instants of other actions, to implement non-blocking table service operations or concurrent streaming model\nwrites with event time ordering."}),"\n",(0,s.jsx)(t.h3,{id:"timeline-components",children:"Timeline Components"}),"\n",(0,s.jsx)(t.h4,{id:"active-timeline",children:"Active Timeline"}),"\n",(0,s.jsxs)(t.p,{children:["Hudi implements the timeline as a Log Structured Merge (",(0,s.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Log-structured_merge-tree",children:"LSM"}),") tree under the ",(0,s.jsx)(t.code,{children:".hoodie/timeline"})," directory. Unlike typical LSM implementations,\nthe memory component and the write-ahead-log are at once replaced by ",(0,s.jsx)(t.a,{href:"https://avro.apache.org/",children:"avro"})," serialized files containing individual actions (",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"active timeline"})}),") for high durability and inter-process co-ordination.\nAll actions on the Hudi table are created in the active timeline a new entry and periodically actions are archived from the active timeline to the LSM structure (timeline history).\nAs the name suggests active timeline is consulted all the time to build a consistent view of data and archiving completed actions ensures reads on the timeline does not incur unnecessary latencies\nas timeline grows. The key invariant around such archiving is that any side effects from completed/pending actions (e.g. uncommitted files) are removed from storage, before archiving them."]}),"\n",(0,s.jsx)(t.h4,{id:"lsm-timeline-history",children:"LSM Timeline History"}),"\n",(0,s.jsxs)(t.p,{children:["As mentioned above, active timeline has limited log history to be fast, while archived timeline is expensive to access\nduring reads or writes, especially with high write throughput. To overcome this limitation, Hudi introduced the LSM (\nlog-structured merge) tree based timeline. Completed actions, their plans and completion metadata are stored in a more\nscalable LSM tree based archived timeline organized in an ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"history"})})," storage folder under the ",(0,s.jsx)(t.code,{children:".hoodie/timeline"})," metadata\npath. It consists of Apache Parquet files with action instant data and bookkeeping metadata files, in the following\nmanner."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"/.hoodie/timeline/history/ \t\t\t\t\t\n\u251c\u2500\u2500 _version_ \t\t\t\t\t <-- stores the manifest version that is current\n\u251c\u2500\u2500 manifest_1 <-- manifests store list of files in timeline\n\u251c\u2500\u2500 manifest_2 <-- compactions, cleaning, writes produce new manifest files\n\u251c\u2500\u2500 ... \n\u251c\u2500\u2500 manifest_ <-- there can be many manifest files at any given time\n\u251c\u2500\u2500 __.parquet <-- files storing actual action details\n"})}),"\n",(0,s.jsx)(t.p,{children:"One can read more about the details of LSM timeline in Hudi 1.0 specs. To understand it better, here is an example."}),"\n",(0,s.jsx)("figure",{children:(0,s.jsx)("img",{className:"docimage",src:i(91140).A,alt:"lsm_tree.png"})}),"\n",(0,s.jsxs)(t.p,{children:["In the above figure, each level is a tree sorted by instant times. We can see that for a bunch of commits the metadata\nis stored in a parquet file. As and when more commits are accumulated, they get compacted and pushed down to lower level\nof the tree. Each new operation to the timeline yields a new snapshot version. The advantage of such a structure is that\nwe can keep the top level in memory if needed, and still load the remaining levels efficiently from the disk if we need to walk\nback longer history. The LSM timeline compaction frequency is controlled by",(0,s.jsx)(t.code,{children:"hoodie.timeline.compaction.batch.size"})," i.e.\nfor every ",(0,s.jsx)(t.em,{children:"N"})," parquet files in the current level, they are merged and flush as a compacted file in the next level."]}),"\n",(0,s.jsx)(t.h3,{id:"timeline-archival-configs",children:"Timeline Archival Configs"}),"\n",(0,s.jsx)(t.p,{children:"Basic configurations that control archival."}),"\n",(0,s.jsx)(t.h4,{id:"spark-configs",children:"Spark configs"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.keep.max.commits"}),(0,s.jsx)(t.td,{children:"30 (Optional)"}),(0,s.jsx)(t.td,{children:"Archiving service moves older entries from timeline into an archived log after each write, to keep the metadata overhead constant, even as the table size grows. This config controls the maximum number of instants to retain in the active timeline."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.keep.min.commits"}),(0,s.jsx)(t.td,{children:"20 (Optional)"}),(0,s.jsx)(t.td,{children:"Similar to hoodie.keep.max.commits, but controls the minimum number of instants to retain in the active timeline."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.timeline.compaction.batch.size"}),(0,s.jsx)(t.td,{children:"10 (Optional)"}),(0,s.jsx)(t.td,{children:"Controls the number of parquet files to compact in a single compaction run at the current level of the LSM tree."})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["For more advanced configs refer ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations#Archival-Configs-advanced-configs",children:"here"}),"."]}),"\n",(0,s.jsx)(t.h4,{id:"flink-options",children:"Flink Options"}),"\n",(0,s.jsx)(t.p,{children:"Flink jobs using the SQL can be configured through the options in WITH clause. The actual datasource level configs are listed below."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"archive.max_commits"}),(0,s.jsx)(t.td,{children:"50 (Optional)"}),(0,s.jsxs)(t.td,{children:["Max number of commits to keep before archiving older commits into a sequential log, default 50",(0,s.jsx)("br",{}),(0,s.jsx)("br",{})," ",(0,s.jsx)(t.code,{children:"Config Param: ARCHIVE_MAX_COMMITS"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"archive.min_commits"}),(0,s.jsx)(t.td,{children:"40 (Optional)"}),(0,s.jsxs)(t.td,{children:["Min number of commits to keep before archiving older commits into a sequential log, default 40",(0,s.jsx)("br",{}),(0,s.jsx)("br",{})," ",(0,s.jsx)(t.code,{children:"Config Param: ARCHIVE_MIN_COMMITS"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.timeline.compaction.batch.size"}),(0,s.jsx)(t.td,{children:"10 (Optional)"}),(0,s.jsx)(t.td,{children:"Controls the number of parquet files to compact in a single compaction run at the current level of the LSM tree."})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["Refer ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations#Flink-Options",children:"here"})," for more details."]})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},91140:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/lsm_tree-0a069798a1196c1c71330abcb7ff3581.png"},57050:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/hudi-timeline-actions-e56d0d9fad5645d9910f2591ad7775de.png"},94200:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/hudi-timeline-truetime-4cb47da19e5344580d5ebdcdce3d6cf2.png"},28453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>o});var n=i(96540);const s={},a=n.createContext(s);function r(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/f67021ea.53f18aee.js b/content/assets/js/f67021ea.79ab4ac0.js similarity index 94% rename from content/assets/js/f67021ea.53f18aee.js rename to content/assets/js/f67021ea.79ab4ac0.js index d638d2af06db7..534927e560f12 100644 --- a/content/assets/js/f67021ea.53f18aee.js +++ b/content/assets/js/f67021ea.79ab4ac0.js @@ -1 +1 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[17987],{26947:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"indexes","title":"Indexes","description":"In databases, indexes are auxiliary data structures maintained to quickly locate records needed, without reading unnecessary data","source":"@site/docs/indexes.md","sourceDirName":".","slug":"/indexes","permalink":"/docs/next/indexes","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/indexes.md","tags":[],"version":"current","frontMatter":{"title":"Indexes","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4},"sidebar":"docs","previous":{"title":"Table Metadata","permalink":"/docs/next/metadata"},"next":{"title":"Concurrency Control","permalink":"/docs/next/concurrency_control"}}');var s=i(74848),a=i(28453);const o={title:"Indexes",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4},r=void 0,d={},l=[{value:"Mapping keys to file groups",id:"mapping-keys-to-file-groups",level:2},{value:"Need for indexing",id:"need-for-indexing",level:2},{value:"Multi-modal Indexing",id:"multi-modal-indexing",level:2},{value:"Bloom Filters",id:"bloom-filters",level:3},{value:"Record Indexes",id:"record-indexes",level:3},{value:"Expression Index",id:"expression-index",level:3},{value:"Secondary Index",id:"secondary-index",level:3},{value:"Additional writer-side indexes",id:"additional-writer-side-indexes",level:2},{value:"Global and Non-Global Indexes",id:"global-and-non-global-indexes",level:3},{value:"Configs",id:"configs",level:3},{value:"Spark based configs",id:"spark-based-configs",level:4},{value:"Flink based configs",id:"flink-based-configs",level:4},{value:"Picking Indexing Strategies",id:"picking-indexing-strategies",level:3},{value:"Workload 1: Late arriving updates to fact tables",id:"workload-1-late-arriving-updates-to-fact-tables",level:4},{value:"Workload 2: De-Duplication in event tables",id:"workload-2-de-duplication-in-event-tables",level:4},{value:"Workload 3: Random updates/deletes to a dimension table",id:"workload-3-random-updatesdeletes-to-a-dimension-table",level:4},{value:"Related Resources",id:"related-resources",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["In databases, indexes are auxiliary data structures maintained to quickly locate records needed, without reading unnecessary data\nfrom storage. Given that Hudi\u2019s design has been heavily optimized for handling mutable change streams, with different\nwrite patterns, Hudi considers ",(0,s.jsx)(n.a,{href:"#indexing",children:"indexing"})," as an integral part of its design and has uniquely supported\n",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/blog/2020/11/11/hudi-indexing-mechanisms/",children:"indexing capabilities"})," from its inception, to speed\nup writes on the ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/blog/2024/07/11/what-is-a-data-lakehouse/",children:"data lakehouse"}),", while still providing\ncolumnar query performance."]}),"\n",(0,s.jsx)(n.h2,{id:"mapping-keys-to-file-groups",children:"Mapping keys to file groups"}),"\n",(0,s.jsx)(n.p,{children:"The most foundational index mechanism in Hudi tracks a mapping from a given key (record key + optionally partition path) consistently to a file id. Other types of indexes like secondary indexes,\nbuild on this foundation. This mapping between record key and file group/file id rarely changes once the first version of a record has been written to a file group.\nOnly clustering or cross-partition updates that are implemented as deletes + inserts remap the record key to a different file group. Even then, a given record key is associated with exactly one\nfile group at any completed instant on the timeline."}),"\n",(0,s.jsx)(n.h2,{id:"need-for-indexing",children:"Need for indexing"}),"\n",(0,s.jsxs)(n.p,{children:["For ",(0,s.jsx)(n.a,{href:"table_types#copy-on-write-table",children:"Copy-On-Write tables"}),", indexing enables fast upsert/delete operations, by avoiding the need to join against the entire dataset to determine which files to rewrite.\nFor ",(0,s.jsx)(n.a,{href:"table_types#merge-on-read-table",children:"Merge-On-Read tables"}),", indexing allows Hudi to bound the amount of change records any given base file needs to be merged against. Specifically, a given base file needs to merged\nonly against updates for records that are part of that base file."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Fact table",src:i(82301).A+"",width:"3994",height:"1704"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: Comparison of merge cost for updates (dark blue blocks) against base files (light blue blocks)"})]}),"\n",(0,s.jsx)(n.p,{children:"In contrast,"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Designs without an indexing component (e.g: ",(0,s.jsx)(n.a,{href:"https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions",children:"Apache Hive/Apache Iceberg"}),") end up having to merge all the base files against all incoming updates/delete records\n(10-100x more ",(0,s.jsx)(n.a,{href:"table_types#comparison",children:"read amplification"}),")."]}),"\n",(0,s.jsx)(n.li,{children:"Designs that implement heavily write-optimized OLTP data structures like LSM trees do not require an indexing component. But they perform poorly scan heavy workloads\nagainst cloud storage making them unsuitable for serving analytical queries."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Hudi shines by achieving both great write performance and read performance, at the extra storage costs of an index, which can however unlock a lot more, as we explore below."}),"\n",(0,s.jsx)(n.h2,{id:"multi-modal-indexing",children:"Multi-modal Indexing"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://www.onehouse.ai/blog/introducing-multi-modal-index-for-the-lakehouse-in-apache-hudi",children:"Multi-modal indexing"}),",\nintroduced in ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/releases/release-0.11.0/#multi-modal-index",children:"0.11.0 Hudi release"}),",\nis a re-imagination of what a general purpose indexing subsystem should look like for the lake. Multi-modal indexing is\nimplemented by enhancing the metadata table with the flexibility to extend to new index types as new partitions,\nalong with an ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/metadata_indexing/#setup-async-indexing",children:"asynchronous index"})," building"]}),"\n",(0,s.jsxs)(n.p,{children:["Hudi supports a multi-modal index by augmenting the metadata table with the capability to incorporate new types of indexes, complemented by an\nasynchronous mechanism for ",(0,s.jsx)(n.a,{href:"metadata_indexing",children:"index construction"}),". This enhancement supports a range of indexes within\nthe ",(0,s.jsx)(n.a,{href:"metadata#metadata-table",children:"metadata table"}),", significantly improving the efficiency of both writing to and reading from the table."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Indexes",src:i(4390).A+"",width:"1124",height:"639"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: Indexes in Hudi"})]}),"\n",(0,s.jsx)(n.h3,{id:"bloom-filters",children:"Bloom Filters"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://github.com/apache/hudi/blob/46f41d186c6c84a6af2c54a907ff2736b6013e15/rfc/rfc-37/rfc-37.md",children:"Bloom filter"})," indexes as ",(0,s.jsx)(n.em,{children:"bloom_filter"})," partition in the metadata table.\nThis index employs range-based pruning on the minimum and maximum values of the record keys and bloom-filter-based lookups to tag incoming records. For large tables, this\ninvolves reading the footers of all matching data files for bloom filters, which can be expensive in the case of random\nupdates across the entire dataset. This index stores bloom filters of all data files centrally to avoid scanning the\nfooters directly from all data files."]}),"\n",(0,s.jsx)(n.h3,{id:"record-indexes",children:"Record Indexes"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://cwiki.apache.org/confluence/display/HUDI/RFC-08++Record+level+indexing+mechanisms+for+Hudi+datasets",children:"Record indexes"})," as ",(0,s.jsx)(n.em,{children:"record_index"})," partition in the metadata table.\nContains the mapping of the record key to location. Record index is a global index, enforcing key uniqueness across all partitions in the table. This index aids in locating records faster than\nother existing indexes and can provide a speedup orders of magnitude faster in large deployments where index lookup dominates write latencies. To accommodate very high scales, it utilizes hash-based\nsharding of the key space. Additionally, when it comes to reading data, the index allows for point lookups significantly speeding up index mapping retrieval process."]}),"\n",(0,s.jsx)(n.h3,{id:"expression-index",children:"Expression Index"}),"\n",(0,s.jsxs)(n.p,{children:["An ",(0,s.jsx)(n.a,{href:"https://github.com/apache/hudi/blob/3789840be3d041cbcfc6b24786740210e4e6d6ac/rfc/rfc-63/rfc-63.md",children:"expression index"})," is an index on a function of a column. If a query has a predicate on a function of a column, the expression index can\nbe used to speed up the query. Expression index is stored in ",(0,s.jsx)(n.em,{children:"expr_index_"})," prefixed partitions (one for each\nexpression index) under metadata table. Expression index can be created using SQL syntax. Please checkout SQL DDL\ndocs ",(0,s.jsx)(n.a,{href:"sql_ddl#create-expression-index",children:"here"})," for more details."]}),"\n",(0,s.jsx)(n.h3,{id:"secondary-index",children:"Secondary Index"}),"\n",(0,s.jsxs)(n.p,{children:["Secondary indexes allow users to create indexes on columns that are not part of record key columns in Hudi tables (for\nrecord key fields, Hudi supports ",(0,s.jsx)(n.a,{href:"/blog/2023/11/01/record-level-index",children:"Record-level Index"}),". Secondary indexes\ncan be used to speed up queries with predicate on columns other than record key columns."]}),"\n",(0,s.jsx)(n.p,{children:"Following are configurations that control enabling index building and maintenance on the writer."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.metadata.index.bloom.filter.enable"}),(0,s.jsx)(n.td,{children:"false (Optional)"}),(0,s.jsxs)(n.td,{children:["Enable indexing bloom filters of user data files under metadata table. When enabled, metadata table will have a partition to store the bloom filter index and will be used during the index lookups.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: ENABLE_METADATA_INDEX_BLOOM_FILTER"}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Since Version: 0.11.0"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.metadata.record.index.enable"}),(0,s.jsx)(n.td,{children:"false (Optional)"}),(0,s.jsxs)(n.td,{children:["Create the record Index within the metadata table",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: RECORD_INDEX_ENABLE_PROP"}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Since Version: 0.14.0"}),". This is a pre-requisite for secondary indexes or expression indexes on them."]})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"additional-writer-side-indexes",children:"Additional writer-side indexes"}),"\n",(0,s.jsx)(n.p,{children:"All the indexes discussed above are available both readers/writers using integration with metadata table. There are also indexing mechanisms\nimplemented by the storage engine, by efficiently reading/joining/processing incoming input records against information stored in base/log\nfiles themselves (e.g. bloom filters stored in parquet file footers) or intelligent data layout (e.g. bucket index)."}),"\n",(0,s.jsxs)(n.p,{children:["Currently, Hudi supports the following index types. Default is SIMPLE on Spark engine, and INMEMORY on Flink and Java\nengines. Writers can pick one of these options using ",(0,s.jsx)(n.code,{children:"hoodie.index.type"})," config option."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"SIMPLE (default for Spark engines)"}),": This is the standard index type for the Spark engine. It executes an efficient join of incoming records with keys retrieved from the table stored on disk. It requires keys to be partition-level unique so it can function correctly."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"RECORD_INDEX"})," : Use the record index from section above as the writer side index."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"BLOOM"}),": Uses bloom filters generated from record keys, with the option to further narrow down candidate files based on the ranges of the record keys. It requires keys to be partition-level unique so it can function correctly."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"GLOBAL_BLOOM"}),": Utilizes bloom filters created from record keys, and may also refine the selection of candidate files by using the ranges of record keys. It requires keys to be table/global-level unique so it can function correctly."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"GLOBAL_SIMPLE"}),": Performs a lean join of the incoming records against keys extracted from the table on storage. It requires keys to be table/global-level unique so it can function correctly."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"HBASE"}),": Mangages the index mapping through an external table in Apache HBase."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"INMEMORY (default for Flink and Java)"}),": Uses in-memory hashmap in Spark and Java engine and Flink in-memory state in Flink for indexing."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"BUCKET"}),": Utilizes bucket hashing to identify the file group that houses the records, which proves to be particularly advantageous on a large scale. To select the type of bucket engine\u2014that is, the method by which buckets are created\u2014use the ",(0,s.jsx)(n.code,{children:"hoodie.index.bucket.engine"})," configuration option."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"SIMPLE(default)"}),": This index employs a fixed number of buckets for file groups within each partition, which do not have the capacity to decrease or increase in size. It is applicable to both COW and MOR tables. Due to the unchangeable number of buckets and the design principle of mapping each bucket to a single file group, this indexing method may not be ideal for partitions with significant data skew."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"CONSISTENT_HASHING"}),": This index accommodates a dynamic number of buckets, with the capability for bucket resizing to ensure each bucket is sized appropriately. This addresses the issue of data skew in partitions with a high volume of data by allowing these partitions to be dynamically resized. As a result, partitions can have multiple reasonably sized buckets, unlike the fixed bucket count per partition seen in the SIMPLE bucket engine type. This feature is exclusively compatible with MOR tables."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Bring your own implementation:"})," You can extend this ",(0,s.jsx)(n.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/index/HoodieIndex.java",children:"public API"}),"\nand supply a subclass of ",(0,s.jsx)(n.code,{children:"SparkHoodieIndex"})," (for Apache Spark writers) using ",(0,s.jsx)(n.code,{children:"hoodie.index.class"})," to implement custom indexing."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"global-and-non-global-indexes",children:"Global and Non-Global Indexes"}),"\n",(0,s.jsxs)(n.p,{children:["Another key aspect worth understanding is the difference between global and non-global indexes. Both bloom and simple index have\nglobal options - ",(0,s.jsx)(n.code,{children:"hoodie.index.type=GLOBAL_BLOOM"})," and ",(0,s.jsx)(n.code,{children:"hoodie.index.type=GLOBAL_SIMPLE"})," - respectively. Record index and\nHBase index are by nature a global index."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Global index:"})," Global indexes enforce uniqueness of keys across all partitions of a table i.e guarantees that exactly\none record exists in the table for a given record key. Global indexes offer stronger guarantees, but the update/delete\ncost can still grow with size of the table ",(0,s.jsx)(n.code,{children:"O(size of table)"}),", since the record could belong to any partition in storage.\nIn case of non-global index, lookup involves file groups only for the matching partitions from the incoming records and\nso its not impacted by the total size of the table. These global indexes(GLOBAL_SIMPLE or GLOBAL_BLOOM), might be\nacceptable for decent sized tables, but for large tables, a newly added index (0.14.0) called Record Level Index (RLI),\ncan offer pretty good index lookup performance compared to other global indexes(GLOBAL_SIMPLE or GLOBAL_BLOOM) or\nHbase and also avoids the operational overhead of maintaining external systems."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Non Global index:"})," On the other hand, the default index implementations enforce this constraint only within a specific partition.\nAs one might imagine, non global indexes depends on the writer to provide the same consistent partition path for a given record key during update/delete,\nbut can deliver much better performance since the index lookup operation becomes ",(0,s.jsx)(n.code,{children:"O(number of records updated/deleted)"})," and\nscales well with write volume."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"configs",children:"Configs"}),"\n",(0,s.jsx)(n.h4,{id:"spark-based-configs",children:"Spark based configs"}),"\n",(0,s.jsxs)(n.p,{children:["For Spark DataSource, Spark SQL, DeltaStreamer and Structured Streaming following are the key configs that control\nindexing behavior. Please refer to ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/next/configurations#Common-Index-Configs-advanced-configs",children:"Advanced Configs"}),"\nfor more details. All these, support the index types mentioned ",(0,s.jsx)(n.a,{href:"#index-types-in-hudi",children:"above"}),"."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.index.type"}),(0,s.jsxs)(n.td,{children:["N/A ",(0,s.jsx)(n.strong,{children:"(Required)"})]}),(0,s.jsxs)(n.td,{children:["org.apache.hudi.index.HoodieIndex$IndexType: Determines how input records are indexed, i.e., looked up based on the key for the location in the existing table. Default is SIMPLE on Spark engine, and INMEMORY on Flink and Java engines. Possible Values: ",(0,s.jsx)("br",{})," ",(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:"BLOOM"}),(0,s.jsx)("li",{children:"GLOBAL_BLOOM"}),(0,s.jsx)("li",{children:"SIMPLE"}),(0,s.jsx)("li",{children:"GLOBAL_SIMPLE"}),(0,s.jsx)("li",{children:"HBASE"}),(0,s.jsx)("li",{children:"INMEMORY"}),(0,s.jsx)("li",{children:"FLINK_STATE"}),(0,s.jsx)("li",{children:"BUCKET"}),(0,s.jsx)("li",{children:"RECORD_INDEX"})]}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: INDEX_TYPE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.index.bucket.engine"}),(0,s.jsx)(n.td,{children:"SIMPLE (Optional)"}),(0,s.jsxs)(n.td,{children:["org.apache.hudi.index.HoodieIndex$BucketIndexEngineType: Determines the type of bucketing or hashing to use when ",(0,s.jsx)(n.code,{children:"hoodie.index.type"})," is set to ",(0,s.jsx)(n.code,{children:"BUCKET"}),". Possible Values: ",(0,s.jsx)("br",{})," ",(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:"SIMPLE"}),(0,s.jsx)("li",{children:"CONSISTENT_HASHING"})]})," ",(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: BUCKET_INDEX_ENGINE_TYPE"}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Since Version: 0.11.0"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.index.class"}),(0,s.jsx)(n.td,{children:"(Optional)"}),(0,s.jsxs)(n.td,{children:["Full path of user-defined index class and must be a subclass of HoodieIndex class. It will take precedence over the hoodie.index.type configuration if specified",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: INDEX_CLASS_NAME"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.bloom.index.update.partition.path"}),(0,s.jsx)(n.td,{children:"true (Optional)"}),(0,s.jsxs)(n.td,{children:["Only applies if index type is GLOBAL_BLOOM. When set to true, an update including the partition path of a record that already exists will result in inserting the incoming record into the new partition and deleting the original record in the old partition. When set to false, the original record will only be updated in the old partition, ignoring the new incoming partition if there is a mis-match between partition value for an incoming record with whats in storage.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: BLOOM_INDEX_UPDATE_PARTITION_PATH_ENABLE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.record.index.update.partition.path"}),(0,s.jsx)(n.td,{children:"false (Optional)"}),(0,s.jsxs)(n.td,{children:["Similar to Key: 'hoodie.bloom.index.update.partition.path' , Only applies if index type is RECORD_INDEX. When set to true, an update including the partition path of a record that already exists will result in inserting the incoming record into the new partition and deleting the original record in the old partition. When set to false, the original record will only be updated in the old partition, ignoring the new incoming partition if there is a mis-match between partition value for an incoming record with whats in storage. ",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: RECORD_INDEX_UPDATE_PARTITION_PATH_ENABLE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.simple.index.update.partition.path"}),(0,s.jsx)(n.td,{children:"true (Optional)"}),(0,s.jsxs)(n.td,{children:["Similar to Key: 'hoodie.bloom.index.update.partition.path' , Only applies if index type is GLOBAL_SIMPLE. When set to true, an update including the partition path of a record that already exists will result in inserting the incoming record into the new partition and deleting the original record in the old partition. When set to false, the original record will only be updated in the old partition, ignoring the new incoming partition if there is a mis-match between partition value for an incoming record with whats in storage. ",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: SIMPLE_INDEX_UPDATE_PARTITION_PATH_ENABLE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.hbase.index.update.partition.path"}),(0,s.jsx)(n.td,{children:"false (Optional)"}),(0,s.jsxs)(n.td,{children:["Only applies if index type is HBASE. When an already existing record is upserted to a new partition compared to whats in storage, this config when set, will delete old record in old partition and will insert it as new record in new partition.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: UPDATE_PARTITION_PATH_ENABLE"})]})]})]})]}),"\n",(0,s.jsx)(n.h4,{id:"flink-based-configs",children:"Flink based configs"}),"\n",(0,s.jsxs)(n.p,{children:["For Flink DataStream and Flink SQL only support Bucket Index and internal Flink state store backed in memory index.\nFollowing are the basic configs that control the indexing behavior. Please refer ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/next/configurations#Flink-Options-advanced-configs",children:"here"}),"\nfor advanced configs."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"index.type"}),(0,s.jsx)(n.td,{children:"FLINK_STATE (Optional)"}),(0,s.jsxs)(n.td,{children:["Index type of Flink write job, default is using state backed index. Possible values:",(0,s.jsx)("br",{})," ",(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:"FLINK_STATE"}),(0,s.jsx)("li",{children:"BUCKET"})]}),(0,s.jsx)("br",{})," ",(0,s.jsx)(n.code,{children:"Config Param: INDEX_TYPE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.index.bucket.engine"}),(0,s.jsx)(n.td,{children:"SIMPLE (Optional)"}),(0,s.jsxs)(n.td,{children:["org.apache.hudi.index.HoodieIndex$BucketIndexEngineType: Determines the type of bucketing or hashing to use when ",(0,s.jsx)(n.code,{children:"hoodie.index.type"})," is set to ",(0,s.jsx)(n.code,{children:"BUCKET"}),". Possible Values: ",(0,s.jsx)("br",{})," ",(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:"SIMPLE"}),(0,s.jsx)("li",{children:"CONSISTENT_HASHING"})]})]})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"picking-indexing-strategies",children:"Picking Indexing Strategies"}),"\n",(0,s.jsx)(n.p,{children:"Since data comes in at different volumes, velocity and has different access patterns, different indexes could be used for different workload types.\nLet\u2019s walk through some typical workload types and see how to leverage the right Hudi index for such use-cases.\nThis is based on our experience and you should diligently decide if the same strategies are best for your workloads."}),"\n",(0,s.jsx)(n.h4,{id:"workload-1-late-arriving-updates-to-fact-tables",children:"Workload 1: Late arriving updates to fact tables"}),"\n",(0,s.jsx)(n.p,{children:"Many companies store large volumes of transactional data in NoSQL data stores. For eg, trip tables in case of ride-sharing, buying and selling of shares,\norders in an e-commerce site. These tables are usually ever growing with random updates on most recent data with long tail updates going to older data, either\ndue to transactions settling at a later date/data corrections. In other words, most updates go into the latest partitions with few updates going to older ones."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Fact table",src:i(50042).A+"",width:"3191",height:"1327"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: Typical update pattern for Fact tables"})]}),"\n",(0,s.jsxs)(n.p,{children:["For such workloads, the ",(0,s.jsx)(n.code,{children:"BLOOM"})," index performs well, since index look-up will prune a lot of data files based on a well-sized bloom filter.\nAdditionally, if the keys can be constructed such that they have a certain ordering, the number of files to be compared is further reduced by range pruning.\nHudi constructs an interval tree with all the file key ranges and efficiently filters out the files that don't match any key ranges in the updates/deleted records."]}),"\n",(0,s.jsxs)(n.p,{children:["In order to efficiently compare incoming record keys against bloom filters i.e with minimal number of bloom filter reads and uniform distribution of work across\nthe executors, Hudi leverages caching of input records and employs a custom partitioner that can iron out data skews using statistics. At times, if the bloom filter\nfalse positive ratio is high, it could increase the amount of data shuffled to perform the lookup. Hudi supports dynamic bloom filters\n(enabled using ",(0,s.jsx)(n.code,{children:"hoodie.bloom.index.filter.type=DYNAMIC_V0"}),"), which adjusts its size based on the number of records stored in a given file to deliver the\nconfigured false positive ratio."]}),"\n",(0,s.jsx)(n.h4,{id:"workload-2-de-duplication-in-event-tables",children:"Workload 2: De-Duplication in event tables"}),"\n",(0,s.jsx)(n.p,{children:'Event Streaming is everywhere. Events coming from Apache Kafka or similar message bus are typically 10-100x the size of fact tables and often treat "time" (event\'s arrival time/processing\ntime) as a first class citizen. For eg, IoT event stream, click stream data, ad impressions etc. Inserts and updates only span the last few partitions as these are mostly append only data.\nGiven duplicate events can be introduced anywhere in the end-end pipeline, de-duplication before storing on the data lake is a common requirement.'}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Event table",src:i(39506).A+"",width:"6218",height:"2609"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure showing the spread of updates for Event table."})]}),"\n",(0,s.jsxs)(n.p,{children:["In general, this is a very challenging problem to solve at lower cost. Although, we could even employ a key value store to perform this de-duplication with HBASE index, the index storage\ncosts would grow linear with number of events and thus can be prohibitively expensive. In fact, ",(0,s.jsx)(n.code,{children:"BLOOM"})," index with range pruning is the optimal solution here. One can leverage the fact\nthat time is often a first class citizen and construct a key such as ",(0,s.jsx)(n.code,{children:"event_ts + event_id"})," such that the inserted records have monotonically increasing keys. This yields great returns\nby pruning large amounts of files even within the latest table partitions."]}),"\n",(0,s.jsx)(n.h4,{id:"workload-3-random-updatesdeletes-to-a-dimension-table",children:"Workload 3: Random updates/deletes to a dimension table"}),"\n",(0,s.jsx)(n.p,{children:"These types of tables usually contain high dimensional data and hold reference data e.g user profile, merchant information. These are high fidelity tables where the updates are often small but also spread\nacross a lot of partitions and data files ranging across the dataset from old to new. Often times, these tables are also un-partitioned, since there is also not a good way to partition these tables."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Dimensions table",src:i(17429).A+"",width:"13365",height:"5602"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure showing the spread of updates for Dimensions table."})]}),"\n",(0,s.jsxs)(n.p,{children:["As discussed before, the ",(0,s.jsx)(n.code,{children:"BLOOM"})," index may not yield benefits if a good number of files cannot be pruned out by comparing ranges/filters. In such a random write workload, updates end up touching\nmost files within in the table and thus bloom filters will typically indicate a true positive for all files based on some incoming update. Consequently, we would end up comparing ranges/filter, only\nto finally check the incoming updates against all files. The ",(0,s.jsx)(n.code,{children:"SIMPLE"})," Index will be a better fit as it does not do any upfront pruning based, but directly joins with interested fields from every data file.\n",(0,s.jsx)(n.code,{children:"HBASE"})," index can be employed, if the operational overhead is acceptable and would provide much better lookup times for these tables."]}),"\n",(0,s.jsxs)(n.p,{children:["When using a global index, users should also consider setting ",(0,s.jsx)(n.code,{children:"hoodie.bloom.index.update.partition.path=true"})," or ",(0,s.jsx)(n.code,{children:"hoodie.simple.index.update.partition.path=true"})," to deal with cases where the\npartition path value could change due to an update e.g users table partitioned by home city; user relocates to a different city. These tables are also excellent candidates for the Merge-On-Read table type."]}),"\n",(0,s.jsx)(n.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,s.jsx)("h3",{children:"Videos"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://youtu.be/XlRvMFJ7g9c",children:"Global Bloom Index: Remove duplicates & guarantee uniquness - Hudi Labs"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://www.onehouse.ai/blog/introducing-multi-modal-index-for-the-lakehouse-in-apache-hudi",children:"Multi-Modal Index for the Lakehouse in Apache Hudi"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},17429:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/dimension-c1a4d25a9b59f1ae577b2159336b2a4e.png"},39506:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/event_bus-0066b1fff4c3b67ef966404738e53e59.png"},50042:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/nosql-bc8be272a92982296f05780fb60394ff.png"},82301:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/with_without_index-c0808363df23ac1aba63bc81a68b6c8c.png"},4390:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/hudi-stack-indexes-589506d411b969d14a9087633253a391.png"},28453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>r});var t=i(96540);const s={},a=t.createContext(s);function o(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[17987],{26947:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"indexes","title":"Indexes","description":"In databases, indexes are auxiliary data structures maintained to quickly locate records needed, without reading unnecessary data","source":"@site/docs/indexes.md","sourceDirName":".","slug":"/indexes","permalink":"/docs/next/indexes","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/indexes.md","tags":[],"version":"current","frontMatter":{"title":"Indexes","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4},"sidebar":"docs","previous":{"title":"Table Metadata","permalink":"/docs/next/metadata"},"next":{"title":"Concurrency Control","permalink":"/docs/next/concurrency_control"}}');var s=i(74848),a=i(28453);const o={title:"Indexes",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4},r=void 0,d={},l=[{value:"Mapping keys to file groups",id:"mapping-keys-to-file-groups",level:2},{value:"Need for indexing",id:"need-for-indexing",level:2},{value:"Multi-modal Indexing",id:"multi-modal-indexing",level:2},{value:"Bloom Filters",id:"bloom-filters",level:3},{value:"Record Indexes",id:"record-indexes",level:3},{value:"Expression Index",id:"expression-index",level:3},{value:"Secondary Index",id:"secondary-index",level:3},{value:"Additional writer-side indexes",id:"additional-writer-side-indexes",level:2},{value:"Global and Non-Global Indexes",id:"global-and-non-global-indexes",level:3},{value:"Configs",id:"configs",level:3},{value:"Spark based configs",id:"spark-based-configs",level:4},{value:"Flink based configs",id:"flink-based-configs",level:4},{value:"Picking Indexing Strategies",id:"picking-indexing-strategies",level:3},{value:"Workload 1: Late arriving updates to fact tables",id:"workload-1-late-arriving-updates-to-fact-tables",level:4},{value:"Workload 2: De-Duplication in event tables",id:"workload-2-de-duplication-in-event-tables",level:4},{value:"Workload 3: Random updates/deletes to a dimension table",id:"workload-3-random-updatesdeletes-to-a-dimension-table",level:4},{value:"Related Resources",id:"related-resources",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["In databases, indexes are auxiliary data structures maintained to quickly locate records needed, without reading unnecessary data\nfrom storage. Given that Hudi\u2019s design has been heavily optimized for handling mutable change streams, with different\nwrite patterns, Hudi considers ",(0,s.jsx)(n.a,{href:"#indexing",children:"indexing"})," as an integral part of its design and has uniquely supported\n",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/blog/2020/11/11/hudi-indexing-mechanisms/",children:"indexing capabilities"})," from its inception, to speed\nup writes on the ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/blog/2024/07/11/what-is-a-data-lakehouse/",children:"data lakehouse"}),", while still providing\ncolumnar query performance."]}),"\n",(0,s.jsx)(n.h2,{id:"mapping-keys-to-file-groups",children:"Mapping keys to file groups"}),"\n",(0,s.jsx)(n.p,{children:"The most foundational index mechanism in Hudi tracks a mapping from a given key (record key + optionally partition path) consistently to a file id. Other types of indexes like secondary indexes,\nbuild on this foundation. This mapping between record key and file group/file id rarely changes once the first version of a record has been written to a file group.\nOnly clustering or cross-partition updates that are implemented as deletes + inserts remap the record key to a different file group. Even then, a given record key is associated with exactly one\nfile group at any completed instant on the timeline."}),"\n",(0,s.jsx)(n.h2,{id:"need-for-indexing",children:"Need for indexing"}),"\n",(0,s.jsxs)(n.p,{children:["For ",(0,s.jsx)(n.a,{href:"table_types#copy-on-write-table",children:"Copy-On-Write tables"}),", indexing enables fast upsert/delete operations, by avoiding the need to join against the entire dataset to determine which files to rewrite.\nFor ",(0,s.jsx)(n.a,{href:"table_types#merge-on-read-table",children:"Merge-On-Read tables"}),", indexing allows Hudi to bound the amount of change records any given base file needs to be merged against. Specifically, a given base file needs to merged\nonly against updates for records that are part of that base file."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Fact table",src:i(82301).A+"",width:"3994",height:"1704"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: Comparison of merge cost for updates (dark blue blocks) against base files (light blue blocks)"})]}),"\n",(0,s.jsx)(n.p,{children:"In contrast,"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Designs without an indexing component (e.g: ",(0,s.jsx)(n.a,{href:"https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions",children:"Apache Hive/Apache Iceberg"}),") end up having to merge all the base files against all incoming updates/delete records\n(10-100x more ",(0,s.jsx)(n.a,{href:"table_types#comparison",children:"read amplification"}),")."]}),"\n",(0,s.jsx)(n.li,{children:"Designs that implement heavily write-optimized OLTP data structures like LSM trees do not require an indexing component. But they perform poorly scan heavy workloads\nagainst cloud storage making them unsuitable for serving analytical queries."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Hudi shines by achieving both great write performance and read performance, at the extra storage costs of an index, which can however unlock a lot more, as we explore below."}),"\n",(0,s.jsx)(n.h2,{id:"multi-modal-indexing",children:"Multi-modal Indexing"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://www.onehouse.ai/blog/introducing-multi-modal-index-for-the-lakehouse-in-apache-hudi",children:"Multi-modal indexing"}),",\nintroduced in ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/releases/release-0.11.0/#multi-modal-index",children:"0.11.0 Hudi release"}),",\nis a re-imagination of what a general purpose indexing subsystem should look like for the lake. Multi-modal indexing is\nimplemented by enhancing the metadata table with the flexibility to extend to new index types as new partitions,\nalong with an ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/metadata_indexing/#setup-async-indexing",children:"asynchronous index"})," building"]}),"\n",(0,s.jsxs)(n.p,{children:["Hudi supports a multi-modal index by augmenting the metadata table with the capability to incorporate new types of indexes, complemented by an\nasynchronous mechanism for ",(0,s.jsx)(n.a,{href:"metadata_indexing",children:"index construction"}),". This enhancement supports a range of indexes within\nthe ",(0,s.jsx)(n.a,{href:"metadata#metadata-table",children:"metadata table"}),", significantly improving the efficiency of both writing to and reading from the table."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Indexes",src:i(4390).A+"",width:"1124",height:"639"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: Indexes in Hudi"})]}),"\n",(0,s.jsx)(n.h3,{id:"bloom-filters",children:"Bloom Filters"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://github.com/apache/hudi/blob/46f41d186c6c84a6af2c54a907ff2736b6013e15/rfc/rfc-37/rfc-37.md",children:"Bloom filter"})," indexes as ",(0,s.jsx)(n.em,{children:"bloom_filter"})," partition in the metadata table.\nThis index employs range-based pruning on the minimum and maximum values of the record keys and bloom-filter-based lookups to tag incoming records. For large tables, this\ninvolves reading the footers of all matching data files for bloom filters, which can be expensive in the case of random\nupdates across the entire dataset. This index stores bloom filters of all data files centrally to avoid scanning the\nfooters directly from all data files."]}),"\n",(0,s.jsx)(n.h3,{id:"record-indexes",children:"Record Indexes"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://cwiki.apache.org/confluence/display/HUDI/RFC-08++Record+level+indexing+mechanisms+for+Hudi+datasets",children:"Record indexes"})," as ",(0,s.jsx)(n.em,{children:"record_index"})," partition in the metadata table.\nContains the mapping of the record key to location. Record index is a global index, enforcing key uniqueness across all partitions in the table. This index aids in locating records faster than\nother existing indexes and can provide a speedup orders of magnitude faster in large deployments where index lookup dominates write latencies. To accommodate very high scales, it utilizes hash-based\nsharding of the key space. Additionally, when it comes to reading data, the index allows for point lookups significantly speeding up index mapping retrieval process."]}),"\n",(0,s.jsx)(n.h3,{id:"expression-index",children:"Expression Index"}),"\n",(0,s.jsxs)(n.p,{children:["An ",(0,s.jsx)(n.a,{href:"https://github.com/apache/hudi/blob/3789840be3d041cbcfc6b24786740210e4e6d6ac/rfc/rfc-63/rfc-63.md",children:"expression index"})," is an index on a function of a column. If a query has a predicate on a function of a column, the expression index can\nbe used to speed up the query. Expression index is stored in ",(0,s.jsx)(n.em,{children:"expr_index_"})," prefixed partitions (one for each\nexpression index) under metadata table. Expression index can be created using SQL syntax. Please checkout SQL DDL\ndocs ",(0,s.jsx)(n.a,{href:"sql_ddl#create-expression-index",children:"here"})," for more details."]}),"\n",(0,s.jsx)(n.h3,{id:"secondary-index",children:"Secondary Index"}),"\n",(0,s.jsxs)(n.p,{children:["Secondary indexes allow users to create indexes on columns that are not part of record key columns in Hudi tables (for\nrecord key fields, Hudi supports ",(0,s.jsx)(n.a,{href:"/blog/2023/11/01/record-level-index",children:"Record-level Index"}),". Secondary indexes\ncan be used to speed up queries with predicate on columns other than record key columns."]}),"\n",(0,s.jsx)(n.p,{children:"Following are configurations that control enabling index building and maintenance on the writer."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.metadata.index.bloom.filter.enable"}),(0,s.jsx)(n.td,{children:"false (Optional)"}),(0,s.jsxs)(n.td,{children:["Enable indexing bloom filters of user data files under metadata table. When enabled, metadata table will have a partition to store the bloom filter index and will be used during the index lookups.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: ENABLE_METADATA_INDEX_BLOOM_FILTER"}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Since Version: 0.11.0"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.metadata.record.index.enable"}),(0,s.jsx)(n.td,{children:"false (Optional)"}),(0,s.jsxs)(n.td,{children:["Create the record Index within the metadata table",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: RECORD_INDEX_ENABLE_PROP"}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Since Version: 0.14.0"}),". This is a pre-requisite for secondary indexes or expression indexes on them."]})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"additional-writer-side-indexes",children:"Additional writer-side indexes"}),"\n",(0,s.jsx)(n.p,{children:"All the indexes discussed above are available both readers/writers using integration with metadata table. There are also indexing mechanisms\nimplemented by the storage engine, by efficiently reading/joining/processing incoming input records against information stored in base/log\nfiles themselves (e.g. bloom filters stored in parquet file footers) or intelligent data layout (e.g. bucket index)."}),"\n",(0,s.jsxs)(n.p,{children:["Currently, Hudi supports the following index types. Default is SIMPLE on Spark engine, and INMEMORY on Flink and Java\nengines. Writers can pick one of these options using ",(0,s.jsx)(n.code,{children:"hoodie.index.type"})," config option."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"SIMPLE (default for Spark engines)"}),": This is the standard index type for the Spark engine. It executes an efficient join of incoming records with keys retrieved from the table stored on disk. It requires keys to be partition-level unique so it can function correctly."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"RECORD_INDEX"})," : Use the record index from section above as the writer side index."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"BLOOM"}),": Uses bloom filters generated from record keys, with the option to further narrow down candidate files based on the ranges of the record keys. It requires keys to be partition-level unique so it can function correctly."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"GLOBAL_BLOOM"}),": Utilizes bloom filters created from record keys, and may also refine the selection of candidate files by using the ranges of record keys. It requires keys to be table/global-level unique so it can function correctly."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"GLOBAL_SIMPLE"}),": Performs a lean join of the incoming records against keys extracted from the table on storage. It requires keys to be table/global-level unique so it can function correctly."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"HBASE"}),": Mangages the index mapping through an external table in Apache HBase."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"INMEMORY (default for Flink and Java)"}),": Uses in-memory hashmap in Spark and Java engine and Flink in-memory state in Flink for indexing."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"BUCKET"}),": Utilizes bucket hashing to identify the file group that houses the records, which proves to be particularly advantageous on a large scale. To select the type of bucket engine\u2014that is, the method by which buckets are created\u2014use the ",(0,s.jsx)(n.code,{children:"hoodie.index.bucket.engine"})," configuration option."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"SIMPLE(default)"}),": This index employs a fixed number of buckets for file groups within each partition, which do not have the capacity to decrease or increase in size. It is applicable to both COW and MOR tables. Due to the unchangeable number of buckets and the design principle of mapping each bucket to a single file group, this indexing method may not be ideal for partitions with significant data skew."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"CONSISTENT_HASHING"}),": This index accommodates a dynamic number of buckets, with the capability for bucket resizing to ensure each bucket is sized appropriately. This addresses the issue of data skew in partitions with a high volume of data by allowing these partitions to be dynamically resized. As a result, partitions can have multiple reasonably sized buckets, unlike the fixed bucket count per partition seen in the SIMPLE bucket engine type. This feature is exclusively compatible with MOR tables."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Bring your own implementation:"})," You can extend this ",(0,s.jsx)(n.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/index/HoodieIndex.java",children:"public API"}),"\nand supply a subclass of ",(0,s.jsx)(n.code,{children:"SparkHoodieIndex"})," (for Apache Spark writers) using ",(0,s.jsx)(n.code,{children:"hoodie.index.class"})," to implement custom indexing."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"global-and-non-global-indexes",children:"Global and Non-Global Indexes"}),"\n",(0,s.jsxs)(n.p,{children:["Another key aspect worth understanding is the difference between global and non-global indexes. Both bloom and simple index have\nglobal options - ",(0,s.jsx)(n.code,{children:"hoodie.index.type=GLOBAL_BLOOM"})," and ",(0,s.jsx)(n.code,{children:"hoodie.index.type=GLOBAL_SIMPLE"})," - respectively. Record index and\nHBase index are by nature a global index."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Global index:"})," Global indexes enforce uniqueness of keys across all partitions of a table i.e guarantees that exactly\none record exists in the table for a given record key. Global indexes offer stronger guarantees, but the update/delete\ncost can still grow with size of the table ",(0,s.jsx)(n.code,{children:"O(size of table)"}),", since the record could belong to any partition in storage.\nIn case of non-global index, lookup involves file groups only for the matching partitions from the incoming records and\nso its not impacted by the total size of the table. These global indexes(GLOBAL_SIMPLE or GLOBAL_BLOOM), might be\nacceptable for decent sized tables, but for large tables, a newly added index (0.14.0) called Record Level Index (RLI),\ncan offer pretty good index lookup performance compared to other global indexes(GLOBAL_SIMPLE or GLOBAL_BLOOM) or\nHbase and also avoids the operational overhead of maintaining external systems."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Non Global index:"})," On the other hand, the default index implementations enforce this constraint only within a specific partition.\nAs one might imagine, non global indexes depends on the writer to provide the same consistent partition path for a given record key during update/delete,\nbut can deliver much better performance since the index lookup operation becomes ",(0,s.jsx)(n.code,{children:"O(number of records updated/deleted)"})," and\nscales well with write volume."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"configs",children:"Configs"}),"\n",(0,s.jsx)(n.h4,{id:"spark-based-configs",children:"Spark based configs"}),"\n",(0,s.jsxs)(n.p,{children:["For Spark DataSource, Spark SQL, DeltaStreamer and Structured Streaming following are the key configs that control\nindexing behavior. Please refer to ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/next/configurations#Common-Index-Configs-advanced-configs",children:"Advanced Configs"}),"\nfor more details. All these, support the index types mentioned ",(0,s.jsx)(n.a,{href:"#index-types-in-hudi",children:"above"}),"."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.index.type"}),(0,s.jsxs)(n.td,{children:["N/A ",(0,s.jsx)(n.strong,{children:"(Required)"})]}),(0,s.jsxs)(n.td,{children:["org.apache.hudi.index.HoodieIndex$IndexType: Determines how input records are indexed, i.e., looked up based on the key for the location in the existing table. Default is SIMPLE on Spark engine, and INMEMORY on Flink and Java engines. Possible Values: ",(0,s.jsx)("br",{})," ",(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:"BLOOM"}),(0,s.jsx)("li",{children:"GLOBAL_BLOOM"}),(0,s.jsx)("li",{children:"SIMPLE"}),(0,s.jsx)("li",{children:"GLOBAL_SIMPLE"}),(0,s.jsx)("li",{children:"HBASE"}),(0,s.jsx)("li",{children:"INMEMORY"}),(0,s.jsx)("li",{children:"FLINK_STATE"}),(0,s.jsx)("li",{children:"BUCKET"}),(0,s.jsx)("li",{children:"RECORD_INDEX"})]}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: INDEX_TYPE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.index.bucket.engine"}),(0,s.jsx)(n.td,{children:"SIMPLE (Optional)"}),(0,s.jsxs)(n.td,{children:["org.apache.hudi.index.HoodieIndex$BucketIndexEngineType: Determines the type of bucketing or hashing to use when ",(0,s.jsx)(n.code,{children:"hoodie.index.type"})," is set to ",(0,s.jsx)(n.code,{children:"BUCKET"}),". Possible Values: ",(0,s.jsx)("br",{})," ",(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:"SIMPLE"}),(0,s.jsx)("li",{children:"CONSISTENT_HASHING"})]})," ",(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: BUCKET_INDEX_ENGINE_TYPE"}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Since Version: 0.11.0"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.index.class"}),(0,s.jsx)(n.td,{children:"(Optional)"}),(0,s.jsxs)(n.td,{children:["Full path of user-defined index class and must be a subclass of HoodieIndex class. It will take precedence over the hoodie.index.type configuration if specified",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: INDEX_CLASS_NAME"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.bloom.index.update.partition.path"}),(0,s.jsx)(n.td,{children:"true (Optional)"}),(0,s.jsxs)(n.td,{children:["Only applies if index type is GLOBAL_BLOOM. When set to true, an update including the partition path of a record that already exists will result in inserting the incoming record into the new partition and deleting the original record in the old partition. When set to false, the original record will only be updated in the old partition, ignoring the new incoming partition if there is a mis-match between partition value for an incoming record with whats in storage.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: BLOOM_INDEX_UPDATE_PARTITION_PATH_ENABLE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.record.index.update.partition.path"}),(0,s.jsx)(n.td,{children:"false (Optional)"}),(0,s.jsxs)(n.td,{children:["Similar to Key: 'hoodie.bloom.index.update.partition.path' , Only applies if index type is RECORD_INDEX. When set to true, an update including the partition path of a record that already exists will result in inserting the incoming record into the new partition and deleting the original record in the old partition. When set to false, the original record will only be updated in the old partition, ignoring the new incoming partition if there is a mis-match between partition value for an incoming record with whats in storage. ",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: RECORD_INDEX_UPDATE_PARTITION_PATH_ENABLE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.simple.index.update.partition.path"}),(0,s.jsx)(n.td,{children:"true (Optional)"}),(0,s.jsxs)(n.td,{children:["Similar to Key: 'hoodie.bloom.index.update.partition.path' , Only applies if index type is GLOBAL_SIMPLE. When set to true, an update including the partition path of a record that already exists will result in inserting the incoming record into the new partition and deleting the original record in the old partition. When set to false, the original record will only be updated in the old partition, ignoring the new incoming partition if there is a mis-match between partition value for an incoming record with whats in storage. ",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: SIMPLE_INDEX_UPDATE_PARTITION_PATH_ENABLE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.hbase.index.update.partition.path"}),(0,s.jsx)(n.td,{children:"false (Optional)"}),(0,s.jsxs)(n.td,{children:["Only applies if index type is HBASE. When an already existing record is upserted to a new partition compared to whats in storage, this config when set, will delete old record in old partition and will insert it as new record in new partition.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: UPDATE_PARTITION_PATH_ENABLE"})]})]})]})]}),"\n",(0,s.jsx)(n.h4,{id:"flink-based-configs",children:"Flink based configs"}),"\n",(0,s.jsxs)(n.p,{children:["For Flink DataStream and Flink SQL only support Bucket Index and internal Flink state store backed in memory index.\nFollowing are the basic configs that control the indexing behavior. Please refer ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/next/configurations#Flink-Options-advanced-configs",children:"here"}),"\nfor advanced configs."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"index.type"}),(0,s.jsx)(n.td,{children:"FLINK_STATE (Optional)"}),(0,s.jsxs)(n.td,{children:["Index type of Flink write job, default is using state backed index. Possible values:",(0,s.jsx)("br",{})," ",(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:"FLINK_STATE"}),(0,s.jsx)("li",{children:"BUCKET"})]}),(0,s.jsx)("br",{})," ",(0,s.jsx)(n.code,{children:"Config Param: INDEX_TYPE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.index.bucket.engine"}),(0,s.jsx)(n.td,{children:"SIMPLE (Optional)"}),(0,s.jsxs)(n.td,{children:["org.apache.hudi.index.HoodieIndex$BucketIndexEngineType: Determines the type of bucketing or hashing to use when ",(0,s.jsx)(n.code,{children:"hoodie.index.type"})," is set to ",(0,s.jsx)(n.code,{children:"BUCKET"}),". Possible Values: ",(0,s.jsx)("br",{})," ",(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:"SIMPLE"}),(0,s.jsx)("li",{children:"CONSISTENT_HASHING"})]})]})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"picking-indexing-strategies",children:"Picking Indexing Strategies"}),"\n",(0,s.jsx)(n.p,{children:"Since data comes in at different volumes, velocity and has different access patterns, different indexes could be used for different workload types.\nLet\u2019s walk through some typical workload types and see how to leverage the right Hudi index for such use-cases.\nThis is based on our experience and you should diligently decide if the same strategies are best for your workloads."}),"\n",(0,s.jsx)(n.h4,{id:"workload-1-late-arriving-updates-to-fact-tables",children:"Workload 1: Late arriving updates to fact tables"}),"\n",(0,s.jsx)(n.p,{children:"Many companies store large volumes of transactional data in NoSQL data stores. For eg, trip tables in case of ride-sharing, buying and selling of shares,\norders in an e-commerce site. These tables are usually ever growing with random updates on most recent data with long tail updates going to older data, either\ndue to transactions settling at a later date/data corrections. In other words, most updates go into the latest partitions with few updates going to older ones."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Fact table",src:i(50042).A+"",width:"3191",height:"1327"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: Typical update pattern for Fact tables"})]}),"\n",(0,s.jsxs)(n.p,{children:["For such workloads, the ",(0,s.jsx)(n.code,{children:"BLOOM"})," index performs well, since index look-up will prune a lot of data files based on a well-sized bloom filter.\nAdditionally, if the keys can be constructed such that they have a certain ordering, the number of files to be compared is further reduced by range pruning.\nHudi constructs an interval tree with all the file key ranges and efficiently filters out the files that don't match any key ranges in the updates/deleted records."]}),"\n",(0,s.jsxs)(n.p,{children:["In order to efficiently compare incoming record keys against bloom filters i.e with minimal number of bloom filter reads and uniform distribution of work across\nthe executors, Hudi leverages caching of input records and employs a custom partitioner that can iron out data skews using statistics. At times, if the bloom filter\nfalse positive ratio is high, it could increase the amount of data shuffled to perform the lookup. Hudi supports dynamic bloom filters\n(enabled using ",(0,s.jsx)(n.code,{children:"hoodie.bloom.index.filter.type=DYNAMIC_V0"}),"), which adjusts its size based on the number of records stored in a given file to deliver the\nconfigured false positive ratio."]}),"\n",(0,s.jsx)(n.h4,{id:"workload-2-de-duplication-in-event-tables",children:"Workload 2: De-Duplication in event tables"}),"\n",(0,s.jsx)(n.p,{children:'Event Streaming is everywhere. Events coming from Apache Kafka or similar message bus are typically 10-100x the size of fact tables and often treat "time" (event\'s arrival time/processing\ntime) as a first class citizen. For eg, IoT event stream, click stream data, ad impressions etc. Inserts and updates only span the last few partitions as these are mostly append only data.\nGiven duplicate events can be introduced anywhere in the end-end pipeline, de-duplication before storing on the data lake is a common requirement.'}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Event table",src:i(39506).A+"",width:"6218",height:"2609"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure showing the spread of updates for Event table."})]}),"\n",(0,s.jsxs)(n.p,{children:["In general, this is a very challenging problem to solve at lower cost. Although, we could even employ a key value store to perform this de-duplication with HBASE index, the index storage\ncosts would grow linear with number of events and thus can be prohibitively expensive. In fact, ",(0,s.jsx)(n.code,{children:"BLOOM"})," index with range pruning is the optimal solution here. One can leverage the fact\nthat time is often a first class citizen and construct a key such as ",(0,s.jsx)(n.code,{children:"event_ts + event_id"})," such that the inserted records have monotonically increasing keys. This yields great returns\nby pruning large amounts of files even within the latest table partitions."]}),"\n",(0,s.jsx)(n.h4,{id:"workload-3-random-updatesdeletes-to-a-dimension-table",children:"Workload 3: Random updates/deletes to a dimension table"}),"\n",(0,s.jsx)(n.p,{children:"These types of tables usually contain high dimensional data and hold reference data e.g user profile, merchant information. These are high fidelity tables where the updates are often small but also spread\nacross a lot of partitions and data files ranging across the dataset from old to new. Often times, these tables are also un-partitioned, since there is also not a good way to partition these tables."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Dimensions table",src:i(17429).A+"",width:"13365",height:"5602"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure showing the spread of updates for Dimensions table."})]}),"\n",(0,s.jsxs)(n.p,{children:["As discussed before, the ",(0,s.jsx)(n.code,{children:"BLOOM"})," index may not yield benefits if a good number of files cannot be pruned out by comparing ranges/filters. In such a random write workload, updates end up touching\nmost files within in the table and thus bloom filters will typically indicate a true positive for all files based on some incoming update. Consequently, we would end up comparing ranges/filter, only\nto finally check the incoming updates against all files. The ",(0,s.jsx)(n.code,{children:"SIMPLE"})," Index will be a better fit as it does not do any upfront pruning based, but directly joins with interested fields from every data file.\n",(0,s.jsx)(n.code,{children:"HBASE"})," index can be employed, if the operational overhead is acceptable and would provide much better lookup times for these tables."]}),"\n",(0,s.jsxs)(n.p,{children:["When using a global index, users should also consider setting ",(0,s.jsx)(n.code,{children:"hoodie.bloom.index.update.partition.path=true"})," or ",(0,s.jsx)(n.code,{children:"hoodie.simple.index.update.partition.path=true"})," to deal with cases where the\npartition path value could change due to an update e.g users table partitioned by home city; user relocates to a different city. These tables are also excellent candidates for the Merge-On-Read table type."]}),"\n",(0,s.jsx)(n.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,s.jsx)("h3",{children:"Blogs"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://medium.com/@simpsons/global-vs-non-global-index-in-apache-hudi-ac880b031cbc",children:"Global vs Non-global index in Apache Hudi"})}),"\n"]}),"\n",(0,s.jsx)("h3",{children:"Videos"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://youtu.be/XlRvMFJ7g9c",children:"Global Bloom Index: Remove duplicates & guarantee uniquness - Hudi Labs"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://www.onehouse.ai/blog/introducing-multi-modal-index-for-the-lakehouse-in-apache-hudi",children:"Multi-Modal Index for the Lakehouse in Apache Hudi"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},17429:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/dimension-c1a4d25a9b59f1ae577b2159336b2a4e.png"},39506:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/event_bus-0066b1fff4c3b67ef966404738e53e59.png"},50042:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/nosql-bc8be272a92982296f05780fb60394ff.png"},82301:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/with_without_index-c0808363df23ac1aba63bc81a68b6c8c.png"},4390:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/hudi-stack-indexes-589506d411b969d14a9087633253a391.png"},28453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>r});var t=i(96540);const s={},a=t.createContext(s);function o(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/content/assets/js/runtime~main.352dbe58.js b/content/assets/js/runtime~main.ba01cd22.js similarity index 99% rename from content/assets/js/runtime~main.352dbe58.js rename to content/assets/js/runtime~main.ba01cd22.js index 901d8df46c154..3b5a4f8e23e05 100644 --- a/content/assets/js/runtime~main.352dbe58.js +++ b/content/assets/js/runtime~main.ba01cd22.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,f,c,b,d={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return d[e].call(f.exports,f,f.exports,r),f.exports}r.m=d,e=[],r.O=(a,f,c,b)=>{if(!f){var d=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[f,c,b]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var d={};a=a||[null,f({}),f([]),f(f)];for(var t=2&c&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,r.d(b,d),b},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({16:"0583dad8",25:"a33c645e",28:"0da1f28a",39:"a978e5ab",48:"a674d2f7",60:"e9bd6ef2",67:"56169fa6",106:"6c6aeb2d",129:"275b5c51",159:"af8190e8",217:"b1f77b90",278:"a1a7cea0",292:"fcc9c1b0",323:"be9655ff",335:"43d16b11",354:"0b4da2f0",387:"19ac452e",437:"a168e2e0",569:"b4a99b76",614:"0a87a91b",805:"5c109a5d",822:"79cc09db",851:"8b10f6da",878:"e9038c17",910:"ce3da75c",917:"02b5547e",924:"9699c87d",940:"0c459987",1103:"4b935b7f",1107:"060b2af9",1119:"e3b4090c",1136:"ae09e9a1",1190:"b0127f30",1251:"ea1c8f1c",1284:"62a07427",1337:"9cab4fb3",1360:"eb8e7dea",1422:"562c897e",1442:"50f3bb83",1506:"4b25608f",1517:"da868c82",1550:"8425e24c",1635:"73c8d421",1656:"cc5200ca",1658:"7a51e13d",1784:"89dd9b54",1785:"269ce614",1791:"4b2ed2d0",1841:"92bb01f4",1846:"9f349e0c",1857:"d032d8fc",1882:"c28fec2b",1928:"6e47a3c2",1946:"45b94beb",1955:"7fbadf7c",1983:"b93dc3c9",2016:"3c15683d",2053:"7a3be72c",2121:"fdb4abad",2172:"ef5805c5",2214:"32aa7863",2225:"9781112c",2239:"2b154460",2256:"31863783",2262:"7d9ec3a3",2298:"d2a01f74",2385:"fb4f9065",2450:"3b3f1ad3",2472:"1b7e3feb",2540:"e8b490f7",2577:"b9e56da2",2638:"372d2263",2640:"dba6e014",2652:"9ed88412",2663:"9d0312da",2679:"7e9327af",2700:"5e58268b",2739:"4c5bb0e3",2748:"7c87f31d",2759:"d28b7dcd",2768:"ad32f2e8",2772:"48f24bab",2791:"ba2305d7",2839:"00cd9d46",2854:"093ec6b1",2867:"c03096de",2884:"8539bc43",2912:"404a423b",2932:"580eda40",2954:"6e7eafb1",3075:"a80470ee",3125:"32dcc326",3131:"d29911ee",3137:"4f7cd6bb",3144:"aed1d196",3179:"5c3bdea9",3303:"6be904db",3313:"a3e90044",3323:"b9073401",3471:"1c4da86a",3558:"7fb3fac1",3693:"b783cafb",3694:"5e85aa31",3722:"50cd3db4",3740:"dc1f5b39",3764:"394bb252",3847:"43d31177",3940:"260d7fd0",3965:"d18b6106",3968:"50494a26",4014:"c943b655",4028:"04ae9608",4040:"b4ced939",4060:"0bf991f2",4074:"817ed3cf",4117:"d772531a",4133:"b18f8924",4137:"1a47b5e7",4205:"0c12eeea",4269:"18ffe98c",4355:"1497bce1",4368:"25fe5fdb",4382:"56471e5f",4405:"1dcf0194",4467:"ff5a6f64",4514:"3e8d408e",4530:"1cb4ff83",4574:"d9f219f0",4591:"405284b3",4602:"9920fffc",4777:"43d0cc21",4790:"3b6474f3",4863:"a0c4b68b",4890:"7c52b6f4",4919:"4929a6fa",4949:"066b815f",4980:"006c64a3",5008:"6880fe95",5028:"f5c507c6",5029:"ca8c3af7",5065:"25ed107d",5193:"d0ff2798",5195:"8c7f4a45",5206:"4b9df2bb",5269:"627b1f39",5270:"6ff0c558",5289:"b3a451d2",5295:"bbc3d059",5304:"44fefb3e",5322:"22b4f68c",5334:"86642e8b",5338:"0e11b6db",5594:"0c74166d",5622:"fb863cab",5631:"32ba6a4c",5633:"a804bb8e",5647:"d03e0408",5679:"58c4a37c",5721:"42bda306",5806:"1adb4ab6",5834:"6a34bd67",5887:"b5960565",5888:"478a7123",5936:"4959f63e",6022:"959a592e",6054:"87c914ef",6090:"384f1d9f",6158:"0d706529",6170:"14ed99c2",6203:"0ba05648",6225:"baed6a8a",6289:"59ba4d58",6310:"14a73a68",6350:"ce3c8465",6368:"207e0bd3",6371:"4658250f",6372:"5c865244",6407:"47ddb104",6467:"3faff22d",6475:"316bb886",6552:"ae59a273",6559:"21b16c5b",6636:"f6a1f09d",6677:"ea2cf37a",6692:"0cca5757",6697:"17ace3c3",6709:"debf2b54",6739:"01ceb854",6761:"507d925b",6778:"9cb5abfe",6791:"ae0384e2",6823:"4f684eef",6897:"b52407fb",6930:"ac385e9e",6944:"52f660a4",7035:"e841f655",7071:"6e78b29b",7100:"e7c12d1f",7103:"9d67d055",7125:"b744ccc8",7167:"bfd461a8",7317:"b1b9fe16",7355:"96f48bd9",7444:"502758cc",7458:"8fdc7f76",7517:"4abd5d51",7566:"12a626af",7622:"9df106ad",7629:"2a74f6a7",7715:"06a1e3b2",7734:"d6b46894",7747:"79a2ad2d",7773:"869d1599",7802:"deab0229",7850:"68c81474",7907:"7ba20019",7953:"df4b657d",8003:"f85e4dd8",8070:"0480b142",8139:"addb1e87",8174:"464278e7",8177:"38122bdb",8183:"c7a3e7d6",8192:"934057b1",8209:"01a85c17",8289:"c286af15",8348:"09ff3d76",8354:"db9fbbab",8363:"24179e00",8367:"abd23114",8407:"7a049829",8413:"cd17745a",8417:"bbced460",8585:"497095d8",8619:"15c2f51a",8632:"22351c69",8645:"212a125d",8651:"80bd773e",8699:"8f08e203",8762:"1cd42d14",8766:"7a11cfa3",8840:"e161c803",8888:"3a6a48c9",8889:"effd3c61",8900:"eebb3a9f",8902:"dc8afb47",8965:"b6e28713",8978:"6d5644d6",9003:"91415840",9045:"7c9ee56f",9066:"4c492fb9",9076:"52b6ceb8",9127:"29c12ff9",9152:"17666b14",9189:"d4eb85a9",9195:"b2d2727d",9228:"d336ca2e",9257:"0687df23",9262:"29a0dcae",9351:"4c14260d",9379:"7fd1d1a0",9380:"409e52b6",9385:"8ea09047",9428:"cfb1206c",9432:"8cd4ff44",9446:"49b92117",9458:"762ed4b3",9460:"01964c8d",9471:"ebf12a38",9499:"953153ea",9516:"2fec12c7",9525:"bf1307fc",9570:"8eea179e",9573:"13ab27aa",9631:"79e67a34",9647:"5e95c892",9650:"747973bc",9676:"e4d28161",9702:"a0d28f55",9722:"c35662b8",9724:"46e7f252",9737:"0d37dd31",9790:"6a0b8fcc",9836:"2fd2285d",9860:"d6d00b14",9870:"36e3724e",9891:"8a5cd0c4",9907:"9c0f572d",9914:"06b7dbb6",9944:"9ee88b57",9986:"c782ecef",10030:"c2277200",10118:"f89af623",10181:"f7519df0",10198:"ce5d6b55",10238:"0eb44ec6",10285:"b69fdc1c",10354:"8c29db87",10472:"0ca8e4c5",10488:"dc8e8e39",10492:"40011a75",10535:"79c374cf",10545:"1ca50c03",10610:"b1051fbd",10637:"6a326c1d",10642:"936cf648",10653:"5bf02344",10688:"f71afd42",10727:"f53cf472",10767:"931768b8",10789:"10fb8f29",10884:"9009d9a7",10887:"ac65ed35",10907:"b964b0d3",10920:"42746bb6",10924:"f0c78ca3",10956:"726b1d2e",10978:"90db14b9",11052:"9f1f18ec",11058:"7c44e50a",11111:"2750cc84",11156:"f97de939",11275:"2e961a80",11289:"82b971d3",11299:"ac338f84",11326:"f9cb0cea",11355:"6ed20719",11508:"039c7621",11565:"3d026c66",11631:"d2a270f8",11684:"9aee6bed",11716:"8fa68fae",11725:"51e360fd",11745:"446810fe",11768:"4cc89b71",11782:"3f65fb56",11795:"43ff550e",11804:"b9168984",11806:"7cb0ba19",11842:"f630dd79",11855:"51e592eb",11869:"43c57b15",11905:"41b6dd58",11906:"757b41cf",11977:"608a85b6",12047:"d25544dd",12134:"088c57bd",12144:"5617941b",12186:"3deb4153",12316:"77a5f3f8",12318:"9b28f794",12378:"2592f25d",12393:"7d05d2dd",12395:"a0fb693a",12431:"61c30610",12452:"f4a568da",12477:"ac9a039d",12485:"3e8ec4bd",12513:"70570476",12535:"2ca30cc7",12542:"0bce5bfd",12608:"ae632d28",12613:"bb6acec0",12654:"98af85a1",12679:"755aa830",12686:"f81e2128",12763:"0166538a",12869:"236efcfc",12945:"bc561320",12995:"72ed5e19",13021:"9b078b3d",13060:"075d0b63",13063:"6695bce8",13152:"4d01f822",13203:"a5fd3751",13210:"326f3c2b",13236:"814487fc",13298:"be65306b",13321:"bb230ab4",13366:"c7690f1a",13374:"0c9b8a46",13375:"15be7f5e",13406:"cdd81d53",13419:"05f125a2",13465:"f7887fd4",13511:"3f9b0969",13514:"35f2b245",13522:"559e18a5",13525:"aeb9cb2b",13534:"a221d960",13535:"27aec4ea",13575:"1b3749bd",13580:"b7ffc82e",13626:"16444e78",13698:"e32c93f6",13733:"e4126631",13762:"35ace877",13803:"5005f1cd",13849:"fdf3b0ba",13918:"a586ac12",13943:"79c522c5",13982:"f4dd7c05",13996:"bb5bef2a",14003:"fe0a5e13",14027:"4fe2812d",14042:"6c6eb236",14043:"2da40935",14125:"c58d5881",14134:"88677a17",14136:"5ba7f3a0",14152:"0c792305",14163:"79f5ed7e",14179:"0466f8a1",14257:"973a6c2e",14259:"4d62164b",14261:"881e0310",14264:"15b03510",14317:"2d2f3863",14340:"02704d8d",14363:"33732613",14388:"4330e2c5",14399:"95a29cbe",14410:"262f048a",14433:"5a1ac6cd",14435:"a2218d2d",14496:"0dc66419",14536:"b812e3a7",14599:"04287605",14627:"6b0d4b59",14726:"cb290368",14750:"8049dc2a",14802:"4193b389",14822:"da9a6aef",14835:"3145e86d",14868:"9c9e6d14",14871:"281df6d1",14917:"b2f79aaf",14919:"68aea991",14943:"b634826e",15038:"e8bf575a",15078:"6773b5f7",15079:"461201e5",15144:"e6691bac",15165:"29fcaeb8",15186:"809a1b46",15220:"e0719818",15235:"246d116d",15272:"ee5dc595",15292:"7bd6096e",15316:"a0583d0f",15403:"bbbd3731",15407:"413b2e2c",15427:"63067f40",15473:"ad07d5ed",15501:"259868d4",15552:"1ff337bc",15607:"a309ba1a",15764:"0d11ee2a",15805:"65df1ffd",15857:"520bf372",15917:"04d2875d",15947:"f05cb9af",15955:"1ea67680",16017:"777c5b61",16032:"7f5a2db2",16100:"5685cb00",16209:"f0db470e",16231:"d05ef008",16319:"1839a246",16377:"8eca1d9c",16499:"58c0e7a1",16500:"b5eb2b1f",16622:"3d8e248c",16641:"4ccf094c",16747:"ab84da8d",16885:"7c3644b1",16942:"426a3c0f",16950:"bd7a3684",17009:"a3848d24",17033:"30e67995",17115:"3687929f",17119:"87557f51",17232:"bc36781c",17294:"82fc01c6",17332:"b4762a45",17368:"de821e02",17402:"b629aa71",17411:"496a5e3a",17441:"c5c8072f",17474:"f7750a15",17502:"dddd9631",17508:"80e60ab1",17530:"8c212f85",17581:"46e89fee",17626:"47f3a505",17681:"a2af438a",17709:"89514438",17739:"b1e22259",17805:"bc4a985b",17818:"2d9024ae",17860:"7cfc22c1",17867:"9130943e",17944:"36f96221",17987:"f67021ea",17988:"a3255c75",18006:"059d2658",18033:"c1fa975f",18103:"7707ed5e",18121:"3a2db09e",18146:"c15d9823",18350:"889bcd45",18351:"670426f7",18401:"17896441",18438:"7eea383c",18445:"762cb2d4",18520:"905fdac9",18620:"1bdcf2af",18645:"e798c07e",18738:"3b375bfc",18757:"10b6d210",18798:"6c76cc4e",18940:"6cc2587c",18950:"d75d009b",18998:"7487c019",19042:"378587af",19052:"6e547e58",19070:"6f878c05",19108:"6f3d983d",19109:"868e6cc1",19136:"9c3fccaa",19237:"e77e0240",19252:"d9884433",19267:"1354c4fd",19271:"345a8726",19369:"a2cfe627",19387:"9228ff94",19396:"c61ed569",19425:"efd9e5ca",19428:"4b6ad6c1",19474:"a3c850e8",19513:"3faa4dcb",19521:"7f5a4e86",19542:"3548485f",19664:"76b52ed8",19687:"547af68c",19711:"0e4a3360",19736:"9e46f997",19774:"3c6c92ad",19798:"83c71362",19801:"a5052667",19865:"7e53000f",19891:"389b06c3",19999:"99bce14a",20038:"0ef00d46",20103:"430ee71a",20160:"ecc82a52",20194:"69fce7d3",20229:"5aae4c30",20286:"f60a8e85",20325:"6b7b009f",20358:"a55cf427",20361:"784d2d5b",20405:"a170c4b2",20415:"839320c8",20424:"c97a4f9f",20434:"39c0c867",20491:"4c056f0f",20535:"ca16b0fe",20541:"2925f13d",20619:"eae39fd7",20676:"874c4928",20713:"ff781369",20812:"a827f20e",20857:"bd440596",20892:"1d99c39c",20924:"92328698",20931:"de69fdc1",20951:"5ef30e9e",21070:"e3b4fd8a",21077:"7ff678ac",21121:"c1b7702d",21177:"574aa417",21191:"53798754",21273:"58f98693",21275:"e737da10",21290:"fab95ca2",21303:"e4bea80c",21316:"266d37b9",21341:"b23dd436",21346:"b2c62a3d",21373:"50737734",21401:"5105c354",21417:"9db9c0e0",21448:"995d9cd2",21482:"5f404bc7",21524:"69f9ca18",21560:"6c888f35",21574:"263bc6da",21585:"d17a9646",21630:"aad02470",21635:"6224d640",21662:"b1722c22",21729:"ea9d899a",21764:"df2a910d",21805:"1926d3d7",21816:"fe2d6fd6",21837:"7ce47929",21874:"a54a9a31",21909:"d3de5519",21921:"a8a7f86a",22141:"625beb64",22313:"334d7764",22369:"83a16324",22385:"9a5e9795",22428:"47425d5b",22447:"f93d9ca9",22472:"494588b9",22483:"95d688dd",22499:"2923e8f3",22501:"ff15e2eb",22504:"61773850",22534:"6f37f43d",22595:"ca5d6ba8",22628:"a36f1f19",22640:"69375b61",22647:"c760fa6a",22673:"c699b29d",22709:"74c5eee6",22750:"f701b058",22816:"70db0e3d",22844:"d6ededeb",22911:"9a29e675",22916:"d49fdba3",22932:"0d5f3865",22973:"70a32eac",23002:"1fd06df8",23041:"07da43c6",23081:"ef1c4348",23083:"7050405a",23119:"39307ee6",23141:"a1c39b3f",23172:"b994507e",23332:"fe86f3f9",23388:"fa5f4abf",23438:"95d97af4",23475:"fdeab78a",23547:"a67ef186",23563:"f24f712d",23591:"53746e73",23600:"af9b00f1",23625:"996abb7f",23634:"59e9dc06",23637:"9c150758",23641:"35313843",23666:"cb16b650",23676:"d235b83f",23700:"ea8366f8",23765:"fac8c34b",23773:"2153fb85",23880:"3affb2e4",23938:"be354741",23998:"afe4349e",24022:"9c7497bb",24065:"5ef1cef9",24084:"4ed60a8a",24098:"89ad6a53",24126:"897856d4",24140:"5ce7213e",24172:"1d2c1565",24234:"3af3061a",24265:"7ebf6f1e",24340:"a4e075be",24366:"99d3870c",24373:"5cbd92da",24377:"b5b376a0",24381:"4066930f",24437:"77b23935",24475:"045bd6f5",24476:"6cf93e89",24704:"3befffe2",24728:"91c64349",24729:"931beacc",24741:"e2c09daf",24776:"a852ca5b",24815:"a68f650d",24826:"ed6ec893",24853:"7cfd7c3a",24866:"e0c51b98",24867:"b4972e92",24868:"c6301cab",24891:"f0709bee",24912:"8e01a36e",24919:"cf6129a8",24932:"51fff4d3",24970:"231cac3a",25013:"1e3d98df",25044:"9cd11b72",25067:"9531441e",25101:"8bd2257d",25130:"b277530c",25186:"96046d19",25273:"19531bab",25285:"1da16fcf",25335:"537936fe",25396:"d78b8cbc",25397:"4083b748",25426:"b973fe72",25452:"5ef8e026",25531:"af5c68f9",25532:"40ebd41e",25539:"7fb09d55",25578:"c7382291",25582:"65603bfa",25601:"7205cbcf",25778:"d56bdeaf",25781:"ba115cad",25845:"d2c3f17d",25869:"6d1cdd35",25871:"c9953bfc",25874:"17268e53",25959:"f7f19049",25987:"1645b95d",25993:"92db1d5a",26003:"90c5833e",26009:"20f9256f",26060:"7662a79c",26064:"2316ae30",26081:"de97f7b0",26183:"fd6c914a",26216:"4e3e1e17",26260:"477cc2f7",26305:"878dce9b",26333:"9579dcb9",26337:"65009e94",26414:"14fd0d1c",26548:"9a5789a7",26577:"8eca70a5",26627:"8353278b",26630:"ba839983",26632:"960d3eb8",26722:"1802ae9e",26724:"78bc6f25",26744:"21e535c3",26797:"4681e75f",26833:"e2fe7a08",26859:"04fb6378",26882:"958a296c",26900:"b3749361",27012:"aca5eee4",27020:"58714c61",27088:"1547c10f",27115:"e37692b4",27123:"c4d1e829",27179:"cbec0238",27212:"ce710151",27369:"f52b34fb",27388:"f7e205e5",27398:"a3983124",27444:"7a3be7e3",27473:"31ed8f07",27663:"9f8f3c52",27737:"6d701be3",27823:"f95764fc",27887:"b0d5c266",27921:"10ccea9f",27955:"2e7e1134",27995:"ee4b8f19",28020:"ecd026d3",28086:"2cc67ca6",28127:"859500dc",28147:"abde445c",28166:"8120957a",28169:"513b54fb",28178:"9adef974",28204:"758b9bc9",28235:"20a81622",28252:"b8d3e47d",28319:"ec410c33",28410:"89cbd1b8",28428:"b212a261",28435:"5b374304",28499:"261fe657",28627:"54ad050e",28679:"0871002b",28687:"ab48a39f",28701:"c3856c66",28782:"fd5c5192",28793:"379ac6de",28803:"8b6fbbb4",28834:"7ed2bc06",28853:"4c00d6b9",28889:"2a0b5233",28920:"e7ef6e16",28941:"8c5b1685",28945:"f382fc88",28993:"8e7128cd",29060:"9c7a2f87",29123:"763fa02a",29171:"6f3c73f2",29204:"d4836e14",29243:"d330b699",29337:"8a472aba",29408:"fbce6636",29414:"b92135a6",29421:"163a1bae",29452:"13171783",29457:"e4d4ec4e",29498:"da05f515",29523:"b2f58160",29526:"b45a54e9",29653:"13f72d6c",29679:"6e0a413f",29690:"b1633424",29698:"a642dcef",29708:"80b93830",29733:"da10e58f",29795:"e6557239",29820:"16381f20",29829:"d973177d",29845:"5d94dea0",29891:"26f5f607",29922:"5397b577",29950:"5de1c39a",29969:"332b14e0",30035:"87546ad3",30066:"6b836ac4",30154:"339988c0",30167:"22bf7f69",30262:"5320ed26",30265:"132be4b3",30317:"af953e30",30355:"4b678e99",30378:"5c5d3a2d",30396:"e4a43002",30410:"90ffbe81",30564:"407230da",30569:"c7165ecb",30579:"1ee0a129",30583:"775c5b43",30628:"6ee9522e",30654:"5d70257a",30790:"a7c3ebee",30827:"5814834c",30831:"ced554c7",30842:"d8412727",30848:"677757ca",30934:"44c28e7f",31004:"7dea1595",31016:"416fb909",31039:"71d5b1f8",31047:"3f9a993f",31125:"c3c8ddc4",31141:"be9442ac",31144:"fbf25af7",31220:"b8ab477f",31255:"5c81ce12",31257:"67f1ea1e",31272:"fa366c46",31393:"07f6d4d1",31465:"cc564cf4",31541:"1668cad9",31544:"c602d51d",31567:"8c4bf82a",31680:"b38306ed",31705:"05957343",31720:"0a70c05a",31726:"624fba40",31749:"974bc2fa",31791:"04eab06f",31797:"14a26e2a",31861:"a14af959",31862:"c791a767",31869:"2dcd9099",31957:"2e31e40f",31972:"4ef864ee",31996:"8dbbcff6",32005:"f0dc0726",32012:"9ba9284f",32039:"116b7e55",32183:"5110a7b7",32225:"eb05a324",32270:"53ba3577",32278:"149a2d9e",32335:"f9a4941d",32365:"fe345ee5",32391:"e1407f5b",32472:"c08ba4cb",32527:"e6c2d44b",32558:"40c3731f",32691:"798484e3",32728:"1b520177",32824:"943ce597",32825:"fdddbf66",32847:"8590fd3e",32875:"65511420",32949:"43764587",32960:"225cc45a",32993:"604cd7c5",33049:"97e51b1f",33065:"a172f6b1",33192:"ee003a92",33214:"2a422024",33234:"465994bd",33290:"7da68ccc",33303:"f5ff1a23",33350:"2d0c5b52",33458:"c16e0158",33517:"3ed70074",33524:"f81c13fc",33533:"65ea2434",33540:"fe7ac0b7",33559:"8f00bf20",33567:"6075be34",33572:"269d704a",33577:"df68b7b1",33612:"3f933ca5",33621:"33241236",33638:"d294bdb0",33643:"da7149d8",33659:"81a6b262",33724:"755872dc",33804:"1b31aebb",33806:"07399e71",33816:"45f2496e",33825:"f8a443f2",33854:"06758c2b",33881:"a7690409",33889:"e9c7c2b7",33999:"49aa1a16",34127:"18b5779a",34156:"f5c63bac",34179:"3f4396e6",34182:"80f4f5b6",34196:"13e6af21",34255:"e8a8dea2",34331:"164e61b9",34335:"6153f283",34388:"79fbf53e",34520:"538371ec",34528:"b038a3ec",34543:"782eae4d",34549:"0735e5be",34597:"40cd51eb",34621:"f30fab6f",34638:"852f3aa7",34662:"ef071c32",34691:"02e54e09",34706:"47a1bde9",34750:"a5fea1bd",34803:"e076fc92",34808:"2e6ef254",34810:"924dcf98",34837:"10fcd509",34847:"dc7f8f8b",34877:"f7702246",34904:"f44e1bcd",34918:"c9cac9d9",34970:"40dc6b06",35044:"5e2f1fff",35067:"47cb0ede",35088:"35788c78",35139:"6fe5390f",35144:"83829ea7",35179:"372475fb",35248:"2947aa63",35288:"0f3b9f0c",35325:"d42065ad",35329:"a7827f50",35379:"d9454955",35402:"976ab233",35532:"388d5845",35618:"97bb73fe",35730:"2b4cfa56",35733:"8fc868c2",35742:"aba21aa0",35766:"ff6f6072",35767:"3019fa66",35784:"d240c26d",35837:"dd61deac",35881:"8852ad6f",35922:"92928c02",35932:"a3142532",35960:"dfa4e294",35983:"b5a599e0",36009:"04afe417",36055:"59be0e8d",36067:"ceff0062",36113:"28f38ec5",36144:"307d712e",36192:"b60e28b6",36264:"8a759f03",36302:"eafd7a74",36379:"467ff4a0",36387:"e23d1069",36549:"5ea64d6c",36569:"1472dfa3",36594:"94a5efbc",36619:"2573355f",36640:"1084a32f",36672:"b6fb003b",36689:"77787075",36747:"a3015275",36790:"12935692",36851:"649faa0e",36885:"1007513a",37109:"d73e6b67",37115:"0b4fcfba",37147:"97da4333",37191:"d786420c",37204:"8f3b27f1",37206:"43dcd746",37209:"e34cac0e",37257:"37524cd6",37329:"554882a9",37366:"6013ac2e",37403:"32b44a8d",37486:"ce46a18e",37489:"6a293d29",37577:"e9705ef5",37578:"e17d733a",37617:"be2ede3f",37643:"a6aa9e1f",37673:"e2657c7c",37740:"2cfb265a",37799:"feab7dcb",37809:"5f87fd99",37827:"42545929",37839:"d5e29b01",37841:"9ad03801",37842:"cd060f40",37872:"88d0aec4",37954:"3f272b07",38001:"690cbdd8",38003:"8d086d51",38056:"baad6bf9",38107:"1efbb938",38158:"66372f10",38238:"2e9f383c",38348:"bbc1ba35",38370:"cf858c26",38385:"7c15a7a1",38416:"dcd7017c",38439:"9474fc0c",38449:"91335d19",38451:"f0fb7623",38468:"b4a84943",38600:"0f497157",38605:"6dc06ee1",38607:"7eaa135a",38700:"1bf4b05b",38767:"c4de5678",38786:"872a41d4",38816:"5ea125b2",38835:"6495713a",38839:"110e78c3",38888:"6f5eeb66",38974:"2c50796a",38999:"daa4f13d",39058:"53317765",39088:"5560f355",39110:"cb9e1f3d",39138:"755ebe0d",39142:"b5f01515",39153:"0b8a4e62",39192:"09b62bf8",39197:"484cbf74",39202:"8b795044",39208:"93f7a5ff",39230:"b992801d",39240:"90f157dc",39260:"47074836",39265:"b40642d4",39283:"b1043e58",39405:"cc6505da",39407:"995840bc",39417:"085b8128",39423:"a615dd65",39444:"0f65ccfb",39487:"9d833fad",39494:"b326207c",39496:"7b2a260d",39505:"782d926e",39518:"630bda65",39520:"441dded5",39555:"4a80e27a",39569:"06a8eab3",39587:"7d0e1375",39608:"97ae1fff",39712:"8f64cb7a",39715:"a68f0e64",39758:"07bef82a",39773:"fb3759c3",39777:"320da59d",39781:"3c2d0811",39840:"8fa753de",39887:"9b0c8626",39901:"d76c455f",39908:"09a52b17",39921:"6471fe03",39973:"d4a2e930",40065:"5f469a3b",40124:"bc817d28",40178:"0508dae2",40205:"edf7dc61",40245:"ecaa52af",40369:"3c36ce76",40463:"0cd1a20c",40464:"4d1df301",40555:"3415fffa",40606:"3e032765",40616:"12a5de9b",40651:"bf5126e1",40690:"dfc3c224",40697:"cc01a9d7",40755:"8393a516",40758:"1a7b33c3",40797:"d2110cc0",40827:"ddebc8bf",40847:"2662e92d",40907:"321dafc4",40919:"2884dc3d",40927:"881bebdd",40959:"ca0149b2",40999:"68c5632a",41030:"33d4a0d4",41125:"0fa5c29b",41135:"85ffab62",41159:"93340492",41260:"6c9200cf",41361:"247909f7",41455:"2bf5edd4",41461:"fd517388",41491:"c3f88c36",41504:"8cd118b0",41518:"bf9d9be8",41594:"da172daa",41640:"d407c2c6",41651:"e8e3bd30",41677:"9017a110",41739:"b9edf71b",41750:"bc38a1dd",41852:"29db9f25",41867:"78f0e259",41872:"58b3152e",41892:"dc5506b6",41907:"b7a56be4",41944:"14828316",41954:"7c49023e",42068:"c413ce11",42187:"295cb0c0",42196:"671726ea",42268:"89c8b6fe",42298:"3fa17fc2",42299:"1f979aba",42350:"6df57399",42368:"ffac4af0",42465:"b8212f90",42487:"203cc654",42518:"34825c6d",42566:"2b505997",42576:"b184a577",42596:"eafac744",42690:"165a93e5",42702:"28826a4b",42723:"d8ed3ccd",42794:"89f1622a",42799:"5314580d",42801:"bf3d61ec",42879:"aeca0a21",42881:"432e670c",42900:"c9d95cbd",42905:"145364e0",42911:"39c7a203",42920:"ebbd9274",42937:"a8c92c97",42942:"19028add",42995:"2812e3b9",43029:"e3477e52",43035:"2907d5eb",43040:"676c7c8e",43042:"bec2896b",43078:"50536743",43088:"341293cf",43113:"12164231",43195:"d831e3b2",43286:"fe9b6676",43352:"4c07ba53",43421:"f048922c",43432:"fbf82623",43445:"83fec35c",43461:"7b89671b",43512:"d319e9f2",43642:"4cd0ba1b",43677:"7117a8cd",43739:"752351f9",43868:"c09831a6",43922:"a8b66660",43980:"509aac2d",44008:"5a8b22a0",44022:"454b7ded",44040:"43d1bad2",44045:"894f5c0e",44118:"6503f568",44123:"e2fc22cf",44125:"ca2b0f7e",44129:"d653d7ed",44143:"19acc4ed",44290:"4f087d20",44326:"cfca4f26",44339:"0a91021f",44380:"8fd374dc",44405:"d363a80c",44419:"216bf65d",44489:"6fb01322",44492:"9882af90",44551:"9b2ae5ff",44567:"502906a9",44640:"20bfa334",44662:"d65b2c25",44682:"bdc69003",44719:"60165173",44840:"27077527",44876:"260982a7",44891:"30769210",44933:"f3d02b29",44939:"43f3c18b",44948:"c7a67184",44960:"12b957b7",44964:"8914fdfe",44994:"41af2803",44997:"6e34e766",45113:"55946737",45117:"86fe1f77",45146:"b528d4d0",45210:"49a37e79",45231:"7737fe61",45238:"c3f790da",45290:"db90ec2b",45323:"815e47ce",45339:"24d4b044",45460:"459dbf85",45500:"e85bde03",45541:"a722b43a",45561:"7dce0476",45640:"ef7891f5",45670:"c36346e3",45682:"3533dbd1",45919:"a2a2954f",45983:"9926d60d",45988:"95aba771",46001:"8cf74eb7",46008:"2e048b0f",46025:"1fb7523b",46039:"f724037a",46063:"67893f6a",46074:"f1087137",46156:"53cdeba4",46197:"8e4df3f0",46244:"ea511817",46296:"04b49851",46375:"e49bd305",46425:"00239e8e",46451:"4bb02a47",46472:"bcb734aa",46513:"9dfe5a97",46515:"c13f246c",46547:"c5427124",46578:"8012465a",46598:"8393d26f",46652:"5f0630da",46662:"4f48cd24",46754:"2b6a7ab0",46802:"8f07070c",46840:"b2e2853b",46850:"917a523c",46888:"db9d1243",46891:"85f8bce5",46905:"57a58e78",46911:"ff13b684",46917:"7b0a3d41",46921:"a28b89d0",46937:"37ffd066",46979:"a9afee85",47041:"bbb92300",47060:"26996ad6",47087:"a5c8a2aa",47106:"696d889c",47110:"1366dd9b",47127:"c648308f",47206:"4d2e69a6",47236:"131c6f6e",47247:"5048202c",47248:"c7e2144d",47297:"6111afa9",47433:"b9a767d8",47517:"09e5dcaa",47537:"df0967b2",47555:"0029660c",47622:"0c1ff092",47668:"b1899f7e",47693:"39a07549",47699:"17093d00",47730:"4edf53e5",47917:"6bb76d2c",48003:"7ad7688e",48023:"47f96c4a",48050:"ca713325",48063:"c17f9567",48071:"852ff8c6",48091:"0cc98403",48130:"f81c1134",48132:"c467a11b",48162:"519b5759",48167:"00021e3e",48188:"9d8965aa",48214:"bef59fc9",48285:"e672d61a",48295:"e2b4c006",48304:"189e3ac3",48310:"f6884a75",48355:"d8c836b4",48360:"959b45a2",48361:"712c16a5",48532:"2896ce7a",48544:"0a5f31be",48592:"c1506482",48613:"7a556257",48661:"ef4f3413",48673:"5db19d16",48733:"d009d47f",48768:"e054d919",48793:"b71be52f",48803:"79392e36",48842:"d0b9fc21",48883:"ce18dbde",49013:"9d9f8394",49046:"c68848f4",49055:"be94b749",49071:"97d17d75",49112:"3455c0d5",49174:"0ac5df82",49199:"7795e379",49226:"f2a06fea",49280:"6111bc4c",49305:"ad0a2b75",49350:"2417a912",49388:"8f1510f6",49461:"2019135a",49521:"49d63cc6",49569:"0d819826",49579:"e01bb6c7",49583:"8ec8c5c5",49587:"2cbb324b",49655:"b0ba51ed",49676:"2391d372",49783:"acf72eb8",49786:"5bd6f6db",49880:"3fc6d2b7",49991:"1d5cbb7b",50012:"40c88f7a",50095:"837c6843",50176:"756c7559",50178:"18dddf22",50183:"f2790563",50259:"ea981684",50261:"ec6a0daf",50293:"fc6a53b6",50361:"09a0b8d6",50414:"c59a4667",50428:"a33de290",50446:"eaebafad",50472:"a4e24d6c",50486:"313c653e",50507:"129c4e7a",50570:"c112d1b7",50584:"3fd21eb6",50642:"e964b083",50700:"75be343d",50703:"0914ee26",50747:"0d98f85b",50769:"a339c33e",50800:"b365f6bc",50819:"4251704e",50827:"aa04bdb6",50839:"8aa0dce2",50934:"e7b82dc0",51047:"4dd6f8d8",51049:"6bd6fe03",51060:"e1758f93",51090:"12aaf145",51102:"3304ac90",51116:"d366555a",51170:"5e85b509",51175:"c39359c5",51184:"90d97cfa",51229:"a06af3ed",51237:"85a6e3f4",51378:"0a8d92af",51412:"fe2deb8c",51420:"7a04b795",51438:"14515c80",51494:"65eb0274",51548:"45b02367",51578:"8447ad38",51584:"4c2a4e19",51589:"f762fff5",51636:"ba5671ab",51649:"6537c712",51665:"65d842b9",51694:"612cc46d",51711:"89bdbd96",51755:"b50c8022",51763:"9199f8bd",51769:"1bd7f091",51814:"91a39dd0",51828:"44e51e65",51837:"5c238f81",51878:"48b6c251",51890:"b5fb4df8",51937:"34689118",52036:"1d79e793",52042:"7f8ebea7",52093:"edea4b8a",52102:"95cc61bd",52132:"3498be82",52135:"d0ed28b7",52176:"81d19844",52207:"508f03f4",52218:"1562cf35",52235:"fadc68df",52250:"8ec5e058",52266:"3e088827",52267:"6818c2e9",52282:"be224150",52286:"8e1e17e5",52342:"0dd8c0ac",52408:"ab586159",52450:"2dc793da",52462:"3016c86b",52466:"8c67a0ff",52478:"cda1618e",52488:"ca57223f",52563:"f2da277e",52569:"7199ad43",52572:"a9417ee3",52612:"27f2e2a4",52634:"c4f5d8e4",52680:"2124517a",52711:"9e4087bc",52731:"c8f57d29",52770:"85afc7f5",52785:"25eae11f",52826:"ce319efa",52840:"9e1bed9d",52882:"fa2ae802",52895:"69fcecaa",52911:"4d4179b3",52912:"82c60778",52913:"4adafdbf",53074:"2f32a261",53132:"5de85215",53170:"aaf3ff15",53178:"71514a42",53201:"d670063b",53237:"79ab3378",53256:"fa713049",53266:"76a0389c",53288:"f8fe23f1",53314:"5440b68b",53449:"e2bce80a",53458:"63436e22",53492:"a45dd8f5",53540:"92f1a745",53619:"16640689",53629:"5a2d67ad",53633:"f6ef9721",53646:"6c9978fa",53670:"52ed38a1",53742:"77612fce",53771:"3a447539",53786:"e352cccc",53832:"7c8deb08",53860:"e623e42b",53861:"2a5e97be",53871:"94dd9534",53881:"e9a95c5e",53901:"a4da17e3",53925:"a8933372",53982:"d5f056f5",53990:"f72b3fe4",54097:"8c317219",54106:"93b4d825",54200:"f97d7d88",54240:"3a55b748",54246:"5ba9c4b5",54270:"e5c0ea66",54272:"f020ef51",54274:"b7bc328b",54277:"71e2c4b4",54399:"25aa47d2",54415:"c87c5e1b",54462:"0c3d0366",54487:"52676037",54500:"fb9e14c7",54540:"66193a96",54568:"633af835",54730:"d4522125",54749:"ff4fb41e",54759:"0f7d8652",54772:"13883961",54851:"a2de6851",54879:"a872c629",54881:"c46bba44",54927:"55f8cc28",54950:"0a893fdf",54951:"98bd463b",54992:"5bcffa9a",55004:"37d125cb",55100:"70d55848",55144:"152d0582",55167:"c1cb0a0b",55206:"aaa8a12d",55276:"c962ae4a",55302:"facc4cc2",55342:"ee44120f",55401:"2027fd18",55483:"342d2e6b",55526:"f7fa3381",55534:"ab685cdb",55559:"29cf75d4",55566:"c8861997",55579:"3a9c66ce",55616:"d5caed5f",55664:"a7511015",55668:"bbaa8144",55754:"069b26b8",55780:"d425e9d6",55836:"94b063ba",55929:"2cbaf53f",55942:"41adf405",55955:"194c8540",56028:"e1a6f6ca",56037:"69ef23f7",56062:"cde3e47b",56087:"c96d4604",56097:"096bca72",56122:"a7b4d0d7",56123:"602e2465",56133:"887c7539",56190:"5160d3b0",56256:"e028a908",56259:"75a12619",56297:"575869e5",56384:"fec58251",56408:"cbb5064a",56493:"858f1266",56510:"86a45dc2",56560:"c9c31477",56607:"609f9177",56648:"06eed450",56662:"beb32294",56688:"8dd3eb38",56723:"69e6c429",56725:"9a502a1c",56767:"2d57b909",56779:"6664c24a",56826:"eec5649b",56916:"ebc13825",56948:"1dbfdc18",56974:"39ed0ae4",57054:"97b1d23e",57119:"4d68fc5d",57141:"037241c6",57155:"23348138",57159:"e15f47bb",57165:"034f0308",57178:"2575da36",57182:"a2f498c0",57222:"8ee4a7d7",57245:"e3b05f38",57251:"779bba71",57283:"5e727800",57302:"55b89dea",57326:"3ed58e4a",57359:"841b525c",57361:"79cc2eba",57426:"533bed85",57529:"0b7a8a63",57547:"27211971",57581:"b20f9cb2",57594:"2b2d1be1",57614:"dd48b375",57647:"0ed7fb46",57730:"658997e4",57749:"c07b5739",57760:"73d3ccec",57762:"27b8ef72",57885:"f1691dde",58e3:"e2070fcf",58002:"31fce735",58079:"2655f170",58111:"fa4b529c",58144:"a2171a4d",58255:"400deb23",58259:"078daaf7",58301:"b296abb0",58351:"cbf83637",58359:"a5e62092",58393:"15ea2a5f",58428:"ec854811",58479:"2a882da6",58484:"36d29ed8",58492:"0ba9210d",58581:"f0e5f3ed",58594:"6bd22ece",58666:"a1e59af5",58667:"a36e07dd",58704:"7fde9a4c",58707:"6b6aadc5",58721:"9ffdcfdf",58780:"b7d1b016",58857:"bec552c1",58874:"030dfd2b",58880:"52e97b50",59004:"7dd8c933",59005:"39fca8ac",59009:"a169aa70",59020:"e84457bb",59053:"11b61292",59070:"c43c6f4f",59104:"c762272b",59114:"1a20bc57",59123:"17ffd4ff",59262:"97db775f",59326:"e2b886c9",59349:"156bd387",59475:"55d26943",59493:"150f4998",59521:"b2555332",59614:"c5c8b091",59680:"70cca634",59702:"c9b0e9c8",59732:"9873f053",59740:"ab90a7b7",59779:"28553a2f",59781:"0e7c02dc",59866:"03f08ad1",59873:"b37c8625",59874:"b62e8859",59923:"95789563",59940:"888f35af",59981:"03137a3d",60020:"cc3a93a6",60119:"66eb519d",60167:"152819f0",60185:"e04f784f",60187:"a52bfe45",60193:"5c430979",60198:"5c417b7f",60203:"5c5dd48c",60257:"3fa5d64e",60267:"3d3aadb0",60294:"93d54c10",60315:"42d452f1",60445:"f83acba0",60510:"821320eb",60565:"492bd0ed",60613:"3523854b",60625:"7a82ef89",60676:"244c7b0a",60696:"d163928b",60725:"73e80d5d",60762:"e9d18558",60765:"0614dce3",60819:"c316a3d7",60830:"2df3fdca",60837:"d2436a2b",60861:"c9d25191",60884:"709e1a02",60901:"00b58b18",60908:"fe53d354",60953:"3e85731b",60965:"4d18bf1b",61027:"b1506a50",61114:"127f988d",61228:"4521c19b",61235:"a7456010",61265:"84536aab",61300:"31eb78c6",61345:"f12e5474",61378:"c90911b0",61416:"a1e3441b",61481:"b0f00280",61559:"6b206066",61584:"55b57e06",61627:"35190cab",61652:"495a3878",61702:"faa24029",61721:"4f3239be",61734:"ad2a3b86",61740:"bc80aebf",61786:"aa1329f2",61844:"14da6f38",61886:"124bf435",61939:"88937603",61950:"820ef6f8",61959:"9df3c51e",61991:"a6972a3c",62015:"5cc68a8f",62037:"f1b1ae9c",62061:"2638eb20",62111:"d2289dcb",62120:"cf1cd5da",62138:"1a4e3797",62147:"8d364c04",62149:"5955b5ee",62162:"22c027ab",62182:"0e7e04d8",62188:"1e38d1de",62254:"9b695413",62264:"cb69dde4",62400:"8041f857",62431:"856bc38c",62456:"3e9695b6",62469:"f448ea15",62501:"564f4b07",62549:"cca423c7",62568:"abfb0eb9",62635:"61b91652",62639:"0f378f0f",62641:"58728d91",62672:"fcaa2a90",62691:"d9175e87",62703:"345b88a3",62712:"f9a8c23e",62714:"1769198d",62827:"4e78ea4f",62845:"ae5c2262",62867:"07853d90",62875:"f1096413",62927:"c03ef713",62953:"7a0d5539",62957:"e5c6728d",62975:"baa95a18",63005:"b0635fce",63064:"754efc6e",63075:"37844666",63124:"d4bcf69a",63151:"93f4c2fc",63181:"29fd9202",63228:"34c77011",63262:"df8bdaca",63291:"2f1bf685",63298:"259b7e50",63317:"7dd3b2a7",63330:"60b75cbd",63332:"67474760",63367:"44bdb747",63382:"5f87f962",63387:"9780a9d6",63420:"04ea9cef",63430:"465af2b7",63455:"f30739cc",63515:"a3041c66",63521:"58f053e0",63553:"1fd2ca4a",63576:"b9795b3d",63627:"43a56d47",63646:"47298c37",63682:"f82e3d74",63700:"eadd254f",63739:"81a5dcd4",63779:"c2750739",63795:"a4974adf",63836:"95e06d9c",63907:"57e245ce",63951:"8bbbdfbb",63966:"2278c359",63975:"b81d6cb2",64045:"c47fd21a",64099:"e34c241a",64184:"f4f77456",64209:"88ed6425",64264:"192402a6",64275:"48a72e90",64351:"7c0dabe4",64391:"b65b26fc",64442:"dfa86ee4",64447:"e4307155",64465:"e9f47cd4",64473:"9c8cec5f",64502:"5d817499",64527:"dae07133",64535:"3756d209",64577:"a2a8ce40",64597:"9c273b44",64623:"e52d80fa",64659:"6ae279e9",64670:"46693c0b",64737:"1d00ec5b",64749:"2da5f59f",64838:"9a8a6b3c",64899:"e80f330c",65013:"a3fde46e",65017:"f08c8322",65091:"75914136",65094:"f04b050d",65133:"c9bcea67",65193:"d0cf31b7",65221:"67922501",65223:"2a11e6a7",65233:"0530d392",65246:"ba47c7e8",65350:"517960c0",65356:"8db42357",65359:"070df7e5",65473:"a21d3492",65497:"26115f23",65569:"8008d958",65611:"5d7f3e2f",65625:"e1ba57a0",65629:"26cbee69",65647:"75ba6401",65648:"c7850e27",65658:"329c66a5",65727:"e29a1e9b",65745:"d1be0dfb",65756:"02ff5d42",65759:"7d5633f0",65835:"fbd3de42",65897:"38147e44",65918:"587a0b3e",65926:"567cfed1",65957:"21719437",66061:"1f391b9e",66062:"fada9729",66097:"ceca85fb",66135:"331ad65a",66140:"136587f9",66162:"cf5645b0",66169:"0b7cbed9",66210:"2b53c3fa",66237:"cc9fb6c4",66327:"eee168db",66338:"dcbc8483",66372:"8fb804ed",66381:"9019bc0f",66394:"c0d2ab5d",66415:"6f47e633",66461:"cb8920e1",66499:"85e49a93",66504:"b01f49d5",66510:"79d5f27a",66518:"c6ec7d6a",66524:"83037ff5",66538:"d0550e1e",66559:"ecb74126",66575:"b0e34666",66602:"9fce9e91",66715:"48455675",66753:"5389895e",66759:"e381e7b7",66822:"62e9fea7",66832:"e1fde1ef",66867:"58b9aab4",66903:"47f8f95a",66912:"6e955522",66947:"6faab85c",66995:"ba8ea34b",67044:"1b143eab",67061:"c1050649",67098:"a7bd4aaa",67100:"27c39d7f",67104:"06073810",67114:"0d86fe8d",67149:"11235f31",67189:"9736a6b2",67229:"2d4f05ca",67252:"60cef16d",67376:"01ed4ae3",67438:"b6d7433d",67472:"814f3328",67489:"3477cc36",67507:"77139df7",67545:"d89aa357",67581:"a1a96ebc",67587:"8775fa1c",67649:"eedfeff5",67668:"47766edd",67683:"cace8592",67704:"8fb89e11",67720:"4d59e059",67729:"2c18bef5",67755:"b57b3f07",67775:"39b26ead",67914:"0a0dd03a",67954:"8aec9a60",67989:"59171146",68038:"863f8530",68043:"c1c9577e",68045:"0924bdf1",68094:"e981d05e",68210:"a148d810",68246:"3b8a31a8",68249:"e48e4dc9",68253:"89c88bb6",68304:"8ea5f648",68315:"98826249",68334:"9d05a91f",68434:"975aa772",68467:"bb6faf52",68470:"60753781",68515:"f553a3a8",68551:"9a8c2230",68569:"d81421b8",68665:"f645a9e6",68685:"0b87289b",68710:"dbf13a93",68765:"719a7d9b",68770:"14033dfb",68839:"3ac10f9a",68861:"bb1a3e9c",68865:"08299697",68910:"62cdbb35",68930:"5aa406a5",68955:"f9d38c6e",68991:"b60b94c8",69017:"ef13094f",69030:"8a752d6d",69038:"8df5dc78",69129:"4a55387a",69169:"fc384521",69199:"f0589cfc",69347:"de9d53d2",69365:"4d2a5110",69384:"5a360e6e",69457:"7ffd9a5f",69501:"fc15228a",69517:"8a4df687",69570:"4d573718",69588:"a3713279",69633:"05c96a0d",69638:"9c10cdcf",69671:"36e398ec",69770:"b1e8d27b",69787:"787caf51",69844:"615fd764",69875:"b58f381c",69982:"8e981336",70008:"0860d759",70022:"c8d1e051",70058:"73a7a1a2",70100:"b318f3b6",70117:"9f3d620b",70126:"f68988f2",70127:"dae6ce88",70133:"2f2d1edf",70174:"e04f6385",70179:"cb543535",70209:"529aff45",70210:"8367b76d",70234:"e76e0aa8",70253:"5e1c183f",70268:"aefdabf4",70399:"d2786aa3",70418:"0bbbad22",70452:"b71c2d32",70502:"8c596cb7",70551:"0bd456dc",70560:"ac5d28bd",70606:"39583919",70612:"6d5145e1",70645:"a9f446ca",70649:"0920b03b",70669:"dcc774d2",70687:"70ca6744",70689:"52375367",70696:"52be8247",70712:"cb488bcc",70728:"07338b13",70749:"ecba2f16",70755:"f3e1c72c",70784:"ac00e857",70791:"fda5ba18",70794:"c1dff2d3",70814:"c3c05d38",70825:"1d89db06",70826:"23421dc8",70828:"6763bf32",70853:"e34cf2a2",70870:"4f594038",70947:"d1fa94a6",70953:"87d75f25",70963:"16029e49",71021:"05f6486e",71026:"5e0cf2ca",71051:"9b8a5dc6",71111:"48c07d39",71117:"92f96583",71162:"af7ce5e3",71227:"131dae92",71235:"18891827",71374:"40d0141e",71407:"7380ddcc",71473:"ff761994",71531:"f89e6cd1",71565:"83c3bea7",71585:"d7e2cd1f",71590:"ed47441b",71612:"a29b4047",71656:"7ec29cb2",71715:"4a74d13d",71784:"e3aab494",71792:"d2a882d8",71858:"09138901",71863:"acec9ba2",71877:"466f5a64",71910:"f783f7a9",71964:"835d6f03",72011:"31b399ad",72043:"f0dc2560",72053:"95f36a1a",72122:"3d095b6b",72135:"8cec3a3f",72246:"cf8b2bc1",72322:"4941c7ed",72353:"f23d42f7",72358:"4419dbb7",72446:"27d3d4e0",72527:"ac84c584",72573:"bd203bf3",72599:"3336b76f",72634:"c8768069",72668:"049fd4ea",72675:"f81aef8e",72707:"eb3eed60",72759:"69f425f4",72815:"56040849",72835:"2d34e835",72880:"43b52908",72907:"491d56e0",72914:"37eca2aa",72925:"b724edf8",73019:"fca979f9",73084:"b8385eea",73193:"da144c90",73264:"33e8889e",73276:"7bd25ebf",73290:"c7f860be",73316:"8b1b48fb",73331:"97d2cbab",73376:"21838a86",73397:"681664ad",73472:"092425ad",73493:"4c26df07",73539:"5ebbf59b",73540:"73d617e8",73569:"ac6289fa",73607:"01689e9b",73609:"622b7911",73624:"edefc60b",73684:"35be90fa",73693:"c6ea0115",73741:"eb08ed44",73756:"d8415e6f",73800:"5cf43a2c",73841:"569e0588",73846:"4d015a5e",73888:"06dd3057",73891:"d721a748",73905:"d502d9c9",73940:"f4731b9a",74019:"14841d7a",74027:"9d891c91",74039:"2e6d9cc0",74046:"b7aeb8c2",74069:"ea5e46ff",74121:"da7bf323",74134:"393be207",74282:"2fd7ee6b",74312:"acf7953e",74388:"57eb6545",74403:"bc42f283",74418:"103c2fe7",74490:"3d4e54c7",74524:"111d9467",74588:"84939cad",74657:"033d3629",74684:"e6ce3bd9",74792:"a5ac74f6",74880:"ec7a5af3",74902:"43c329f5",74945:"ad848ffa",74961:"9b3f2ab9",74994:"eb5c136f",75036:"0c90e710",75043:"1c4d0413",75051:"13d28288",75062:"8df3f976",75078:"dd620de6",75105:"e2585025",75106:"9f49c871",75173:"3126d1b1",75267:"6dab9497",75309:"07deb48b",75359:"84aa8d64",75378:"847c1b9e",75405:"ceaa6e69",75450:"97c492a6",75459:"605c3775",75666:"2aa42d18",75695:"68f2aae3",75696:"1ad07866",75718:"d2250181",75735:"691ef278",75759:"217c03e5",75775:"724a4edc",75805:"ad132b09",75866:"a3541f3b",75911:"f18854fb",75919:"e01c8f09",76041:"03240ae1",76123:"52166518",76163:"20a6876f",76166:"1778a2f7",76215:"d9605822",76235:"6a3d5afb",76257:"cc7760fb",76262:"075f4b70",76264:"cb46984a",76274:"5d06256e",76285:"0d71ae17",76289:"1ed4b1ad",76368:"9267add8",76530:"594c10ba",76641:"eb0d63b4",76683:"b6f16885",76719:"a50107bb",76748:"9a68cfff",76850:"d5a221f8",76854:"2b00a752",76871:"e364f7ff",76873:"a91e6a0a",77077:"a01a15fc",77088:"bf048e24",77096:"61ee4158",77123:"62825cc3",77145:"30ae1693",77174:"ce019e24",77183:"eaf93d9c",77200:"a95aede3",77222:"fe2389d2",77261:"1aef3c3b",77298:"109d395b",77369:"c4acdd50",77391:"d0c84d34",77596:"0235a442",77679:"5ef28561",77698:"60381fc6",77749:"3a31d53f",77764:"8c3793bd",77787:"d9e41302",77794:"62e7b5b0",77920:"a52788ff",78001:"33ab05f6",78037:"c9599a77",78055:"30175d3c",78087:"90caa6a1",78159:"8df10e0f",78199:"5455ca0e",78312:"1682c6e0",78354:"c1b680b7",78421:"b1a2ea9a",78497:"28ebe10c",78512:"b7e5c092",78522:"ff4a022d",78544:"4adc4126",78583:"95365ba3",78632:"4f1d1584",78704:"b80df7ca",78758:"667a9f57",78764:"6000d05b",78787:"a7f76e11",78820:"04c3dd09",78858:"4f0afd2f",78876:"499efff2",78880:"335badf9",78912:"c8939218",78919:"f73fc2b7",78926:"73bc484b",78985:"ccd7c88f",78988:"0ee8b775",79039:"803df44c",79048:"a94703ab",79150:"cdc43a7d",79157:"c884c38e",79180:"cc426672",79302:"74555694",79416:"a2030166",79474:"120bc0be",79485:"8b7dab17",79506:"368f9c22",79520:"34900881",79521:"09b9b020",79656:"1bfbaba8",79739:"8be24c4d",79841:"fc26a5d5",79866:"619263e9",79987:"dd6ea91b",80018:"5e4ec6cd",80046:"93c339e4",80091:"587df15f",80102:"7349f9da",80198:"d38a6f54",80205:"0cc20099",80259:"45cd5638",80260:"8aabb1ce",80299:"8657657d",80310:"3c89ed52",80362:"2fd10e89",80375:"6e954188",80408:"81c96f91",80424:"abf14b6e",80442:"e1a35040",80457:"992bda30",80458:"318980ec",80491:"7080aeb9",80531:"27321f21",80557:"5cb06d06",80598:"1f97a7ff",80632:"9abd9d66",80649:"80f24550",80677:"6d70fa33",80744:"641786b9",80750:"84ac5929",80772:"fd440a88",80781:"cfdba83a",80794:"442da8c1",80841:"413bf93f",80863:"b6aee096",80947:"a7f213e3",80957:"c141421f",81012:"820b9813",81019:"f74d3bfd",81050:"c88d5fcd",81085:"104fa664",81125:"aee88ae1",81175:"f98df6cf",81188:"ddf9f187",81212:"347b93da",81285:"54e1e905",81300:"2195a7cc",81319:"12363bc4",81346:"a20f65a6",81390:"e6c5d4a7",81410:"7af33a93",81482:"ae0ec9f4",81530:"654827c2",81544:"13685ceb",81583:"15a3ce9a",81639:"ffe2a86d",81666:"a74d38f6",81692:"0d9e9c41",81737:"c75c3ca5",81761:"932d66ca",81770:"fddd2104",81791:"d3571192",81795:"b90928c1",81802:"6066240e",81891:"b3dc9cb4",81902:"29470dda",81903:"acecf23e",81943:"4b93078e",81982:"2a59c009",81990:"f9ecf61e",82012:"4a7139ae",82019:"755e7c7e",82242:"cb7dc7d1",82261:"d2c9f0b8",82297:"226eff01",82354:"b87f99cc",82362:"7345c721",82431:"5d210bb4",82456:"24f4e7d7",82486:"4393156b",82553:"0add85e5",82581:"907fc94b",82588:"4cd82028",82663:"dd0ce7a8",82722:"72e3e702",82754:"4ccba4b8",82847:"dd09cc7b",82905:"12cecbf6",82939:"2a7d5452",82987:"732a7c43",83027:"dac8839d",83078:"42174d87",83089:"686a74aa",83103:"21cd7edb",83109:"79ca5236",83111:"6060cc06",83121:"deacbd9b",83127:"10757cc8",83182:"e5cd0e7f",83203:"95126e44",83213:"828aa184",83249:"ccc49370",83260:"5c26bf07",83273:"2b6eabf2",83316:"0ba08ea0",83378:"d0f169c8",83470:"e6ccb422",83574:"c85c7bc6",83608:"19560f91",83670:"9e37e644",83700:"a8c902bd",83779:"e6fc8a9b",83797:"b6cd0ba6",83824:"f5dd5915",83841:"cc517726",83849:"c48426e8",83928:"345eb925",83932:"757c6784",83954:"e67a83cf",83958:"2bf0d1a9",83970:"e200187b",83976:"0e384e19",84013:"c17d6939",84070:"511d3e84",84107:"ed83b9b9",84152:"d2ed2b82",84227:"17d9fbbc",84232:"ddd99a22",84255:"901160ed",84259:"2ffd8514",84319:"1132d5f6",84332:"0b82d45d",84527:"8180940b",84530:"2e72ea50",84563:"2760fb69",84572:"d9a7203a",84760:"21f4f354",84773:"b738b15f",84813:"6875c492",84869:"6bd2e919",84963:"d9d878d8",85014:"ae42df76",85095:"ec2ed6e2",85097:"7c86d680",85105:"ab380486",85205:"0cf3b0b8",85209:"8beefa16",85243:"78c968cb",85257:"ffec2b37",85279:"8f4a15da",85322:"c9ff545e",85358:"813f53ba",85442:"2f6614a5",85453:"de5aeda1",85537:"2c88985c",85581:"8f9bc413",85588:"24e645af",85736:"0e8c3a89",85796:"a4a3eadf",85806:"3e226f70",85817:"d40aab8b",85896:"ddb0149a",85899:"41639dad",85917:"716f14d9",85960:"5268c144",85973:"5733876a",85997:"83b6afd8",86053:"ae271c01",86074:"199e6876",86121:"677325f0",86129:"fb03d32d",86167:"1f8198a4",86215:"95ee2976",86216:"abe1b280",86246:"7a2c4c43",86354:"d630316d",86417:"669193a7",86434:"d5f51703",86478:"2a1b9f9a",86480:"3a311bb0",86501:"f4e1ab69",86586:"b76e61dd",86597:"0e0dfb6a",86623:"49bbb99a",86659:"7ff6577b",86669:"927f97a3",86685:"58421c87",86807:"b0445ba0",86829:"5626901c",86846:"57ec2762",86856:"c942990c",86888:"5687c7cb",86890:"319b6f13",86914:"869411c7",86939:"7a06eb83",86992:"d2a66e94",87004:"b62a4e5f",87087:"40df2769",87159:"4eec7d8d",87184:"4462c0cc",87186:"767cce31",87205:"bad31f72",87217:"9c71777e",87269:"33ac18ed",87282:"c884ad6a",87377:"c4f2c374",87407:"cd08112a",87432:"0b425eb3",87456:"33bf4676",87459:"b8f2cc13",87473:"baf4021b",87483:"d5762a9f",87485:"643da015",87547:"e29c32f4",87589:"d2b2e5aa",87614:"7c29a585",87688:"137db567",87747:"3f1a4665",87781:"6f831635",87863:"4194f325",87875:"01f93a4b",87880:"f553a7ec",87905:"fc17862c",87945:"5b17955f",87971:"dc4ee1bb",87995:"85f9f5a6",87996:"72a68b3b",88047:"a5f4f54c",88111:"ca3d464c",88163:"2e05ee79",88222:"b8fd1a8c",88248:"ed990644",88298:"85e50ec2",88310:"0169a509",88327:"fbfb0bb0",88393:"3cf947bf",88394:"5ae50f21",88399:"078339bb",88436:"a13618bc",88441:"40e4b7d4",88468:"bf79ed6f",88478:"23a811a2",88522:"d3f32089",88547:"2283659c",88622:"5871fbee",88626:"6e8a38ea",88654:"6dc022b8",88696:"6be5dbf9",88775:"b330ac5c",88815:"71cde98c",88817:"d3065e4e",88821:"b0b71a2a",88847:"014c2cb9",88852:"508d741f",88855:"5edce1ad",88865:"d15e98db",88903:"568a0660",88986:"7b658d8e",89018:"2c9ce68e",89093:"fc93a2ea",89097:"24f450eb",89172:"adb96665",89175:"9f15c6e7",89210:"9b191135",89289:"d8e6b3db",89338:"324cb577",89353:"b919dab0",89362:"cb2f16be",89402:"39ac0d5b",89415:"9ed26de9",89437:"ce1709a8",89455:"978ca64f",89489:"145c1cc4",89534:"66405406",89554:"7ff4234e",89610:"2709984f",89641:"cde9af88",89696:"837dc7e4",89801:"084a80b5",89810:"9bfa1541",89858:"36994c47",89873:"65f8c8fd",89986:"e582f766",90066:"bfb3b697",90071:"7e60f0fb",90110:"dbe2cfea",90115:"1026ad00",90135:"8abd7194",90214:"9db841c0",90257:"7b773c92",90280:"a80ed580",90317:"b3abe364",90378:"c633f93f",90414:"ed2667fa",90416:"9947fe09",90438:"fe49dcfb",90513:"6157713d",90562:"32eb34e5",90593:"99144b30",90598:"2563c97b",90625:"73554d19",90627:"bfa9eb5d",90717:"fff1effb",90749:"48dc1693",90831:"e96ddf11",90842:"837010ac",90849:"0058b4c6",90910:"e03c6723",90950:"271ea2f9",90972:"70e8710e",91025:"466375b7",91058:"42003ca2",91109:"014625f4",91187:"3629c812",91203:"ece3ee5e",91257:"f657ed9f",91305:"af1525aa",91319:"0f84f33f",91333:"d1980a1b",91359:"88f66091",91405:"ae3304ee",91428:"284c57b4",91530:"7118d0f0",91540:"980d0b86",91581:"8614d32b",91587:"1fecd571",91597:"e33cf622",91621:"7907a033",91695:"6033c607",91724:"9964550a",91787:"df99aa82",91844:"41ca93cc",91895:"b7201a27",91916:"72fdaa88",91993:"8ce0215f",92018:"0ce689e1",92031:"e2c3948d",92105:"6342cf5e",92125:"4cce6e5a",92196:"56a0d755",92223:"e772c536",92241:"bef29d9e",92273:"85fe7d70",92329:"4a4c6752",92410:"4c434b32",92412:"d888d821",92475:"1be20fdf",92535:"b6eb7220",92544:"e53ee22f",92653:"efa442c3",92664:"7c1d6f5a",92673:"9dfaf941",92955:"3e082aad",93057:"adfd3bc1",93085:"b5ea0533",93166:"fed5be48",93206:"2ed2a721",93209:"47b26a6d",93210:"e55ca189",93269:"b12147a6",93273:"cf32db66",93341:"aba187b8",93361:"2357dc71",93362:"7a234181",93438:"f5e9d1c4",93442:"63786366",93534:"a9c52207",93546:"d9e43198",93602:"44c6f0c9",93636:"e1847ef7",93795:"f179621d",93849:"09bacf3b",93854:"0a07ac32",93884:"c3c082a1",94e3:"45a5cd1f",94065:"ee71d619",94082:"8c0fb9c6",94091:"beceb38b",94106:"acddd5ca",94153:"6ee6a410",94168:"c6b4dc09",94227:"f0cc57e7",94251:"824e6f8c",94314:"00f9d3c8",94344:"8b44df1d",94361:"657bf45c",94417:"85c8b6c7",94538:"13feb7a8",94555:"8e7aaae8",94561:"a1e44e64",94568:"745d4b8c",94625:"0a02a2d0",94646:"30549b42",94648:"50774ec6",94685:"8520f5db",94711:"0c2c2d88",94713:"6dfe2e3e",94788:"c26e67a5",94796:"256701a3",94841:"a1282170",94843:"3e1f4a39",94863:"fc66001f",94864:"95ec5604",94910:"bb63d03e",94925:"e8b41ff0",94926:"98700a51",94980:"5fc8caff",94997:"8d65e26f",95020:"63c4b13e",95058:"4b69979c",95078:"10ac9a3e",95093:"818bb2cd",95136:"c0df5757",95159:"cdb727d9",95183:"f58814fb",95187:"59700627",95231:"1cb0fe52",95240:"b4030b00",95245:"ed211a79",95330:"9b4185c1",95427:"52910a8f",95443:"e1afbf8c",95470:"8a40ff6b",95542:"5917c028",95605:"9a8fdb53",95641:"188015be",95649:"4885c521",95659:"30d4e84f",95768:"89ce4ba3",95785:"8c79a60d",95818:"dbea5ca6",95909:"9e488927",95911:"accd2b0e",95912:"cbc2448c",96022:"5180e398",96086:"eb84cef2",96155:"a267572b",96225:"838df61f",96239:"380e17bf",96268:"638db053",96276:"82a7c68f",96325:"65d1ec04",96463:"ddd9290b",96470:"1b260ed9",96555:"d4083900",96652:"5b0025cd",96693:"8c42b153",96745:"4f748135",96771:"a98ffe6a",96778:"181eb1b5",96793:"c3c125b1",96881:"d527c17c",96963:"98749210",97006:"7ab01152",97033:"e9032a0d",97047:"763a8986",97107:"9331da7d",97114:"32bb5bcb",97123:"9d2e74da",97167:"20a30ea0",97189:"1b3061f3",97223:"7fa05810",97246:"365a7fd7",97253:"1a8a162f",97296:"205cdcf8",97342:"c2a473ad",97358:"76276d52",97379:"3bfbd79c",97420:"224c7e3e",97424:"ba47c136",97476:"b93a682d",97536:"3a6c6e5b",97554:"6ccd70b6",97562:"3d08e0be",97585:"8e81e342",97664:"facb0528",97670:"1dba1ecf",97732:"b58e88de",97737:"8fa9d00b",97753:"41b1becf",97763:"7d2fd416",97821:"97a057b3",97829:"e5562b89",97863:"47edbc34",97887:"26ec8ae2",97895:"ab8b4014",97901:"bf7dfc7c",97905:"ff509459",97913:"1e228808",98012:"350cc719",98020:"16243474",98021:"139d61ea",98030:"95f25ea6",98058:"fbb50b04",98059:"75dbe45b",98087:"b18455bc",98094:"48f67822",98139:"a2219ebb",98147:"fc46979d",98165:"c8e5bf38",98237:"3539b92c",98271:"f62bafa2",98308:"756094a5",98311:"9e297776",98392:"1c3a958e",98425:"b943b6ea",98473:"94dcd3de",98477:"ea6f04d4",98534:"6065ad54",98700:"99e64d04",98750:"19bfb940",98758:"af6e9729",98761:"3314c9d3",98779:"a48978f5",98804:"bf667688",98867:"3e8495a1",98908:"b4e94af8",98925:"ab37b32f",98935:"5de60d34",98941:"c9ba7c72",98947:"ef00b8a0",98982:"e8178b53",99001:"82a5d7f7",99095:"1c27379d",99146:"210305d4",99151:"8e563661",99252:"3047f3e7",99254:"c14fcab2",99299:"8944e56a",99306:"bdecca0c",99330:"b3e98411",99335:"df09200e",99437:"5ffb8f23",99451:"c0684476",99502:"2263a65b",99504:"76af5d51",99528:"16e939a3",99531:"8c2cbe8e",99534:"c49eb59b",99543:"25c655c3",99611:"9cc8ffa2",99644:"bfbfac54",99678:"25e15e7c",99701:"5a4dd75d",99705:"5fb14ca8",99709:"dc330c71",99710:"6e34d00c",99746:"f4a839f6",99747:"a32c0324",99872:"8e34a11f",99905:"2f7d15c4",99913:"38836367",99987:"4b2e4980"}[e]||e)+"."+{16:"8a09bc3c",25:"6875f362",28:"8eabdc91",39:"068bc723",48:"849a2f6b",60:"38634d1d",67:"7eac7b6d",106:"5d0f86c7",129:"ad091a76",159:"d17cfd99",217:"0bc1c4b6",278:"7a133af3",292:"0bd61be4",323:"2ca86a04",335:"10e8b68a",354:"40cf0362",387:"cd12a486",437:"dfb6628b",569:"02866324",614:"44e4a263",805:"07c12e99",822:"ef8339d8",851:"ee36c626",878:"8fad3634",910:"efe21154",917:"6161fd8b",924:"356e5ddd",940:"cac0b0df",1103:"3f89d301",1107:"7e8866c9",1119:"4bbc5be2",1136:"21f72e0a",1190:"8e56610a",1251:"49f694ba",1284:"f5a3911b",1337:"ed03be8e",1360:"ecf0e7ca",1422:"0e1d3b9a",1442:"47fac533",1506:"554d3065",1517:"1a694762",1550:"39a1cecd",1635:"35a7771d",1656:"ca0647f1",1658:"9711c713",1784:"0fef97f2",1785:"bc4d1952",1791:"5fd94693",1841:"b4a6b9c8",1846:"9ac595fa",1857:"4c849a8f",1882:"e0a7b21d",1928:"877dfaf1",1946:"61767f79",1955:"8a0bfb14",1983:"1982ff74",2016:"bd8bb947",2053:"a44f5cd9",2121:"e27f349b",2172:"33f2ad32",2214:"6a299945",2225:"7d7028c3",2239:"0f532176",2256:"779aea49",2262:"0bf08dd9",2298:"571d78d4",2385:"a6abe910",2450:"57f1681a",2472:"1b1cbadb",2540:"ccf5521a",2577:"9d61156a",2638:"0d848ef2",2640:"f6e9fddd",2652:"7c607567",2663:"4e8fefa1",2679:"dd0dc46a",2700:"2fafe158",2739:"0ca6b901",2748:"6afd10a6",2759:"38d24c2d",2768:"13d74cf3",2772:"5a7711f9",2791:"35fa4f4e",2839:"27e3f7c1",2854:"45badd67",2867:"2d1bdc8f",2884:"bc593027",2912:"4a994ce6",2932:"da39912d",2954:"f91b5b76",3075:"2f46f339",3125:"d85555ca",3131:"feeade58",3137:"a059264d",3144:"86fccc09",3179:"d88e0655",3303:"e1d40ac6",3313:"c4669891",3323:"a9b14b11",3471:"5be54bd3",3558:"4acdbe49",3693:"18efdc0f",3694:"cc0b4859",3722:"35a202b7",3740:"f2909c31",3764:"98e31955",3847:"6ae5e13d",3940:"06f163c7",3965:"c5d1f980",3968:"27784d55",4014:"fa271ba2",4028:"fdcb2d50",4040:"f4d4f02f",4060:"9b076617",4074:"33fd4cf3",4117:"9e3d6091",4133:"255f8728",4137:"75ef07ad",4205:"600be0a6",4269:"04fc581f",4355:"ef747ac7",4368:"2a18d792",4382:"5dd5bfe7",4405:"5da3e763",4467:"a9d685ff",4514:"b9b659a7",4530:"ae1c75a3",4574:"fc708067",4591:"93231c73",4602:"f0ac3d8f",4777:"5ba3f668",4790:"904f169a",4863:"2586fc4c",4890:"d278e426",4919:"c4d3cd3f",4949:"ffee880a",4980:"df50cb4e",5008:"6b1d60d5",5028:"7c782fc8",5029:"92619e1a",5065:"f9e7905c",5193:"1b398db6",5195:"774314fd",5206:"705fa214",5269:"3ef4f7b7",5270:"babf4f83",5289:"7a6d5275",5295:"55c2bba2",5304:"bb7c5b01",5322:"746c214e",5334:"5dddcc55",5338:"29eb08ba",5594:"341820cd",5622:"b7d8d7b8",5631:"e2b9b99a",5633:"a518d9fe",5647:"5d077e51",5679:"e005a1d1",5721:"d9f96b25",5806:"3440443d",5834:"8a7b0abb",5887:"68e33d36",5888:"5fa93c63",5936:"b9ce6fac",6022:"68004ad0",6054:"9b9387b6",6090:"f09b8f13",6158:"077cf067",6170:"31c32ba9",6203:"9f3b730b",6225:"4e2d8d24",6289:"a054c626",6310:"2da72e95",6350:"3246d056",6368:"505a4db3",6371:"091b2713",6372:"368025e5",6407:"c92fd14a",6467:"fecfe081",6475:"6ba96ded",6552:"b2b49c3f",6559:"c4675766",6636:"d669b70d",6677:"144addec",6692:"1df14aa2",6697:"5901c946",6709:"5ec644bd",6739:"cbfa6ce5",6761:"5d49f1ec",6778:"d15a57d6",6791:"2a8b7bcc",6823:"ff319028",6897:"55b30925",6930:"ef13ba85",6944:"cadf7087",7035:"04f7671e",7071:"9a7aef67",7100:"078c6553",7103:"6b60b9e8",7125:"b49e987b",7167:"960b2669",7317:"56224cc2",7355:"04e349af",7444:"42b1316f",7458:"24779c3b",7517:"0120af7d",7566:"dff45037",7622:"77095e00",7629:"1c27322a",7715:"5d269ad1",7734:"99a612f4",7747:"6f5217dc",7773:"a5129a8e",7802:"e5622638",7850:"a753f976",7907:"df25cd3e",7953:"ccc96052",8003:"308e1ef3",8070:"264340d9",8139:"61f67727",8174:"34dbd8a5",8177:"b6e0383c",8183:"147ec233",8192:"db4decd8",8209:"c1611e12",8289:"ffb3c473",8348:"3268c830",8354:"fb86f6fe",8363:"7fb1b5be",8367:"b027c2f9",8407:"99cf73d6",8413:"f12343b6",8417:"1b4b7f2b",8585:"223cec3e",8619:"df2fa06f",8632:"d4174f8d",8645:"e8362a79",8651:"e168587e",8699:"91e6e14c",8762:"4a09a33e",8766:"249ad394",8840:"8b4ab2c8",8888:"c84e49fc",8889:"86b477eb",8900:"fd8d3c4a",8902:"0f380f56",8965:"79e095ac",8978:"dc9f01fa",9003:"2d33db3b",9045:"4ab2e7e1",9066:"e4d3738b",9076:"916fbe5f",9127:"714c4851",9152:"c66c2521",9189:"0dc2870e",9195:"f73b50f1",9228:"46600037",9257:"c66aef02",9262:"793c41ca",9351:"61c33e87",9379:"6a5733b2",9380:"f90d89c5",9385:"dcf32ec4",9428:"6546d84d",9432:"48aca857",9446:"15fade35",9458:"7babc575",9460:"ca2fd5da",9471:"4a10d39c",9499:"ce206b69",9516:"c1f50d60",9525:"6395de95",9570:"e3b8ddf6",9573:"d316bf10",9631:"10562627",9647:"4bc8eb58",9650:"7174236d",9676:"cfd0f282",9702:"b965bad8",9722:"664860a4",9724:"52a83b67",9737:"79dbbe2c",9790:"e789ce2c",9836:"8fa50ab8",9860:"74431a06",9870:"438c6e6b",9891:"6a85c793",9907:"8492cade",9914:"d91c7b9a",9944:"f78b15cc",9986:"d714f752",10030:"59d03524",10118:"ab9fc9b2",10181:"3af67d97",10198:"86d665d9",10238:"50e474ba",10285:"bb7ecfb9",10354:"47cf3433",10472:"bdde685c",10488:"7d9ce470",10492:"e72abd0f",10535:"0d2ae118",10545:"f8206ac1",10610:"87868eba",10637:"0495e0c8",10642:"91b10c43",10653:"14a3241d",10688:"01c09458",10727:"2cdd7370",10767:"5998e785",10789:"3ced43a2",10884:"53e13b06",10887:"c5d8d489",10907:"a8d1a1dc",10920:"193c16db",10924:"95f4527b",10956:"b3581086",10978:"7f66cc97",11052:"c175ef33",11058:"b579a417",11111:"92a9adda",11156:"9f4df04c",11275:"7652321b",11289:"f07258e3",11299:"70c0805d",11326:"6ff62e03",11355:"670963d6",11508:"80fc6cd5",11565:"c60cdfb0",11631:"cc98017f",11684:"35726479",11716:"42a92ee7",11725:"127bbd01",11745:"4bbb96df",11768:"20e072bc",11782:"ed1984f6",11795:"ad2f4f53",11804:"b5477c1c",11806:"42b6e782",11842:"0baed23a",11855:"bfd20606",11869:"ced68d00",11905:"3420ebde",11906:"68908acd",11977:"c7bbc133",12047:"dce108f4",12134:"ae61bf97",12144:"1c1bbfbc",12186:"6a19cda2",12316:"4f2ec008",12318:"6eee13e3",12378:"27f2d38e",12393:"c1d28ac0",12395:"d9ff1cb1",12431:"a60ff215",12452:"97321323",12477:"e0de1e38",12485:"926a358a",12513:"80c6f08a",12535:"0c941d5a",12542:"9713e3ea",12608:"5c3e8335",12613:"ed4c9e9b",12654:"2320fb02",12679:"1987a2a6",12686:"8a06023e",12763:"91b8b830",12869:"442fc6d5",12945:"fc3acd38",12995:"ab02afd2",13021:"48555bb8",13060:"aacf116d",13063:"f4ce2b61",13152:"c62fcc56",13203:"c8815658",13210:"c492ed74",13236:"b09128dd",13298:"a8dfd245",13321:"4eb4493a",13366:"3c71c883",13374:"cfd37507",13375:"8ee7aefa",13406:"13cd1c37",13419:"b7a37f75",13465:"dd6217fa",13511:"d5b3caaa",13514:"b12fdebd",13522:"288b7d48",13525:"b906d866",13534:"17c9040e",13535:"5f863db7",13575:"0d1292de",13580:"8d40e9a7",13626:"720ad675",13698:"4cea1995",13733:"38f0a082",13762:"bca2bb57",13803:"bad250a1",13849:"0d423bae",13918:"bed720cf",13943:"453b7813",13982:"17e1f232",13996:"06631037",14003:"b85e041a",14027:"f1e7d467",14042:"de2f466d",14043:"69af2a51",14125:"527729ad",14134:"adda3dca",14136:"cc61dbbb",14152:"578ea5b7",14163:"af95fa0b",14179:"4aa5ccd8",14257:"da0d1ce3",14259:"9642e3bc",14261:"3d684545",14264:"61ebcfca",14317:"dcc8d0e6",14340:"8dd3b9be",14363:"9fdbf1ab",14388:"ae4bc2d3",14399:"ffd8a59d",14410:"cfbbb6cf",14433:"2c05622e",14435:"1ee34b91",14496:"17b3929b",14536:"10fb693d",14599:"a88c7ee0",14627:"cdb12c57",14726:"e51ab934",14750:"e9c21c9f",14802:"de3cd2b2",14822:"a06e5d99",14835:"0c69e520",14868:"b144ac54",14871:"c80525bf",14917:"28bfdf38",14919:"011e3248",14943:"fd40645a",15038:"8fb987eb",15078:"3707a6b6",15079:"97fca775",15144:"71664a42",15165:"3c006089",15186:"9c7f1b63",15220:"109d2e90",15235:"71ebac3a",15272:"13610938",15292:"328425c6",15316:"9cf140bc",15403:"8aefcfa4",15407:"ea6e5a65",15427:"6dbd0648",15473:"14fe1707",15501:"c8870324",15552:"7f6375ba",15607:"487239af",15764:"bd93ba8d",15805:"a819ffcc",15857:"4a7c5609",15917:"28cf866b",15947:"648ebe12",15955:"514b69ce",16017:"9d0f4c08",16032:"47c54457",16100:"0611b6f9",16209:"fbdc06f9",16231:"4dce858a",16319:"4732e626",16377:"367c7435",16499:"3b79297d",16500:"b4e686b5",16622:"b9a182ac",16641:"63243294",16747:"0771fd0b",16885:"9c0ac3a2",16942:"92d06824",16950:"48871f0d",17009:"10072815",17033:"eb12c1ef",17115:"0a45bdc0",17119:"b280a982",17232:"e57d15e6",17294:"0542258d",17332:"8b8baae3",17368:"115e5928",17402:"bdf033c0",17411:"03677a17",17441:"96e8dc5a",17474:"d3cc75ea",17502:"279389ac",17508:"1fb03d3f",17530:"88f83b35",17581:"2b842d8c",17626:"36956c06",17681:"5dd2ea64",17709:"7802d0a5",17739:"82146eff",17805:"8a44ead4",17818:"d75d0b8d",17860:"cc12893d",17867:"cac87718",17944:"53bb5673",17987:"53f18aee",17988:"6cc28a3d",18006:"c111595f",18033:"10fe31fe",18103:"a388784d",18121:"617b2ffd",18146:"95d7ba5d",18350:"f98fdabe",18351:"002d2df4",18401:"e94b36b4",18438:"7e8561ff",18445:"4e7d45c5",18520:"9fcfbaad",18620:"14588da2",18645:"66f4e3ae",18738:"88fed3ac",18757:"af5d2223",18798:"059f696d",18940:"1ee0f351",18950:"69aec1f5",18998:"db0ba0ec",19042:"f2d5ba0f",19052:"99eea1e9",19070:"f854e03e",19108:"ecbc268a",19109:"9741eeee",19136:"497d63f1",19237:"f651ae7f",19252:"120b0fba",19267:"0b9c27a3",19271:"81fe6522",19369:"43355738",19387:"99f2a106",19396:"cdf3109c",19425:"1d1db863",19428:"05a9e187",19474:"09d53c64",19513:"36062fee",19521:"c3aa46ab",19542:"95ba9a85",19664:"46dfd0b9",19687:"300fafa6",19711:"75e966bf",19736:"0a635609",19774:"ce35f8cf",19798:"b9d535eb",19801:"51ca69aa",19865:"cfdb0b35",19891:"3fbe9ab9",19999:"12a3ab26",20038:"db96bb57",20103:"ad5960b8",20160:"270b34ef",20194:"f1baf75d",20229:"40f68aa0",20286:"b249e590",20325:"960a510b",20358:"43110a16",20361:"ad2d7e59",20405:"c035349a",20415:"83d5d036",20424:"e5504750",20434:"bd31090e",20491:"907553b6",20535:"9f958eb8",20541:"dcfadc81",20619:"23928919",20676:"3388d156",20713:"3d6d71ad",20812:"0f0199c5",20857:"bb3132aa",20892:"31d8f230",20924:"e4fef5c4",20931:"b8036f1b",20951:"a20fcb32",21070:"a8900866",21077:"a68cdbf0",21121:"4c137c15",21177:"093ad022",21191:"5de11232",21273:"908689e4",21275:"eb589f3d",21290:"0c7c0365",21303:"bdf31e12",21316:"fe15db87",21341:"475db505",21346:"f490b9f9",21373:"9fcc5ee7",21401:"06aacf16",21417:"38f28434",21448:"9908b8dd",21482:"9ecbf669",21524:"d7e79944",21560:"a0edd7dc",21574:"4deddbeb",21585:"7b244de2",21630:"15f37768",21635:"95acc70e",21662:"95e27da1",21729:"ed2a8c6b",21764:"a96fe837",21805:"b555879a",21816:"ced1acf1",21837:"c401bc3e",21874:"d29acb33",21909:"4300cff4",21921:"193750e7",22141:"3ae5c6dc",22313:"cffab16f",22369:"8efee04e",22385:"b551598c",22428:"4573e534",22447:"d7010a6e",22472:"ecd49f93",22483:"9d782227",22499:"2575e3c3",22501:"4f13697b",22504:"c055c741",22534:"85034a52",22595:"dc8a546e",22628:"c7870ff3",22640:"1a855b7e",22647:"1318d50e",22673:"9b329e63",22709:"d92e340b",22750:"bf71f62d",22816:"3d4baa1b",22844:"c586deb2",22911:"202546a1",22916:"8d456179",22932:"dcb09864",22973:"1b43a4e6",23002:"4fad494a",23041:"f35f208e",23081:"15bf2d5c",23083:"bc82584b",23119:"b3b53229",23141:"70ca6181",23172:"c3a54128",23332:"d979405b",23388:"1678b3a5",23438:"adce0003",23475:"475adf50",23547:"5809152d",23563:"2ff8adf5",23591:"0056b029",23600:"a5202301",23625:"4b0929bb",23634:"5b74042a",23637:"039d8f53",23641:"3627f9fd",23666:"b60b4f41",23676:"c467ba2b",23700:"49359600",23765:"cd26f4f3",23773:"520cf3dc",23880:"f23d8063",23938:"d312764a",23998:"79a7d02e",24022:"870880c2",24065:"66cb1805",24084:"0194a56d",24098:"a0602b5b",24126:"37fede99",24140:"eb4a5735",24172:"1e513f10",24234:"8cab740f",24265:"9a476a2b",24340:"10e55999",24366:"8a444fd8",24373:"ab56a496",24377:"1cd6ec42",24381:"8cc6de74",24437:"d4b0c4cb",24475:"24d8adfa",24476:"2f952c5e",24704:"cf0a496d",24728:"0b98b763",24729:"055e6d18",24741:"90d7367f",24776:"4c19f189",24815:"6a3bcf36",24826:"f46941c8",24853:"91dc934e",24866:"d50b77ce",24867:"a8a3b8e9",24868:"64d89cc1",24891:"acea9caf",24912:"c8b91976",24919:"4ba924a0",24932:"ba390371",24970:"00f2ab70",25013:"ad26ed51",25044:"c495349e",25067:"a053ee4d",25101:"e136e901",25130:"4fb7b9f4",25186:"b0b2572a",25273:"cf02c70c",25285:"45a1ec19",25335:"b58a27d3",25396:"89ddaa62",25397:"f44c23ce",25426:"5994dd2a",25452:"e356ced0",25531:"70bc702b",25532:"973de6d2",25539:"4073dbe6",25578:"42db5727",25582:"2844b50a",25601:"aacfb2eb",25778:"6e2353ca",25781:"72653a4c",25845:"3668f0da",25869:"7ff9c8b3",25871:"6d4f8d18",25874:"a999abad",25959:"03b0d503",25987:"b6951fae",25993:"5a60b486",26003:"0dbe838e",26009:"6f80e4a4",26060:"49615372",26064:"2c34cf8a",26081:"4fd365ee",26183:"f197b658",26216:"0d38f496",26260:"d8f05c88",26305:"deccd138",26333:"ff2d3221",26337:"a16833a6",26414:"34f7cb93",26548:"9e235a1b",26577:"23f41c03",26627:"369f52dc",26630:"e90418e0",26632:"0dd9e951",26722:"14ac1711",26724:"7b16081c",26744:"58600e3c",26797:"0e6e3c17",26833:"ce805620",26859:"aff1f02a",26882:"d62acd2d",26900:"81479d5b",27012:"c29dba83",27020:"a2996298",27088:"47e88723",27115:"294cd6b8",27123:"6eed6c70",27179:"55360a14",27212:"4e430747",27369:"56253630",27388:"b0340f4a",27398:"50cba2a0",27444:"ea243234",27473:"5eca5e0b",27663:"e88ba1c1",27737:"6ce228fd",27823:"8a88b285",27887:"a3b9de04",27921:"45a287dc",27955:"be1e4c9d",27995:"09203cc8",28020:"ae6c303b",28086:"964d7344",28127:"52851c3a",28147:"1f3d479d",28166:"24865c80",28169:"5ab36c27",28178:"f62bdc9d",28204:"d075bb24",28235:"5ae34328",28252:"c129dd81",28319:"5d3fafd5",28410:"0b21d6e0",28428:"b0be705a",28435:"fceffd0e",28498:"1948bf76",28499:"f005668d",28627:"ae271a52",28679:"1d8f6a45",28687:"aacd5569",28701:"a28f8b91",28782:"40f66cca",28793:"e76cb139",28803:"49549dd3",28834:"3ee8e8b4",28853:"aa92d9dc",28889:"c2c9914f",28920:"9629e812",28941:"8c7af014",28945:"65b1a092",28993:"f632a39c",29060:"32b1dc91",29123:"dbd291d1",29171:"71258614",29204:"a6a43695",29243:"1356f2ff",29337:"01639ff2",29408:"bd89f274",29414:"8660a85b",29421:"fbe24116",29452:"3e9a03a7",29457:"7d14d05f",29498:"7aab7361",29523:"7c6695ac",29526:"2f8989c1",29653:"8f3e3c80",29679:"04a3f313",29690:"942394eb",29698:"0a4d3c74",29708:"8f01ba9e",29733:"13ded0ec",29795:"3b9ed063",29820:"86a6b03d",29829:"d1f3ee13",29845:"a1cbc44a",29891:"850e5356",29922:"a7552bd2",29950:"c6942778",29969:"67f28cd0",30035:"175fda04",30066:"bb46b5af",30154:"ff90619a",30167:"47c6ce34",30262:"e0931477",30265:"a50c2e7c",30317:"35aae90c",30355:"ef8a4417",30378:"6d8d95c9",30396:"87304d95",30410:"4e970141",30564:"97976d72",30569:"e40e0024",30579:"d0ae98f0",30583:"0349d956",30628:"c26c6054",30654:"73dd606b",30790:"a0648778",30827:"49ffcf71",30831:"64198a51",30842:"b50c451d",30848:"6480bf83",30934:"79541782",31004:"1d4923d1",31016:"035c650a",31039:"8dc64df6",31047:"cc5471ac",31125:"0d364546",31141:"652afae1",31144:"28477358",31220:"28b772dc",31255:"f94efe8c",31257:"771d4335",31272:"c7607cd9",31393:"a1e486ff",31465:"fff27cf7",31541:"4b8b9953",31544:"f4a84c54",31567:"a41f71c0",31680:"72a131db",31705:"4c5db215",31720:"77528df6",31726:"d1ef5da1",31749:"45dfc10c",31791:"392e408a",31797:"0a23a6de",31861:"93b5dcbf",31862:"9fb160ee",31869:"691241cf",31957:"09fc98dc",31972:"a2543041",31996:"7a9af77d",32005:"3ab64a28",32012:"287d33ab",32039:"4917de23",32183:"e4c13218",32225:"07d3987f",32270:"640b03e4",32278:"b3715c88",32335:"2a952a69",32365:"fe0329c9",32391:"a83eb43b",32472:"a7687f19",32527:"9df1b2f1",32558:"e82fa20b",32691:"c97ef1a0",32728:"a5d1f40a",32824:"d88681ec",32825:"20536cef",32847:"b0005fda",32875:"0800d3ee",32949:"7a6c4ac1",32960:"b5798ca2",32993:"6c882733",33049:"8364c70d",33065:"7304db46",33192:"9a5863ec",33214:"bc8b27d8",33234:"a84fa661",33290:"219552f4",33303:"43ad6989",33350:"75f07d8c",33458:"a7557404",33517:"3db9b64d",33524:"2e7a87c2",33533:"73ed698a",33540:"148c3af3",33559:"8fc1b433",33567:"350cc4b3",33572:"09b03628",33577:"d40cdbfd",33612:"c687cf88",33621:"bda44dbf",33638:"5fca92de",33643:"569e4e05",33659:"21d9ac33",33724:"88ca3752",33804:"d3822e25",33806:"7a355084",33816:"d55e6964",33825:"5a0253e7",33854:"94a59e40",33881:"5b41d6d8",33889:"b061c751",33999:"668ec8b1",34127:"fde6c8af",34156:"bbf91755",34179:"1bd8bf5b",34182:"21781a90",34196:"5c27b80b",34255:"3851abf4",34331:"9ed21c85",34335:"449a955c",34388:"63680cd5",34520:"7924cd1f",34528:"a8871870",34543:"0b1c0a0d",34549:"c9123c09",34597:"2d91134c",34621:"ae85fbee",34638:"16fa9b5f",34662:"091b3d87",34691:"a7c8fe63",34706:"89e46f0f",34750:"224f43cb",34803:"b8ca48f9",34808:"909e26ac",34810:"99716174",34837:"61c61de3",34847:"c1ad7786",34877:"5060c2b1",34904:"25d15372",34918:"cbd6f71e",34970:"cfbb2faa",35044:"cf8fed2a",35067:"d17b3136",35088:"cea1a9b9",35139:"1eb36ee6",35144:"bffb4b7d",35179:"10e7c1bf",35248:"74d1ce2f",35288:"991ef11e",35325:"e01489cc",35329:"9e684943",35379:"8ab1496f",35402:"375ee7c7",35532:"1beb2628",35618:"e4f3db36",35730:"f9137192",35733:"28dd7656",35742:"de61f764",35766:"9a1fa293",35767:"dfa52db3",35784:"fc8fde7f",35837:"1e5ce2e7",35881:"c8a2bef3",35922:"4cfe6391",35932:"506269e4",35960:"059789bb",35983:"a3ffd343",36009:"cbae7f1b",36055:"4770b5a2",36067:"fbcdaf70",36113:"2d48d701",36144:"725b0d44",36192:"26c2e85f",36264:"3ee1d673",36302:"72b0bcd9",36379:"b702241b",36387:"251632c5",36549:"e2747c6f",36569:"64ebfa77",36594:"bd886889",36619:"617e0e66",36640:"52eef1a4",36672:"1702d861",36689:"8a2dde69",36747:"e29bc85b",36790:"9de7a9c1",36851:"203b548f",36885:"1ac872db",37109:"0784f49d",37115:"b776b259",37147:"088d2c22",37191:"2d0ea897",37204:"1605f8c9",37206:"af6fb7c2",37209:"9b43eef4",37257:"dceda108",37329:"9a57546b",37366:"160a0072",37403:"c5e2093a",37486:"e7d57a3f",37489:"9a67fcbe",37577:"a1199bf2",37578:"0177c4c6",37617:"8e607010",37643:"4865d39b",37673:"7883a91c",37740:"fab7fc26",37799:"403baa89",37809:"9b6986e9",37827:"5fde1cd7",37839:"05558af7",37841:"670e19e8",37842:"1d81fddc",37872:"e9177a7e",37954:"076d3157",38001:"cb066494",38003:"70d204fd",38056:"20662e51",38107:"43c0bc0c",38158:"51aebc6d",38238:"5390d965",38348:"adc210d2",38370:"fdc0ca5e",38385:"97d9f92d",38416:"20851e98",38439:"461b0f80",38449:"39bb4f65",38451:"6bf97463",38468:"716e8fd3",38600:"5d6ce15c",38605:"f3f72edd",38607:"fbd8a71b",38700:"f325af51",38767:"cd1ba66e",38786:"31e8cea7",38816:"7447358c",38835:"40a51f33",38839:"dae4efea",38888:"6753bae4",38974:"4d5d8235",38999:"35806b80",39058:"effdc4b7",39088:"f567553b",39110:"50177589",39138:"10007fdc",39142:"6a331906",39153:"e21126fe",39192:"ef51e43e",39197:"ea14ffa4",39202:"40e4ffae",39208:"a97db242",39230:"5527100c",39240:"5079f647",39260:"ba5c24ff",39265:"5d0ed436",39283:"79d7db8a",39405:"6242229c",39407:"a7203d6b",39417:"d02a7f26",39423:"17d4a9fd",39444:"a22313d8",39487:"5b0731f4",39494:"f30b5ac5",39496:"ebba264e",39505:"5bda256e",39518:"c3c9d6ae",39520:"27de82f7",39555:"cccbb5c8",39569:"3bef5f39",39587:"af0d65e6",39608:"1a5e64fb",39712:"0a24b98c",39715:"bbc66cf5",39758:"a3fc9df7",39773:"b393be97",39777:"3432c599",39781:"47d6c4a6",39840:"53dbfad3",39887:"e46ee796",39901:"eb9119ba",39908:"6d740ec1",39921:"0e79eaf9",39973:"e8d22580",40065:"b7fdc9d7",40124:"40c231c1",40178:"b61f965a",40205:"c94f090b",40245:"b96db1fd",40369:"92864a0d",40463:"427c10a1",40464:"acd8440a",40555:"f52300e8",40606:"12108f89",40616:"a9f41f0f",40651:"2d49ff29",40690:"a60e3624",40697:"b4dd2319",40755:"3e432e6b",40758:"4d3e9419",40797:"3db6824f",40827:"1a80c281",40847:"cd35205d",40907:"d1b3edb9",40919:"6f0cfe05",40927:"73302b80",40959:"dfce7692",40999:"a9ca37f2",41030:"1804232c",41125:"2c45e5dd",41135:"e8aa7f97",41159:"3ac9a111",41260:"8ca7fc77",41361:"784c9a03",41455:"eddcbb4b",41461:"3443ba16",41491:"56b3d829",41504:"6389ddd7",41518:"d9e6c91e",41594:"af01423f",41640:"9e866231",41651:"616b00c8",41677:"8c940416",41739:"e8f5e70c",41750:"ee28ae45",41852:"3dd9673c",41867:"0e7edf3f",41872:"b0386e86",41892:"9f8c189d",41907:"f8e6d852",41944:"9bd9e858",41954:"e362215b",42068:"5e07d0e9",42187:"d9057212",42196:"71100c70",42268:"6c4ef9de",42298:"a50f4480",42299:"09b7f6e8",42350:"1142cfde",42368:"f8b7383f",42465:"3ff7fed9",42487:"56c461db",42518:"198e0c40",42566:"b345a309",42576:"9a6fd0e8",42596:"7100815e",42690:"f8d6e169",42702:"5f8c0f9d",42723:"4fe95284",42794:"7bc80366",42799:"439a565c",42801:"98f49e04",42879:"7c6ac9f2",42881:"45103050",42900:"a68c15fc",42905:"6bb55442",42911:"5bb7f601",42920:"c438d5bb",42937:"58f6b800",42942:"5cf3f15a",42995:"695ebee8",43029:"0d532445",43035:"dfc57d02",43040:"1e4a40d7",43042:"f5fd14f0",43078:"a02f005d",43088:"49e4451b",43113:"0310d8f0",43195:"92666359",43286:"f606a9ec",43352:"24cd4507",43421:"0a5a165b",43432:"fd8b8122",43445:"93a5e7b9",43461:"b6d04d9b",43512:"df29c6ae",43642:"d6ff100f",43677:"d746dcb5",43739:"fc70054f",43868:"a3261008",43922:"32416b57",43980:"4a4883a1",44008:"643184c5",44022:"6fcc094e",44040:"2dd42aaf",44045:"c0d86ede",44118:"8cf0d0b2",44123:"11ceffaf",44125:"e33c2ae7",44129:"86e86df2",44143:"044af036",44290:"0d453a69",44326:"2ee9dd8c",44339:"b32856ef",44380:"cf224181",44405:"51b730f8",44419:"a05b3029",44489:"66da1d5e",44492:"ec2797ef",44551:"b4882b70",44567:"3c62c94b",44640:"d04281b8",44662:"d947bd90",44682:"087d97b5",44719:"9f19c736",44840:"a727ef1c",44876:"e3d3c1eb",44891:"06e055c0",44933:"1455309f",44939:"e64332af",44948:"07d7525c",44960:"843bad26",44964:"b983a3df",44994:"41cd7968",44997:"3ffd623b",45113:"523985ee",45117:"8c2c2ced",45146:"e85c17b6",45210:"52123a36",45231:"a109a3fa",45238:"f9e62925",45290:"d75a994a",45323:"faea1743",45339:"3bf0bfb0",45460:"550b46d2",45500:"065ed853",45541:"6fd99ec3",45561:"f24f5701",45640:"6c7f6a66",45670:"50c1ba0a",45682:"888518b8",45919:"55919297",45983:"13ee651a",45988:"17b1ea4d",46001:"f432c2ec",46008:"f69f5c00",46025:"7650608b",46039:"f72f1171",46063:"3541e9ea",46074:"6f20e0a9",46156:"7d11bc0b",46197:"df2b2640",46244:"cad26181",46296:"f08eab96",46375:"df5f4d23",46425:"cdb28597",46451:"a6a11df4",46472:"fadf22a1",46513:"56c87a15",46515:"254b9405",46547:"8eec7030",46578:"59c56ca8",46598:"c169c2b6",46652:"63a78692",46662:"e6c9e2f6",46754:"5fcdc1a8",46802:"d659f98a",46840:"2eaf8b00",46850:"b6f5cc68",46888:"4961c159",46891:"3a3be22d",46905:"e3c70d3d",46911:"2300f302",46917:"762b651e",46921:"be8d197f",46937:"5c1b7fd5",46979:"008db483",47041:"255878c7",47060:"9049c3c7",47087:"13a87ecf",47106:"bccff21d",47110:"56dd8cf9",47127:"5f600751",47206:"4cdf2089",47236:"3d4f63b4",47247:"4d3adf16",47248:"816064a8",47297:"eeb342f5",47433:"ac211919",47517:"4328267e",47537:"f3a77ab2",47555:"b251b72a",47622:"09db78d4",47668:"680ae267",47693:"c10aa10f",47699:"492e4477",47730:"4bc36570",47917:"2dde4c6a",48003:"a29cbb41",48023:"0f86cac1",48050:"1fdb78aa",48063:"3a568226",48071:"d796c291",48091:"df7b8959",48130:"e6c193ae",48132:"953d34cb",48158:"d48e413c",48162:"b4c8061b",48167:"4dcfa6c4",48188:"04a8ab5c",48214:"46956ca7",48285:"d6809f4f",48295:"0b50cf9f",48304:"5f48cd0c",48310:"64b1d5ea",48355:"8e22de30",48360:"cfbd7304",48361:"c850e674",48532:"a494db1c",48544:"86f74040",48592:"349dffae",48613:"3f89da26",48661:"3216d8bf",48673:"9d684a78",48733:"c32bd61c",48768:"079b97bc",48793:"5daa512b",48803:"88f5f6df",48842:"f3bf8406",48883:"a235bfe0",49013:"07816850",49046:"9e2e99da",49055:"eb422c4d",49071:"ba636502",49112:"d7a24cb5",49174:"03c624f6",49199:"efe75a67",49226:"b6e04903",49280:"4dfb5a77",49305:"acecb563",49350:"b3dbf751",49388:"9bd7db7c",49461:"5ae94b5a",49521:"60482983",49569:"b4567b28",49579:"e16a6c78",49583:"393a5e78",49587:"4cf9d174",49655:"68089f3d",49676:"2bc5bc8b",49783:"5250a56f",49786:"7b91213f",49880:"54c0806d",49991:"403e6dc1",50012:"68d419a1",50095:"6ed54966",50176:"417fb999",50178:"18db7c21",50183:"1be5d08f",50259:"f7eb5e14",50261:"7008ff7c",50293:"42163459",50361:"bb9593e9",50414:"9d3834fc",50428:"f90b3bfe",50446:"5d436275",50472:"f3bb4c29",50486:"0f8a2868",50507:"8f74cee6",50570:"c66081cd",50584:"8ff63e94",50642:"da2e25f5",50700:"11590bcc",50703:"bd356fa0",50747:"b4c4b315",50769:"bbaddabb",50800:"1ada2615",50819:"551c9c7c",50827:"394e36ad",50839:"7fc947a3",50934:"7c4a4744",51047:"e05467fa",51049:"e5ceb9fb",51060:"7c84a54d",51090:"d3055e1c",51102:"25d73939",51116:"5d147865",51170:"b528a493",51175:"3e23e8e6",51184:"3fbba03e",51229:"24c83fdf",51237:"83d2b73c",51378:"27ce1cb5",51412:"e5d9f101",51420:"51bfdb8b",51438:"153db1c7",51494:"da27cda2",51548:"c84495e4",51578:"260cb010",51584:"24cf19af",51589:"990a5fd7",51636:"b532bd62",51649:"c406b631",51665:"4e1dca5f",51694:"d22c56f1",51711:"6ed1019a",51755:"e7683163",51763:"614f3b14",51769:"4709b0b0",51814:"e54b3ca6",51828:"cce51e7a",51837:"7e552679",51878:"72c458a7",51890:"33cbdd96",51937:"7b8f3921",52036:"4ce3fd22",52042:"f430fae8",52093:"0bc9c087",52102:"8459ac52",52132:"18679067",52135:"24738c10",52176:"9d3aca59",52207:"3fd074b7",52218:"715862a4",52235:"b3475660",52250:"d133f712",52266:"7f7e57bb",52267:"999b9003",52282:"63565f78",52286:"4a595239",52342:"e54f9f4c",52408:"d3db7d01",52450:"99135bd3",52462:"3529eb94",52466:"0060b180",52478:"f31e943b",52488:"2e672211",52563:"63e5002f",52569:"0978d751",52572:"66b2d328",52612:"fe83ac5d",52634:"f1140671",52680:"c4c41065",52711:"07c974a8",52731:"c514a24b",52770:"479aefff",52785:"db98dd4c",52826:"83f0710d",52840:"3fb65c88",52882:"f217557d",52895:"6f6f0499",52911:"2bf6f0df",52912:"9734e003",52913:"3bc2819d",53074:"21f6a3c7",53132:"26e4c97f",53170:"46c4c760",53178:"12177593",53201:"0d2201ce",53237:"9d662527",53256:"de10895e",53266:"ec0e5b63",53288:"58febaaa",53314:"aeb9ccb6",53449:"8c293a1d",53458:"d06e4d8a",53492:"c61db897",53540:"b615600c",53619:"07903309",53629:"0e9da356",53633:"91cfa4ca",53646:"252e93c1",53670:"5d9992cf",53742:"e3fb6085",53771:"503e9c26",53786:"295cce71",53832:"ea177f3b",53860:"045fe6c1",53861:"89eb5be8",53871:"06715a06",53881:"baaec368",53901:"176898ea",53925:"c90ab7e0",53982:"ac914839",53990:"ada2a249",54097:"7fe429a5",54106:"0ae8620d",54200:"d2bacd5b",54240:"9d3e04a4",54246:"60f12cee",54270:"091906f6",54272:"15bec62e",54274:"de7a41fb",54277:"203dd83d",54399:"52bbe215",54415:"f56879e1",54462:"7f730c3e",54487:"c5676dbb",54500:"8b8b005b",54540:"a02f600f",54568:"b4a9dfa4",54730:"18e0d97a",54749:"506a8f87",54759:"03807f37",54772:"1026b8f9",54851:"d6dbe9b4",54879:"50ccf7ac",54881:"d0c3c6aa",54927:"40575db9",54950:"c2be47fc",54951:"d7f390d4",54992:"712f1c60",55004:"a9d23daf",55100:"538b7d12",55144:"9e0ba362",55167:"b4d49358",55206:"0d70c765",55276:"e3d30ccb",55302:"1f220875",55342:"baf46857",55401:"b92ec369",55483:"9bee99fb",55526:"93ae64fa",55534:"25d024d7",55559:"b83a883d",55566:"82130cb7",55579:"4e0724fd",55616:"6658ee4a",55664:"42d281a8",55668:"ee74c105",55754:"89d9928b",55780:"a19a9af8",55836:"96bafd1b",55929:"77f3f6c1",55942:"d374a5b6",55955:"da177b3e",56028:"af871c03",56037:"ab8234ba",56062:"60867da1",56087:"13c91d14",56097:"f053aab6",56122:"74d598a4",56123:"c789ce2d",56133:"762b0fec",56190:"ef64dc1f",56256:"e36aeffd",56259:"68ac1963",56297:"26633708",56384:"fb72bb40",56408:"5bae03da",56493:"7ee5fd86",56510:"0a75fbb3",56560:"3239f135",56607:"48d20332",56648:"0e90e357",56662:"5e826942",56688:"2cca9c43",56723:"1293a3d4",56725:"7b698c07",56767:"e8136b8f",56779:"d6ff4e16",56826:"50015c12",56916:"550c02b1",56948:"46365228",56974:"4839cefe",57054:"6fb01f30",57119:"987dbf1a",57141:"7d7eec25",57155:"e94ea6ca",57159:"052fafd0",57165:"d5789e63",57178:"8bfa9b62",57182:"69123d57",57222:"c8de5978",57245:"8d409ef9",57251:"58acefa5",57283:"21045dc1",57302:"aa7169af",57326:"8b59f195",57359:"8ee1fa90",57361:"4a3a3cb3",57426:"57e1c591",57529:"7bab9ba3",57547:"3a1cad18",57581:"fb0331ac",57594:"1e47fc98",57614:"8825c03e",57647:"56c9542f",57730:"2bca685b",57749:"4bc6c338",57760:"1092dcab",57762:"c39c754a",57885:"5d86fd4d",58e3:"734d343b",58002:"748d2de6",58079:"573a9aa6",58111:"73a02d4a",58144:"36de5476",58255:"5ee8f8b1",58259:"cd10818c",58301:"4a5e22ca",58351:"cdf49691",58359:"dcd461e7",58393:"399932cd",58428:"3ffcb7ac",58479:"44dcc97b",58484:"f70a46c3",58492:"d2645f8d",58581:"83d42deb",58594:"cf6bd0a0",58666:"f2504d8d",58667:"97e291ec",58704:"25df67a5",58707:"15c67f3b",58721:"f353fceb",58780:"d0db0c75",58857:"865eb012",58874:"1a0a7c4a",58880:"1513efa4",58913:"e13e4900",59004:"328f4441",59005:"cfef6f48",59009:"dc31e278",59020:"8f1ae138",59053:"6eeb65e2",59070:"00082207",59104:"12590816",59114:"7e53ee45",59123:"564f8b9a",59182:"15f5ff3a",59262:"aaf827b1",59326:"73c25d16",59349:"c28d69e6",59475:"006f4c07",59493:"631868f6",59521:"c957bd71",59614:"b7e2e03b",59680:"3c671a5e",59702:"69bdff54",59732:"2a459114",59740:"04c67354",59779:"2a5eec41",59781:"f87d58a7",59866:"aa994063",59873:"1880b633",59874:"a8378fd7",59923:"b38aed5f",59940:"f75ceebc",59981:"76c5bdaf",60020:"0f554f37",60119:"5b9bc0b4",60167:"b7af2062",60185:"eb38933e",60187:"7636ec06",60193:"2bef0842",60198:"a93ff4e2",60203:"8d7339c1",60257:"5032408d",60267:"d687473f",60294:"5b4136af",60315:"55f56501",60445:"36846bdf",60510:"ffb2f2a0",60565:"d1460e67",60613:"cb3cc081",60625:"ad1309c8",60676:"81736ab9",60696:"a608baca",60725:"dbd85841",60762:"a573b13f",60765:"2dc71301",60819:"5e525d6e",60830:"00f6a771",60837:"fc61e2ff",60861:"b786146f",60884:"14ad0b43",60901:"0a407239",60908:"4b488b61",60953:"0a991989",60965:"60e4101b",61027:"449d7005",61114:"6ed53af4",61228:"71606809",61235:"b3fca070",61265:"f983c95e",61300:"834cd9b6",61345:"a53b2883",61378:"f5f5ceb0",61416:"179f2544",61481:"27590116",61559:"e81e8852",61584:"8bd4f52e",61627:"269c1cb3",61652:"48519009",61702:"3ab98eb7",61721:"1bede07a",61734:"76fade34",61740:"ae48d0eb",61786:"11544c15",61844:"b500c1f5",61886:"838ac25b",61939:"63ea2061",61950:"d36ac652",61959:"81d6b244",61991:"5a92f8a3",62015:"8ec5ca20",62037:"306ee7ed",62061:"1efccb35",62111:"cd0efc31",62120:"99d514b9",62138:"567ed5e1",62147:"8390c8e4",62149:"f514162d",62162:"5acdb074",62182:"503834a5",62188:"3e551357",62254:"245e993a",62264:"e4528e15",62400:"e7e7907a",62431:"b246e6b9",62456:"43e0651c",62469:"3c915cc0",62501:"de4df872",62549:"301ee9e3",62568:"68871186",62635:"22cbfad7",62639:"210bc494",62641:"75bfbfe9",62672:"6358ea51",62691:"753414c4",62703:"564b723c",62712:"d5ff0699",62714:"fe7a976f",62827:"296a4530",62845:"90aeb106",62867:"672ac76f",62875:"c31ca64d",62927:"d4d0ae7b",62953:"0792ec6e",62957:"6f1cdfbd",62975:"995912fe",63005:"6d110437",63064:"c0bf5dca",63075:"3ee1025d",63124:"34aa01f3",63151:"b9cb4815",63181:"ea8d8fd9",63228:"10bd0d98",63262:"bf4c2c34",63291:"9ffac09b",63298:"acbff002",63317:"811a54d4",63330:"bc478490",63332:"500cc836",63367:"7a6eb5b0",63382:"e45271df",63387:"489643ee",63420:"489eff90",63430:"26ae4f11",63455:"62b0c186",63515:"a47e4d5b",63521:"66036a01",63553:"ea92fe5c",63576:"0cc97e30",63627:"6f0e73b2",63646:"24a98389",63682:"e81f5366",63700:"7e8b055f",63739:"a9c24938",63760:"d6e4a1fe",63779:"8304ce91",63795:"90a8fc97",63836:"c50ffd2f",63907:"7efe218f",63951:"b86c7710",63966:"d1164b7f",63975:"7ff61510",64045:"8cd8acd5",64099:"a0ff270b",64184:"80d3a705",64209:"a2d5ce2d",64264:"304d81a8",64275:"336cbfa6",64351:"38e048a0",64391:"a3d0ce9f",64442:"e6149577",64447:"ab60d1bd",64465:"3c9d3adc",64473:"cf1bf285",64502:"3c32636b",64527:"8724400a",64535:"2a06b13a",64577:"d5c345aa",64597:"16a203d3",64623:"c358ac06",64659:"61c9f121",64670:"9186d3ad",64737:"9eaa058a",64749:"867c6f08",64838:"b35964d0",64899:"bf652241",65013:"9e1d762b",65017:"566badfd",65091:"33aa1367",65094:"9c1741e7",65133:"6b78163f",65193:"c9d51b91",65221:"f8300e9e",65223:"fc7b2fde",65233:"4caa50f4",65246:"b0e81973",65350:"360c493c",65356:"044c021b",65359:"367c24bc",65473:"5e0a91a2",65497:"8399cb89",65569:"b0072d01",65611:"5f89a380",65625:"08954e37",65629:"16ecda58",65647:"24aaa41f",65648:"e4fb5853",65658:"3b939be5",65727:"ded58870",65745:"316ea106",65756:"15cd943a",65759:"819fc53e",65835:"a3453b0a",65897:"a381fb32",65918:"146740b5",65926:"e5ecb06c",65957:"68a2cc05",66061:"45757a8b",66062:"eff2a5a4",66097:"25d8d490",66135:"e4b972b4",66140:"8dff9019",66162:"2b8e16e9",66169:"02c3df8a",66210:"d091b4c8",66237:"c01df0e8",66327:"5e088192",66338:"66797f3d",66372:"b09b0736",66381:"ad989954",66394:"8bded28d",66415:"cb19b5da",66461:"d833c819",66499:"38de97de",66504:"ca582e0b",66510:"24f0668b",66518:"c9394214",66524:"8bc94417",66538:"78f9375b",66559:"e664ab4b",66575:"a2383db1",66602:"5af37c6b",66715:"b7e0c845",66753:"69af30ac",66759:"dfe5642b",66822:"a5b3c79d",66832:"6af1a81d",66867:"9bff7442",66903:"1a459fba",66912:"54eafe75",66947:"c4ee53cb",66995:"784da00a",67044:"f4de3f48",67061:"d9896998",67098:"75ab85df",67100:"9ce14990",67104:"02c01d9f",67114:"8c651089",67149:"eda30c95",67189:"7efc5baf",67229:"600b8e16",67252:"9e177ed7",67376:"e257bb32",67438:"594c8d9d",67472:"522d8645",67489:"982012ab",67507:"f3e3cc96",67545:"326fab84",67581:"3158be0d",67587:"79c7e4c3",67649:"3e6502fb",67668:"b61eb3fe",67683:"d02d9bcf",67704:"90a45e0a",67720:"a584e6c3",67729:"20a9cf6e",67755:"1e073c84",67775:"b9dde3dc",67914:"332bff15",67954:"48148f16",67989:"b94c1f76",68038:"353d6f0d",68043:"e18e6796",68045:"7e4deb9f",68094:"1571ddda",68210:"58aca33b",68246:"f542fe1c",68249:"b11b303c",68253:"c30a59ca",68304:"6409542f",68315:"91b0f913",68334:"e92472f4",68434:"c764b111",68467:"a09054a8",68470:"20998ed9",68515:"48625b37",68551:"847ce269",68569:"8cddf474",68665:"36bf7051",68685:"4b2f7100",68710:"62339bd0",68765:"a74cb64a",68770:"cab2adc5",68839:"6cd72ebd",68861:"7c45d32f",68865:"a511cfb9",68910:"93d8f036",68930:"67d62767",68955:"d59c084b",68991:"fee3dba7",69017:"51df1e44",69030:"105e1b32",69038:"aade7e7f",69129:"af425d1b",69169:"310f0e66",69199:"aea55b19",69347:"146443c3",69365:"e3667910",69384:"efa43be3",69457:"0159f9de",69501:"99f0cd42",69517:"0c43557c",69570:"915a5618",69588:"919af855",69633:"322b0d34",69638:"05f50075",69671:"c73392f3",69770:"c4d5f69c",69787:"13159f81",69844:"3b524105",69875:"32cda754",69982:"3d6dd370",70008:"58761afb",70022:"066cbf14",70058:"943c427c",70100:"572c029c",70117:"b3c36679",70126:"d4115426",70127:"b084e3ed",70133:"9100024b",70174:"54e46a31",70179:"6bd088b0",70209:"f942e04a",70210:"baea7766",70234:"a553ab8f",70253:"f5ded396",70268:"4452b64a",70399:"e6d32efa",70418:"4c6611da",70452:"e2a2f968",70502:"c692a6f9",70551:"5ef3d7c7",70560:"215f7919",70606:"38763243",70612:"b8278f3e",70645:"4df69f83",70649:"416d6f2a",70669:"d4aecb8b",70687:"2dc36e49",70689:"2651b58f",70696:"c124e296",70712:"4c96e1d5",70728:"bf4215fc",70749:"42771251",70755:"3a5a31a3",70784:"0e4575ad",70791:"ad524d20",70794:"0f408514",70814:"2d650128",70825:"6ae11483",70826:"27591451",70828:"8b297c90",70853:"88bc6dfe",70870:"84bc6d3e",70947:"dc575b6a",70953:"0932b99a",70963:"6b5459a5",71021:"48d0f323",71026:"65a1b93e",71051:"bd187ac1",71111:"fc43fabc",71117:"209f2f28",71162:"54a7c705",71227:"c59bf196",71235:"ffab41df",71374:"ce3ef14b",71407:"7a2306d2",71473:"664a5e47",71531:"e7ecea81",71565:"e5390c69",71585:"72b12311",71590:"c9f8c1ee",71612:"5e412c85",71656:"e6be372d",71715:"5b33b525",71784:"fa873b97",71792:"a6dc84f6",71858:"4bc2929e",71863:"92de78c1",71877:"2ec93eca",71910:"16d68f54",71964:"70da7109",72011:"7070f410",72043:"dc1ef129",72053:"6c6b59b0",72122:"23fdf7ea",72135:"5d936594",72246:"0f8806ae",72322:"8245e8b1",72353:"8d7cc6bd",72358:"7f58ed97",72446:"4a887c84",72527:"bc4dd3e0",72573:"dda0531c",72599:"9a7c5694",72634:"2c57b1ce",72668:"a2ebdf55",72675:"062aa684",72707:"7fcd7169",72759:"16cfab86",72815:"370f154f",72835:"07d5ab1d",72880:"82729a0d",72907:"8897656e",72914:"a6b31fb7",72925:"04c27620",73019:"5eb6a457",73084:"48ab7c0f",73193:"fc9f3e78",73264:"6ccefbd7",73276:"4d9bb901",73290:"d109a779",73316:"d595c06c",73331:"3e2d12a8",73376:"df8d786f",73397:"5d1ec000",73472:"2c6afda4",73493:"6c824c9e",73539:"a9e1fae9",73540:"d2683542",73569:"3aebe524",73607:"5d5dfef0",73609:"c5233a93",73624:"7161ba9d",73684:"8c31bfad",73693:"7d0c657f",73741:"c203b285",73756:"e59be998",73800:"bd55d6a9",73841:"d5ca1fa3",73846:"669a7fc7",73888:"46723720",73891:"335d1a8a",73905:"74bdfa12",73940:"e1201e1b",74019:"da089245",74027:"f505499b",74039:"a154b9e1",74046:"80b43a0e",74069:"bf9b50b1",74121:"976ee526",74134:"78e4ce3b",74282:"530f2a45",74312:"1776f3bf",74388:"455542b1",74403:"f4e7381a",74418:"3ab1a45d",74490:"800980fe",74524:"411bcbe4",74588:"4657c99b",74657:"071be4bc",74684:"08c31347",74792:"7bee6d52",74880:"8302c738",74902:"404c15e2",74945:"ae83d79c",74961:"1ab74c24",74994:"50e20aa9",75036:"6923b486",75043:"9bf3467b",75051:"483179e4",75062:"c02cd0c9",75078:"a71daff9",75105:"a4f9c66a",75106:"b618c014",75173:"0650181c",75267:"1905bdc5",75309:"d03c9c6d",75359:"1199c533",75378:"7152a165",75405:"98e83edf",75450:"0e82a67d",75459:"0049814e",75666:"0d1db8f4",75695:"09919d70",75696:"49a8d4e6",75718:"3efe0489",75735:"0b7281c8",75759:"29828f86",75775:"034e9612",75805:"cdf0f609",75866:"b5edd83e",75911:"e2c5cb8b",75919:"5d46debe",76041:"73d8152b",76123:"ee2b987d",76163:"eec9e7aa",76166:"d34b4fe7",76215:"f8abf276",76235:"02562da7",76257:"3ae01493",76262:"5ea97bda",76264:"e627ec8b",76274:"ab0d6c32",76285:"0742bfe0",76289:"208c9bec",76368:"500ae3ed",76530:"595f3583",76641:"2e5945d0",76683:"45b5ebf0",76719:"3fa3d99b",76748:"3d43af04",76850:"b0aa9be8",76854:"54e40af3",76871:"3cc12515",76873:"6ade5fbb",77077:"9dd7d520",77088:"19b3c698",77096:"d15e01a9",77123:"f06a5da1",77145:"470371c5",77174:"7f4d362f",77183:"3e975e2c",77200:"2f3da969",77222:"32602dc6",77261:"34bc5584",77298:"0e6e1364",77369:"789a51cd",77391:"a5d2357e",77596:"f28bf1fc",77679:"3ef8cf50",77698:"897d517b",77749:"57524945",77764:"96ce0e27",77787:"ebaf27f5",77794:"a1d36ea7",77920:"32922c56",78001:"494fb1aa",78037:"380f20f2",78055:"64043d5a",78087:"792a9bde",78159:"4f38a4f8",78199:"7352f166",78312:"4227ef96",78354:"e1a80164",78421:"90fce091",78497:"f3762333",78512:"53548a02",78522:"3a8bb73f",78544:"6a741e05",78583:"16c7d56d",78632:"2e8da915",78704:"8074d8fc",78758:"bd259526",78764:"21ea3c33",78787:"79135f9e",78820:"8b478ac3",78858:"34bc29ba",78876:"59d1e0a4",78880:"57c23eae",78912:"b1c543a5",78919:"dfaaf169",78926:"01258cb1",78985:"b28dc1c0",78988:"76e47634",79039:"56222027",79048:"a78c49a8",79150:"7f9b8fbc",79157:"5c77fbba",79180:"001af72a",79302:"4003d6b5",79416:"d8803eb4",79474:"ce9bb68e",79485:"abc97de2",79506:"c5a051c0",79520:"7ee03445",79521:"34c92224",79656:"aaf407c1",79739:"28dafb21",79841:"bb848e98",79866:"72d729c2",79987:"ec16d719",80018:"8fe0883c",80046:"6b819d70",80091:"cf6c8fc7",80102:"9c77890f",80198:"ae37fddf",80205:"8b305082",80259:"2a9fd9bf",80260:"cb06e1c4",80299:"67a193ac",80310:"825dba4c",80362:"777aaaa9",80375:"c431c14a",80408:"65e68152",80424:"2b9e2beb",80442:"138beb03",80457:"a89f5ad8",80458:"05820e47",80491:"31389da7",80531:"16becf9e",80557:"c57e7621",80598:"f70e808c",80632:"3aff62bf",80649:"47ad624c",80677:"4c372437",80744:"595e9d0b",80750:"73b5b786",80772:"832cafa9",80781:"304645e6",80794:"1edbd938",80841:"aefb64da",80863:"9f9ec4bc",80947:"39b525ca",80957:"97a18955",81012:"7a14d07b",81019:"0757a63a",81050:"4ca32e8c",81085:"e860a612",81125:"4f6a5985",81175:"cd0071f2",81188:"9d386ddb",81212:"6b747f92",81285:"b35bde59",81300:"8a132e02",81319:"5eca8594",81346:"96f50bd6",81390:"35ed9e45",81410:"1b63b983",81482:"bf8e657a",81530:"c7de49da",81544:"9f053080",81583:"5d60f872",81639:"2f3e574a",81666:"310e4ba3",81692:"cd67aa57",81737:"bc202717",81761:"c2e8f014",81770:"f9f0bc0a",81791:"514758f4",81795:"fe21b98a",81802:"33f4867c",81891:"85e8a888",81902:"972577b8",81903:"6ea756ad",81943:"bda6f1f4",81982:"45b0a42d",81990:"7dbdd021",82012:"b83ac31c",82019:"09be3a79",82237:"96c3210a",82242:"a8849529",82261:"65a3a905",82297:"4ce54554",82354:"e6079d9a",82362:"4bfee9a1",82431:"c58b9a06",82456:"a76fa164",82486:"6ee2f109",82553:"b2f3c04c",82581:"4ac5a8bc",82588:"22192259",82663:"e2968488",82722:"a43dfc55",82754:"1f4c6ca0",82847:"f1160e5f",82905:"facce5bc",82939:"3ffe9e05",82987:"27acfdea",83027:"eff4badb",83078:"e1a47202",83089:"c7ada7b9",83103:"3840f51a",83109:"6414a4ba",83111:"56e10872",83121:"006dc26d",83127:"f69c75fe",83182:"cef47da6",83203:"6e8afdc3",83213:"569e617a",83249:"32d3403c",83260:"c6525628",83273:"38f30c97",83316:"b0b27b89",83378:"aac56db8",83470:"71c00062",83574:"a3dc9dce",83608:"ee9f57b5",83670:"8fa9b576",83700:"060932b3",83779:"50eea83c",83797:"ca389040",83824:"09a61fd1",83841:"e29e4267",83849:"a66ff3dc",83928:"6c3fffad",83932:"7e88d302",83954:"0e32797d",83958:"bbdcafaa",83970:"2b543913",83976:"968c9e99",84013:"6a35ce6e",84070:"f86c329b",84107:"cdeafde2",84152:"00a2579f",84227:"dd167da5",84232:"fb6c362a",84255:"5f7c3639",84259:"a83b5248",84319:"add20ab0",84332:"ed66d686",84527:"a2acefd3",84530:"7b34a9d4",84563:"692274ef",84572:"790e2aae",84760:"175a5b9f",84773:"2493d544",84813:"39aa10b6",84869:"b3c6188c",84963:"75f5a097",85014:"3b5a5dea",85095:"6e925ba8",85097:"1682c825",85105:"b97600ae",85205:"b80556e6",85209:"5ee954e1",85243:"01e4ab56",85257:"b95de7f5",85279:"9d896a2f",85322:"18b44b2b",85358:"30512b2a",85442:"7970ece3",85453:"fb1e1d1e",85537:"c0626242",85581:"7500bb20",85588:"53c18d68",85736:"48cb5964",85796:"e203b806",85806:"fbd285ee",85817:"f02bbb8e",85896:"e9b359a5",85899:"ef3290b1",85917:"e7d86b26",85960:"f16cb757",85973:"b1b5df36",85997:"db6152cf",86053:"4dc95938",86074:"741302c3",86121:"594f4aa4",86129:"7cb605a7",86167:"3ce460dc",86215:"77a5d5a6",86216:"bef3c0fc",86246:"e0349554",86354:"bc7c5dc8",86417:"a1124a7e",86434:"dc8e21d6",86478:"84cf68a0",86480:"06949ebe",86501:"9d7d8716",86586:"8c579e0a",86597:"9bd3dc22",86623:"a74edf8c",86659:"0e19cb86",86669:"3e544ff8",86685:"45e653c2",86807:"3d614f42",86829:"00572ffd",86846:"9070c2f2",86856:"28df0c06",86888:"0615aab2",86890:"fce759e0",86914:"0fb4f3b2",86939:"8b586edf",86992:"8a207a53",87004:"c486e5ea",87087:"05aae5c6",87159:"443cc7aa",87184:"a039315d",87186:"57a6b3ca",87205:"b2690949",87217:"1f696713",87269:"35be2680",87282:"c1f408d5",87377:"bbb33c7e",87407:"5da9e9b5",87432:"2a58f20b",87456:"30fa1b01",87459:"ca9b021b",87473:"7572fe2b",87483:"e76cd711",87485:"074d2936",87547:"8a3e31a9",87589:"a5c128db",87614:"29322f97",87688:"abe56e79",87747:"99cd7148",87781:"89e64bd0",87863:"5fd2edbf",87875:"a9ccf0bd",87880:"bd9c4f07",87905:"5b6b1941",87945:"05f869bf",87971:"1b696ed9",87995:"341abd86",87996:"23c299a7",88047:"a9a1b642",88111:"6e8bb269",88163:"2c3c6b0d",88222:"9b39dc9b",88248:"f8851e5d",88298:"10ee8dff",88310:"36767ebb",88327:"774b80c7",88393:"5ffb00fa",88394:"903eae4c",88399:"c0edc4c4",88436:"2424bc8e",88441:"98d13908",88468:"ee29a68a",88478:"46e46ed6",88522:"8af566d6",88547:"7ac33681",88622:"441ab315",88626:"5b4795b9",88654:"eadecd16",88696:"3e68290f",88775:"06f05fbd",88815:"c077e43d",88817:"9e1a7664",88821:"cee6cb12",88847:"988a32ab",88852:"414f6661",88855:"0a2c96aa",88865:"e8542a46",88903:"e122d6fd",88986:"0bc77a5d",89018:"8a55ca24",89093:"b18e7a97",89097:"aa5fb21a",89172:"f79b59df",89175:"d0983721",89210:"395fbb55",89289:"d1f4bf4f",89338:"efe97fec",89353:"e7814320",89362:"780293e3",89402:"4de66462",89415:"6fb43246",89437:"90d090a3",89455:"f8dbee27",89489:"c8cc5158",89534:"da6951a5",89554:"a784419c",89610:"cc130b82",89641:"9d5b345b",89696:"abcb22e4",89801:"cb16760f",89810:"9e2ddc23",89858:"8b837402",89873:"0d66abd8",89986:"49804246",90066:"ecb816b0",90071:"f51c662f",90110:"cf0b8805",90115:"f497c160",90135:"d3605a71",90214:"23fc1725",90257:"6105e05b",90280:"9e2d7785",90317:"0dbcd032",90378:"47701034",90414:"4258fc22",90416:"410119bd",90438:"817c940d",90513:"91bc9a3b",90562:"b9ee764a",90593:"eac7c7dc",90598:"bd31cfd9",90625:"183eaa34",90627:"69608c40",90717:"f97b214a",90749:"f70bc7ca",90831:"3b92aace",90842:"ea14dbf2",90849:"39cca96c",90910:"0098609d",90950:"e0bca964",90972:"4dfbb0c4",91025:"baab9bea",91058:"6d57ca17",91109:"22f0de7c",91187:"ff56e27b",91203:"7e4cc839",91257:"5b4a526c",91305:"c2578a79",91319:"302da679",91333:"bb1412e1",91359:"67ea2072",91405:"c7144869",91428:"d8c3b11a",91530:"9b1454b8",91540:"18f2c91b",91581:"2c4a9a6c",91587:"5ac8f274",91597:"1fa2692d",91621:"67795e38",91695:"55515b28",91724:"20a3ceb2",91787:"bf5ab72e",91844:"46dfa8ad",91895:"5d4b082b",91916:"9ebdbb47",91993:"8c22cc82",92018:"8b6adee1",92031:"fe024597",92105:"5cefee77",92125:"683c7611",92196:"4b555b09",92223:"38a9da1c",92241:"28e0f6e0",92273:"f9a086ad",92329:"021f8e8b",92410:"4f523206",92412:"0fea7b37",92475:"3181ced3",92535:"63822ab0",92544:"15f57ee3",92653:"c1972b89",92664:"728dae56",92673:"39debf2e",92955:"89495ccb",93057:"a805415e",93085:"6b1e261e",93166:"5f6aac76",93206:"a2bf9194",93209:"13044cf3",93210:"85ec11dd",93269:"1029ee46",93273:"a527fd2c",93341:"7dde88bf",93361:"3d0e28ec",93362:"b3248d4e",93438:"eda79199",93442:"8344dacb",93534:"ede04b1c",93546:"d382b725",93602:"56ae7f49",93636:"259ed984",93795:"395d0490",93849:"00e1630b",93854:"c47af2be",93884:"e3d67ca0",94e3:"789c1bc4",94065:"6e8f3ab7",94082:"b6dbf702",94091:"578df47f",94106:"7ccfcc6b",94153:"b039c689",94168:"d6078fe7",94227:"970cd00b",94251:"9e3cf38b",94314:"d3489683",94344:"cd30ed80",94361:"9a28b459",94417:"394f998e",94538:"f82ebe9d",94555:"70e87010",94561:"a0b349d3",94568:"5a296dcb",94625:"98b3088f",94646:"e5304cee",94648:"f6228d59",94685:"438776dc",94711:"611b1dc8",94713:"58810f4d",94788:"6fc1dd4f",94796:"4010c4d3",94841:"89ae3e4e",94843:"828d0dc0",94863:"55a59675",94864:"7c75a8b5",94910:"d465e058",94925:"8f642dfc",94926:"aae8d19c",94980:"93fccaed",94997:"d853cfde",95020:"5e8185a7",95058:"75d979d0",95078:"41cdca60",95093:"423cea85",95136:"797d7fa0",95159:"1a0d6a0e",95183:"dfc87c30",95187:"85f160a6",95231:"b9c65497",95240:"7c6cb8db",95245:"dbd1b852",95330:"8e4b3ab8",95427:"9aa9c150",95443:"f7ec7ba1",95470:"87fd0551",95542:"91ccb5d3",95605:"6c76232e",95641:"0addadba",95649:"6a65e3ce",95659:"0a1f4efb",95768:"80c58542",95785:"48f89240",95818:"16d5276d",95909:"aa84deac",95911:"529b3233",95912:"423bd8a9",96022:"afa72882",96086:"085de370",96155:"e89275d6",96225:"fbcf69e0",96239:"843c315c",96268:"8b0816d9",96276:"82ebc6ff",96325:"75b0ccfb",96425:"769273ca",96463:"f832da4d",96470:"be797944",96555:"d21049e9",96652:"2f23cc7f",96693:"1d428461",96745:"6967bd1e",96771:"dc2aa01a",96778:"f5680f39",96793:"e0a23a9d",96881:"d4be0935",96963:"8985d561",97006:"598d7afd",97033:"fe730233",97047:"87cbec5b",97107:"18c4752e",97114:"9cc27416",97123:"040c8599",97167:"1238b646",97189:"23708f52",97223:"c8e4b82c",97246:"17ce0e36",97253:"b41c2a94",97296:"a57c26cb",97342:"52841075",97358:"c769b875",97379:"57d3846e",97420:"81fe43ee",97424:"0223e146",97476:"187bd928",97536:"b4e3b3c7",97554:"005cc38e",97562:"bb8d8d2e",97585:"59a181fb",97664:"4e7bff16",97670:"a4274e75",97732:"0b31f7d8",97737:"2f8afde7",97753:"53aae94a",97763:"f430820c",97821:"f80efef2",97829:"5d36ccb6",97863:"f8cc590a",97887:"8c7c5b59",97895:"05685ac0",97901:"67fd6666",97905:"fd91bb9d",97913:"43f18326",98012:"6c29418a",98020:"96dae171",98021:"460aa0c1",98030:"a757e267",98058:"1c320273",98059:"6e7c26fa",98087:"0b0abad7",98094:"4dd0cc8b",98139:"7eab7866",98147:"7e92b0f4",98165:"2a383035",98237:"4eecdd21",98271:"a3781957",98308:"82707bbb",98311:"2e182187",98392:"2f73849c",98425:"bdd345cf",98473:"34829e79",98477:"ec2092dc",98534:"15f60b76",98700:"1fd78c55",98750:"89bad922",98758:"6d0f7cf8",98761:"e46ef735",98779:"84885d5b",98804:"6f3a5963",98867:"b7ac1bd7",98908:"e0e363a6",98925:"57095a25",98935:"86078de4",98941:"dcb08cf0",98947:"5f9ce70b",98982:"bdfdb56f",99001:"bc35de59",99095:"ee8e46b4",99146:"7b22214e",99151:"42d6760d",99252:"8f9df3bd",99254:"0688518f",99299:"a59c607a",99306:"56c8bfe8",99330:"3327c94a",99335:"b5287441",99437:"2c8966f9",99451:"b554daf7",99502:"8b774927",99504:"2e6b3e55",99528:"7e312bbc",99531:"e8f43f56",99534:"428df931",99543:"b88fd084",99611:"1da1e411",99644:"d506a7c9",99678:"1b66abd1",99701:"10059403",99705:"1a05760e",99709:"3640fd16",99710:"ffd9ccf4",99746:"4b4c2ec6",99747:"9fa0b3a5",99872:"d78a1b1f",99905:"0b59e46f",99913:"7b5a7e5b",99987:"e88defa7"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),c={},b="hudi:",r.l=(e,a,f,d)=>{if(c[e])c[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=c[e];if(delete c[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={12164231:"43113",12935692:"36790",13171783:"29452",13883961:"54772",14828316:"41944",16243474:"98020",16640689:"53619",17896441:"18401",18891827:"71235",21719437:"65957",23348138:"57155",27077527:"44840",27211971:"57547",30769210:"44891",31863783:"2256",33241236:"33621",33732613:"14363",34689118:"51937",34900881:"79520",35313843:"23641",37844666:"63075",38836367:"99913",39583919:"70606",42545929:"37827",43764587:"32949",47074836:"39260",48455675:"66715",50536743:"43078",50737734:"21373",52166518:"76123",52375367:"70689",52676037:"54487",53317765:"39058",53798754:"21191",55946737:"45113",56040849:"72815",59171146:"67989",59700627:"95187",60165173:"44719",60753781:"68470",61773850:"22504",63786366:"93442",65511420:"32875",66405406:"89534",67474760:"63332",67922501:"65221",70570476:"12513",74555694:"79302",75914136:"65091",77787075:"36689",88937603:"61939",89514438:"17709",91415840:"9003",92328698:"20924",93340492:"41159",95789563:"59923",98749210:"96963",98826249:"68315","0583dad8":"16",a33c645e:"25","0da1f28a":"28",a978e5ab:"39",a674d2f7:"48",e9bd6ef2:"60","56169fa6":"67","6c6aeb2d":"106","275b5c51":"129",af8190e8:"159",b1f77b90:"217",a1a7cea0:"278",fcc9c1b0:"292",be9655ff:"323","43d16b11":"335","0b4da2f0":"354","19ac452e":"387",a168e2e0:"437",b4a99b76:"569","0a87a91b":"614","5c109a5d":"805","79cc09db":"822","8b10f6da":"851",e9038c17:"878",ce3da75c:"910","02b5547e":"917","9699c87d":"924","0c459987":"940","4b935b7f":"1103","060b2af9":"1107",e3b4090c:"1119",ae09e9a1:"1136",b0127f30:"1190",ea1c8f1c:"1251","62a07427":"1284","9cab4fb3":"1337",eb8e7dea:"1360","562c897e":"1422","50f3bb83":"1442","4b25608f":"1506",da868c82:"1517","8425e24c":"1550","73c8d421":"1635",cc5200ca:"1656","7a51e13d":"1658","89dd9b54":"1784","269ce614":"1785","4b2ed2d0":"1791","92bb01f4":"1841","9f349e0c":"1846",d032d8fc:"1857",c28fec2b:"1882","6e47a3c2":"1928","45b94beb":"1946","7fbadf7c":"1955",b93dc3c9:"1983","3c15683d":"2016","7a3be72c":"2053",fdb4abad:"2121",ef5805c5:"2172","32aa7863":"2214","9781112c":"2225","2b154460":"2239","7d9ec3a3":"2262",d2a01f74:"2298",fb4f9065:"2385","3b3f1ad3":"2450","1b7e3feb":"2472",e8b490f7:"2540",b9e56da2:"2577","372d2263":"2638",dba6e014:"2640","9ed88412":"2652","9d0312da":"2663","7e9327af":"2679","5e58268b":"2700","4c5bb0e3":"2739","7c87f31d":"2748",d28b7dcd:"2759",ad32f2e8:"2768","48f24bab":"2772",ba2305d7:"2791","00cd9d46":"2839","093ec6b1":"2854",c03096de:"2867","8539bc43":"2884","404a423b":"2912","580eda40":"2932","6e7eafb1":"2954",a80470ee:"3075","32dcc326":"3125",d29911ee:"3131","4f7cd6bb":"3137",aed1d196:"3144","5c3bdea9":"3179","6be904db":"3303",a3e90044:"3313",b9073401:"3323","1c4da86a":"3471","7fb3fac1":"3558",b783cafb:"3693","5e85aa31":"3694","50cd3db4":"3722",dc1f5b39:"3740","394bb252":"3764","43d31177":"3847","260d7fd0":"3940",d18b6106:"3965","50494a26":"3968",c943b655:"4014","04ae9608":"4028",b4ced939:"4040","0bf991f2":"4060","817ed3cf":"4074",d772531a:"4117",b18f8924:"4133","1a47b5e7":"4137","0c12eeea":"4205","18ffe98c":"4269","1497bce1":"4355","25fe5fdb":"4368","56471e5f":"4382","1dcf0194":"4405",ff5a6f64:"4467","3e8d408e":"4514","1cb4ff83":"4530",d9f219f0:"4574","405284b3":"4591","9920fffc":"4602","43d0cc21":"4777","3b6474f3":"4790",a0c4b68b:"4863","7c52b6f4":"4890","4929a6fa":"4919","066b815f":"4949","006c64a3":"4980","6880fe95":"5008",f5c507c6:"5028",ca8c3af7:"5029","25ed107d":"5065",d0ff2798:"5193","8c7f4a45":"5195","4b9df2bb":"5206","627b1f39":"5269","6ff0c558":"5270",b3a451d2:"5289",bbc3d059:"5295","44fefb3e":"5304","22b4f68c":"5322","86642e8b":"5334","0e11b6db":"5338","0c74166d":"5594",fb863cab:"5622","32ba6a4c":"5631",a804bb8e:"5633",d03e0408:"5647","58c4a37c":"5679","42bda306":"5721","1adb4ab6":"5806","6a34bd67":"5834",b5960565:"5887","478a7123":"5888","4959f63e":"5936","959a592e":"6022","87c914ef":"6054","384f1d9f":"6090","0d706529":"6158","14ed99c2":"6170","0ba05648":"6203",baed6a8a:"6225","59ba4d58":"6289","14a73a68":"6310",ce3c8465:"6350","207e0bd3":"6368","4658250f":"6371","5c865244":"6372","47ddb104":"6407","3faff22d":"6467","316bb886":"6475",ae59a273:"6552","21b16c5b":"6559",f6a1f09d:"6636",ea2cf37a:"6677","0cca5757":"6692","17ace3c3":"6697",debf2b54:"6709","01ceb854":"6739","507d925b":"6761","9cb5abfe":"6778",ae0384e2:"6791","4f684eef":"6823",b52407fb:"6897",ac385e9e:"6930","52f660a4":"6944",e841f655:"7035","6e78b29b":"7071",e7c12d1f:"7100","9d67d055":"7103",b744ccc8:"7125",bfd461a8:"7167",b1b9fe16:"7317","96f48bd9":"7355","502758cc":"7444","8fdc7f76":"7458","4abd5d51":"7517","12a626af":"7566","9df106ad":"7622","2a74f6a7":"7629","06a1e3b2":"7715",d6b46894:"7734","79a2ad2d":"7747","869d1599":"7773",deab0229:"7802","68c81474":"7850","7ba20019":"7907",df4b657d:"7953",f85e4dd8:"8003","0480b142":"8070",addb1e87:"8139","464278e7":"8174","38122bdb":"8177",c7a3e7d6:"8183","934057b1":"8192","01a85c17":"8209",c286af15:"8289","09ff3d76":"8348",db9fbbab:"8354","24179e00":"8363",abd23114:"8367","7a049829":"8407",cd17745a:"8413",bbced460:"8417","497095d8":"8585","15c2f51a":"8619","22351c69":"8632","212a125d":"8645","80bd773e":"8651","8f08e203":"8699","1cd42d14":"8762","7a11cfa3":"8766",e161c803:"8840","3a6a48c9":"8888",effd3c61:"8889",eebb3a9f:"8900",dc8afb47:"8902",b6e28713:"8965","6d5644d6":"8978","7c9ee56f":"9045","4c492fb9":"9066","52b6ceb8":"9076","29c12ff9":"9127","17666b14":"9152",d4eb85a9:"9189",b2d2727d:"9195",d336ca2e:"9228","0687df23":"9257","29a0dcae":"9262","4c14260d":"9351","7fd1d1a0":"9379","409e52b6":"9380","8ea09047":"9385",cfb1206c:"9428","8cd4ff44":"9432","49b92117":"9446","762ed4b3":"9458","01964c8d":"9460",ebf12a38:"9471","953153ea":"9499","2fec12c7":"9516",bf1307fc:"9525","8eea179e":"9570","13ab27aa":"9573","79e67a34":"9631","5e95c892":"9647","747973bc":"9650",e4d28161:"9676",a0d28f55:"9702",c35662b8:"9722","46e7f252":"9724","0d37dd31":"9737","6a0b8fcc":"9790","2fd2285d":"9836",d6d00b14:"9860","36e3724e":"9870","8a5cd0c4":"9891","9c0f572d":"9907","06b7dbb6":"9914","9ee88b57":"9944",c782ecef:"9986",c2277200:"10030",f89af623:"10118",f7519df0:"10181",ce5d6b55:"10198","0eb44ec6":"10238",b69fdc1c:"10285","8c29db87":"10354","0ca8e4c5":"10472",dc8e8e39:"10488","40011a75":"10492","79c374cf":"10535","1ca50c03":"10545",b1051fbd:"10610","6a326c1d":"10637","936cf648":"10642","5bf02344":"10653",f71afd42:"10688",f53cf472:"10727","931768b8":"10767","10fb8f29":"10789","9009d9a7":"10884",ac65ed35:"10887",b964b0d3:"10907","42746bb6":"10920",f0c78ca3:"10924","726b1d2e":"10956","90db14b9":"10978","9f1f18ec":"11052","7c44e50a":"11058","2750cc84":"11111",f97de939:"11156","2e961a80":"11275","82b971d3":"11289",ac338f84:"11299",f9cb0cea:"11326","6ed20719":"11355","039c7621":"11508","3d026c66":"11565",d2a270f8:"11631","9aee6bed":"11684","8fa68fae":"11716","51e360fd":"11725","446810fe":"11745","4cc89b71":"11768","3f65fb56":"11782","43ff550e":"11795",b9168984:"11804","7cb0ba19":"11806",f630dd79:"11842","51e592eb":"11855","43c57b15":"11869","41b6dd58":"11905","757b41cf":"11906","608a85b6":"11977",d25544dd:"12047","088c57bd":"12134","5617941b":"12144","3deb4153":"12186","77a5f3f8":"12316","9b28f794":"12318","2592f25d":"12378","7d05d2dd":"12393",a0fb693a:"12395","61c30610":"12431",f4a568da:"12452",ac9a039d:"12477","3e8ec4bd":"12485","2ca30cc7":"12535","0bce5bfd":"12542",ae632d28:"12608",bb6acec0:"12613","98af85a1":"12654","755aa830":"12679",f81e2128:"12686","0166538a":"12763","236efcfc":"12869",bc561320:"12945","72ed5e19":"12995","9b078b3d":"13021","075d0b63":"13060","6695bce8":"13063","4d01f822":"13152",a5fd3751:"13203","326f3c2b":"13210","814487fc":"13236",be65306b:"13298",bb230ab4:"13321",c7690f1a:"13366","0c9b8a46":"13374","15be7f5e":"13375",cdd81d53:"13406","05f125a2":"13419",f7887fd4:"13465","3f9b0969":"13511","35f2b245":"13514","559e18a5":"13522",aeb9cb2b:"13525",a221d960:"13534","27aec4ea":"13535","1b3749bd":"13575",b7ffc82e:"13580","16444e78":"13626",e32c93f6:"13698",e4126631:"13733","35ace877":"13762","5005f1cd":"13803",fdf3b0ba:"13849",a586ac12:"13918","79c522c5":"13943",f4dd7c05:"13982",bb5bef2a:"13996",fe0a5e13:"14003","4fe2812d":"14027","6c6eb236":"14042","2da40935":"14043",c58d5881:"14125","88677a17":"14134","5ba7f3a0":"14136","0c792305":"14152","79f5ed7e":"14163","0466f8a1":"14179","973a6c2e":"14257","4d62164b":"14259","881e0310":"14261","15b03510":"14264","2d2f3863":"14317","02704d8d":"14340","4330e2c5":"14388","95a29cbe":"14399","262f048a":"14410","5a1ac6cd":"14433",a2218d2d:"14435","0dc66419":"14496",b812e3a7:"14536","04287605":"14599","6b0d4b59":"14627",cb290368:"14726","8049dc2a":"14750","4193b389":"14802",da9a6aef:"14822","3145e86d":"14835","9c9e6d14":"14868","281df6d1":"14871",b2f79aaf:"14917","68aea991":"14919",b634826e:"14943",e8bf575a:"15038","6773b5f7":"15078","461201e5":"15079",e6691bac:"15144","29fcaeb8":"15165","809a1b46":"15186",e0719818:"15220","246d116d":"15235",ee5dc595:"15272","7bd6096e":"15292",a0583d0f:"15316",bbbd3731:"15403","413b2e2c":"15407","63067f40":"15427",ad07d5ed:"15473","259868d4":"15501","1ff337bc":"15552",a309ba1a:"15607","0d11ee2a":"15764","65df1ffd":"15805","520bf372":"15857","04d2875d":"15917",f05cb9af:"15947","1ea67680":"15955","777c5b61":"16017","7f5a2db2":"16032","5685cb00":"16100",f0db470e:"16209",d05ef008:"16231","1839a246":"16319","8eca1d9c":"16377","58c0e7a1":"16499",b5eb2b1f:"16500","3d8e248c":"16622","4ccf094c":"16641",ab84da8d:"16747","7c3644b1":"16885","426a3c0f":"16942",bd7a3684:"16950",a3848d24:"17009","30e67995":"17033","3687929f":"17115","87557f51":"17119",bc36781c:"17232","82fc01c6":"17294",b4762a45:"17332",de821e02:"17368",b629aa71:"17402","496a5e3a":"17411",c5c8072f:"17441",f7750a15:"17474",dddd9631:"17502","80e60ab1":"17508","8c212f85":"17530","46e89fee":"17581","47f3a505":"17626",a2af438a:"17681",b1e22259:"17739",bc4a985b:"17805","2d9024ae":"17818","7cfc22c1":"17860","9130943e":"17867","36f96221":"17944",f67021ea:"17987",a3255c75:"17988","059d2658":"18006",c1fa975f:"18033","7707ed5e":"18103","3a2db09e":"18121",c15d9823:"18146","889bcd45":"18350","670426f7":"18351","7eea383c":"18438","762cb2d4":"18445","905fdac9":"18520","1bdcf2af":"18620",e798c07e:"18645","3b375bfc":"18738","10b6d210":"18757","6c76cc4e":"18798","6cc2587c":"18940",d75d009b:"18950","7487c019":"18998","378587af":"19042","6e547e58":"19052","6f878c05":"19070","6f3d983d":"19108","868e6cc1":"19109","9c3fccaa":"19136",e77e0240:"19237",d9884433:"19252","1354c4fd":"19267","345a8726":"19271",a2cfe627:"19369","9228ff94":"19387",c61ed569:"19396",efd9e5ca:"19425","4b6ad6c1":"19428",a3c850e8:"19474","3faa4dcb":"19513","7f5a4e86":"19521","3548485f":"19542","76b52ed8":"19664","547af68c":"19687","0e4a3360":"19711","9e46f997":"19736","3c6c92ad":"19774","83c71362":"19798",a5052667:"19801","7e53000f":"19865","389b06c3":"19891","99bce14a":"19999","0ef00d46":"20038","430ee71a":"20103",ecc82a52:"20160","69fce7d3":"20194","5aae4c30":"20229",f60a8e85:"20286","6b7b009f":"20325",a55cf427:"20358","784d2d5b":"20361",a170c4b2:"20405","839320c8":"20415",c97a4f9f:"20424","39c0c867":"20434","4c056f0f":"20491",ca16b0fe:"20535","2925f13d":"20541",eae39fd7:"20619","874c4928":"20676",ff781369:"20713",a827f20e:"20812",bd440596:"20857","1d99c39c":"20892",de69fdc1:"20931","5ef30e9e":"20951",e3b4fd8a:"21070","7ff678ac":"21077",c1b7702d:"21121","574aa417":"21177","58f98693":"21273",e737da10:"21275",fab95ca2:"21290",e4bea80c:"21303","266d37b9":"21316",b23dd436:"21341",b2c62a3d:"21346","5105c354":"21401","9db9c0e0":"21417","995d9cd2":"21448","5f404bc7":"21482","69f9ca18":"21524","6c888f35":"21560","263bc6da":"21574",d17a9646:"21585",aad02470:"21630","6224d640":"21635",b1722c22:"21662",ea9d899a:"21729",df2a910d:"21764","1926d3d7":"21805",fe2d6fd6:"21816","7ce47929":"21837",a54a9a31:"21874",d3de5519:"21909",a8a7f86a:"21921","625beb64":"22141","334d7764":"22313","83a16324":"22369","9a5e9795":"22385","47425d5b":"22428",f93d9ca9:"22447","494588b9":"22472","95d688dd":"22483","2923e8f3":"22499",ff15e2eb:"22501","6f37f43d":"22534",ca5d6ba8:"22595",a36f1f19:"22628","69375b61":"22640",c760fa6a:"22647",c699b29d:"22673","74c5eee6":"22709",f701b058:"22750","70db0e3d":"22816",d6ededeb:"22844","9a29e675":"22911",d49fdba3:"22916","0d5f3865":"22932","70a32eac":"22973","1fd06df8":"23002","07da43c6":"23041",ef1c4348:"23081","7050405a":"23083","39307ee6":"23119",a1c39b3f:"23141",b994507e:"23172",fe86f3f9:"23332",fa5f4abf:"23388","95d97af4":"23438",fdeab78a:"23475",a67ef186:"23547",f24f712d:"23563","53746e73":"23591",af9b00f1:"23600","996abb7f":"23625","59e9dc06":"23634","9c150758":"23637",cb16b650:"23666",d235b83f:"23676",ea8366f8:"23700",fac8c34b:"23765","2153fb85":"23773","3affb2e4":"23880",be354741:"23938",afe4349e:"23998","9c7497bb":"24022","5ef1cef9":"24065","4ed60a8a":"24084","89ad6a53":"24098","897856d4":"24126","5ce7213e":"24140","1d2c1565":"24172","3af3061a":"24234","7ebf6f1e":"24265",a4e075be:"24340","99d3870c":"24366","5cbd92da":"24373",b5b376a0:"24377","4066930f":"24381","77b23935":"24437","045bd6f5":"24475","6cf93e89":"24476","3befffe2":"24704","91c64349":"24728","931beacc":"24729",e2c09daf:"24741",a852ca5b:"24776",a68f650d:"24815",ed6ec893:"24826","7cfd7c3a":"24853",e0c51b98:"24866",b4972e92:"24867",c6301cab:"24868",f0709bee:"24891","8e01a36e":"24912",cf6129a8:"24919","51fff4d3":"24932","231cac3a":"24970","1e3d98df":"25013","9cd11b72":"25044","9531441e":"25067","8bd2257d":"25101",b277530c:"25130","96046d19":"25186","19531bab":"25273","1da16fcf":"25285","537936fe":"25335",d78b8cbc:"25396","4083b748":"25397",b973fe72:"25426","5ef8e026":"25452",af5c68f9:"25531","40ebd41e":"25532","7fb09d55":"25539",c7382291:"25578","65603bfa":"25582","7205cbcf":"25601",d56bdeaf:"25778",ba115cad:"25781",d2c3f17d:"25845","6d1cdd35":"25869",c9953bfc:"25871","17268e53":"25874",f7f19049:"25959","1645b95d":"25987","92db1d5a":"25993","90c5833e":"26003","20f9256f":"26009","7662a79c":"26060","2316ae30":"26064",de97f7b0:"26081",fd6c914a:"26183","4e3e1e17":"26216","477cc2f7":"26260","878dce9b":"26305","9579dcb9":"26333","65009e94":"26337","14fd0d1c":"26414","9a5789a7":"26548","8eca70a5":"26577","8353278b":"26627",ba839983:"26630","960d3eb8":"26632","1802ae9e":"26722","78bc6f25":"26724","21e535c3":"26744","4681e75f":"26797",e2fe7a08:"26833","04fb6378":"26859","958a296c":"26882",b3749361:"26900",aca5eee4:"27012","58714c61":"27020","1547c10f":"27088",e37692b4:"27115",c4d1e829:"27123",cbec0238:"27179",ce710151:"27212",f52b34fb:"27369",f7e205e5:"27388",a3983124:"27398","7a3be7e3":"27444","31ed8f07":"27473","9f8f3c52":"27663","6d701be3":"27737",f95764fc:"27823",b0d5c266:"27887","10ccea9f":"27921","2e7e1134":"27955",ee4b8f19:"27995",ecd026d3:"28020","2cc67ca6":"28086","859500dc":"28127",abde445c:"28147","8120957a":"28166","513b54fb":"28169","9adef974":"28178","758b9bc9":"28204","20a81622":"28235",b8d3e47d:"28252",ec410c33:"28319","89cbd1b8":"28410",b212a261:"28428","5b374304":"28435","261fe657":"28499","54ad050e":"28627","0871002b":"28679",ab48a39f:"28687",c3856c66:"28701",fd5c5192:"28782","379ac6de":"28793","8b6fbbb4":"28803","7ed2bc06":"28834","4c00d6b9":"28853","2a0b5233":"28889",e7ef6e16:"28920","8c5b1685":"28941",f382fc88:"28945","8e7128cd":"28993","9c7a2f87":"29060","763fa02a":"29123","6f3c73f2":"29171",d4836e14:"29204",d330b699:"29243","8a472aba":"29337",fbce6636:"29408",b92135a6:"29414","163a1bae":"29421",e4d4ec4e:"29457",da05f515:"29498",b2f58160:"29523",b45a54e9:"29526","13f72d6c":"29653","6e0a413f":"29679",b1633424:"29690",a642dcef:"29698","80b93830":"29708",da10e58f:"29733",e6557239:"29795","16381f20":"29820",d973177d:"29829","5d94dea0":"29845","26f5f607":"29891","5397b577":"29922","5de1c39a":"29950","332b14e0":"29969","87546ad3":"30035","6b836ac4":"30066","339988c0":"30154","22bf7f69":"30167","5320ed26":"30262","132be4b3":"30265",af953e30:"30317","4b678e99":"30355","5c5d3a2d":"30378",e4a43002:"30396","90ffbe81":"30410","407230da":"30564",c7165ecb:"30569","1ee0a129":"30579","775c5b43":"30583","6ee9522e":"30628","5d70257a":"30654",a7c3ebee:"30790","5814834c":"30827",ced554c7:"30831",d8412727:"30842","677757ca":"30848","44c28e7f":"30934","7dea1595":"31004","416fb909":"31016","71d5b1f8":"31039","3f9a993f":"31047",c3c8ddc4:"31125",be9442ac:"31141",fbf25af7:"31144",b8ab477f:"31220","5c81ce12":"31255","67f1ea1e":"31257",fa366c46:"31272","07f6d4d1":"31393",cc564cf4:"31465","1668cad9":"31541",c602d51d:"31544","8c4bf82a":"31567",b38306ed:"31680","05957343":"31705","0a70c05a":"31720","624fba40":"31726","974bc2fa":"31749","04eab06f":"31791","14a26e2a":"31797",a14af959:"31861",c791a767:"31862","2dcd9099":"31869","2e31e40f":"31957","4ef864ee":"31972","8dbbcff6":"31996",f0dc0726:"32005","9ba9284f":"32012","116b7e55":"32039","5110a7b7":"32183",eb05a324:"32225","53ba3577":"32270","149a2d9e":"32278",f9a4941d:"32335",fe345ee5:"32365",e1407f5b:"32391",c08ba4cb:"32472",e6c2d44b:"32527","40c3731f":"32558","798484e3":"32691","1b520177":"32728","943ce597":"32824",fdddbf66:"32825","8590fd3e":"32847","225cc45a":"32960","604cd7c5":"32993","97e51b1f":"33049",a172f6b1:"33065",ee003a92:"33192","2a422024":"33214","465994bd":"33234","7da68ccc":"33290",f5ff1a23:"33303","2d0c5b52":"33350",c16e0158:"33458","3ed70074":"33517",f81c13fc:"33524","65ea2434":"33533",fe7ac0b7:"33540","8f00bf20":"33559","6075be34":"33567","269d704a":"33572",df68b7b1:"33577","3f933ca5":"33612",d294bdb0:"33638",da7149d8:"33643","81a6b262":"33659","755872dc":"33724","1b31aebb":"33804","07399e71":"33806","45f2496e":"33816",f8a443f2:"33825","06758c2b":"33854",a7690409:"33881",e9c7c2b7:"33889","49aa1a16":"33999","18b5779a":"34127",f5c63bac:"34156","3f4396e6":"34179","80f4f5b6":"34182","13e6af21":"34196",e8a8dea2:"34255","164e61b9":"34331","6153f283":"34335","79fbf53e":"34388","538371ec":"34520",b038a3ec:"34528","782eae4d":"34543","0735e5be":"34549","40cd51eb":"34597",f30fab6f:"34621","852f3aa7":"34638",ef071c32:"34662","02e54e09":"34691","47a1bde9":"34706",a5fea1bd:"34750",e076fc92:"34803","2e6ef254":"34808","924dcf98":"34810","10fcd509":"34837",dc7f8f8b:"34847",f7702246:"34877",f44e1bcd:"34904",c9cac9d9:"34918","40dc6b06":"34970","5e2f1fff":"35044","47cb0ede":"35067","35788c78":"35088","6fe5390f":"35139","83829ea7":"35144","372475fb":"35179","2947aa63":"35248","0f3b9f0c":"35288",d42065ad:"35325",a7827f50:"35329",d9454955:"35379","976ab233":"35402","388d5845":"35532","97bb73fe":"35618","2b4cfa56":"35730","8fc868c2":"35733",aba21aa0:"35742",ff6f6072:"35766","3019fa66":"35767",d240c26d:"35784",dd61deac:"35837","8852ad6f":"35881","92928c02":"35922",a3142532:"35932",dfa4e294:"35960",b5a599e0:"35983","04afe417":"36009","59be0e8d":"36055",ceff0062:"36067","28f38ec5":"36113","307d712e":"36144",b60e28b6:"36192","8a759f03":"36264",eafd7a74:"36302","467ff4a0":"36379",e23d1069:"36387","5ea64d6c":"36549","1472dfa3":"36569","94a5efbc":"36594","2573355f":"36619","1084a32f":"36640",b6fb003b:"36672",a3015275:"36747","649faa0e":"36851","1007513a":"36885",d73e6b67:"37109","0b4fcfba":"37115","97da4333":"37147",d786420c:"37191","8f3b27f1":"37204","43dcd746":"37206",e34cac0e:"37209","37524cd6":"37257","554882a9":"37329","6013ac2e":"37366","32b44a8d":"37403",ce46a18e:"37486","6a293d29":"37489",e9705ef5:"37577",e17d733a:"37578",be2ede3f:"37617",a6aa9e1f:"37643",e2657c7c:"37673","2cfb265a":"37740",feab7dcb:"37799","5f87fd99":"37809",d5e29b01:"37839","9ad03801":"37841",cd060f40:"37842","88d0aec4":"37872","3f272b07":"37954","690cbdd8":"38001","8d086d51":"38003",baad6bf9:"38056","1efbb938":"38107","66372f10":"38158","2e9f383c":"38238",bbc1ba35:"38348",cf858c26:"38370","7c15a7a1":"38385",dcd7017c:"38416","9474fc0c":"38439","91335d19":"38449",f0fb7623:"38451",b4a84943:"38468","0f497157":"38600","6dc06ee1":"38605","7eaa135a":"38607","1bf4b05b":"38700",c4de5678:"38767","872a41d4":"38786","5ea125b2":"38816","6495713a":"38835","110e78c3":"38839","6f5eeb66":"38888","2c50796a":"38974",daa4f13d:"38999","5560f355":"39088",cb9e1f3d:"39110","755ebe0d":"39138",b5f01515:"39142","0b8a4e62":"39153","09b62bf8":"39192","484cbf74":"39197","8b795044":"39202","93f7a5ff":"39208",b992801d:"39230","90f157dc":"39240",b40642d4:"39265",b1043e58:"39283",cc6505da:"39405","995840bc":"39407","085b8128":"39417",a615dd65:"39423","0f65ccfb":"39444","9d833fad":"39487",b326207c:"39494","7b2a260d":"39496","782d926e":"39505","630bda65":"39518","441dded5":"39520","4a80e27a":"39555","06a8eab3":"39569","7d0e1375":"39587","97ae1fff":"39608","8f64cb7a":"39712",a68f0e64:"39715","07bef82a":"39758",fb3759c3:"39773","320da59d":"39777","3c2d0811":"39781","8fa753de":"39840","9b0c8626":"39887",d76c455f:"39901","09a52b17":"39908","6471fe03":"39921",d4a2e930:"39973","5f469a3b":"40065",bc817d28:"40124","0508dae2":"40178",edf7dc61:"40205",ecaa52af:"40245","3c36ce76":"40369","0cd1a20c":"40463","4d1df301":"40464","3415fffa":"40555","3e032765":"40606","12a5de9b":"40616",bf5126e1:"40651",dfc3c224:"40690",cc01a9d7:"40697","8393a516":"40755","1a7b33c3":"40758",d2110cc0:"40797",ddebc8bf:"40827","2662e92d":"40847","321dafc4":"40907","2884dc3d":"40919","881bebdd":"40927",ca0149b2:"40959","68c5632a":"40999","33d4a0d4":"41030","0fa5c29b":"41125","85ffab62":"41135","6c9200cf":"41260","247909f7":"41361","2bf5edd4":"41455",fd517388:"41461",c3f88c36:"41491","8cd118b0":"41504",bf9d9be8:"41518",da172daa:"41594",d407c2c6:"41640",e8e3bd30:"41651","9017a110":"41677",b9edf71b:"41739",bc38a1dd:"41750","29db9f25":"41852","78f0e259":"41867","58b3152e":"41872",dc5506b6:"41892",b7a56be4:"41907","7c49023e":"41954",c413ce11:"42068","295cb0c0":"42187","671726ea":"42196","89c8b6fe":"42268","3fa17fc2":"42298","1f979aba":"42299","6df57399":"42350",ffac4af0:"42368",b8212f90:"42465","203cc654":"42487","34825c6d":"42518","2b505997":"42566",b184a577:"42576",eafac744:"42596","165a93e5":"42690","28826a4b":"42702",d8ed3ccd:"42723","89f1622a":"42794","5314580d":"42799",bf3d61ec:"42801",aeca0a21:"42879","432e670c":"42881",c9d95cbd:"42900","145364e0":"42905","39c7a203":"42911",ebbd9274:"42920",a8c92c97:"42937","19028add":"42942","2812e3b9":"42995",e3477e52:"43029","2907d5eb":"43035","676c7c8e":"43040",bec2896b:"43042","341293cf":"43088",d831e3b2:"43195",fe9b6676:"43286","4c07ba53":"43352",f048922c:"43421",fbf82623:"43432","83fec35c":"43445","7b89671b":"43461",d319e9f2:"43512","4cd0ba1b":"43642","7117a8cd":"43677","752351f9":"43739",c09831a6:"43868",a8b66660:"43922","509aac2d":"43980","5a8b22a0":"44008","454b7ded":"44022","43d1bad2":"44040","894f5c0e":"44045","6503f568":"44118",e2fc22cf:"44123",ca2b0f7e:"44125",d653d7ed:"44129","19acc4ed":"44143","4f087d20":"44290",cfca4f26:"44326","0a91021f":"44339","8fd374dc":"44380",d363a80c:"44405","216bf65d":"44419","6fb01322":"44489","9882af90":"44492","9b2ae5ff":"44551","502906a9":"44567","20bfa334":"44640",d65b2c25:"44662",bdc69003:"44682","260982a7":"44876",f3d02b29:"44933","43f3c18b":"44939",c7a67184:"44948","12b957b7":"44960","8914fdfe":"44964","41af2803":"44994","6e34e766":"44997","86fe1f77":"45117",b528d4d0:"45146","49a37e79":"45210","7737fe61":"45231",c3f790da:"45238",db90ec2b:"45290","815e47ce":"45323","24d4b044":"45339","459dbf85":"45460",e85bde03:"45500",a722b43a:"45541","7dce0476":"45561",ef7891f5:"45640",c36346e3:"45670","3533dbd1":"45682",a2a2954f:"45919","9926d60d":"45983","95aba771":"45988","8cf74eb7":"46001","2e048b0f":"46008","1fb7523b":"46025",f724037a:"46039","67893f6a":"46063",f1087137:"46074","53cdeba4":"46156","8e4df3f0":"46197",ea511817:"46244","04b49851":"46296",e49bd305:"46375","00239e8e":"46425","4bb02a47":"46451",bcb734aa:"46472","9dfe5a97":"46513",c13f246c:"46515",c5427124:"46547","8012465a":"46578","8393d26f":"46598","5f0630da":"46652","4f48cd24":"46662","2b6a7ab0":"46754","8f07070c":"46802",b2e2853b:"46840","917a523c":"46850",db9d1243:"46888","85f8bce5":"46891","57a58e78":"46905",ff13b684:"46911","7b0a3d41":"46917",a28b89d0:"46921","37ffd066":"46937",a9afee85:"46979",bbb92300:"47041","26996ad6":"47060",a5c8a2aa:"47087","696d889c":"47106","1366dd9b":"47110",c648308f:"47127","4d2e69a6":"47206","131c6f6e":"47236","5048202c":"47247",c7e2144d:"47248","6111afa9":"47297",b9a767d8:"47433","09e5dcaa":"47517",df0967b2:"47537","0029660c":"47555","0c1ff092":"47622",b1899f7e:"47668","39a07549":"47693","17093d00":"47699","4edf53e5":"47730","6bb76d2c":"47917","7ad7688e":"48003","47f96c4a":"48023",ca713325:"48050",c17f9567:"48063","852ff8c6":"48071","0cc98403":"48091",f81c1134:"48130",c467a11b:"48132","519b5759":"48162","00021e3e":"48167","9d8965aa":"48188",bef59fc9:"48214",e672d61a:"48285",e2b4c006:"48295","189e3ac3":"48304",f6884a75:"48310",d8c836b4:"48355","959b45a2":"48360","712c16a5":"48361","2896ce7a":"48532","0a5f31be":"48544",c1506482:"48592","7a556257":"48613",ef4f3413:"48661","5db19d16":"48673",d009d47f:"48733",e054d919:"48768",b71be52f:"48793","79392e36":"48803",d0b9fc21:"48842",ce18dbde:"48883","9d9f8394":"49013",c68848f4:"49046",be94b749:"49055","97d17d75":"49071","3455c0d5":"49112","0ac5df82":"49174","7795e379":"49199",f2a06fea:"49226","6111bc4c":"49280",ad0a2b75:"49305","2417a912":"49350","8f1510f6":"49388","2019135a":"49461","49d63cc6":"49521","0d819826":"49569",e01bb6c7:"49579","8ec8c5c5":"49583","2cbb324b":"49587",b0ba51ed:"49655","2391d372":"49676",acf72eb8:"49783","5bd6f6db":"49786","3fc6d2b7":"49880","1d5cbb7b":"49991","40c88f7a":"50012","837c6843":"50095","756c7559":"50176","18dddf22":"50178",f2790563:"50183",ea981684:"50259",ec6a0daf:"50261",fc6a53b6:"50293","09a0b8d6":"50361",c59a4667:"50414",a33de290:"50428",eaebafad:"50446",a4e24d6c:"50472","313c653e":"50486","129c4e7a":"50507",c112d1b7:"50570","3fd21eb6":"50584",e964b083:"50642","75be343d":"50700","0914ee26":"50703","0d98f85b":"50747",a339c33e:"50769",b365f6bc:"50800","4251704e":"50819",aa04bdb6:"50827","8aa0dce2":"50839",e7b82dc0:"50934","4dd6f8d8":"51047","6bd6fe03":"51049",e1758f93:"51060","12aaf145":"51090","3304ac90":"51102",d366555a:"51116","5e85b509":"51170",c39359c5:"51175","90d97cfa":"51184",a06af3ed:"51229","85a6e3f4":"51237","0a8d92af":"51378",fe2deb8c:"51412","7a04b795":"51420","14515c80":"51438","65eb0274":"51494","45b02367":"51548","8447ad38":"51578","4c2a4e19":"51584",f762fff5:"51589",ba5671ab:"51636","6537c712":"51649","65d842b9":"51665","612cc46d":"51694","89bdbd96":"51711",b50c8022:"51755","9199f8bd":"51763","1bd7f091":"51769","91a39dd0":"51814","44e51e65":"51828","5c238f81":"51837","48b6c251":"51878",b5fb4df8:"51890","1d79e793":"52036","7f8ebea7":"52042",edea4b8a:"52093","95cc61bd":"52102","3498be82":"52132",d0ed28b7:"52135","81d19844":"52176","508f03f4":"52207","1562cf35":"52218",fadc68df:"52235","8ec5e058":"52250","3e088827":"52266","6818c2e9":"52267",be224150:"52282","8e1e17e5":"52286","0dd8c0ac":"52342",ab586159:"52408","2dc793da":"52450","3016c86b":"52462","8c67a0ff":"52466",cda1618e:"52478",ca57223f:"52488",f2da277e:"52563","7199ad43":"52569",a9417ee3:"52572","27f2e2a4":"52612",c4f5d8e4:"52634","2124517a":"52680","9e4087bc":"52711",c8f57d29:"52731","85afc7f5":"52770","25eae11f":"52785",ce319efa:"52826","9e1bed9d":"52840",fa2ae802:"52882","69fcecaa":"52895","4d4179b3":"52911","82c60778":"52912","4adafdbf":"52913","2f32a261":"53074","5de85215":"53132",aaf3ff15:"53170","71514a42":"53178",d670063b:"53201","79ab3378":"53237",fa713049:"53256","76a0389c":"53266",f8fe23f1:"53288","5440b68b":"53314",e2bce80a:"53449","63436e22":"53458",a45dd8f5:"53492","92f1a745":"53540","5a2d67ad":"53629",f6ef9721:"53633","6c9978fa":"53646","52ed38a1":"53670","77612fce":"53742","3a447539":"53771",e352cccc:"53786","7c8deb08":"53832",e623e42b:"53860","2a5e97be":"53861","94dd9534":"53871",e9a95c5e:"53881",a4da17e3:"53901",a8933372:"53925",d5f056f5:"53982",f72b3fe4:"53990","8c317219":"54097","93b4d825":"54106",f97d7d88:"54200","3a55b748":"54240","5ba9c4b5":"54246",e5c0ea66:"54270",f020ef51:"54272",b7bc328b:"54274","71e2c4b4":"54277","25aa47d2":"54399",c87c5e1b:"54415","0c3d0366":"54462",fb9e14c7:"54500","66193a96":"54540","633af835":"54568",d4522125:"54730",ff4fb41e:"54749","0f7d8652":"54759",a2de6851:"54851",a872c629:"54879",c46bba44:"54881","55f8cc28":"54927","0a893fdf":"54950","98bd463b":"54951","5bcffa9a":"54992","37d125cb":"55004","70d55848":"55100","152d0582":"55144",c1cb0a0b:"55167",aaa8a12d:"55206",c962ae4a:"55276",facc4cc2:"55302",ee44120f:"55342","2027fd18":"55401","342d2e6b":"55483",f7fa3381:"55526",ab685cdb:"55534","29cf75d4":"55559",c8861997:"55566","3a9c66ce":"55579",d5caed5f:"55616",a7511015:"55664",bbaa8144:"55668","069b26b8":"55754",d425e9d6:"55780","94b063ba":"55836","2cbaf53f":"55929","41adf405":"55942","194c8540":"55955",e1a6f6ca:"56028","69ef23f7":"56037",cde3e47b:"56062",c96d4604:"56087","096bca72":"56097",a7b4d0d7:"56122","602e2465":"56123","887c7539":"56133","5160d3b0":"56190",e028a908:"56256","75a12619":"56259","575869e5":"56297",fec58251:"56384",cbb5064a:"56408","858f1266":"56493","86a45dc2":"56510",c9c31477:"56560","609f9177":"56607","06eed450":"56648",beb32294:"56662","8dd3eb38":"56688","69e6c429":"56723","9a502a1c":"56725","2d57b909":"56767","6664c24a":"56779",eec5649b:"56826",ebc13825:"56916","1dbfdc18":"56948","39ed0ae4":"56974","97b1d23e":"57054","4d68fc5d":"57119","037241c6":"57141",e15f47bb:"57159","034f0308":"57165","2575da36":"57178",a2f498c0:"57182","8ee4a7d7":"57222",e3b05f38:"57245","779bba71":"57251","5e727800":"57283","55b89dea":"57302","3ed58e4a":"57326","841b525c":"57359","79cc2eba":"57361","533bed85":"57426","0b7a8a63":"57529",b20f9cb2:"57581","2b2d1be1":"57594",dd48b375:"57614","0ed7fb46":"57647","658997e4":"57730",c07b5739:"57749","73d3ccec":"57760","27b8ef72":"57762",f1691dde:"57885",e2070fcf:"58000","31fce735":"58002","2655f170":"58079",fa4b529c:"58111",a2171a4d:"58144","400deb23":"58255","078daaf7":"58259",b296abb0:"58301",cbf83637:"58351",a5e62092:"58359","15ea2a5f":"58393",ec854811:"58428","2a882da6":"58479","36d29ed8":"58484","0ba9210d":"58492",f0e5f3ed:"58581","6bd22ece":"58594",a1e59af5:"58666",a36e07dd:"58667","7fde9a4c":"58704","6b6aadc5":"58707","9ffdcfdf":"58721",b7d1b016:"58780",bec552c1:"58857","030dfd2b":"58874","52e97b50":"58880","7dd8c933":"59004","39fca8ac":"59005",a169aa70:"59009",e84457bb:"59020","11b61292":"59053",c43c6f4f:"59070",c762272b:"59104","1a20bc57":"59114","17ffd4ff":"59123","97db775f":"59262",e2b886c9:"59326","156bd387":"59349","55d26943":"59475","150f4998":"59493",b2555332:"59521",c5c8b091:"59614","70cca634":"59680",c9b0e9c8:"59702","9873f053":"59732",ab90a7b7:"59740","28553a2f":"59779","0e7c02dc":"59781","03f08ad1":"59866",b37c8625:"59873",b62e8859:"59874","888f35af":"59940","03137a3d":"59981",cc3a93a6:"60020","66eb519d":"60119","152819f0":"60167",e04f784f:"60185",a52bfe45:"60187","5c430979":"60193","5c417b7f":"60198","5c5dd48c":"60203","3fa5d64e":"60257","3d3aadb0":"60267","93d54c10":"60294","42d452f1":"60315",f83acba0:"60445","821320eb":"60510","492bd0ed":"60565","3523854b":"60613","7a82ef89":"60625","244c7b0a":"60676",d163928b:"60696","73e80d5d":"60725",e9d18558:"60762","0614dce3":"60765",c316a3d7:"60819","2df3fdca":"60830",d2436a2b:"60837",c9d25191:"60861","709e1a02":"60884","00b58b18":"60901",fe53d354:"60908","3e85731b":"60953","4d18bf1b":"60965",b1506a50:"61027","127f988d":"61114","4521c19b":"61228",a7456010:"61235","84536aab":"61265","31eb78c6":"61300",f12e5474:"61345",c90911b0:"61378",a1e3441b:"61416",b0f00280:"61481","6b206066":"61559","55b57e06":"61584","35190cab":"61627","495a3878":"61652",faa24029:"61702","4f3239be":"61721",ad2a3b86:"61734",bc80aebf:"61740",aa1329f2:"61786","14da6f38":"61844","124bf435":"61886","820ef6f8":"61950","9df3c51e":"61959",a6972a3c:"61991","5cc68a8f":"62015",f1b1ae9c:"62037","2638eb20":"62061",d2289dcb:"62111",cf1cd5da:"62120","1a4e3797":"62138","8d364c04":"62147","5955b5ee":"62149","22c027ab":"62162","0e7e04d8":"62182","1e38d1de":"62188","9b695413":"62254",cb69dde4:"62264","8041f857":"62400","856bc38c":"62431","3e9695b6":"62456",f448ea15:"62469","564f4b07":"62501",cca423c7:"62549",abfb0eb9:"62568","61b91652":"62635","0f378f0f":"62639","58728d91":"62641",fcaa2a90:"62672",d9175e87:"62691","345b88a3":"62703",f9a8c23e:"62712","1769198d":"62714","4e78ea4f":"62827",ae5c2262:"62845","07853d90":"62867",f1096413:"62875",c03ef713:"62927","7a0d5539":"62953",e5c6728d:"62957",baa95a18:"62975",b0635fce:"63005","754efc6e":"63064",d4bcf69a:"63124","93f4c2fc":"63151","29fd9202":"63181","34c77011":"63228",df8bdaca:"63262","2f1bf685":"63291","259b7e50":"63298","7dd3b2a7":"63317","60b75cbd":"63330","44bdb747":"63367","5f87f962":"63382","9780a9d6":"63387","04ea9cef":"63420","465af2b7":"63430",f30739cc:"63455",a3041c66:"63515","58f053e0":"63521","1fd2ca4a":"63553",b9795b3d:"63576","43a56d47":"63627","47298c37":"63646",f82e3d74:"63682",eadd254f:"63700","81a5dcd4":"63739",c2750739:"63779",a4974adf:"63795","95e06d9c":"63836","57e245ce":"63907","8bbbdfbb":"63951","2278c359":"63966",b81d6cb2:"63975",c47fd21a:"64045",e34c241a:"64099",f4f77456:"64184","88ed6425":"64209","192402a6":"64264","48a72e90":"64275","7c0dabe4":"64351",b65b26fc:"64391",dfa86ee4:"64442",e4307155:"64447",e9f47cd4:"64465","9c8cec5f":"64473","5d817499":"64502",dae07133:"64527","3756d209":"64535",a2a8ce40:"64577","9c273b44":"64597",e52d80fa:"64623","6ae279e9":"64659","46693c0b":"64670","1d00ec5b":"64737","2da5f59f":"64749","9a8a6b3c":"64838",e80f330c:"64899",a3fde46e:"65013",f08c8322:"65017",f04b050d:"65094",c9bcea67:"65133",d0cf31b7:"65193","2a11e6a7":"65223","0530d392":"65233",ba47c7e8:"65246","517960c0":"65350","8db42357":"65356","070df7e5":"65359",a21d3492:"65473","26115f23":"65497","8008d958":"65569","5d7f3e2f":"65611",e1ba57a0:"65625","26cbee69":"65629","75ba6401":"65647",c7850e27:"65648","329c66a5":"65658",e29a1e9b:"65727",d1be0dfb:"65745","02ff5d42":"65756","7d5633f0":"65759",fbd3de42:"65835","38147e44":"65897","587a0b3e":"65918","567cfed1":"65926","1f391b9e":"66061",fada9729:"66062",ceca85fb:"66097","331ad65a":"66135","136587f9":"66140",cf5645b0:"66162","0b7cbed9":"66169","2b53c3fa":"66210",cc9fb6c4:"66237",eee168db:"66327",dcbc8483:"66338","8fb804ed":"66372","9019bc0f":"66381",c0d2ab5d:"66394","6f47e633":"66415",cb8920e1:"66461","85e49a93":"66499",b01f49d5:"66504","79d5f27a":"66510",c6ec7d6a:"66518","83037ff5":"66524",d0550e1e:"66538",ecb74126:"66559",b0e34666:"66575","9fce9e91":"66602","5389895e":"66753",e381e7b7:"66759","62e9fea7":"66822",e1fde1ef:"66832","58b9aab4":"66867","47f8f95a":"66903","6e955522":"66912","6faab85c":"66947",ba8ea34b:"66995","1b143eab":"67044",c1050649:"67061",a7bd4aaa:"67098","27c39d7f":"67100","06073810":"67104","0d86fe8d":"67114","11235f31":"67149","9736a6b2":"67189","2d4f05ca":"67229","60cef16d":"67252","01ed4ae3":"67376",b6d7433d:"67438","814f3328":"67472","3477cc36":"67489","77139df7":"67507",d89aa357:"67545",a1a96ebc:"67581","8775fa1c":"67587",eedfeff5:"67649","47766edd":"67668",cace8592:"67683","8fb89e11":"67704","4d59e059":"67720","2c18bef5":"67729",b57b3f07:"67755","39b26ead":"67775","0a0dd03a":"67914","8aec9a60":"67954","863f8530":"68038",c1c9577e:"68043","0924bdf1":"68045",e981d05e:"68094",a148d810:"68210","3b8a31a8":"68246",e48e4dc9:"68249","89c88bb6":"68253","8ea5f648":"68304","9d05a91f":"68334","975aa772":"68434",bb6faf52:"68467",f553a3a8:"68515","9a8c2230":"68551",d81421b8:"68569",f645a9e6:"68665","0b87289b":"68685",dbf13a93:"68710","719a7d9b":"68765","14033dfb":"68770","3ac10f9a":"68839",bb1a3e9c:"68861","08299697":"68865","62cdbb35":"68910","5aa406a5":"68930",f9d38c6e:"68955",b60b94c8:"68991",ef13094f:"69017","8a752d6d":"69030","8df5dc78":"69038","4a55387a":"69129",fc384521:"69169",f0589cfc:"69199",de9d53d2:"69347","4d2a5110":"69365","5a360e6e":"69384","7ffd9a5f":"69457",fc15228a:"69501","8a4df687":"69517","4d573718":"69570",a3713279:"69588","05c96a0d":"69633","9c10cdcf":"69638","36e398ec":"69671",b1e8d27b:"69770","787caf51":"69787","615fd764":"69844",b58f381c:"69875","8e981336":"69982","0860d759":"70008",c8d1e051:"70022","73a7a1a2":"70058",b318f3b6:"70100","9f3d620b":"70117",f68988f2:"70126",dae6ce88:"70127","2f2d1edf":"70133",e04f6385:"70174",cb543535:"70179","529aff45":"70209","8367b76d":"70210",e76e0aa8:"70234","5e1c183f":"70253",aefdabf4:"70268",d2786aa3:"70399","0bbbad22":"70418",b71c2d32:"70452","8c596cb7":"70502","0bd456dc":"70551",ac5d28bd:"70560","6d5145e1":"70612",a9f446ca:"70645","0920b03b":"70649",dcc774d2:"70669","70ca6744":"70687","52be8247":"70696",cb488bcc:"70712","07338b13":"70728",ecba2f16:"70749",f3e1c72c:"70755",ac00e857:"70784",fda5ba18:"70791",c1dff2d3:"70794",c3c05d38:"70814","1d89db06":"70825","23421dc8":"70826","6763bf32":"70828",e34cf2a2:"70853","4f594038":"70870",d1fa94a6:"70947","87d75f25":"70953","16029e49":"70963","05f6486e":"71021","5e0cf2ca":"71026","9b8a5dc6":"71051","48c07d39":"71111","92f96583":"71117",af7ce5e3:"71162","131dae92":"71227","40d0141e":"71374","7380ddcc":"71407",ff761994:"71473",f89e6cd1:"71531","83c3bea7":"71565",d7e2cd1f:"71585",ed47441b:"71590",a29b4047:"71612","7ec29cb2":"71656","4a74d13d":"71715",e3aab494:"71784",d2a882d8:"71792","09138901":"71858",acec9ba2:"71863","466f5a64":"71877",f783f7a9:"71910","835d6f03":"71964","31b399ad":"72011",f0dc2560:"72043","95f36a1a":"72053","3d095b6b":"72122","8cec3a3f":"72135",cf8b2bc1:"72246","4941c7ed":"72322",f23d42f7:"72353","4419dbb7":"72358","27d3d4e0":"72446",ac84c584:"72527",bd203bf3:"72573","3336b76f":"72599",c8768069:"72634","049fd4ea":"72668",f81aef8e:"72675",eb3eed60:"72707","69f425f4":"72759","2d34e835":"72835","43b52908":"72880","491d56e0":"72907","37eca2aa":"72914",b724edf8:"72925",fca979f9:"73019",b8385eea:"73084",da144c90:"73193","33e8889e":"73264","7bd25ebf":"73276",c7f860be:"73290","8b1b48fb":"73316","97d2cbab":"73331","21838a86":"73376","681664ad":"73397","092425ad":"73472","4c26df07":"73493","5ebbf59b":"73539","73d617e8":"73540",ac6289fa:"73569","01689e9b":"73607","622b7911":"73609",edefc60b:"73624","35be90fa":"73684",c6ea0115:"73693",eb08ed44:"73741",d8415e6f:"73756","5cf43a2c":"73800","569e0588":"73841","4d015a5e":"73846","06dd3057":"73888",d721a748:"73891",d502d9c9:"73905",f4731b9a:"73940","14841d7a":"74019","9d891c91":"74027","2e6d9cc0":"74039",b7aeb8c2:"74046",ea5e46ff:"74069",da7bf323:"74121","393be207":"74134","2fd7ee6b":"74282",acf7953e:"74312","57eb6545":"74388",bc42f283:"74403","103c2fe7":"74418","3d4e54c7":"74490","111d9467":"74524","84939cad":"74588","033d3629":"74657",e6ce3bd9:"74684",a5ac74f6:"74792",ec7a5af3:"74880","43c329f5":"74902",ad848ffa:"74945","9b3f2ab9":"74961",eb5c136f:"74994","0c90e710":"75036","1c4d0413":"75043","13d28288":"75051","8df3f976":"75062",dd620de6:"75078",e2585025:"75105","9f49c871":"75106","3126d1b1":"75173","6dab9497":"75267","07deb48b":"75309","84aa8d64":"75359","847c1b9e":"75378",ceaa6e69:"75405","97c492a6":"75450","605c3775":"75459","2aa42d18":"75666","68f2aae3":"75695","1ad07866":"75696",d2250181:"75718","691ef278":"75735","217c03e5":"75759","724a4edc":"75775",ad132b09:"75805",a3541f3b:"75866",f18854fb:"75911",e01c8f09:"75919","03240ae1":"76041","20a6876f":"76163","1778a2f7":"76166",d9605822:"76215","6a3d5afb":"76235",cc7760fb:"76257","075f4b70":"76262",cb46984a:"76264","5d06256e":"76274","0d71ae17":"76285","1ed4b1ad":"76289","9267add8":"76368","594c10ba":"76530",eb0d63b4:"76641",b6f16885:"76683",a50107bb:"76719","9a68cfff":"76748",d5a221f8:"76850","2b00a752":"76854",e364f7ff:"76871",a91e6a0a:"76873",a01a15fc:"77077",bf048e24:"77088","61ee4158":"77096","62825cc3":"77123","30ae1693":"77145",ce019e24:"77174",eaf93d9c:"77183",a95aede3:"77200",fe2389d2:"77222","1aef3c3b":"77261","109d395b":"77298",c4acdd50:"77369",d0c84d34:"77391","0235a442":"77596","5ef28561":"77679","60381fc6":"77698","3a31d53f":"77749","8c3793bd":"77764",d9e41302:"77787","62e7b5b0":"77794",a52788ff:"77920","33ab05f6":"78001",c9599a77:"78037","30175d3c":"78055","90caa6a1":"78087","8df10e0f":"78159","5455ca0e":"78199","1682c6e0":"78312",c1b680b7:"78354",b1a2ea9a:"78421","28ebe10c":"78497",b7e5c092:"78512",ff4a022d:"78522","4adc4126":"78544","95365ba3":"78583","4f1d1584":"78632",b80df7ca:"78704","667a9f57":"78758","6000d05b":"78764",a7f76e11:"78787","04c3dd09":"78820","4f0afd2f":"78858","499efff2":"78876","335badf9":"78880",c8939218:"78912",f73fc2b7:"78919","73bc484b":"78926",ccd7c88f:"78985","0ee8b775":"78988","803df44c":"79039",a94703ab:"79048",cdc43a7d:"79150",c884c38e:"79157",cc426672:"79180",a2030166:"79416","120bc0be":"79474","8b7dab17":"79485","368f9c22":"79506","09b9b020":"79521","1bfbaba8":"79656","8be24c4d":"79739",fc26a5d5:"79841","619263e9":"79866",dd6ea91b:"79987","5e4ec6cd":"80018","93c339e4":"80046","587df15f":"80091","7349f9da":"80102",d38a6f54:"80198","0cc20099":"80205","45cd5638":"80259","8aabb1ce":"80260","8657657d":"80299","3c89ed52":"80310","2fd10e89":"80362","6e954188":"80375","81c96f91":"80408",abf14b6e:"80424",e1a35040:"80442","992bda30":"80457","318980ec":"80458","7080aeb9":"80491","27321f21":"80531","5cb06d06":"80557","1f97a7ff":"80598","9abd9d66":"80632","80f24550":"80649","6d70fa33":"80677","641786b9":"80744","84ac5929":"80750",fd440a88:"80772",cfdba83a:"80781","442da8c1":"80794","413bf93f":"80841",b6aee096:"80863",a7f213e3:"80947",c141421f:"80957","820b9813":"81012",f74d3bfd:"81019",c88d5fcd:"81050","104fa664":"81085",aee88ae1:"81125",f98df6cf:"81175",ddf9f187:"81188","347b93da":"81212","54e1e905":"81285","2195a7cc":"81300","12363bc4":"81319",a20f65a6:"81346",e6c5d4a7:"81390","7af33a93":"81410",ae0ec9f4:"81482","654827c2":"81530","13685ceb":"81544","15a3ce9a":"81583",ffe2a86d:"81639",a74d38f6:"81666","0d9e9c41":"81692",c75c3ca5:"81737","932d66ca":"81761",fddd2104:"81770",d3571192:"81791",b90928c1:"81795","6066240e":"81802",b3dc9cb4:"81891","29470dda":"81902",acecf23e:"81903","4b93078e":"81943","2a59c009":"81982",f9ecf61e:"81990","4a7139ae":"82012","755e7c7e":"82019",cb7dc7d1:"82242",d2c9f0b8:"82261","226eff01":"82297",b87f99cc:"82354","7345c721":"82362","5d210bb4":"82431","24f4e7d7":"82456","4393156b":"82486","0add85e5":"82553","907fc94b":"82581","4cd82028":"82588",dd0ce7a8:"82663","72e3e702":"82722","4ccba4b8":"82754",dd09cc7b:"82847","12cecbf6":"82905","2a7d5452":"82939","732a7c43":"82987",dac8839d:"83027","42174d87":"83078","686a74aa":"83089","21cd7edb":"83103","79ca5236":"83109","6060cc06":"83111",deacbd9b:"83121","10757cc8":"83127",e5cd0e7f:"83182","95126e44":"83203","828aa184":"83213",ccc49370:"83249","5c26bf07":"83260","2b6eabf2":"83273","0ba08ea0":"83316",d0f169c8:"83378",e6ccb422:"83470",c85c7bc6:"83574","19560f91":"83608","9e37e644":"83670",a8c902bd:"83700",e6fc8a9b:"83779",b6cd0ba6:"83797",f5dd5915:"83824",cc517726:"83841",c48426e8:"83849","345eb925":"83928","757c6784":"83932",e67a83cf:"83954","2bf0d1a9":"83958",e200187b:"83970","0e384e19":"83976",c17d6939:"84013","511d3e84":"84070",ed83b9b9:"84107",d2ed2b82:"84152","17d9fbbc":"84227",ddd99a22:"84232","901160ed":"84255","2ffd8514":"84259","1132d5f6":"84319","0b82d45d":"84332","8180940b":"84527","2e72ea50":"84530","2760fb69":"84563",d9a7203a:"84572","21f4f354":"84760",b738b15f:"84773","6875c492":"84813","6bd2e919":"84869",d9d878d8:"84963",ae42df76:"85014",ec2ed6e2:"85095","7c86d680":"85097",ab380486:"85105","0cf3b0b8":"85205","8beefa16":"85209","78c968cb":"85243",ffec2b37:"85257","8f4a15da":"85279",c9ff545e:"85322","813f53ba":"85358","2f6614a5":"85442",de5aeda1:"85453","2c88985c":"85537","8f9bc413":"85581","24e645af":"85588","0e8c3a89":"85736",a4a3eadf:"85796","3e226f70":"85806",d40aab8b:"85817",ddb0149a:"85896","41639dad":"85899","716f14d9":"85917","5268c144":"85960","5733876a":"85973","83b6afd8":"85997",ae271c01:"86053","199e6876":"86074","677325f0":"86121",fb03d32d:"86129","1f8198a4":"86167","95ee2976":"86215",abe1b280:"86216","7a2c4c43":"86246",d630316d:"86354","669193a7":"86417",d5f51703:"86434","2a1b9f9a":"86478","3a311bb0":"86480",f4e1ab69:"86501",b76e61dd:"86586","0e0dfb6a":"86597","49bbb99a":"86623","7ff6577b":"86659","927f97a3":"86669","58421c87":"86685",b0445ba0:"86807","5626901c":"86829","57ec2762":"86846",c942990c:"86856","5687c7cb":"86888","319b6f13":"86890","869411c7":"86914","7a06eb83":"86939",d2a66e94:"86992",b62a4e5f:"87004","40df2769":"87087","4eec7d8d":"87159","4462c0cc":"87184","767cce31":"87186",bad31f72:"87205","9c71777e":"87217","33ac18ed":"87269",c884ad6a:"87282",c4f2c374:"87377",cd08112a:"87407","0b425eb3":"87432","33bf4676":"87456",b8f2cc13:"87459",baf4021b:"87473",d5762a9f:"87483","643da015":"87485",e29c32f4:"87547",d2b2e5aa:"87589","7c29a585":"87614","137db567":"87688","3f1a4665":"87747","6f831635":"87781","4194f325":"87863","01f93a4b":"87875",f553a7ec:"87880",fc17862c:"87905","5b17955f":"87945",dc4ee1bb:"87971","85f9f5a6":"87995","72a68b3b":"87996",a5f4f54c:"88047",ca3d464c:"88111","2e05ee79":"88163",b8fd1a8c:"88222",ed990644:"88248","85e50ec2":"88298","0169a509":"88310",fbfb0bb0:"88327","3cf947bf":"88393","5ae50f21":"88394","078339bb":"88399",a13618bc:"88436","40e4b7d4":"88441",bf79ed6f:"88468","23a811a2":"88478",d3f32089:"88522","2283659c":"88547","5871fbee":"88622","6e8a38ea":"88626","6dc022b8":"88654","6be5dbf9":"88696",b330ac5c:"88775","71cde98c":"88815",d3065e4e:"88817",b0b71a2a:"88821","014c2cb9":"88847","508d741f":"88852","5edce1ad":"88855",d15e98db:"88865","568a0660":"88903","7b658d8e":"88986","2c9ce68e":"89018",fc93a2ea:"89093","24f450eb":"89097",adb96665:"89172","9f15c6e7":"89175","9b191135":"89210",d8e6b3db:"89289","324cb577":"89338",b919dab0:"89353",cb2f16be:"89362","39ac0d5b":"89402","9ed26de9":"89415",ce1709a8:"89437","978ca64f":"89455","145c1cc4":"89489","7ff4234e":"89554","2709984f":"89610",cde9af88:"89641","837dc7e4":"89696","084a80b5":"89801","9bfa1541":"89810","36994c47":"89858","65f8c8fd":"89873",e582f766:"89986",bfb3b697:"90066","7e60f0fb":"90071",dbe2cfea:"90110","1026ad00":"90115","8abd7194":"90135","9db841c0":"90214","7b773c92":"90257",a80ed580:"90280",b3abe364:"90317",c633f93f:"90378",ed2667fa:"90414","9947fe09":"90416",fe49dcfb:"90438","6157713d":"90513","32eb34e5":"90562","99144b30":"90593","2563c97b":"90598","73554d19":"90625",bfa9eb5d:"90627",fff1effb:"90717","48dc1693":"90749",e96ddf11:"90831","837010ac":"90842","0058b4c6":"90849",e03c6723:"90910","271ea2f9":"90950","70e8710e":"90972","466375b7":"91025","42003ca2":"91058","014625f4":"91109","3629c812":"91187",ece3ee5e:"91203",f657ed9f:"91257",af1525aa:"91305","0f84f33f":"91319",d1980a1b:"91333","88f66091":"91359",ae3304ee:"91405","284c57b4":"91428","7118d0f0":"91530","980d0b86":"91540","8614d32b":"91581","1fecd571":"91587",e33cf622:"91597","7907a033":"91621","6033c607":"91695","9964550a":"91724",df99aa82:"91787","41ca93cc":"91844",b7201a27:"91895","72fdaa88":"91916","8ce0215f":"91993","0ce689e1":"92018",e2c3948d:"92031","6342cf5e":"92105","4cce6e5a":"92125","56a0d755":"92196",e772c536:"92223",bef29d9e:"92241","85fe7d70":"92273","4a4c6752":"92329","4c434b32":"92410",d888d821:"92412","1be20fdf":"92475",b6eb7220:"92535",e53ee22f:"92544",efa442c3:"92653","7c1d6f5a":"92664","9dfaf941":"92673","3e082aad":"92955",adfd3bc1:"93057",b5ea0533:"93085",fed5be48:"93166","2ed2a721":"93206","47b26a6d":"93209",e55ca189:"93210",b12147a6:"93269",cf32db66:"93273",aba187b8:"93341","2357dc71":"93361","7a234181":"93362",f5e9d1c4:"93438",a9c52207:"93534",d9e43198:"93546","44c6f0c9":"93602",e1847ef7:"93636",f179621d:"93795","09bacf3b":"93849","0a07ac32":"93854",c3c082a1:"93884","45a5cd1f":"94000",ee71d619:"94065","8c0fb9c6":"94082",beceb38b:"94091",acddd5ca:"94106","6ee6a410":"94153",c6b4dc09:"94168",f0cc57e7:"94227","824e6f8c":"94251","00f9d3c8":"94314","8b44df1d":"94344","657bf45c":"94361","85c8b6c7":"94417","13feb7a8":"94538","8e7aaae8":"94555",a1e44e64:"94561","745d4b8c":"94568","0a02a2d0":"94625","30549b42":"94646","50774ec6":"94648","8520f5db":"94685","0c2c2d88":"94711","6dfe2e3e":"94713",c26e67a5:"94788","256701a3":"94796",a1282170:"94841","3e1f4a39":"94843",fc66001f:"94863","95ec5604":"94864",bb63d03e:"94910",e8b41ff0:"94925","98700a51":"94926","5fc8caff":"94980","8d65e26f":"94997","63c4b13e":"95020","4b69979c":"95058","10ac9a3e":"95078","818bb2cd":"95093",c0df5757:"95136",cdb727d9:"95159",f58814fb:"95183","1cb0fe52":"95231",b4030b00:"95240",ed211a79:"95245","9b4185c1":"95330","52910a8f":"95427",e1afbf8c:"95443","8a40ff6b":"95470","5917c028":"95542","9a8fdb53":"95605","188015be":"95641","4885c521":"95649","30d4e84f":"95659","89ce4ba3":"95768","8c79a60d":"95785",dbea5ca6:"95818","9e488927":"95909",accd2b0e:"95911",cbc2448c:"95912","5180e398":"96022",eb84cef2:"96086",a267572b:"96155","838df61f":"96225","380e17bf":"96239","638db053":"96268","82a7c68f":"96276","65d1ec04":"96325",ddd9290b:"96463","1b260ed9":"96470",d4083900:"96555","5b0025cd":"96652","8c42b153":"96693","4f748135":"96745",a98ffe6a:"96771","181eb1b5":"96778",c3c125b1:"96793",d527c17c:"96881","7ab01152":"97006",e9032a0d:"97033","763a8986":"97047","9331da7d":"97107","32bb5bcb":"97114","9d2e74da":"97123","20a30ea0":"97167","1b3061f3":"97189","7fa05810":"97223","365a7fd7":"97246","1a8a162f":"97253","205cdcf8":"97296",c2a473ad:"97342","76276d52":"97358","3bfbd79c":"97379","224c7e3e":"97420",ba47c136:"97424",b93a682d:"97476","3a6c6e5b":"97536","6ccd70b6":"97554","3d08e0be":"97562","8e81e342":"97585",facb0528:"97664","1dba1ecf":"97670",b58e88de:"97732","8fa9d00b":"97737","41b1becf":"97753","7d2fd416":"97763","97a057b3":"97821",e5562b89:"97829","47edbc34":"97863","26ec8ae2":"97887",ab8b4014:"97895",bf7dfc7c:"97901",ff509459:"97905","1e228808":"97913","350cc719":"98012","139d61ea":"98021","95f25ea6":"98030",fbb50b04:"98058","75dbe45b":"98059",b18455bc:"98087","48f67822":"98094",a2219ebb:"98139",fc46979d:"98147",c8e5bf38:"98165","3539b92c":"98237",f62bafa2:"98271","756094a5":"98308","9e297776":"98311","1c3a958e":"98392",b943b6ea:"98425","94dcd3de":"98473",ea6f04d4:"98477","6065ad54":"98534","99e64d04":"98700","19bfb940":"98750",af6e9729:"98758","3314c9d3":"98761",a48978f5:"98779",bf667688:"98804","3e8495a1":"98867",b4e94af8:"98908",ab37b32f:"98925","5de60d34":"98935",c9ba7c72:"98941",ef00b8a0:"98947",e8178b53:"98982","82a5d7f7":"99001","1c27379d":"99095","210305d4":"99146","8e563661":"99151","3047f3e7":"99252",c14fcab2:"99254","8944e56a":"99299",bdecca0c:"99306",b3e98411:"99330",df09200e:"99335","5ffb8f23":"99437",c0684476:"99451","2263a65b":"99502","76af5d51":"99504","16e939a3":"99528","8c2cbe8e":"99531",c49eb59b:"99534","25c655c3":"99543","9cc8ffa2":"99611",bfbfac54:"99644","25e15e7c":"99678","5a4dd75d":"99701","5fb14ca8":"99705",dc330c71:"99709","6e34d00c":"99710",f4a839f6:"99746",a32c0324:"99747","8e34a11f":"99872","2f7d15c4":"99905","4b2e4980":"99987"}[e]||e,r.p+r.u(e)},(()=>{var e={45354:0,71869:0};r.f.j=(a,f)=>{var c=r.o(e,a)?e[a]:void 0;if(0!==c)if(c)f.push(c[2]);else if(/^(45354|71869)$/.test(a))e[a]=0;else{var b=new Promise(((f,b)=>c=e[a]=[f,b]));f.push(c[2]=b);var d=r.p+r.u(a),t=new Error;r.l(d,(f=>{if(r.o(e,a)&&(0!==(c=e[a])&&(e[a]=void 0),c)){var b=f&&("load"===f.type?"missing":f.type),d=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+b+": "+d+")",t.name="ChunkLoadError",t.type=b,t.request=d,c[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var c,b,d=f[0],t=f[1],o=f[2],n=0;if(d.some((a=>0!==e[a]))){for(c in t)r.o(t,c)&&(r.m[c]=t[c]);if(o)var i=o(r)}for(a&&a(f);n{"use strict";var e,a,f,c,b,d={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return d[e].call(f.exports,f,f.exports,r),f.exports}r.m=d,e=[],r.O=(a,f,c,b)=>{if(!f){var d=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[f,c,b]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var d={};a=a||[null,f({}),f([]),f(f)];for(var t=2&c&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,r.d(b,d),b},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({16:"0583dad8",25:"a33c645e",28:"0da1f28a",39:"a978e5ab",48:"a674d2f7",60:"e9bd6ef2",67:"56169fa6",106:"6c6aeb2d",129:"275b5c51",159:"af8190e8",217:"b1f77b90",278:"a1a7cea0",292:"fcc9c1b0",323:"be9655ff",335:"43d16b11",354:"0b4da2f0",387:"19ac452e",437:"a168e2e0",569:"b4a99b76",614:"0a87a91b",805:"5c109a5d",822:"79cc09db",851:"8b10f6da",878:"e9038c17",910:"ce3da75c",917:"02b5547e",924:"9699c87d",940:"0c459987",1103:"4b935b7f",1107:"060b2af9",1119:"e3b4090c",1136:"ae09e9a1",1190:"b0127f30",1251:"ea1c8f1c",1284:"62a07427",1337:"9cab4fb3",1360:"eb8e7dea",1422:"562c897e",1442:"50f3bb83",1506:"4b25608f",1517:"da868c82",1550:"8425e24c",1635:"73c8d421",1656:"cc5200ca",1658:"7a51e13d",1784:"89dd9b54",1785:"269ce614",1791:"4b2ed2d0",1841:"92bb01f4",1846:"9f349e0c",1857:"d032d8fc",1882:"c28fec2b",1928:"6e47a3c2",1946:"45b94beb",1955:"7fbadf7c",1983:"b93dc3c9",2016:"3c15683d",2053:"7a3be72c",2121:"fdb4abad",2172:"ef5805c5",2214:"32aa7863",2225:"9781112c",2239:"2b154460",2256:"31863783",2262:"7d9ec3a3",2298:"d2a01f74",2385:"fb4f9065",2450:"3b3f1ad3",2472:"1b7e3feb",2540:"e8b490f7",2577:"b9e56da2",2638:"372d2263",2640:"dba6e014",2652:"9ed88412",2663:"9d0312da",2679:"7e9327af",2700:"5e58268b",2739:"4c5bb0e3",2748:"7c87f31d",2759:"d28b7dcd",2768:"ad32f2e8",2772:"48f24bab",2791:"ba2305d7",2839:"00cd9d46",2854:"093ec6b1",2867:"c03096de",2884:"8539bc43",2912:"404a423b",2932:"580eda40",2954:"6e7eafb1",3075:"a80470ee",3125:"32dcc326",3131:"d29911ee",3137:"4f7cd6bb",3144:"aed1d196",3179:"5c3bdea9",3303:"6be904db",3313:"a3e90044",3323:"b9073401",3471:"1c4da86a",3558:"7fb3fac1",3693:"b783cafb",3694:"5e85aa31",3722:"50cd3db4",3740:"dc1f5b39",3764:"394bb252",3847:"43d31177",3940:"260d7fd0",3965:"d18b6106",3968:"50494a26",4014:"c943b655",4028:"04ae9608",4040:"b4ced939",4060:"0bf991f2",4074:"817ed3cf",4117:"d772531a",4133:"b18f8924",4137:"1a47b5e7",4205:"0c12eeea",4269:"18ffe98c",4355:"1497bce1",4368:"25fe5fdb",4382:"56471e5f",4405:"1dcf0194",4467:"ff5a6f64",4514:"3e8d408e",4530:"1cb4ff83",4574:"d9f219f0",4591:"405284b3",4602:"9920fffc",4777:"43d0cc21",4790:"3b6474f3",4863:"a0c4b68b",4890:"7c52b6f4",4919:"4929a6fa",4949:"066b815f",4980:"006c64a3",5008:"6880fe95",5028:"f5c507c6",5029:"ca8c3af7",5065:"25ed107d",5193:"d0ff2798",5195:"8c7f4a45",5206:"4b9df2bb",5269:"627b1f39",5270:"6ff0c558",5289:"b3a451d2",5295:"bbc3d059",5304:"44fefb3e",5322:"22b4f68c",5334:"86642e8b",5338:"0e11b6db",5594:"0c74166d",5622:"fb863cab",5631:"32ba6a4c",5633:"a804bb8e",5647:"d03e0408",5679:"58c4a37c",5721:"42bda306",5806:"1adb4ab6",5834:"6a34bd67",5887:"b5960565",5888:"478a7123",5936:"4959f63e",6022:"959a592e",6054:"87c914ef",6090:"384f1d9f",6158:"0d706529",6170:"14ed99c2",6203:"0ba05648",6225:"baed6a8a",6289:"59ba4d58",6310:"14a73a68",6350:"ce3c8465",6368:"207e0bd3",6371:"4658250f",6372:"5c865244",6407:"47ddb104",6467:"3faff22d",6475:"316bb886",6552:"ae59a273",6559:"21b16c5b",6636:"f6a1f09d",6677:"ea2cf37a",6692:"0cca5757",6697:"17ace3c3",6709:"debf2b54",6739:"01ceb854",6761:"507d925b",6778:"9cb5abfe",6791:"ae0384e2",6823:"4f684eef",6897:"b52407fb",6930:"ac385e9e",6944:"52f660a4",7035:"e841f655",7071:"6e78b29b",7100:"e7c12d1f",7103:"9d67d055",7125:"b744ccc8",7167:"bfd461a8",7317:"b1b9fe16",7355:"96f48bd9",7444:"502758cc",7458:"8fdc7f76",7517:"4abd5d51",7566:"12a626af",7622:"9df106ad",7629:"2a74f6a7",7715:"06a1e3b2",7734:"d6b46894",7747:"79a2ad2d",7773:"869d1599",7802:"deab0229",7850:"68c81474",7907:"7ba20019",7953:"df4b657d",8003:"f85e4dd8",8070:"0480b142",8139:"addb1e87",8174:"464278e7",8177:"38122bdb",8183:"c7a3e7d6",8192:"934057b1",8209:"01a85c17",8289:"c286af15",8348:"09ff3d76",8354:"db9fbbab",8363:"24179e00",8367:"abd23114",8407:"7a049829",8413:"cd17745a",8417:"bbced460",8585:"497095d8",8619:"15c2f51a",8632:"22351c69",8645:"212a125d",8651:"80bd773e",8699:"8f08e203",8762:"1cd42d14",8766:"7a11cfa3",8840:"e161c803",8888:"3a6a48c9",8889:"effd3c61",8900:"eebb3a9f",8902:"dc8afb47",8965:"b6e28713",8978:"6d5644d6",9003:"91415840",9045:"7c9ee56f",9066:"4c492fb9",9076:"52b6ceb8",9127:"29c12ff9",9152:"17666b14",9189:"d4eb85a9",9195:"b2d2727d",9228:"d336ca2e",9257:"0687df23",9262:"29a0dcae",9351:"4c14260d",9379:"7fd1d1a0",9380:"409e52b6",9385:"8ea09047",9428:"cfb1206c",9432:"8cd4ff44",9446:"49b92117",9458:"762ed4b3",9460:"01964c8d",9471:"ebf12a38",9499:"953153ea",9516:"2fec12c7",9525:"bf1307fc",9570:"8eea179e",9573:"13ab27aa",9631:"79e67a34",9647:"5e95c892",9650:"747973bc",9676:"e4d28161",9702:"a0d28f55",9722:"c35662b8",9724:"46e7f252",9737:"0d37dd31",9790:"6a0b8fcc",9836:"2fd2285d",9860:"d6d00b14",9870:"36e3724e",9891:"8a5cd0c4",9907:"9c0f572d",9914:"06b7dbb6",9944:"9ee88b57",9986:"c782ecef",10030:"c2277200",10118:"f89af623",10181:"f7519df0",10198:"ce5d6b55",10238:"0eb44ec6",10285:"b69fdc1c",10354:"8c29db87",10472:"0ca8e4c5",10488:"dc8e8e39",10492:"40011a75",10535:"79c374cf",10545:"1ca50c03",10610:"b1051fbd",10637:"6a326c1d",10642:"936cf648",10653:"5bf02344",10688:"f71afd42",10727:"f53cf472",10767:"931768b8",10789:"10fb8f29",10884:"9009d9a7",10887:"ac65ed35",10907:"b964b0d3",10920:"42746bb6",10924:"f0c78ca3",10956:"726b1d2e",10978:"90db14b9",11052:"9f1f18ec",11058:"7c44e50a",11111:"2750cc84",11156:"f97de939",11275:"2e961a80",11289:"82b971d3",11299:"ac338f84",11326:"f9cb0cea",11355:"6ed20719",11508:"039c7621",11565:"3d026c66",11631:"d2a270f8",11684:"9aee6bed",11716:"8fa68fae",11725:"51e360fd",11745:"446810fe",11768:"4cc89b71",11782:"3f65fb56",11795:"43ff550e",11804:"b9168984",11806:"7cb0ba19",11842:"f630dd79",11855:"51e592eb",11869:"43c57b15",11905:"41b6dd58",11906:"757b41cf",11977:"608a85b6",12047:"d25544dd",12134:"088c57bd",12144:"5617941b",12186:"3deb4153",12316:"77a5f3f8",12318:"9b28f794",12378:"2592f25d",12393:"7d05d2dd",12395:"a0fb693a",12431:"61c30610",12452:"f4a568da",12477:"ac9a039d",12485:"3e8ec4bd",12513:"70570476",12535:"2ca30cc7",12542:"0bce5bfd",12608:"ae632d28",12613:"bb6acec0",12654:"98af85a1",12679:"755aa830",12686:"f81e2128",12763:"0166538a",12869:"236efcfc",12945:"bc561320",12995:"72ed5e19",13021:"9b078b3d",13060:"075d0b63",13063:"6695bce8",13152:"4d01f822",13203:"a5fd3751",13210:"326f3c2b",13236:"814487fc",13298:"be65306b",13321:"bb230ab4",13366:"c7690f1a",13374:"0c9b8a46",13375:"15be7f5e",13406:"cdd81d53",13419:"05f125a2",13465:"f7887fd4",13511:"3f9b0969",13514:"35f2b245",13522:"559e18a5",13525:"aeb9cb2b",13534:"a221d960",13535:"27aec4ea",13575:"1b3749bd",13580:"b7ffc82e",13626:"16444e78",13698:"e32c93f6",13733:"e4126631",13762:"35ace877",13803:"5005f1cd",13849:"fdf3b0ba",13918:"a586ac12",13943:"79c522c5",13982:"f4dd7c05",13996:"bb5bef2a",14003:"fe0a5e13",14027:"4fe2812d",14042:"6c6eb236",14043:"2da40935",14125:"c58d5881",14134:"88677a17",14136:"5ba7f3a0",14152:"0c792305",14163:"79f5ed7e",14179:"0466f8a1",14257:"973a6c2e",14259:"4d62164b",14261:"881e0310",14264:"15b03510",14317:"2d2f3863",14340:"02704d8d",14363:"33732613",14388:"4330e2c5",14399:"95a29cbe",14410:"262f048a",14433:"5a1ac6cd",14435:"a2218d2d",14496:"0dc66419",14536:"b812e3a7",14599:"04287605",14627:"6b0d4b59",14726:"cb290368",14750:"8049dc2a",14802:"4193b389",14822:"da9a6aef",14835:"3145e86d",14868:"9c9e6d14",14871:"281df6d1",14917:"b2f79aaf",14919:"68aea991",14943:"b634826e",15038:"e8bf575a",15078:"6773b5f7",15079:"461201e5",15144:"e6691bac",15165:"29fcaeb8",15186:"809a1b46",15220:"e0719818",15235:"246d116d",15272:"ee5dc595",15292:"7bd6096e",15316:"a0583d0f",15403:"bbbd3731",15407:"413b2e2c",15427:"63067f40",15473:"ad07d5ed",15501:"259868d4",15552:"1ff337bc",15607:"a309ba1a",15764:"0d11ee2a",15805:"65df1ffd",15857:"520bf372",15917:"04d2875d",15947:"f05cb9af",15955:"1ea67680",16017:"777c5b61",16032:"7f5a2db2",16100:"5685cb00",16209:"f0db470e",16231:"d05ef008",16319:"1839a246",16377:"8eca1d9c",16499:"58c0e7a1",16500:"b5eb2b1f",16622:"3d8e248c",16641:"4ccf094c",16747:"ab84da8d",16885:"7c3644b1",16942:"426a3c0f",16950:"bd7a3684",17009:"a3848d24",17033:"30e67995",17115:"3687929f",17119:"87557f51",17232:"bc36781c",17294:"82fc01c6",17332:"b4762a45",17368:"de821e02",17402:"b629aa71",17411:"496a5e3a",17441:"c5c8072f",17474:"f7750a15",17502:"dddd9631",17508:"80e60ab1",17530:"8c212f85",17581:"46e89fee",17626:"47f3a505",17681:"a2af438a",17709:"89514438",17739:"b1e22259",17805:"bc4a985b",17818:"2d9024ae",17860:"7cfc22c1",17867:"9130943e",17944:"36f96221",17987:"f67021ea",17988:"a3255c75",18006:"059d2658",18033:"c1fa975f",18103:"7707ed5e",18121:"3a2db09e",18146:"c15d9823",18350:"889bcd45",18351:"670426f7",18401:"17896441",18438:"7eea383c",18445:"762cb2d4",18520:"905fdac9",18620:"1bdcf2af",18645:"e798c07e",18738:"3b375bfc",18757:"10b6d210",18798:"6c76cc4e",18940:"6cc2587c",18950:"d75d009b",18998:"7487c019",19042:"378587af",19052:"6e547e58",19070:"6f878c05",19108:"6f3d983d",19109:"868e6cc1",19136:"9c3fccaa",19237:"e77e0240",19252:"d9884433",19267:"1354c4fd",19271:"345a8726",19369:"a2cfe627",19387:"9228ff94",19396:"c61ed569",19425:"efd9e5ca",19428:"4b6ad6c1",19474:"a3c850e8",19513:"3faa4dcb",19521:"7f5a4e86",19542:"3548485f",19664:"76b52ed8",19687:"547af68c",19711:"0e4a3360",19736:"9e46f997",19774:"3c6c92ad",19798:"83c71362",19801:"a5052667",19865:"7e53000f",19891:"389b06c3",19999:"99bce14a",20038:"0ef00d46",20103:"430ee71a",20160:"ecc82a52",20194:"69fce7d3",20229:"5aae4c30",20286:"f60a8e85",20325:"6b7b009f",20358:"a55cf427",20361:"784d2d5b",20405:"a170c4b2",20415:"839320c8",20424:"c97a4f9f",20434:"39c0c867",20491:"4c056f0f",20535:"ca16b0fe",20541:"2925f13d",20619:"eae39fd7",20676:"874c4928",20713:"ff781369",20812:"a827f20e",20857:"bd440596",20892:"1d99c39c",20924:"92328698",20931:"de69fdc1",20951:"5ef30e9e",21070:"e3b4fd8a",21077:"7ff678ac",21121:"c1b7702d",21177:"574aa417",21191:"53798754",21273:"58f98693",21275:"e737da10",21290:"fab95ca2",21303:"e4bea80c",21316:"266d37b9",21341:"b23dd436",21346:"b2c62a3d",21373:"50737734",21401:"5105c354",21417:"9db9c0e0",21448:"995d9cd2",21482:"5f404bc7",21524:"69f9ca18",21560:"6c888f35",21574:"263bc6da",21585:"d17a9646",21630:"aad02470",21635:"6224d640",21662:"b1722c22",21729:"ea9d899a",21764:"df2a910d",21805:"1926d3d7",21816:"fe2d6fd6",21837:"7ce47929",21874:"a54a9a31",21909:"d3de5519",21921:"a8a7f86a",22141:"625beb64",22313:"334d7764",22369:"83a16324",22385:"9a5e9795",22428:"47425d5b",22447:"f93d9ca9",22472:"494588b9",22483:"95d688dd",22499:"2923e8f3",22501:"ff15e2eb",22504:"61773850",22534:"6f37f43d",22595:"ca5d6ba8",22628:"a36f1f19",22640:"69375b61",22647:"c760fa6a",22673:"c699b29d",22709:"74c5eee6",22750:"f701b058",22816:"70db0e3d",22844:"d6ededeb",22911:"9a29e675",22916:"d49fdba3",22932:"0d5f3865",22973:"70a32eac",23002:"1fd06df8",23041:"07da43c6",23081:"ef1c4348",23083:"7050405a",23119:"39307ee6",23141:"a1c39b3f",23172:"b994507e",23332:"fe86f3f9",23388:"fa5f4abf",23438:"95d97af4",23475:"fdeab78a",23547:"a67ef186",23563:"f24f712d",23591:"53746e73",23600:"af9b00f1",23625:"996abb7f",23634:"59e9dc06",23637:"9c150758",23641:"35313843",23666:"cb16b650",23676:"d235b83f",23700:"ea8366f8",23765:"fac8c34b",23773:"2153fb85",23880:"3affb2e4",23938:"be354741",23998:"afe4349e",24022:"9c7497bb",24065:"5ef1cef9",24084:"4ed60a8a",24098:"89ad6a53",24126:"897856d4",24140:"5ce7213e",24172:"1d2c1565",24234:"3af3061a",24265:"7ebf6f1e",24340:"a4e075be",24366:"99d3870c",24373:"5cbd92da",24377:"b5b376a0",24381:"4066930f",24437:"77b23935",24475:"045bd6f5",24476:"6cf93e89",24704:"3befffe2",24728:"91c64349",24729:"931beacc",24741:"e2c09daf",24776:"a852ca5b",24815:"a68f650d",24826:"ed6ec893",24853:"7cfd7c3a",24866:"e0c51b98",24867:"b4972e92",24868:"c6301cab",24891:"f0709bee",24912:"8e01a36e",24919:"cf6129a8",24932:"51fff4d3",24970:"231cac3a",25013:"1e3d98df",25044:"9cd11b72",25067:"9531441e",25101:"8bd2257d",25130:"b277530c",25186:"96046d19",25273:"19531bab",25285:"1da16fcf",25335:"537936fe",25396:"d78b8cbc",25397:"4083b748",25426:"b973fe72",25452:"5ef8e026",25531:"af5c68f9",25532:"40ebd41e",25539:"7fb09d55",25578:"c7382291",25582:"65603bfa",25601:"7205cbcf",25778:"d56bdeaf",25781:"ba115cad",25845:"d2c3f17d",25869:"6d1cdd35",25871:"c9953bfc",25874:"17268e53",25959:"f7f19049",25987:"1645b95d",25993:"92db1d5a",26003:"90c5833e",26009:"20f9256f",26060:"7662a79c",26064:"2316ae30",26081:"de97f7b0",26183:"fd6c914a",26216:"4e3e1e17",26260:"477cc2f7",26305:"878dce9b",26333:"9579dcb9",26337:"65009e94",26414:"14fd0d1c",26548:"9a5789a7",26577:"8eca70a5",26627:"8353278b",26630:"ba839983",26632:"960d3eb8",26722:"1802ae9e",26724:"78bc6f25",26744:"21e535c3",26797:"4681e75f",26833:"e2fe7a08",26859:"04fb6378",26882:"958a296c",26900:"b3749361",27012:"aca5eee4",27020:"58714c61",27088:"1547c10f",27115:"e37692b4",27123:"c4d1e829",27179:"cbec0238",27212:"ce710151",27369:"f52b34fb",27388:"f7e205e5",27398:"a3983124",27444:"7a3be7e3",27473:"31ed8f07",27663:"9f8f3c52",27737:"6d701be3",27823:"f95764fc",27887:"b0d5c266",27921:"10ccea9f",27955:"2e7e1134",27995:"ee4b8f19",28020:"ecd026d3",28086:"2cc67ca6",28127:"859500dc",28147:"abde445c",28166:"8120957a",28169:"513b54fb",28178:"9adef974",28204:"758b9bc9",28235:"20a81622",28252:"b8d3e47d",28319:"ec410c33",28410:"89cbd1b8",28428:"b212a261",28435:"5b374304",28499:"261fe657",28627:"54ad050e",28679:"0871002b",28687:"ab48a39f",28701:"c3856c66",28782:"fd5c5192",28793:"379ac6de",28803:"8b6fbbb4",28834:"7ed2bc06",28853:"4c00d6b9",28889:"2a0b5233",28920:"e7ef6e16",28941:"8c5b1685",28945:"f382fc88",28993:"8e7128cd",29060:"9c7a2f87",29123:"763fa02a",29171:"6f3c73f2",29204:"d4836e14",29243:"d330b699",29337:"8a472aba",29408:"fbce6636",29414:"b92135a6",29421:"163a1bae",29452:"13171783",29457:"e4d4ec4e",29498:"da05f515",29523:"b2f58160",29526:"b45a54e9",29653:"13f72d6c",29679:"6e0a413f",29690:"b1633424",29698:"a642dcef",29708:"80b93830",29733:"da10e58f",29795:"e6557239",29820:"16381f20",29829:"d973177d",29845:"5d94dea0",29891:"26f5f607",29922:"5397b577",29950:"5de1c39a",29969:"332b14e0",30035:"87546ad3",30066:"6b836ac4",30154:"339988c0",30167:"22bf7f69",30262:"5320ed26",30265:"132be4b3",30317:"af953e30",30355:"4b678e99",30378:"5c5d3a2d",30396:"e4a43002",30410:"90ffbe81",30564:"407230da",30569:"c7165ecb",30579:"1ee0a129",30583:"775c5b43",30628:"6ee9522e",30654:"5d70257a",30790:"a7c3ebee",30827:"5814834c",30831:"ced554c7",30842:"d8412727",30848:"677757ca",30934:"44c28e7f",31004:"7dea1595",31016:"416fb909",31039:"71d5b1f8",31047:"3f9a993f",31125:"c3c8ddc4",31141:"be9442ac",31144:"fbf25af7",31220:"b8ab477f",31255:"5c81ce12",31257:"67f1ea1e",31272:"fa366c46",31393:"07f6d4d1",31465:"cc564cf4",31541:"1668cad9",31544:"c602d51d",31567:"8c4bf82a",31680:"b38306ed",31705:"05957343",31720:"0a70c05a",31726:"624fba40",31749:"974bc2fa",31791:"04eab06f",31797:"14a26e2a",31861:"a14af959",31862:"c791a767",31869:"2dcd9099",31957:"2e31e40f",31972:"4ef864ee",31996:"8dbbcff6",32005:"f0dc0726",32012:"9ba9284f",32039:"116b7e55",32183:"5110a7b7",32225:"eb05a324",32270:"53ba3577",32278:"149a2d9e",32335:"f9a4941d",32365:"fe345ee5",32391:"e1407f5b",32472:"c08ba4cb",32527:"e6c2d44b",32558:"40c3731f",32691:"798484e3",32728:"1b520177",32824:"943ce597",32825:"fdddbf66",32847:"8590fd3e",32875:"65511420",32949:"43764587",32960:"225cc45a",32993:"604cd7c5",33049:"97e51b1f",33065:"a172f6b1",33192:"ee003a92",33214:"2a422024",33234:"465994bd",33290:"7da68ccc",33303:"f5ff1a23",33350:"2d0c5b52",33458:"c16e0158",33517:"3ed70074",33524:"f81c13fc",33533:"65ea2434",33540:"fe7ac0b7",33559:"8f00bf20",33567:"6075be34",33572:"269d704a",33577:"df68b7b1",33612:"3f933ca5",33621:"33241236",33638:"d294bdb0",33643:"da7149d8",33659:"81a6b262",33724:"755872dc",33804:"1b31aebb",33806:"07399e71",33816:"45f2496e",33825:"f8a443f2",33854:"06758c2b",33881:"a7690409",33889:"e9c7c2b7",33999:"49aa1a16",34127:"18b5779a",34156:"f5c63bac",34179:"3f4396e6",34182:"80f4f5b6",34196:"13e6af21",34255:"e8a8dea2",34331:"164e61b9",34335:"6153f283",34388:"79fbf53e",34520:"538371ec",34528:"b038a3ec",34543:"782eae4d",34549:"0735e5be",34597:"40cd51eb",34621:"f30fab6f",34638:"852f3aa7",34662:"ef071c32",34691:"02e54e09",34706:"47a1bde9",34750:"a5fea1bd",34803:"e076fc92",34808:"2e6ef254",34810:"924dcf98",34837:"10fcd509",34847:"dc7f8f8b",34877:"f7702246",34904:"f44e1bcd",34918:"c9cac9d9",34970:"40dc6b06",35044:"5e2f1fff",35067:"47cb0ede",35088:"35788c78",35139:"6fe5390f",35144:"83829ea7",35179:"372475fb",35248:"2947aa63",35288:"0f3b9f0c",35325:"d42065ad",35329:"a7827f50",35379:"d9454955",35402:"976ab233",35532:"388d5845",35618:"97bb73fe",35730:"2b4cfa56",35733:"8fc868c2",35742:"aba21aa0",35766:"ff6f6072",35767:"3019fa66",35784:"d240c26d",35837:"dd61deac",35881:"8852ad6f",35922:"92928c02",35932:"a3142532",35960:"dfa4e294",35983:"b5a599e0",36009:"04afe417",36055:"59be0e8d",36067:"ceff0062",36113:"28f38ec5",36144:"307d712e",36192:"b60e28b6",36264:"8a759f03",36302:"eafd7a74",36379:"467ff4a0",36387:"e23d1069",36549:"5ea64d6c",36569:"1472dfa3",36594:"94a5efbc",36619:"2573355f",36640:"1084a32f",36672:"b6fb003b",36689:"77787075",36747:"a3015275",36790:"12935692",36851:"649faa0e",36885:"1007513a",37109:"d73e6b67",37115:"0b4fcfba",37147:"97da4333",37191:"d786420c",37204:"8f3b27f1",37206:"43dcd746",37209:"e34cac0e",37257:"37524cd6",37329:"554882a9",37366:"6013ac2e",37403:"32b44a8d",37486:"ce46a18e",37489:"6a293d29",37577:"e9705ef5",37578:"e17d733a",37617:"be2ede3f",37643:"a6aa9e1f",37673:"e2657c7c",37740:"2cfb265a",37799:"feab7dcb",37809:"5f87fd99",37827:"42545929",37839:"d5e29b01",37841:"9ad03801",37842:"cd060f40",37872:"88d0aec4",37954:"3f272b07",38001:"690cbdd8",38003:"8d086d51",38056:"baad6bf9",38107:"1efbb938",38158:"66372f10",38238:"2e9f383c",38348:"bbc1ba35",38370:"cf858c26",38385:"7c15a7a1",38416:"dcd7017c",38439:"9474fc0c",38449:"91335d19",38451:"f0fb7623",38468:"b4a84943",38600:"0f497157",38605:"6dc06ee1",38607:"7eaa135a",38700:"1bf4b05b",38767:"c4de5678",38786:"872a41d4",38816:"5ea125b2",38835:"6495713a",38839:"110e78c3",38888:"6f5eeb66",38974:"2c50796a",38999:"daa4f13d",39058:"53317765",39088:"5560f355",39110:"cb9e1f3d",39138:"755ebe0d",39142:"b5f01515",39153:"0b8a4e62",39192:"09b62bf8",39197:"484cbf74",39202:"8b795044",39208:"93f7a5ff",39230:"b992801d",39240:"90f157dc",39260:"47074836",39265:"b40642d4",39283:"b1043e58",39405:"cc6505da",39407:"995840bc",39417:"085b8128",39423:"a615dd65",39444:"0f65ccfb",39487:"9d833fad",39494:"b326207c",39496:"7b2a260d",39505:"782d926e",39518:"630bda65",39520:"441dded5",39555:"4a80e27a",39569:"06a8eab3",39587:"7d0e1375",39608:"97ae1fff",39712:"8f64cb7a",39715:"a68f0e64",39758:"07bef82a",39773:"fb3759c3",39777:"320da59d",39781:"3c2d0811",39840:"8fa753de",39887:"9b0c8626",39901:"d76c455f",39908:"09a52b17",39921:"6471fe03",39973:"d4a2e930",40065:"5f469a3b",40124:"bc817d28",40178:"0508dae2",40205:"edf7dc61",40245:"ecaa52af",40369:"3c36ce76",40463:"0cd1a20c",40464:"4d1df301",40555:"3415fffa",40606:"3e032765",40616:"12a5de9b",40651:"bf5126e1",40690:"dfc3c224",40697:"cc01a9d7",40755:"8393a516",40758:"1a7b33c3",40797:"d2110cc0",40827:"ddebc8bf",40847:"2662e92d",40907:"321dafc4",40919:"2884dc3d",40927:"881bebdd",40959:"ca0149b2",40999:"68c5632a",41030:"33d4a0d4",41125:"0fa5c29b",41135:"85ffab62",41159:"93340492",41260:"6c9200cf",41361:"247909f7",41455:"2bf5edd4",41461:"fd517388",41491:"c3f88c36",41504:"8cd118b0",41518:"bf9d9be8",41594:"da172daa",41640:"d407c2c6",41651:"e8e3bd30",41677:"9017a110",41739:"b9edf71b",41750:"bc38a1dd",41852:"29db9f25",41867:"78f0e259",41872:"58b3152e",41892:"dc5506b6",41907:"b7a56be4",41944:"14828316",41954:"7c49023e",42068:"c413ce11",42187:"295cb0c0",42196:"671726ea",42268:"89c8b6fe",42298:"3fa17fc2",42299:"1f979aba",42350:"6df57399",42368:"ffac4af0",42465:"b8212f90",42487:"203cc654",42518:"34825c6d",42566:"2b505997",42576:"b184a577",42596:"eafac744",42690:"165a93e5",42702:"28826a4b",42723:"d8ed3ccd",42794:"89f1622a",42799:"5314580d",42801:"bf3d61ec",42879:"aeca0a21",42881:"432e670c",42900:"c9d95cbd",42905:"145364e0",42911:"39c7a203",42920:"ebbd9274",42937:"a8c92c97",42942:"19028add",42995:"2812e3b9",43029:"e3477e52",43035:"2907d5eb",43040:"676c7c8e",43042:"bec2896b",43078:"50536743",43088:"341293cf",43113:"12164231",43195:"d831e3b2",43286:"fe9b6676",43352:"4c07ba53",43421:"f048922c",43432:"fbf82623",43445:"83fec35c",43461:"7b89671b",43512:"d319e9f2",43642:"4cd0ba1b",43677:"7117a8cd",43739:"752351f9",43868:"c09831a6",43922:"a8b66660",43980:"509aac2d",44008:"5a8b22a0",44022:"454b7ded",44040:"43d1bad2",44045:"894f5c0e",44118:"6503f568",44123:"e2fc22cf",44125:"ca2b0f7e",44129:"d653d7ed",44143:"19acc4ed",44290:"4f087d20",44326:"cfca4f26",44339:"0a91021f",44380:"8fd374dc",44405:"d363a80c",44419:"216bf65d",44489:"6fb01322",44492:"9882af90",44551:"9b2ae5ff",44567:"502906a9",44640:"20bfa334",44662:"d65b2c25",44682:"bdc69003",44719:"60165173",44840:"27077527",44876:"260982a7",44891:"30769210",44933:"f3d02b29",44939:"43f3c18b",44948:"c7a67184",44960:"12b957b7",44964:"8914fdfe",44994:"41af2803",44997:"6e34e766",45113:"55946737",45117:"86fe1f77",45146:"b528d4d0",45210:"49a37e79",45231:"7737fe61",45238:"c3f790da",45290:"db90ec2b",45323:"815e47ce",45339:"24d4b044",45460:"459dbf85",45500:"e85bde03",45541:"a722b43a",45561:"7dce0476",45640:"ef7891f5",45670:"c36346e3",45682:"3533dbd1",45919:"a2a2954f",45983:"9926d60d",45988:"95aba771",46001:"8cf74eb7",46008:"2e048b0f",46025:"1fb7523b",46039:"f724037a",46063:"67893f6a",46074:"f1087137",46156:"53cdeba4",46197:"8e4df3f0",46244:"ea511817",46296:"04b49851",46375:"e49bd305",46425:"00239e8e",46451:"4bb02a47",46472:"bcb734aa",46513:"9dfe5a97",46515:"c13f246c",46547:"c5427124",46578:"8012465a",46598:"8393d26f",46652:"5f0630da",46662:"4f48cd24",46754:"2b6a7ab0",46802:"8f07070c",46840:"b2e2853b",46850:"917a523c",46888:"db9d1243",46891:"85f8bce5",46905:"57a58e78",46911:"ff13b684",46917:"7b0a3d41",46921:"a28b89d0",46937:"37ffd066",46979:"a9afee85",47041:"bbb92300",47060:"26996ad6",47087:"a5c8a2aa",47106:"696d889c",47110:"1366dd9b",47127:"c648308f",47206:"4d2e69a6",47236:"131c6f6e",47247:"5048202c",47248:"c7e2144d",47297:"6111afa9",47433:"b9a767d8",47517:"09e5dcaa",47537:"df0967b2",47555:"0029660c",47622:"0c1ff092",47668:"b1899f7e",47693:"39a07549",47699:"17093d00",47730:"4edf53e5",47917:"6bb76d2c",48003:"7ad7688e",48023:"47f96c4a",48050:"ca713325",48063:"c17f9567",48071:"852ff8c6",48091:"0cc98403",48130:"f81c1134",48132:"c467a11b",48162:"519b5759",48167:"00021e3e",48188:"9d8965aa",48214:"bef59fc9",48285:"e672d61a",48295:"e2b4c006",48304:"189e3ac3",48310:"f6884a75",48355:"d8c836b4",48360:"959b45a2",48361:"712c16a5",48532:"2896ce7a",48544:"0a5f31be",48592:"c1506482",48613:"7a556257",48661:"ef4f3413",48673:"5db19d16",48733:"d009d47f",48768:"e054d919",48793:"b71be52f",48803:"79392e36",48842:"d0b9fc21",48883:"ce18dbde",49013:"9d9f8394",49046:"c68848f4",49055:"be94b749",49071:"97d17d75",49112:"3455c0d5",49174:"0ac5df82",49199:"7795e379",49226:"f2a06fea",49280:"6111bc4c",49305:"ad0a2b75",49350:"2417a912",49388:"8f1510f6",49461:"2019135a",49521:"49d63cc6",49569:"0d819826",49579:"e01bb6c7",49583:"8ec8c5c5",49587:"2cbb324b",49655:"b0ba51ed",49676:"2391d372",49783:"acf72eb8",49786:"5bd6f6db",49880:"3fc6d2b7",49991:"1d5cbb7b",50012:"40c88f7a",50095:"837c6843",50176:"756c7559",50178:"18dddf22",50183:"f2790563",50259:"ea981684",50261:"ec6a0daf",50293:"fc6a53b6",50361:"09a0b8d6",50414:"c59a4667",50428:"a33de290",50446:"eaebafad",50472:"a4e24d6c",50486:"313c653e",50507:"129c4e7a",50570:"c112d1b7",50584:"3fd21eb6",50642:"e964b083",50700:"75be343d",50703:"0914ee26",50747:"0d98f85b",50769:"a339c33e",50800:"b365f6bc",50819:"4251704e",50827:"aa04bdb6",50839:"8aa0dce2",50934:"e7b82dc0",51047:"4dd6f8d8",51049:"6bd6fe03",51060:"e1758f93",51090:"12aaf145",51102:"3304ac90",51116:"d366555a",51170:"5e85b509",51175:"c39359c5",51184:"90d97cfa",51229:"a06af3ed",51237:"85a6e3f4",51378:"0a8d92af",51412:"fe2deb8c",51420:"7a04b795",51438:"14515c80",51494:"65eb0274",51548:"45b02367",51578:"8447ad38",51584:"4c2a4e19",51589:"f762fff5",51636:"ba5671ab",51649:"6537c712",51665:"65d842b9",51694:"612cc46d",51711:"89bdbd96",51755:"b50c8022",51763:"9199f8bd",51769:"1bd7f091",51814:"91a39dd0",51828:"44e51e65",51837:"5c238f81",51878:"48b6c251",51890:"b5fb4df8",51937:"34689118",52036:"1d79e793",52042:"7f8ebea7",52093:"edea4b8a",52102:"95cc61bd",52132:"3498be82",52135:"d0ed28b7",52176:"81d19844",52207:"508f03f4",52218:"1562cf35",52235:"fadc68df",52250:"8ec5e058",52266:"3e088827",52267:"6818c2e9",52282:"be224150",52286:"8e1e17e5",52342:"0dd8c0ac",52408:"ab586159",52450:"2dc793da",52462:"3016c86b",52466:"8c67a0ff",52478:"cda1618e",52488:"ca57223f",52563:"f2da277e",52569:"7199ad43",52572:"a9417ee3",52612:"27f2e2a4",52634:"c4f5d8e4",52680:"2124517a",52711:"9e4087bc",52731:"c8f57d29",52770:"85afc7f5",52785:"25eae11f",52826:"ce319efa",52840:"9e1bed9d",52882:"fa2ae802",52895:"69fcecaa",52911:"4d4179b3",52912:"82c60778",52913:"4adafdbf",53074:"2f32a261",53132:"5de85215",53170:"aaf3ff15",53178:"71514a42",53201:"d670063b",53237:"79ab3378",53256:"fa713049",53266:"76a0389c",53288:"f8fe23f1",53314:"5440b68b",53449:"e2bce80a",53458:"63436e22",53492:"a45dd8f5",53540:"92f1a745",53619:"16640689",53629:"5a2d67ad",53633:"f6ef9721",53646:"6c9978fa",53670:"52ed38a1",53742:"77612fce",53771:"3a447539",53786:"e352cccc",53832:"7c8deb08",53860:"e623e42b",53861:"2a5e97be",53871:"94dd9534",53881:"e9a95c5e",53901:"a4da17e3",53925:"a8933372",53982:"d5f056f5",53990:"f72b3fe4",54097:"8c317219",54106:"93b4d825",54200:"f97d7d88",54240:"3a55b748",54246:"5ba9c4b5",54270:"e5c0ea66",54272:"f020ef51",54274:"b7bc328b",54277:"71e2c4b4",54399:"25aa47d2",54415:"c87c5e1b",54462:"0c3d0366",54487:"52676037",54500:"fb9e14c7",54540:"66193a96",54568:"633af835",54730:"d4522125",54749:"ff4fb41e",54759:"0f7d8652",54772:"13883961",54851:"a2de6851",54879:"a872c629",54881:"c46bba44",54927:"55f8cc28",54950:"0a893fdf",54951:"98bd463b",54992:"5bcffa9a",55004:"37d125cb",55100:"70d55848",55144:"152d0582",55167:"c1cb0a0b",55206:"aaa8a12d",55276:"c962ae4a",55302:"facc4cc2",55342:"ee44120f",55401:"2027fd18",55483:"342d2e6b",55526:"f7fa3381",55534:"ab685cdb",55559:"29cf75d4",55566:"c8861997",55579:"3a9c66ce",55616:"d5caed5f",55664:"a7511015",55668:"bbaa8144",55754:"069b26b8",55780:"d425e9d6",55836:"94b063ba",55929:"2cbaf53f",55942:"41adf405",55955:"194c8540",56028:"e1a6f6ca",56037:"69ef23f7",56062:"cde3e47b",56087:"c96d4604",56097:"096bca72",56122:"a7b4d0d7",56123:"602e2465",56133:"887c7539",56190:"5160d3b0",56256:"e028a908",56259:"75a12619",56297:"575869e5",56384:"fec58251",56408:"cbb5064a",56493:"858f1266",56510:"86a45dc2",56560:"c9c31477",56607:"609f9177",56648:"06eed450",56662:"beb32294",56688:"8dd3eb38",56723:"69e6c429",56725:"9a502a1c",56767:"2d57b909",56779:"6664c24a",56826:"eec5649b",56916:"ebc13825",56948:"1dbfdc18",56974:"39ed0ae4",57054:"97b1d23e",57119:"4d68fc5d",57141:"037241c6",57155:"23348138",57159:"e15f47bb",57165:"034f0308",57178:"2575da36",57182:"a2f498c0",57222:"8ee4a7d7",57245:"e3b05f38",57251:"779bba71",57283:"5e727800",57302:"55b89dea",57326:"3ed58e4a",57359:"841b525c",57361:"79cc2eba",57426:"533bed85",57529:"0b7a8a63",57547:"27211971",57581:"b20f9cb2",57594:"2b2d1be1",57614:"dd48b375",57647:"0ed7fb46",57730:"658997e4",57749:"c07b5739",57760:"73d3ccec",57762:"27b8ef72",57885:"f1691dde",58e3:"e2070fcf",58002:"31fce735",58079:"2655f170",58111:"fa4b529c",58144:"a2171a4d",58255:"400deb23",58259:"078daaf7",58301:"b296abb0",58351:"cbf83637",58359:"a5e62092",58393:"15ea2a5f",58428:"ec854811",58479:"2a882da6",58484:"36d29ed8",58492:"0ba9210d",58581:"f0e5f3ed",58594:"6bd22ece",58666:"a1e59af5",58667:"a36e07dd",58704:"7fde9a4c",58707:"6b6aadc5",58721:"9ffdcfdf",58780:"b7d1b016",58857:"bec552c1",58874:"030dfd2b",58880:"52e97b50",59004:"7dd8c933",59005:"39fca8ac",59009:"a169aa70",59020:"e84457bb",59053:"11b61292",59070:"c43c6f4f",59104:"c762272b",59114:"1a20bc57",59123:"17ffd4ff",59262:"97db775f",59326:"e2b886c9",59349:"156bd387",59475:"55d26943",59493:"150f4998",59521:"b2555332",59614:"c5c8b091",59680:"70cca634",59702:"c9b0e9c8",59732:"9873f053",59740:"ab90a7b7",59779:"28553a2f",59781:"0e7c02dc",59866:"03f08ad1",59873:"b37c8625",59874:"b62e8859",59923:"95789563",59940:"888f35af",59981:"03137a3d",60020:"cc3a93a6",60119:"66eb519d",60167:"152819f0",60185:"e04f784f",60187:"a52bfe45",60193:"5c430979",60198:"5c417b7f",60203:"5c5dd48c",60257:"3fa5d64e",60267:"3d3aadb0",60294:"93d54c10",60315:"42d452f1",60445:"f83acba0",60510:"821320eb",60565:"492bd0ed",60613:"3523854b",60625:"7a82ef89",60676:"244c7b0a",60696:"d163928b",60725:"73e80d5d",60762:"e9d18558",60765:"0614dce3",60819:"c316a3d7",60830:"2df3fdca",60837:"d2436a2b",60861:"c9d25191",60884:"709e1a02",60901:"00b58b18",60908:"fe53d354",60953:"3e85731b",60965:"4d18bf1b",61027:"b1506a50",61114:"127f988d",61228:"4521c19b",61235:"a7456010",61265:"84536aab",61300:"31eb78c6",61345:"f12e5474",61378:"c90911b0",61416:"a1e3441b",61481:"b0f00280",61559:"6b206066",61584:"55b57e06",61627:"35190cab",61652:"495a3878",61702:"faa24029",61721:"4f3239be",61734:"ad2a3b86",61740:"bc80aebf",61786:"aa1329f2",61844:"14da6f38",61886:"124bf435",61939:"88937603",61950:"820ef6f8",61959:"9df3c51e",61991:"a6972a3c",62015:"5cc68a8f",62037:"f1b1ae9c",62061:"2638eb20",62111:"d2289dcb",62120:"cf1cd5da",62138:"1a4e3797",62147:"8d364c04",62149:"5955b5ee",62162:"22c027ab",62182:"0e7e04d8",62188:"1e38d1de",62254:"9b695413",62264:"cb69dde4",62400:"8041f857",62431:"856bc38c",62456:"3e9695b6",62469:"f448ea15",62501:"564f4b07",62549:"cca423c7",62568:"abfb0eb9",62635:"61b91652",62639:"0f378f0f",62641:"58728d91",62672:"fcaa2a90",62691:"d9175e87",62703:"345b88a3",62712:"f9a8c23e",62714:"1769198d",62827:"4e78ea4f",62845:"ae5c2262",62867:"07853d90",62875:"f1096413",62927:"c03ef713",62953:"7a0d5539",62957:"e5c6728d",62975:"baa95a18",63005:"b0635fce",63064:"754efc6e",63075:"37844666",63124:"d4bcf69a",63151:"93f4c2fc",63181:"29fd9202",63228:"34c77011",63262:"df8bdaca",63291:"2f1bf685",63298:"259b7e50",63317:"7dd3b2a7",63330:"60b75cbd",63332:"67474760",63367:"44bdb747",63382:"5f87f962",63387:"9780a9d6",63420:"04ea9cef",63430:"465af2b7",63455:"f30739cc",63515:"a3041c66",63521:"58f053e0",63553:"1fd2ca4a",63576:"b9795b3d",63627:"43a56d47",63646:"47298c37",63682:"f82e3d74",63700:"eadd254f",63739:"81a5dcd4",63779:"c2750739",63795:"a4974adf",63836:"95e06d9c",63907:"57e245ce",63951:"8bbbdfbb",63966:"2278c359",63975:"b81d6cb2",64045:"c47fd21a",64099:"e34c241a",64184:"f4f77456",64209:"88ed6425",64264:"192402a6",64275:"48a72e90",64351:"7c0dabe4",64391:"b65b26fc",64442:"dfa86ee4",64447:"e4307155",64465:"e9f47cd4",64473:"9c8cec5f",64502:"5d817499",64527:"dae07133",64535:"3756d209",64577:"a2a8ce40",64597:"9c273b44",64623:"e52d80fa",64659:"6ae279e9",64670:"46693c0b",64737:"1d00ec5b",64749:"2da5f59f",64838:"9a8a6b3c",64899:"e80f330c",65013:"a3fde46e",65017:"f08c8322",65091:"75914136",65094:"f04b050d",65133:"c9bcea67",65193:"d0cf31b7",65221:"67922501",65223:"2a11e6a7",65233:"0530d392",65246:"ba47c7e8",65350:"517960c0",65356:"8db42357",65359:"070df7e5",65473:"a21d3492",65497:"26115f23",65569:"8008d958",65611:"5d7f3e2f",65625:"e1ba57a0",65629:"26cbee69",65647:"75ba6401",65648:"c7850e27",65658:"329c66a5",65727:"e29a1e9b",65745:"d1be0dfb",65756:"02ff5d42",65759:"7d5633f0",65835:"fbd3de42",65897:"38147e44",65918:"587a0b3e",65926:"567cfed1",65957:"21719437",66061:"1f391b9e",66062:"fada9729",66097:"ceca85fb",66135:"331ad65a",66140:"136587f9",66162:"cf5645b0",66169:"0b7cbed9",66210:"2b53c3fa",66237:"cc9fb6c4",66327:"eee168db",66338:"dcbc8483",66372:"8fb804ed",66381:"9019bc0f",66394:"c0d2ab5d",66415:"6f47e633",66461:"cb8920e1",66499:"85e49a93",66504:"b01f49d5",66510:"79d5f27a",66518:"c6ec7d6a",66524:"83037ff5",66538:"d0550e1e",66559:"ecb74126",66575:"b0e34666",66602:"9fce9e91",66715:"48455675",66753:"5389895e",66759:"e381e7b7",66822:"62e9fea7",66832:"e1fde1ef",66867:"58b9aab4",66903:"47f8f95a",66912:"6e955522",66947:"6faab85c",66995:"ba8ea34b",67044:"1b143eab",67061:"c1050649",67098:"a7bd4aaa",67100:"27c39d7f",67104:"06073810",67114:"0d86fe8d",67149:"11235f31",67189:"9736a6b2",67229:"2d4f05ca",67252:"60cef16d",67376:"01ed4ae3",67438:"b6d7433d",67472:"814f3328",67489:"3477cc36",67507:"77139df7",67545:"d89aa357",67581:"a1a96ebc",67587:"8775fa1c",67649:"eedfeff5",67668:"47766edd",67683:"cace8592",67704:"8fb89e11",67720:"4d59e059",67729:"2c18bef5",67755:"b57b3f07",67775:"39b26ead",67914:"0a0dd03a",67954:"8aec9a60",67989:"59171146",68038:"863f8530",68043:"c1c9577e",68045:"0924bdf1",68094:"e981d05e",68210:"a148d810",68246:"3b8a31a8",68249:"e48e4dc9",68253:"89c88bb6",68304:"8ea5f648",68315:"98826249",68334:"9d05a91f",68434:"975aa772",68467:"bb6faf52",68470:"60753781",68515:"f553a3a8",68551:"9a8c2230",68569:"d81421b8",68665:"f645a9e6",68685:"0b87289b",68710:"dbf13a93",68765:"719a7d9b",68770:"14033dfb",68839:"3ac10f9a",68861:"bb1a3e9c",68865:"08299697",68910:"62cdbb35",68930:"5aa406a5",68955:"f9d38c6e",68991:"b60b94c8",69017:"ef13094f",69030:"8a752d6d",69038:"8df5dc78",69129:"4a55387a",69169:"fc384521",69199:"f0589cfc",69347:"de9d53d2",69365:"4d2a5110",69384:"5a360e6e",69457:"7ffd9a5f",69501:"fc15228a",69517:"8a4df687",69570:"4d573718",69588:"a3713279",69633:"05c96a0d",69638:"9c10cdcf",69671:"36e398ec",69770:"b1e8d27b",69787:"787caf51",69844:"615fd764",69875:"b58f381c",69982:"8e981336",70008:"0860d759",70022:"c8d1e051",70058:"73a7a1a2",70100:"b318f3b6",70117:"9f3d620b",70126:"f68988f2",70127:"dae6ce88",70133:"2f2d1edf",70174:"e04f6385",70179:"cb543535",70209:"529aff45",70210:"8367b76d",70234:"e76e0aa8",70253:"5e1c183f",70268:"aefdabf4",70399:"d2786aa3",70418:"0bbbad22",70452:"b71c2d32",70502:"8c596cb7",70551:"0bd456dc",70560:"ac5d28bd",70606:"39583919",70612:"6d5145e1",70645:"a9f446ca",70649:"0920b03b",70669:"dcc774d2",70687:"70ca6744",70689:"52375367",70696:"52be8247",70712:"cb488bcc",70728:"07338b13",70749:"ecba2f16",70755:"f3e1c72c",70784:"ac00e857",70791:"fda5ba18",70794:"c1dff2d3",70814:"c3c05d38",70825:"1d89db06",70826:"23421dc8",70828:"6763bf32",70853:"e34cf2a2",70870:"4f594038",70947:"d1fa94a6",70953:"87d75f25",70963:"16029e49",71021:"05f6486e",71026:"5e0cf2ca",71051:"9b8a5dc6",71111:"48c07d39",71117:"92f96583",71162:"af7ce5e3",71227:"131dae92",71235:"18891827",71374:"40d0141e",71407:"7380ddcc",71473:"ff761994",71531:"f89e6cd1",71565:"83c3bea7",71585:"d7e2cd1f",71590:"ed47441b",71612:"a29b4047",71656:"7ec29cb2",71715:"4a74d13d",71784:"e3aab494",71792:"d2a882d8",71858:"09138901",71863:"acec9ba2",71877:"466f5a64",71910:"f783f7a9",71964:"835d6f03",72011:"31b399ad",72043:"f0dc2560",72053:"95f36a1a",72122:"3d095b6b",72135:"8cec3a3f",72246:"cf8b2bc1",72322:"4941c7ed",72353:"f23d42f7",72358:"4419dbb7",72446:"27d3d4e0",72527:"ac84c584",72573:"bd203bf3",72599:"3336b76f",72634:"c8768069",72668:"049fd4ea",72675:"f81aef8e",72707:"eb3eed60",72759:"69f425f4",72815:"56040849",72835:"2d34e835",72880:"43b52908",72907:"491d56e0",72914:"37eca2aa",72925:"b724edf8",73019:"fca979f9",73084:"b8385eea",73193:"da144c90",73264:"33e8889e",73276:"7bd25ebf",73290:"c7f860be",73316:"8b1b48fb",73331:"97d2cbab",73376:"21838a86",73397:"681664ad",73472:"092425ad",73493:"4c26df07",73539:"5ebbf59b",73540:"73d617e8",73569:"ac6289fa",73607:"01689e9b",73609:"622b7911",73624:"edefc60b",73684:"35be90fa",73693:"c6ea0115",73741:"eb08ed44",73756:"d8415e6f",73800:"5cf43a2c",73841:"569e0588",73846:"4d015a5e",73888:"06dd3057",73891:"d721a748",73905:"d502d9c9",73940:"f4731b9a",74019:"14841d7a",74027:"9d891c91",74039:"2e6d9cc0",74046:"b7aeb8c2",74069:"ea5e46ff",74121:"da7bf323",74134:"393be207",74282:"2fd7ee6b",74312:"acf7953e",74388:"57eb6545",74403:"bc42f283",74418:"103c2fe7",74490:"3d4e54c7",74524:"111d9467",74588:"84939cad",74657:"033d3629",74684:"e6ce3bd9",74792:"a5ac74f6",74880:"ec7a5af3",74902:"43c329f5",74945:"ad848ffa",74961:"9b3f2ab9",74994:"eb5c136f",75036:"0c90e710",75043:"1c4d0413",75051:"13d28288",75062:"8df3f976",75078:"dd620de6",75105:"e2585025",75106:"9f49c871",75173:"3126d1b1",75267:"6dab9497",75309:"07deb48b",75359:"84aa8d64",75378:"847c1b9e",75405:"ceaa6e69",75450:"97c492a6",75459:"605c3775",75666:"2aa42d18",75695:"68f2aae3",75696:"1ad07866",75718:"d2250181",75735:"691ef278",75759:"217c03e5",75775:"724a4edc",75805:"ad132b09",75866:"a3541f3b",75911:"f18854fb",75919:"e01c8f09",76041:"03240ae1",76123:"52166518",76163:"20a6876f",76166:"1778a2f7",76215:"d9605822",76235:"6a3d5afb",76257:"cc7760fb",76262:"075f4b70",76264:"cb46984a",76274:"5d06256e",76285:"0d71ae17",76289:"1ed4b1ad",76368:"9267add8",76530:"594c10ba",76641:"eb0d63b4",76683:"b6f16885",76719:"a50107bb",76748:"9a68cfff",76850:"d5a221f8",76854:"2b00a752",76871:"e364f7ff",76873:"a91e6a0a",77077:"a01a15fc",77088:"bf048e24",77096:"61ee4158",77123:"62825cc3",77145:"30ae1693",77174:"ce019e24",77183:"eaf93d9c",77200:"a95aede3",77222:"fe2389d2",77261:"1aef3c3b",77298:"109d395b",77369:"c4acdd50",77391:"d0c84d34",77596:"0235a442",77679:"5ef28561",77698:"60381fc6",77749:"3a31d53f",77764:"8c3793bd",77787:"d9e41302",77794:"62e7b5b0",77920:"a52788ff",78001:"33ab05f6",78037:"c9599a77",78055:"30175d3c",78087:"90caa6a1",78159:"8df10e0f",78199:"5455ca0e",78312:"1682c6e0",78354:"c1b680b7",78421:"b1a2ea9a",78497:"28ebe10c",78512:"b7e5c092",78522:"ff4a022d",78544:"4adc4126",78583:"95365ba3",78632:"4f1d1584",78704:"b80df7ca",78758:"667a9f57",78764:"6000d05b",78787:"a7f76e11",78820:"04c3dd09",78858:"4f0afd2f",78876:"499efff2",78880:"335badf9",78912:"c8939218",78919:"f73fc2b7",78926:"73bc484b",78985:"ccd7c88f",78988:"0ee8b775",79039:"803df44c",79048:"a94703ab",79150:"cdc43a7d",79157:"c884c38e",79180:"cc426672",79302:"74555694",79416:"a2030166",79474:"120bc0be",79485:"8b7dab17",79506:"368f9c22",79520:"34900881",79521:"09b9b020",79656:"1bfbaba8",79739:"8be24c4d",79841:"fc26a5d5",79866:"619263e9",79987:"dd6ea91b",80018:"5e4ec6cd",80046:"93c339e4",80091:"587df15f",80102:"7349f9da",80198:"d38a6f54",80205:"0cc20099",80259:"45cd5638",80260:"8aabb1ce",80299:"8657657d",80310:"3c89ed52",80362:"2fd10e89",80375:"6e954188",80408:"81c96f91",80424:"abf14b6e",80442:"e1a35040",80457:"992bda30",80458:"318980ec",80491:"7080aeb9",80531:"27321f21",80557:"5cb06d06",80598:"1f97a7ff",80632:"9abd9d66",80649:"80f24550",80677:"6d70fa33",80744:"641786b9",80750:"84ac5929",80772:"fd440a88",80781:"cfdba83a",80794:"442da8c1",80841:"413bf93f",80863:"b6aee096",80947:"a7f213e3",80957:"c141421f",81012:"820b9813",81019:"f74d3bfd",81050:"c88d5fcd",81085:"104fa664",81125:"aee88ae1",81175:"f98df6cf",81188:"ddf9f187",81212:"347b93da",81285:"54e1e905",81300:"2195a7cc",81319:"12363bc4",81346:"a20f65a6",81390:"e6c5d4a7",81410:"7af33a93",81482:"ae0ec9f4",81530:"654827c2",81544:"13685ceb",81583:"15a3ce9a",81639:"ffe2a86d",81666:"a74d38f6",81692:"0d9e9c41",81737:"c75c3ca5",81761:"932d66ca",81770:"fddd2104",81791:"d3571192",81795:"b90928c1",81802:"6066240e",81891:"b3dc9cb4",81902:"29470dda",81903:"acecf23e",81943:"4b93078e",81982:"2a59c009",81990:"f9ecf61e",82012:"4a7139ae",82019:"755e7c7e",82242:"cb7dc7d1",82261:"d2c9f0b8",82297:"226eff01",82354:"b87f99cc",82362:"7345c721",82431:"5d210bb4",82456:"24f4e7d7",82486:"4393156b",82553:"0add85e5",82581:"907fc94b",82588:"4cd82028",82663:"dd0ce7a8",82722:"72e3e702",82754:"4ccba4b8",82847:"dd09cc7b",82905:"12cecbf6",82939:"2a7d5452",82987:"732a7c43",83027:"dac8839d",83078:"42174d87",83089:"686a74aa",83103:"21cd7edb",83109:"79ca5236",83111:"6060cc06",83121:"deacbd9b",83127:"10757cc8",83182:"e5cd0e7f",83203:"95126e44",83213:"828aa184",83249:"ccc49370",83260:"5c26bf07",83273:"2b6eabf2",83316:"0ba08ea0",83378:"d0f169c8",83470:"e6ccb422",83574:"c85c7bc6",83608:"19560f91",83670:"9e37e644",83700:"a8c902bd",83779:"e6fc8a9b",83797:"b6cd0ba6",83824:"f5dd5915",83841:"cc517726",83849:"c48426e8",83928:"345eb925",83932:"757c6784",83954:"e67a83cf",83958:"2bf0d1a9",83970:"e200187b",83976:"0e384e19",84013:"c17d6939",84070:"511d3e84",84107:"ed83b9b9",84152:"d2ed2b82",84227:"17d9fbbc",84232:"ddd99a22",84255:"901160ed",84259:"2ffd8514",84319:"1132d5f6",84332:"0b82d45d",84527:"8180940b",84530:"2e72ea50",84563:"2760fb69",84572:"d9a7203a",84760:"21f4f354",84773:"b738b15f",84813:"6875c492",84869:"6bd2e919",84963:"d9d878d8",85014:"ae42df76",85095:"ec2ed6e2",85097:"7c86d680",85105:"ab380486",85205:"0cf3b0b8",85209:"8beefa16",85243:"78c968cb",85257:"ffec2b37",85279:"8f4a15da",85322:"c9ff545e",85358:"813f53ba",85442:"2f6614a5",85453:"de5aeda1",85537:"2c88985c",85581:"8f9bc413",85588:"24e645af",85736:"0e8c3a89",85796:"a4a3eadf",85806:"3e226f70",85817:"d40aab8b",85896:"ddb0149a",85899:"41639dad",85917:"716f14d9",85960:"5268c144",85973:"5733876a",85997:"83b6afd8",86053:"ae271c01",86074:"199e6876",86121:"677325f0",86129:"fb03d32d",86167:"1f8198a4",86215:"95ee2976",86216:"abe1b280",86246:"7a2c4c43",86354:"d630316d",86417:"669193a7",86434:"d5f51703",86478:"2a1b9f9a",86480:"3a311bb0",86501:"f4e1ab69",86586:"b76e61dd",86597:"0e0dfb6a",86623:"49bbb99a",86659:"7ff6577b",86669:"927f97a3",86685:"58421c87",86807:"b0445ba0",86829:"5626901c",86846:"57ec2762",86856:"c942990c",86888:"5687c7cb",86890:"319b6f13",86914:"869411c7",86939:"7a06eb83",86992:"d2a66e94",87004:"b62a4e5f",87087:"40df2769",87159:"4eec7d8d",87184:"4462c0cc",87186:"767cce31",87205:"bad31f72",87217:"9c71777e",87269:"33ac18ed",87282:"c884ad6a",87377:"c4f2c374",87407:"cd08112a",87432:"0b425eb3",87456:"33bf4676",87459:"b8f2cc13",87473:"baf4021b",87483:"d5762a9f",87485:"643da015",87547:"e29c32f4",87589:"d2b2e5aa",87614:"7c29a585",87688:"137db567",87747:"3f1a4665",87781:"6f831635",87863:"4194f325",87875:"01f93a4b",87880:"f553a7ec",87905:"fc17862c",87945:"5b17955f",87971:"dc4ee1bb",87995:"85f9f5a6",87996:"72a68b3b",88047:"a5f4f54c",88111:"ca3d464c",88163:"2e05ee79",88222:"b8fd1a8c",88248:"ed990644",88298:"85e50ec2",88310:"0169a509",88327:"fbfb0bb0",88393:"3cf947bf",88394:"5ae50f21",88399:"078339bb",88436:"a13618bc",88441:"40e4b7d4",88468:"bf79ed6f",88478:"23a811a2",88522:"d3f32089",88547:"2283659c",88622:"5871fbee",88626:"6e8a38ea",88654:"6dc022b8",88696:"6be5dbf9",88775:"b330ac5c",88815:"71cde98c",88817:"d3065e4e",88821:"b0b71a2a",88847:"014c2cb9",88852:"508d741f",88855:"5edce1ad",88865:"d15e98db",88903:"568a0660",88986:"7b658d8e",89018:"2c9ce68e",89093:"fc93a2ea",89097:"24f450eb",89172:"adb96665",89175:"9f15c6e7",89210:"9b191135",89289:"d8e6b3db",89338:"324cb577",89353:"b919dab0",89362:"cb2f16be",89402:"39ac0d5b",89415:"9ed26de9",89437:"ce1709a8",89455:"978ca64f",89489:"145c1cc4",89534:"66405406",89554:"7ff4234e",89610:"2709984f",89641:"cde9af88",89696:"837dc7e4",89801:"084a80b5",89810:"9bfa1541",89858:"36994c47",89873:"65f8c8fd",89986:"e582f766",90066:"bfb3b697",90071:"7e60f0fb",90110:"dbe2cfea",90115:"1026ad00",90135:"8abd7194",90214:"9db841c0",90257:"7b773c92",90280:"a80ed580",90317:"b3abe364",90378:"c633f93f",90414:"ed2667fa",90416:"9947fe09",90438:"fe49dcfb",90513:"6157713d",90562:"32eb34e5",90593:"99144b30",90598:"2563c97b",90625:"73554d19",90627:"bfa9eb5d",90717:"fff1effb",90749:"48dc1693",90831:"e96ddf11",90842:"837010ac",90849:"0058b4c6",90910:"e03c6723",90950:"271ea2f9",90972:"70e8710e",91025:"466375b7",91058:"42003ca2",91109:"014625f4",91187:"3629c812",91203:"ece3ee5e",91257:"f657ed9f",91305:"af1525aa",91319:"0f84f33f",91333:"d1980a1b",91359:"88f66091",91405:"ae3304ee",91428:"284c57b4",91530:"7118d0f0",91540:"980d0b86",91581:"8614d32b",91587:"1fecd571",91597:"e33cf622",91621:"7907a033",91695:"6033c607",91724:"9964550a",91787:"df99aa82",91844:"41ca93cc",91895:"b7201a27",91916:"72fdaa88",91993:"8ce0215f",92018:"0ce689e1",92031:"e2c3948d",92105:"6342cf5e",92125:"4cce6e5a",92196:"56a0d755",92223:"e772c536",92241:"bef29d9e",92273:"85fe7d70",92329:"4a4c6752",92410:"4c434b32",92412:"d888d821",92475:"1be20fdf",92535:"b6eb7220",92544:"e53ee22f",92653:"efa442c3",92664:"7c1d6f5a",92673:"9dfaf941",92955:"3e082aad",93057:"adfd3bc1",93085:"b5ea0533",93166:"fed5be48",93206:"2ed2a721",93209:"47b26a6d",93210:"e55ca189",93269:"b12147a6",93273:"cf32db66",93341:"aba187b8",93361:"2357dc71",93362:"7a234181",93438:"f5e9d1c4",93442:"63786366",93534:"a9c52207",93546:"d9e43198",93602:"44c6f0c9",93636:"e1847ef7",93795:"f179621d",93849:"09bacf3b",93854:"0a07ac32",93884:"c3c082a1",94e3:"45a5cd1f",94065:"ee71d619",94082:"8c0fb9c6",94091:"beceb38b",94106:"acddd5ca",94153:"6ee6a410",94168:"c6b4dc09",94227:"f0cc57e7",94251:"824e6f8c",94314:"00f9d3c8",94344:"8b44df1d",94361:"657bf45c",94417:"85c8b6c7",94538:"13feb7a8",94555:"8e7aaae8",94561:"a1e44e64",94568:"745d4b8c",94625:"0a02a2d0",94646:"30549b42",94648:"50774ec6",94685:"8520f5db",94711:"0c2c2d88",94713:"6dfe2e3e",94788:"c26e67a5",94796:"256701a3",94841:"a1282170",94843:"3e1f4a39",94863:"fc66001f",94864:"95ec5604",94910:"bb63d03e",94925:"e8b41ff0",94926:"98700a51",94980:"5fc8caff",94997:"8d65e26f",95020:"63c4b13e",95058:"4b69979c",95078:"10ac9a3e",95093:"818bb2cd",95136:"c0df5757",95159:"cdb727d9",95183:"f58814fb",95187:"59700627",95231:"1cb0fe52",95240:"b4030b00",95245:"ed211a79",95330:"9b4185c1",95427:"52910a8f",95443:"e1afbf8c",95470:"8a40ff6b",95542:"5917c028",95605:"9a8fdb53",95641:"188015be",95649:"4885c521",95659:"30d4e84f",95768:"89ce4ba3",95785:"8c79a60d",95818:"dbea5ca6",95909:"9e488927",95911:"accd2b0e",95912:"cbc2448c",96022:"5180e398",96086:"eb84cef2",96155:"a267572b",96225:"838df61f",96239:"380e17bf",96268:"638db053",96276:"82a7c68f",96325:"65d1ec04",96463:"ddd9290b",96470:"1b260ed9",96555:"d4083900",96652:"5b0025cd",96693:"8c42b153",96745:"4f748135",96771:"a98ffe6a",96778:"181eb1b5",96793:"c3c125b1",96881:"d527c17c",96963:"98749210",97006:"7ab01152",97033:"e9032a0d",97047:"763a8986",97107:"9331da7d",97114:"32bb5bcb",97123:"9d2e74da",97167:"20a30ea0",97189:"1b3061f3",97223:"7fa05810",97246:"365a7fd7",97253:"1a8a162f",97296:"205cdcf8",97342:"c2a473ad",97358:"76276d52",97379:"3bfbd79c",97420:"224c7e3e",97424:"ba47c136",97476:"b93a682d",97536:"3a6c6e5b",97554:"6ccd70b6",97562:"3d08e0be",97585:"8e81e342",97664:"facb0528",97670:"1dba1ecf",97732:"b58e88de",97737:"8fa9d00b",97753:"41b1becf",97763:"7d2fd416",97821:"97a057b3",97829:"e5562b89",97863:"47edbc34",97887:"26ec8ae2",97895:"ab8b4014",97901:"bf7dfc7c",97905:"ff509459",97913:"1e228808",98012:"350cc719",98020:"16243474",98021:"139d61ea",98030:"95f25ea6",98058:"fbb50b04",98059:"75dbe45b",98087:"b18455bc",98094:"48f67822",98139:"a2219ebb",98147:"fc46979d",98165:"c8e5bf38",98237:"3539b92c",98271:"f62bafa2",98308:"756094a5",98311:"9e297776",98392:"1c3a958e",98425:"b943b6ea",98473:"94dcd3de",98477:"ea6f04d4",98534:"6065ad54",98700:"99e64d04",98750:"19bfb940",98758:"af6e9729",98761:"3314c9d3",98779:"a48978f5",98804:"bf667688",98867:"3e8495a1",98908:"b4e94af8",98925:"ab37b32f",98935:"5de60d34",98941:"c9ba7c72",98947:"ef00b8a0",98982:"e8178b53",99001:"82a5d7f7",99095:"1c27379d",99146:"210305d4",99151:"8e563661",99252:"3047f3e7",99254:"c14fcab2",99299:"8944e56a",99306:"bdecca0c",99330:"b3e98411",99335:"df09200e",99437:"5ffb8f23",99451:"c0684476",99502:"2263a65b",99504:"76af5d51",99528:"16e939a3",99531:"8c2cbe8e",99534:"c49eb59b",99543:"25c655c3",99611:"9cc8ffa2",99644:"bfbfac54",99678:"25e15e7c",99701:"5a4dd75d",99705:"5fb14ca8",99709:"dc330c71",99710:"6e34d00c",99746:"f4a839f6",99747:"a32c0324",99872:"8e34a11f",99905:"2f7d15c4",99913:"38836367",99987:"4b2e4980"}[e]||e)+"."+{16:"8a09bc3c",25:"6875f362",28:"8eabdc91",39:"068bc723",48:"849a2f6b",60:"38634d1d",67:"7eac7b6d",106:"5d0f86c7",129:"ad091a76",159:"d17cfd99",217:"0bc1c4b6",278:"7a133af3",292:"0bd61be4",323:"2ca86a04",335:"10e8b68a",354:"40cf0362",387:"cd12a486",437:"dfb6628b",569:"02866324",614:"44e4a263",805:"07c12e99",822:"ef8339d8",851:"ee36c626",878:"8fad3634",910:"efe21154",917:"6161fd8b",924:"356e5ddd",940:"cac0b0df",1103:"3f89d301",1107:"7e8866c9",1119:"4bbc5be2",1136:"21f72e0a",1190:"8e56610a",1251:"49f694ba",1284:"f5a3911b",1337:"ed03be8e",1360:"ecf0e7ca",1422:"0e1d3b9a",1442:"47fac533",1506:"554d3065",1517:"1a694762",1550:"39a1cecd",1635:"35a7771d",1656:"ca0647f1",1658:"9711c713",1784:"0fef97f2",1785:"bc4d1952",1791:"5fd94693",1841:"b4a6b9c8",1846:"9ac595fa",1857:"4c849a8f",1882:"e0a7b21d",1928:"877dfaf1",1946:"61767f79",1955:"8a0bfb14",1983:"1982ff74",2016:"bd8bb947",2053:"a44f5cd9",2121:"e27f349b",2172:"33f2ad32",2214:"6a299945",2225:"7d7028c3",2239:"0f532176",2256:"779aea49",2262:"0bf08dd9",2298:"571d78d4",2385:"a6abe910",2450:"57f1681a",2472:"1b1cbadb",2540:"ccf5521a",2577:"9d61156a",2638:"0d848ef2",2640:"f6e9fddd",2652:"7c607567",2663:"4e8fefa1",2679:"dd0dc46a",2700:"2fafe158",2739:"0ca6b901",2748:"6afd10a6",2759:"38d24c2d",2768:"13d74cf3",2772:"5a7711f9",2791:"35fa4f4e",2839:"27e3f7c1",2854:"45badd67",2867:"2d1bdc8f",2884:"bc593027",2912:"4a994ce6",2932:"da39912d",2954:"f91b5b76",3075:"2f46f339",3125:"d85555ca",3131:"feeade58",3137:"a059264d",3144:"86fccc09",3179:"d88e0655",3303:"e1d40ac6",3313:"c4669891",3323:"a9b14b11",3471:"5be54bd3",3558:"4acdbe49",3693:"18efdc0f",3694:"cc0b4859",3722:"35a202b7",3740:"f2909c31",3764:"98e31955",3847:"6ae5e13d",3940:"06f163c7",3965:"c5d1f980",3968:"27784d55",4014:"fa271ba2",4028:"fdcb2d50",4040:"f4d4f02f",4060:"9b076617",4074:"33fd4cf3",4117:"9e3d6091",4133:"255f8728",4137:"75ef07ad",4205:"600be0a6",4269:"04fc581f",4355:"ef747ac7",4368:"2a18d792",4382:"5dd5bfe7",4405:"5da3e763",4467:"a9d685ff",4514:"b9b659a7",4530:"ae1c75a3",4574:"fc708067",4591:"93231c73",4602:"f0ac3d8f",4777:"5ba3f668",4790:"904f169a",4863:"2586fc4c",4890:"d278e426",4919:"c4d3cd3f",4949:"ffee880a",4980:"df50cb4e",5008:"6b1d60d5",5028:"7c782fc8",5029:"92619e1a",5065:"f9e7905c",5193:"1b398db6",5195:"774314fd",5206:"705fa214",5269:"3ef4f7b7",5270:"babf4f83",5289:"7a6d5275",5295:"55c2bba2",5304:"bb7c5b01",5322:"746c214e",5334:"5dddcc55",5338:"29eb08ba",5594:"341820cd",5622:"b7d8d7b8",5631:"e2b9b99a",5633:"a518d9fe",5647:"5d077e51",5679:"e005a1d1",5721:"d9f96b25",5806:"3440443d",5834:"8a7b0abb",5887:"68e33d36",5888:"5fa93c63",5936:"b9ce6fac",6022:"68004ad0",6054:"9b9387b6",6090:"f09b8f13",6158:"077cf067",6170:"31c32ba9",6203:"9f3b730b",6225:"4e2d8d24",6289:"a054c626",6310:"2da72e95",6350:"3246d056",6368:"505a4db3",6371:"091b2713",6372:"368025e5",6407:"c92fd14a",6467:"fecfe081",6475:"6ba96ded",6552:"b2b49c3f",6559:"c4675766",6636:"d669b70d",6677:"144addec",6692:"1df14aa2",6697:"5901c946",6709:"5ec644bd",6739:"cbfa6ce5",6761:"5d49f1ec",6778:"d15a57d6",6791:"2a8b7bcc",6823:"ff319028",6897:"55b30925",6930:"ef13ba85",6944:"cadf7087",7035:"04f7671e",7071:"9a7aef67",7100:"078c6553",7103:"6b60b9e8",7125:"b49e987b",7167:"960b2669",7317:"56224cc2",7355:"04e349af",7444:"42b1316f",7458:"24779c3b",7517:"0120af7d",7566:"dff45037",7622:"77095e00",7629:"1c27322a",7715:"5d269ad1",7734:"99a612f4",7747:"6f5217dc",7773:"a5129a8e",7802:"e5622638",7850:"a753f976",7907:"df25cd3e",7953:"ccc96052",8003:"308e1ef3",8070:"264340d9",8139:"61f67727",8174:"34dbd8a5",8177:"b6e0383c",8183:"147ec233",8192:"db4decd8",8209:"c1611e12",8289:"ffb3c473",8348:"3268c830",8354:"fb86f6fe",8363:"7fb1b5be",8367:"b027c2f9",8407:"99cf73d6",8413:"f12343b6",8417:"1b4b7f2b",8585:"223cec3e",8619:"df2fa06f",8632:"d4174f8d",8645:"e8362a79",8651:"e168587e",8699:"91e6e14c",8762:"4a09a33e",8766:"249ad394",8840:"8b4ab2c8",8888:"c84e49fc",8889:"65cd727e",8900:"fd8d3c4a",8902:"0f380f56",8965:"79e095ac",8978:"dc9f01fa",9003:"2d33db3b",9045:"4ab2e7e1",9066:"e4d3738b",9076:"916fbe5f",9127:"714c4851",9152:"c66c2521",9189:"0dc2870e",9195:"f73b50f1",9228:"46600037",9257:"c66aef02",9262:"793c41ca",9351:"61c33e87",9379:"6a5733b2",9380:"f90d89c5",9385:"dcf32ec4",9428:"6546d84d",9432:"48aca857",9446:"15fade35",9458:"7babc575",9460:"ca2fd5da",9471:"4a10d39c",9499:"ce206b69",9516:"c1f50d60",9525:"6395de95",9570:"e3b8ddf6",9573:"d316bf10",9631:"10562627",9647:"4bc8eb58",9650:"7174236d",9676:"cfd0f282",9702:"b965bad8",9722:"664860a4",9724:"52a83b67",9737:"79dbbe2c",9790:"e789ce2c",9836:"8fa50ab8",9860:"74431a06",9870:"438c6e6b",9891:"6a85c793",9907:"8492cade",9914:"d91c7b9a",9944:"f78b15cc",9986:"d714f752",10030:"59d03524",10118:"ab9fc9b2",10181:"3af67d97",10198:"86d665d9",10238:"50e474ba",10285:"bb7ecfb9",10354:"47cf3433",10472:"bdde685c",10488:"7d9ce470",10492:"e72abd0f",10535:"0d2ae118",10545:"f8206ac1",10610:"87868eba",10637:"0495e0c8",10642:"91b10c43",10653:"14a3241d",10688:"01c09458",10727:"2cdd7370",10767:"5998e785",10789:"3ced43a2",10884:"53e13b06",10887:"c5d8d489",10907:"a8d1a1dc",10920:"193c16db",10924:"95f4527b",10956:"b3581086",10978:"7f66cc97",11052:"c175ef33",11058:"b579a417",11111:"92a9adda",11156:"9f4df04c",11275:"7652321b",11289:"f07258e3",11299:"70c0805d",11326:"6ff62e03",11355:"670963d6",11508:"80fc6cd5",11565:"c60cdfb0",11631:"cc98017f",11684:"35726479",11716:"42a92ee7",11725:"127bbd01",11745:"4bbb96df",11768:"20e072bc",11782:"ed1984f6",11795:"ad2f4f53",11804:"b5477c1c",11806:"42b6e782",11842:"0baed23a",11855:"bfd20606",11869:"ced68d00",11905:"3420ebde",11906:"68908acd",11977:"c7bbc133",12047:"dce108f4",12134:"ae61bf97",12144:"1c1bbfbc",12186:"6a19cda2",12316:"4f2ec008",12318:"6eee13e3",12378:"27f2d38e",12393:"c1d28ac0",12395:"d9ff1cb1",12431:"a60ff215",12452:"97321323",12477:"e0de1e38",12485:"926a358a",12513:"80c6f08a",12535:"0c941d5a",12542:"9713e3ea",12608:"5c3e8335",12613:"ed4c9e9b",12654:"2320fb02",12679:"1987a2a6",12686:"8a06023e",12763:"91b8b830",12869:"442fc6d5",12945:"fc3acd38",12995:"ab02afd2",13021:"48555bb8",13060:"aacf116d",13063:"f4ce2b61",13152:"c62fcc56",13203:"c8815658",13210:"c492ed74",13236:"b09128dd",13298:"a8dfd245",13321:"4eb4493a",13366:"3c71c883",13374:"cfd37507",13375:"8ee7aefa",13406:"13cd1c37",13419:"b7a37f75",13465:"dd6217fa",13511:"d5b3caaa",13514:"b12fdebd",13522:"288b7d48",13525:"b906d866",13534:"17c9040e",13535:"5f863db7",13575:"0d1292de",13580:"8d40e9a7",13626:"720ad675",13698:"4cea1995",13733:"38f0a082",13762:"bca2bb57",13803:"bad250a1",13849:"0d423bae",13918:"bed720cf",13943:"453b7813",13982:"17e1f232",13996:"06631037",14003:"b85e041a",14027:"f1e7d467",14042:"de2f466d",14043:"69af2a51",14125:"527729ad",14134:"adda3dca",14136:"cc61dbbb",14152:"578ea5b7",14163:"af95fa0b",14179:"4aa5ccd8",14257:"da0d1ce3",14259:"9642e3bc",14261:"3d684545",14264:"61ebcfca",14317:"dcc8d0e6",14340:"8dd3b9be",14363:"9fdbf1ab",14388:"ae4bc2d3",14399:"ffd8a59d",14410:"cfbbb6cf",14433:"2c05622e",14435:"1ee34b91",14496:"17b3929b",14536:"10fb693d",14599:"a88c7ee0",14627:"cdb12c57",14726:"e51ab934",14750:"e9c21c9f",14802:"de3cd2b2",14822:"a06e5d99",14835:"0c69e520",14868:"b144ac54",14871:"c80525bf",14917:"28bfdf38",14919:"011e3248",14943:"fd40645a",15038:"8fb987eb",15078:"3707a6b6",15079:"97fca775",15144:"71664a42",15165:"3c006089",15186:"9c7f1b63",15220:"109d2e90",15235:"71ebac3a",15272:"13610938",15292:"328425c6",15316:"9cf140bc",15403:"8aefcfa4",15407:"ea6e5a65",15427:"6dbd0648",15473:"14fe1707",15501:"c8870324",15552:"7f6375ba",15607:"487239af",15764:"bd93ba8d",15805:"a819ffcc",15857:"4a7c5609",15917:"28cf866b",15947:"648ebe12",15955:"514b69ce",16017:"9d0f4c08",16032:"47c54457",16100:"0611b6f9",16209:"fbdc06f9",16231:"4dce858a",16319:"4732e626",16377:"367c7435",16499:"3b79297d",16500:"b4e686b5",16622:"b9a182ac",16641:"63243294",16747:"0771fd0b",16885:"9c0ac3a2",16942:"92d06824",16950:"48871f0d",17009:"10072815",17033:"eb12c1ef",17115:"0a45bdc0",17119:"b280a982",17232:"e57d15e6",17294:"0542258d",17332:"8b8baae3",17368:"115e5928",17402:"bdf033c0",17411:"03677a17",17441:"96e8dc5a",17474:"d3cc75ea",17502:"279389ac",17508:"1fb03d3f",17530:"88f83b35",17581:"2b842d8c",17626:"36956c06",17681:"5dd2ea64",17709:"7802d0a5",17739:"82146eff",17805:"8a44ead4",17818:"d75d0b8d",17860:"cc12893d",17867:"cac87718",17944:"53bb5673",17987:"79ab4ac0",17988:"6cc28a3d",18006:"c111595f",18033:"10fe31fe",18103:"a388784d",18121:"617b2ffd",18146:"95d7ba5d",18350:"f98fdabe",18351:"002d2df4",18401:"e94b36b4",18438:"7e8561ff",18445:"4e7d45c5",18520:"9fcfbaad",18620:"14588da2",18645:"66f4e3ae",18738:"88fed3ac",18757:"bc03ff70",18798:"059f696d",18940:"1ee0f351",18950:"69aec1f5",18998:"db0ba0ec",19042:"f2d5ba0f",19052:"99eea1e9",19070:"f854e03e",19108:"ecbc268a",19109:"9741eeee",19136:"497d63f1",19237:"f651ae7f",19252:"120b0fba",19267:"0b9c27a3",19271:"81fe6522",19369:"43355738",19387:"99f2a106",19396:"cdf3109c",19425:"1d1db863",19428:"05a9e187",19474:"09d53c64",19513:"36062fee",19521:"c3aa46ab",19542:"95ba9a85",19664:"46dfd0b9",19687:"300fafa6",19711:"75e966bf",19736:"0a635609",19774:"ce35f8cf",19798:"b9d535eb",19801:"51ca69aa",19865:"cfdb0b35",19891:"3fbe9ab9",19999:"12a3ab26",20038:"db96bb57",20103:"ad5960b8",20160:"270b34ef",20194:"f1baf75d",20229:"40f68aa0",20286:"b249e590",20325:"960a510b",20358:"43110a16",20361:"ad2d7e59",20405:"c035349a",20415:"83d5d036",20424:"e5504750",20434:"bd31090e",20491:"907553b6",20535:"9f958eb8",20541:"dcfadc81",20619:"23928919",20676:"3388d156",20713:"3d6d71ad",20812:"0f0199c5",20857:"bb3132aa",20892:"31d8f230",20924:"e4fef5c4",20931:"b8036f1b",20951:"a20fcb32",21070:"a8900866",21077:"a68cdbf0",21121:"4c137c15",21177:"093ad022",21191:"5de11232",21273:"908689e4",21275:"eb589f3d",21290:"0c7c0365",21303:"bdf31e12",21316:"fe15db87",21341:"475db505",21346:"f490b9f9",21373:"9fcc5ee7",21401:"06aacf16",21417:"38f28434",21448:"9908b8dd",21482:"9ecbf669",21524:"d7e79944",21560:"a0edd7dc",21574:"4deddbeb",21585:"7b244de2",21630:"15f37768",21635:"95acc70e",21662:"95e27da1",21729:"ed2a8c6b",21764:"a96fe837",21805:"b555879a",21816:"ced1acf1",21837:"c401bc3e",21874:"d29acb33",21909:"4300cff4",21921:"193750e7",22141:"3ae5c6dc",22313:"cffab16f",22369:"8efee04e",22385:"b551598c",22428:"4573e534",22447:"d7010a6e",22472:"ecd49f93",22483:"9d782227",22499:"2575e3c3",22501:"4f13697b",22504:"c055c741",22534:"85034a52",22595:"dc8a546e",22628:"c7870ff3",22640:"1a855b7e",22647:"1318d50e",22673:"9b329e63",22709:"d92e340b",22750:"bf71f62d",22816:"3d4baa1b",22844:"c586deb2",22911:"202546a1",22916:"8d456179",22932:"dcb09864",22973:"1b43a4e6",23002:"4fad494a",23041:"f35f208e",23081:"15bf2d5c",23083:"bc82584b",23119:"b3b53229",23141:"70ca6181",23172:"c3a54128",23332:"d979405b",23388:"1678b3a5",23438:"adce0003",23475:"475adf50",23547:"5809152d",23563:"2ff8adf5",23591:"0056b029",23600:"a5202301",23625:"4b0929bb",23634:"5b74042a",23637:"039d8f53",23641:"3627f9fd",23666:"b60b4f41",23676:"c467ba2b",23700:"60a4a0cc",23765:"cd26f4f3",23773:"520cf3dc",23880:"f23d8063",23938:"d312764a",23998:"79a7d02e",24022:"870880c2",24065:"66cb1805",24084:"0194a56d",24098:"a0602b5b",24126:"37fede99",24140:"eb4a5735",24172:"1e513f10",24234:"8cab740f",24265:"9a476a2b",24340:"10e55999",24366:"8a444fd8",24373:"ab56a496",24377:"1cd6ec42",24381:"8cc6de74",24437:"d4b0c4cb",24475:"24d8adfa",24476:"2f952c5e",24704:"cf0a496d",24728:"0b98b763",24729:"055e6d18",24741:"90d7367f",24776:"4c19f189",24815:"6a3bcf36",24826:"f46941c8",24853:"91dc934e",24866:"d50b77ce",24867:"a8a3b8e9",24868:"64d89cc1",24891:"acea9caf",24912:"c8b91976",24919:"4ba924a0",24932:"ba390371",24970:"00f2ab70",25013:"ad26ed51",25044:"c495349e",25067:"a053ee4d",25101:"e136e901",25130:"4fb7b9f4",25186:"b0b2572a",25273:"cf02c70c",25285:"45a1ec19",25335:"b58a27d3",25396:"89ddaa62",25397:"f44c23ce",25426:"5994dd2a",25452:"e356ced0",25531:"70bc702b",25532:"973de6d2",25539:"4073dbe6",25578:"42db5727",25582:"2844b50a",25601:"aacfb2eb",25778:"6e2353ca",25781:"72653a4c",25845:"3668f0da",25869:"7ff9c8b3",25871:"6d4f8d18",25874:"a999abad",25959:"03b0d503",25987:"b6951fae",25993:"5a60b486",26003:"0dbe838e",26009:"6f80e4a4",26060:"49615372",26064:"2c34cf8a",26081:"4fd365ee",26183:"f197b658",26216:"0d38f496",26260:"d8f05c88",26305:"deccd138",26333:"ff2d3221",26337:"a16833a6",26414:"34f7cb93",26548:"9e235a1b",26577:"23f41c03",26627:"369f52dc",26630:"e90418e0",26632:"0dd9e951",26722:"14ac1711",26724:"7b16081c",26744:"58600e3c",26797:"0e6e3c17",26833:"ce805620",26859:"aff1f02a",26882:"d62acd2d",26900:"81479d5b",27012:"c29dba83",27020:"a2996298",27088:"47e88723",27115:"294cd6b8",27123:"6eed6c70",27179:"55360a14",27212:"4e430747",27369:"56253630",27388:"b0340f4a",27398:"50cba2a0",27444:"ea243234",27473:"5eca5e0b",27663:"e88ba1c1",27737:"6ce228fd",27823:"8a88b285",27887:"a3b9de04",27921:"45a287dc",27955:"be1e4c9d",27995:"09203cc8",28020:"ae6c303b",28086:"964d7344",28127:"52851c3a",28147:"1f3d479d",28166:"24865c80",28169:"5ab36c27",28178:"f62bdc9d",28204:"d075bb24",28235:"5ae34328",28252:"c129dd81",28319:"5d3fafd5",28410:"0b21d6e0",28428:"b0be705a",28435:"fceffd0e",28498:"1948bf76",28499:"f005668d",28627:"ae271a52",28679:"1d8f6a45",28687:"aacd5569",28701:"a28f8b91",28782:"40f66cca",28793:"e76cb139",28803:"49549dd3",28834:"3ee8e8b4",28853:"aa92d9dc",28889:"c2c9914f",28920:"9629e812",28941:"8c7af014",28945:"65b1a092",28993:"f632a39c",29060:"32b1dc91",29123:"dbd291d1",29171:"71258614",29204:"a6a43695",29243:"1356f2ff",29337:"01639ff2",29408:"bd89f274",29414:"8660a85b",29421:"fbe24116",29452:"3e9a03a7",29457:"7d14d05f",29498:"7aab7361",29523:"7c6695ac",29526:"2f8989c1",29653:"8f3e3c80",29679:"04a3f313",29690:"942394eb",29698:"0a4d3c74",29708:"8f01ba9e",29733:"13ded0ec",29795:"3b9ed063",29820:"86a6b03d",29829:"d1f3ee13",29845:"a1cbc44a",29891:"850e5356",29922:"a7552bd2",29950:"c6942778",29969:"67f28cd0",30035:"175fda04",30066:"bb46b5af",30154:"ff90619a",30167:"47c6ce34",30262:"e0931477",30265:"a50c2e7c",30317:"35aae90c",30355:"ef8a4417",30378:"6d8d95c9",30396:"87304d95",30410:"4e970141",30564:"97976d72",30569:"e40e0024",30579:"d0ae98f0",30583:"0349d956",30628:"c26c6054",30654:"73dd606b",30790:"a0648778",30827:"49ffcf71",30831:"64198a51",30842:"b50c451d",30848:"6480bf83",30934:"79541782",31004:"1d4923d1",31016:"035c650a",31039:"8dc64df6",31047:"cc5471ac",31125:"0d364546",31141:"652afae1",31144:"28477358",31220:"28b772dc",31255:"f94efe8c",31257:"771d4335",31272:"c7607cd9",31393:"a1e486ff",31465:"fff27cf7",31541:"4b8b9953",31544:"f4a84c54",31567:"a41f71c0",31680:"72a131db",31705:"4c5db215",31720:"77528df6",31726:"d1ef5da1",31749:"45dfc10c",31791:"392e408a",31797:"0a23a6de",31861:"93b5dcbf",31862:"9fb160ee",31869:"691241cf",31957:"09fc98dc",31972:"a2543041",31996:"7a9af77d",32005:"3ab64a28",32012:"287d33ab",32039:"4917de23",32183:"e4c13218",32225:"07d3987f",32270:"640b03e4",32278:"b3715c88",32335:"2a952a69",32365:"fe0329c9",32391:"a83eb43b",32472:"a7687f19",32527:"9df1b2f1",32558:"e82fa20b",32691:"c97ef1a0",32728:"a5d1f40a",32824:"d88681ec",32825:"20536cef",32847:"b0005fda",32875:"0800d3ee",32949:"7a6c4ac1",32960:"b5798ca2",32993:"6c882733",33049:"8364c70d",33065:"7304db46",33192:"9a5863ec",33214:"bc8b27d8",33234:"a84fa661",33290:"219552f4",33303:"43ad6989",33350:"75f07d8c",33458:"a7557404",33517:"3db9b64d",33524:"2e7a87c2",33533:"73ed698a",33540:"148c3af3",33559:"8fc1b433",33567:"350cc4b3",33572:"09b03628",33577:"d40cdbfd",33612:"c687cf88",33621:"bda44dbf",33638:"5fca92de",33643:"569e4e05",33659:"21d9ac33",33724:"88ca3752",33804:"d3822e25",33806:"7a355084",33816:"d55e6964",33825:"5a0253e7",33854:"94a59e40",33881:"5b41d6d8",33889:"b061c751",33999:"668ec8b1",34127:"fde6c8af",34156:"bbf91755",34179:"1bd8bf5b",34182:"21781a90",34196:"5c27b80b",34255:"3851abf4",34331:"9ed21c85",34335:"449a955c",34388:"63680cd5",34520:"7924cd1f",34528:"a8871870",34543:"bd5caa0e",34549:"c9123c09",34597:"2d91134c",34621:"ae85fbee",34638:"16fa9b5f",34662:"091b3d87",34691:"dc70936f",34706:"89e46f0f",34750:"224f43cb",34803:"b8ca48f9",34808:"909e26ac",34810:"99716174",34837:"61c61de3",34847:"c1ad7786",34877:"5060c2b1",34904:"25d15372",34918:"cbd6f71e",34970:"cfbb2faa",35044:"cf8fed2a",35067:"d17b3136",35088:"cea1a9b9",35139:"1eb36ee6",35144:"bffb4b7d",35179:"10e7c1bf",35248:"74d1ce2f",35288:"991ef11e",35325:"e01489cc",35329:"9e684943",35379:"8ab1496f",35402:"375ee7c7",35532:"1beb2628",35618:"e4f3db36",35730:"f9137192",35733:"28dd7656",35742:"de61f764",35766:"9a1fa293",35767:"dfa52db3",35784:"fc8fde7f",35837:"1e5ce2e7",35881:"c8a2bef3",35922:"4cfe6391",35932:"506269e4",35960:"059789bb",35983:"a3ffd343",36009:"cbae7f1b",36055:"4770b5a2",36067:"fbcdaf70",36113:"2d48d701",36144:"725b0d44",36192:"26c2e85f",36264:"3ee1d673",36302:"72b0bcd9",36379:"b702241b",36387:"251632c5",36549:"e2747c6f",36569:"64ebfa77",36594:"bd886889",36619:"617e0e66",36640:"52eef1a4",36672:"1702d861",36689:"8a2dde69",36747:"e29bc85b",36790:"9de7a9c1",36851:"203b548f",36885:"1ac872db",37109:"0784f49d",37115:"b776b259",37147:"088d2c22",37191:"2d0ea897",37204:"1605f8c9",37206:"af6fb7c2",37209:"9b43eef4",37257:"dceda108",37329:"9a57546b",37366:"160a0072",37403:"c5e2093a",37486:"e7d57a3f",37489:"9a67fcbe",37577:"a1199bf2",37578:"0177c4c6",37617:"8e607010",37643:"4865d39b",37673:"7883a91c",37740:"fab7fc26",37799:"403baa89",37809:"9b6986e9",37827:"5fde1cd7",37839:"05558af7",37841:"670e19e8",37842:"1d81fddc",37872:"e9177a7e",37954:"076d3157",38001:"cb066494",38003:"70d204fd",38056:"20662e51",38107:"43c0bc0c",38158:"51aebc6d",38238:"5390d965",38348:"adc210d2",38370:"fdc0ca5e",38385:"97d9f92d",38416:"20851e98",38439:"461b0f80",38449:"39bb4f65",38451:"6bf97463",38468:"716e8fd3",38600:"5d6ce15c",38605:"f3f72edd",38607:"fbd8a71b",38700:"f325af51",38767:"cd1ba66e",38786:"31e8cea7",38816:"7447358c",38835:"40a51f33",38839:"dae4efea",38888:"6753bae4",38974:"4d5d8235",38999:"35806b80",39058:"effdc4b7",39088:"f567553b",39110:"50177589",39138:"10007fdc",39142:"6a331906",39153:"e21126fe",39192:"ef51e43e",39197:"ea14ffa4",39202:"40e4ffae",39208:"a97db242",39230:"5527100c",39240:"5079f647",39260:"ba5c24ff",39265:"5d0ed436",39283:"79d7db8a",39405:"6242229c",39407:"a7203d6b",39417:"d02a7f26",39423:"17d4a9fd",39444:"a22313d8",39487:"5b0731f4",39494:"f30b5ac5",39496:"ebba264e",39505:"5bda256e",39518:"c3c9d6ae",39520:"27de82f7",39555:"cccbb5c8",39569:"3bef5f39",39587:"af0d65e6",39608:"1a5e64fb",39712:"0a24b98c",39715:"bbc66cf5",39758:"a3fc9df7",39773:"b393be97",39777:"3432c599",39781:"47d6c4a6",39840:"53dbfad3",39887:"e46ee796",39901:"eb9119ba",39908:"6d740ec1",39921:"0e79eaf9",39973:"e8d22580",40065:"b7fdc9d7",40124:"40c231c1",40178:"b61f965a",40205:"c94f090b",40245:"b96db1fd",40369:"92864a0d",40463:"427c10a1",40464:"acd8440a",40555:"f52300e8",40606:"12108f89",40616:"a9f41f0f",40651:"2d49ff29",40690:"a60e3624",40697:"b4dd2319",40755:"3e432e6b",40758:"4d3e9419",40797:"3db6824f",40827:"1a80c281",40847:"cd35205d",40907:"d1b3edb9",40919:"6f0cfe05",40927:"73302b80",40959:"dfce7692",40999:"a9ca37f2",41030:"1804232c",41125:"2c45e5dd",41135:"e8aa7f97",41159:"3ac9a111",41260:"8ca7fc77",41361:"784c9a03",41455:"eddcbb4b",41461:"3443ba16",41491:"56b3d829",41504:"6389ddd7",41518:"d9e6c91e",41594:"af01423f",41640:"9e866231",41651:"616b00c8",41677:"8c940416",41739:"e8f5e70c",41750:"ee28ae45",41852:"3dd9673c",41867:"0e7edf3f",41872:"b0386e86",41892:"9f8c189d",41907:"f8e6d852",41944:"9bd9e858",41954:"e362215b",42068:"5e07d0e9",42187:"d9057212",42196:"71100c70",42268:"6c4ef9de",42298:"a50f4480",42299:"09b7f6e8",42350:"1142cfde",42368:"f8b7383f",42465:"3ff7fed9",42487:"56c461db",42518:"198e0c40",42566:"b345a309",42576:"9a6fd0e8",42596:"7100815e",42690:"f8d6e169",42702:"5f8c0f9d",42723:"4fe95284",42794:"7bc80366",42799:"439a565c",42801:"98f49e04",42879:"7c6ac9f2",42881:"45103050",42900:"a68c15fc",42905:"6bb55442",42911:"5bb7f601",42920:"c438d5bb",42937:"58f6b800",42942:"5cf3f15a",42995:"695ebee8",43029:"0d532445",43035:"dfc57d02",43040:"1e4a40d7",43042:"f5fd14f0",43078:"a02f005d",43088:"49e4451b",43113:"0310d8f0",43195:"92666359",43286:"f606a9ec",43352:"24cd4507",43421:"0a5a165b",43432:"fd8b8122",43445:"93a5e7b9",43461:"b6d04d9b",43512:"df29c6ae",43642:"d6ff100f",43677:"d746dcb5",43739:"fc70054f",43868:"a3261008",43922:"32416b57",43980:"4a4883a1",44008:"643184c5",44022:"6fcc094e",44040:"2dd42aaf",44045:"c0d86ede",44118:"8cf0d0b2",44123:"11ceffaf",44125:"e33c2ae7",44129:"86e86df2",44143:"044af036",44290:"0d453a69",44326:"2ee9dd8c",44339:"b32856ef",44380:"cf224181",44405:"51b730f8",44419:"a05b3029",44489:"66da1d5e",44492:"ec2797ef",44551:"b4882b70",44567:"3c62c94b",44640:"d04281b8",44662:"d947bd90",44682:"087d97b5",44719:"9f19c736",44840:"a727ef1c",44876:"e3d3c1eb",44891:"06e055c0",44933:"1455309f",44939:"e64332af",44948:"07d7525c",44960:"843bad26",44964:"b983a3df",44994:"41cd7968",44997:"3ffd623b",45113:"523985ee",45117:"8c2c2ced",45146:"e85c17b6",45210:"52123a36",45231:"a109a3fa",45238:"f9e62925",45290:"d75a994a",45323:"faea1743",45339:"3bf0bfb0",45460:"550b46d2",45500:"065ed853",45541:"6fd99ec3",45561:"f24f5701",45640:"6c7f6a66",45670:"50c1ba0a",45682:"888518b8",45919:"55919297",45983:"13ee651a",45988:"17b1ea4d",46001:"f432c2ec",46008:"f69f5c00",46025:"7650608b",46039:"f72f1171",46063:"3541e9ea",46074:"6f20e0a9",46156:"7d11bc0b",46197:"df2b2640",46244:"cad26181",46296:"f08eab96",46375:"df5f4d23",46425:"cdb28597",46451:"a6a11df4",46472:"fadf22a1",46513:"56c87a15",46515:"254b9405",46547:"8eec7030",46578:"59c56ca8",46598:"c169c2b6",46652:"63a78692",46662:"e6c9e2f6",46754:"5fcdc1a8",46802:"d659f98a",46840:"2eaf8b00",46850:"b6f5cc68",46888:"4961c159",46891:"3a3be22d",46905:"e3c70d3d",46911:"2300f302",46917:"762b651e",46921:"be8d197f",46937:"5c1b7fd5",46979:"008db483",47041:"255878c7",47060:"9049c3c7",47087:"13a87ecf",47106:"bccff21d",47110:"56dd8cf9",47127:"5f600751",47206:"4cdf2089",47236:"3d4f63b4",47247:"4d3adf16",47248:"816064a8",47297:"eeb342f5",47433:"ac211919",47517:"4328267e",47537:"f3a77ab2",47555:"b251b72a",47622:"09db78d4",47668:"680ae267",47693:"c10aa10f",47699:"492e4477",47730:"4bc36570",47917:"2dde4c6a",48003:"a29cbb41",48023:"0f86cac1",48050:"1fdb78aa",48063:"3a568226",48071:"d796c291",48091:"df7b8959",48130:"e6c193ae",48132:"953d34cb",48158:"d48e413c",48162:"b4c8061b",48167:"4dcfa6c4",48188:"04a8ab5c",48214:"46956ca7",48285:"d6809f4f",48295:"0b50cf9f",48304:"5f48cd0c",48310:"64b1d5ea",48355:"8e22de30",48360:"cfbd7304",48361:"c850e674",48532:"a494db1c",48544:"86f74040",48592:"349dffae",48613:"3f89da26",48661:"3216d8bf",48673:"9d684a78",48733:"c32bd61c",48768:"079b97bc",48793:"5daa512b",48803:"88f5f6df",48842:"f3bf8406",48883:"a235bfe0",49013:"07816850",49046:"9e2e99da",49055:"eb422c4d",49071:"ba636502",49112:"d7a24cb5",49174:"03c624f6",49199:"efe75a67",49226:"b6e04903",49280:"4dfb5a77",49305:"acecb563",49350:"b3dbf751",49388:"9bd7db7c",49461:"5ae94b5a",49521:"60482983",49569:"b4567b28",49579:"e16a6c78",49583:"393a5e78",49587:"4cf9d174",49655:"68089f3d",49676:"2bc5bc8b",49783:"5250a56f",49786:"7b91213f",49880:"54c0806d",49991:"403e6dc1",50012:"68d419a1",50095:"6ed54966",50176:"417fb999",50178:"18db7c21",50183:"1be5d08f",50259:"f7eb5e14",50261:"7008ff7c",50293:"42163459",50361:"bb9593e9",50414:"9d3834fc",50428:"f90b3bfe",50446:"5d436275",50472:"f3bb4c29",50486:"0f8a2868",50507:"8f74cee6",50570:"c66081cd",50584:"8ff63e94",50642:"da2e25f5",50700:"11590bcc",50703:"bd356fa0",50747:"b4c4b315",50769:"bbaddabb",50800:"1ada2615",50819:"551c9c7c",50827:"394e36ad",50839:"7fc947a3",50934:"7c4a4744",51047:"e05467fa",51049:"e5ceb9fb",51060:"7c84a54d",51090:"d3055e1c",51102:"25d73939",51116:"5d147865",51170:"b528a493",51175:"3e23e8e6",51184:"3fbba03e",51229:"24c83fdf",51237:"83d2b73c",51378:"27ce1cb5",51412:"e5d9f101",51420:"51bfdb8b",51438:"153db1c7",51494:"da27cda2",51548:"c84495e4",51578:"260cb010",51584:"24cf19af",51589:"990a5fd7",51636:"b532bd62",51649:"c406b631",51665:"4e1dca5f",51694:"d22c56f1",51711:"6ed1019a",51755:"e7683163",51763:"614f3b14",51769:"4709b0b0",51814:"e54b3ca6",51828:"cce51e7a",51837:"7e552679",51878:"72c458a7",51890:"33cbdd96",51937:"7b8f3921",52036:"4ce3fd22",52042:"f430fae8",52093:"0bc9c087",52102:"8459ac52",52132:"18679067",52135:"24738c10",52176:"9d3aca59",52207:"3fd074b7",52218:"715862a4",52235:"b3475660",52250:"d133f712",52266:"7f7e57bb",52267:"999b9003",52282:"63565f78",52286:"4a595239",52342:"e54f9f4c",52408:"d3db7d01",52450:"99135bd3",52462:"3529eb94",52466:"0060b180",52478:"f31e943b",52488:"2e672211",52563:"63e5002f",52569:"0978d751",52572:"66b2d328",52612:"fe83ac5d",52634:"f1140671",52680:"c4c41065",52711:"07c974a8",52731:"c514a24b",52770:"479aefff",52785:"db98dd4c",52826:"83f0710d",52840:"3fb65c88",52882:"f217557d",52895:"6f6f0499",52911:"2bf6f0df",52912:"9734e003",52913:"3bc2819d",53074:"21f6a3c7",53132:"26e4c97f",53170:"46c4c760",53178:"12177593",53201:"0d2201ce",53237:"9d662527",53256:"de10895e",53266:"ec0e5b63",53288:"58febaaa",53314:"aeb9ccb6",53449:"8c293a1d",53458:"d06e4d8a",53492:"c61db897",53540:"b615600c",53619:"07903309",53629:"0e9da356",53633:"91cfa4ca",53646:"252e93c1",53670:"5d9992cf",53742:"e3fb6085",53771:"503e9c26",53786:"295cce71",53832:"ea177f3b",53860:"045fe6c1",53861:"89eb5be8",53871:"06715a06",53881:"baaec368",53901:"176898ea",53925:"c90ab7e0",53982:"ac914839",53990:"ada2a249",54097:"7fe429a5",54106:"0ae8620d",54200:"d2bacd5b",54240:"9d3e04a4",54246:"60f12cee",54270:"091906f6",54272:"15bec62e",54274:"de7a41fb",54277:"203dd83d",54399:"52bbe215",54415:"f56879e1",54462:"7f730c3e",54487:"c5676dbb",54500:"8b8b005b",54540:"a02f600f",54568:"b4a9dfa4",54730:"18e0d97a",54749:"506a8f87",54759:"03807f37",54772:"1026b8f9",54851:"d6dbe9b4",54879:"50ccf7ac",54881:"d0c3c6aa",54927:"40575db9",54950:"c2be47fc",54951:"d7f390d4",54992:"712f1c60",55004:"a9d23daf",55100:"538b7d12",55144:"9e0ba362",55167:"b4d49358",55206:"0d70c765",55276:"e3d30ccb",55302:"1f220875",55342:"baf46857",55401:"b92ec369",55483:"9bee99fb",55526:"93ae64fa",55534:"25d024d7",55559:"b83a883d",55566:"82130cb7",55579:"4e0724fd",55616:"6658ee4a",55664:"42d281a8",55668:"ee74c105",55754:"89d9928b",55780:"a19a9af8",55836:"96bafd1b",55929:"77f3f6c1",55942:"d374a5b6",55955:"da177b3e",56028:"af871c03",56037:"ab8234ba",56062:"60867da1",56087:"13c91d14",56097:"f053aab6",56122:"74d598a4",56123:"c789ce2d",56133:"762b0fec",56190:"ef64dc1f",56256:"e36aeffd",56259:"68ac1963",56297:"26633708",56384:"fb72bb40",56408:"5bae03da",56493:"7ee5fd86",56510:"0a75fbb3",56560:"3239f135",56607:"48d20332",56648:"0e90e357",56662:"5e826942",56688:"2cca9c43",56723:"1293a3d4",56725:"7b698c07",56767:"e8136b8f",56779:"d6ff4e16",56826:"50015c12",56916:"550c02b1",56948:"46365228",56974:"4839cefe",57054:"6fb01f30",57119:"987dbf1a",57141:"7d7eec25",57155:"e94ea6ca",57159:"052fafd0",57165:"d5789e63",57178:"8bfa9b62",57182:"69123d57",57222:"c8de5978",57245:"8d409ef9",57251:"58acefa5",57283:"21045dc1",57302:"aa7169af",57326:"8b59f195",57359:"8ee1fa90",57361:"4a3a3cb3",57426:"57e1c591",57529:"7bab9ba3",57547:"3a1cad18",57581:"fb0331ac",57594:"1e47fc98",57614:"8825c03e",57647:"56c9542f",57730:"2bca685b",57749:"4bc6c338",57760:"1092dcab",57762:"c39c754a",57885:"5d86fd4d",58e3:"734d343b",58002:"748d2de6",58079:"573a9aa6",58111:"73a02d4a",58144:"36de5476",58255:"5ee8f8b1",58259:"cd10818c",58301:"4a5e22ca",58351:"cdf49691",58359:"dcd461e7",58393:"399932cd",58428:"3ffcb7ac",58479:"44dcc97b",58484:"f70a46c3",58492:"d2645f8d",58581:"83d42deb",58594:"cf6bd0a0",58666:"f2504d8d",58667:"97e291ec",58704:"25df67a5",58707:"15c67f3b",58721:"f353fceb",58780:"d0db0c75",58857:"865eb012",58874:"1a0a7c4a",58880:"1513efa4",58913:"e13e4900",59004:"328f4441",59005:"cfef6f48",59009:"dc31e278",59020:"8f1ae138",59053:"6eeb65e2",59070:"00082207",59104:"12590816",59114:"83de7b83",59123:"564f8b9a",59182:"15f5ff3a",59262:"aaf827b1",59326:"73c25d16",59349:"c28d69e6",59475:"006f4c07",59493:"631868f6",59521:"c957bd71",59614:"b7e2e03b",59680:"3c671a5e",59702:"69bdff54",59732:"2a459114",59740:"04c67354",59779:"2a5eec41",59781:"f87d58a7",59866:"aa994063",59873:"1880b633",59874:"a8378fd7",59923:"b38aed5f",59940:"f75ceebc",59981:"76c5bdaf",60020:"0f554f37",60119:"5b9bc0b4",60167:"b7af2062",60185:"eb38933e",60187:"7636ec06",60193:"2bef0842",60198:"a93ff4e2",60203:"8d7339c1",60257:"5032408d",60267:"d687473f",60294:"5b4136af",60315:"55f56501",60445:"36846bdf",60510:"ffb2f2a0",60565:"d1460e67",60613:"cb3cc081",60625:"ad1309c8",60676:"81736ab9",60696:"a608baca",60725:"dbd85841",60762:"a573b13f",60765:"2dc71301",60819:"5e525d6e",60830:"00f6a771",60837:"fc61e2ff",60861:"b786146f",60884:"14ad0b43",60901:"0a407239",60908:"4b488b61",60953:"0a991989",60965:"60e4101b",61027:"449d7005",61114:"6ed53af4",61228:"71606809",61235:"b3fca070",61265:"f983c95e",61300:"834cd9b6",61345:"a53b2883",61378:"f5f5ceb0",61416:"179f2544",61481:"27590116",61559:"e81e8852",61584:"8bd4f52e",61627:"269c1cb3",61652:"48519009",61702:"3ab98eb7",61721:"1bede07a",61734:"76fade34",61740:"ae48d0eb",61786:"11544c15",61844:"b500c1f5",61886:"838ac25b",61939:"63ea2061",61950:"d36ac652",61959:"81d6b244",61991:"5a92f8a3",62015:"8ec5ca20",62037:"306ee7ed",62061:"1efccb35",62111:"cd0efc31",62120:"99d514b9",62138:"567ed5e1",62147:"8390c8e4",62149:"f514162d",62162:"5acdb074",62182:"503834a5",62188:"3e551357",62254:"245e993a",62264:"e4528e15",62400:"e7e7907a",62431:"b246e6b9",62456:"43e0651c",62469:"3c915cc0",62501:"de4df872",62549:"301ee9e3",62568:"68871186",62635:"22cbfad7",62639:"210bc494",62641:"75bfbfe9",62672:"6358ea51",62691:"753414c4",62703:"564b723c",62712:"d5ff0699",62714:"fe7a976f",62827:"296a4530",62845:"90aeb106",62867:"672ac76f",62875:"c31ca64d",62927:"d4d0ae7b",62953:"0792ec6e",62957:"6f1cdfbd",62975:"995912fe",63005:"6d110437",63064:"c0bf5dca",63075:"3ee1025d",63124:"34aa01f3",63151:"b9cb4815",63181:"ea8d8fd9",63228:"10bd0d98",63262:"bf4c2c34",63291:"9ffac09b",63298:"acbff002",63317:"811a54d4",63330:"bc478490",63332:"500cc836",63367:"7a6eb5b0",63382:"e45271df",63387:"489643ee",63420:"489eff90",63430:"26ae4f11",63455:"62b0c186",63515:"a47e4d5b",63521:"66036a01",63553:"ea92fe5c",63576:"0cc97e30",63627:"6f0e73b2",63646:"24a98389",63682:"e81f5366",63700:"7e8b055f",63739:"a9c24938",63760:"d6e4a1fe",63779:"8304ce91",63795:"90a8fc97",63836:"c50ffd2f",63907:"7efe218f",63951:"b86c7710",63966:"d1164b7f",63975:"7ff61510",64045:"8cd8acd5",64099:"a0ff270b",64184:"80d3a705",64209:"a2d5ce2d",64264:"304d81a8",64275:"336cbfa6",64351:"38e048a0",64391:"a3d0ce9f",64442:"e6149577",64447:"ab60d1bd",64465:"3c9d3adc",64473:"cf1bf285",64502:"3c32636b",64527:"8724400a",64535:"2a06b13a",64577:"d5c345aa",64597:"16a203d3",64623:"c358ac06",64659:"61c9f121",64670:"9186d3ad",64737:"9eaa058a",64749:"867c6f08",64838:"b35964d0",64899:"bf652241",65013:"9e1d762b",65017:"566badfd",65091:"33aa1367",65094:"9c1741e7",65133:"6b78163f",65193:"c9d51b91",65221:"f8300e9e",65223:"fc7b2fde",65233:"4caa50f4",65246:"b0e81973",65350:"360c493c",65356:"044c021b",65359:"367c24bc",65473:"5e0a91a2",65497:"8399cb89",65569:"b0072d01",65611:"5f89a380",65625:"08954e37",65629:"16ecda58",65647:"24aaa41f",65648:"e4fb5853",65658:"3b939be5",65727:"ded58870",65745:"316ea106",65756:"15cd943a",65759:"819fc53e",65835:"a3453b0a",65897:"a381fb32",65918:"146740b5",65926:"e5ecb06c",65957:"68a2cc05",66061:"45757a8b",66062:"eff2a5a4",66097:"25d8d490",66135:"e4b972b4",66140:"8dff9019",66162:"2b8e16e9",66169:"02c3df8a",66210:"d091b4c8",66237:"c01df0e8",66327:"5e088192",66338:"66797f3d",66372:"b09b0736",66381:"ad989954",66394:"8bded28d",66415:"cb19b5da",66461:"d833c819",66499:"38de97de",66504:"ca582e0b",66510:"24f0668b",66518:"c9394214",66524:"8bc94417",66538:"78f9375b",66559:"e664ab4b",66575:"a2383db1",66602:"5af37c6b",66715:"b7e0c845",66753:"69af30ac",66759:"dfe5642b",66822:"a5b3c79d",66832:"6af1a81d",66867:"9bff7442",66903:"1a459fba",66912:"54eafe75",66947:"c4ee53cb",66995:"784da00a",67044:"f4de3f48",67061:"d9896998",67098:"75ab85df",67100:"9ce14990",67104:"02c01d9f",67114:"8c651089",67149:"eda30c95",67189:"7efc5baf",67229:"600b8e16",67252:"9e177ed7",67376:"e257bb32",67438:"594c8d9d",67472:"522d8645",67489:"982012ab",67507:"f3e3cc96",67545:"326fab84",67581:"3158be0d",67587:"79c7e4c3",67649:"3e6502fb",67668:"b61eb3fe",67683:"d02d9bcf",67704:"90a45e0a",67720:"a584e6c3",67729:"20a9cf6e",67755:"1e073c84",67775:"b9dde3dc",67914:"332bff15",67954:"48148f16",67989:"b94c1f76",68038:"353d6f0d",68043:"e18e6796",68045:"7e4deb9f",68094:"1571ddda",68210:"58aca33b",68246:"f542fe1c",68249:"b11b303c",68253:"c30a59ca",68304:"6409542f",68315:"91b0f913",68334:"e92472f4",68434:"c764b111",68467:"a09054a8",68470:"20998ed9",68515:"48625b37",68551:"847ce269",68569:"8cddf474",68665:"36bf7051",68685:"4b2f7100",68710:"62339bd0",68765:"a74cb64a",68770:"cab2adc5",68839:"6cd72ebd",68861:"7c45d32f",68865:"a511cfb9",68910:"93d8f036",68930:"67d62767",68955:"d59c084b",68991:"fee3dba7",69017:"51df1e44",69030:"105e1b32",69038:"aade7e7f",69129:"af425d1b",69169:"310f0e66",69199:"aea55b19",69347:"146443c3",69365:"e3667910",69384:"efa43be3",69457:"0159f9de",69501:"99f0cd42",69517:"0c43557c",69570:"915a5618",69588:"919af855",69633:"322b0d34",69638:"05f50075",69671:"c73392f3",69770:"c4d5f69c",69787:"13159f81",69844:"3b524105",69875:"32cda754",69982:"3d6dd370",70008:"58761afb",70022:"066cbf14",70058:"943c427c",70100:"572c029c",70117:"b3c36679",70126:"d4115426",70127:"b084e3ed",70133:"9100024b",70174:"54e46a31",70179:"6bd088b0",70209:"f942e04a",70210:"baea7766",70234:"a553ab8f",70253:"30c1c2e5",70268:"4452b64a",70399:"e6d32efa",70418:"4c6611da",70452:"e2a2f968",70502:"c692a6f9",70551:"5ef3d7c7",70560:"215f7919",70606:"38763243",70612:"b8278f3e",70645:"4df69f83",70649:"416d6f2a",70669:"d4aecb8b",70687:"2dc36e49",70689:"2651b58f",70696:"c124e296",70712:"4c96e1d5",70728:"bf4215fc",70749:"42771251",70755:"3a5a31a3",70784:"0e4575ad",70791:"ad524d20",70794:"0f408514",70814:"2d650128",70825:"6ae11483",70826:"27591451",70828:"8b297c90",70853:"88bc6dfe",70870:"84bc6d3e",70947:"dc575b6a",70953:"0932b99a",70963:"6b5459a5",71021:"48d0f323",71026:"65a1b93e",71051:"bd187ac1",71111:"fc43fabc",71117:"209f2f28",71162:"54a7c705",71227:"c59bf196",71235:"ffab41df",71374:"ce3ef14b",71407:"7a2306d2",71473:"664a5e47",71531:"e7ecea81",71565:"e5390c69",71585:"72b12311",71590:"65b131bc",71612:"5e412c85",71656:"e6be372d",71715:"5b33b525",71784:"fa873b97",71792:"a6dc84f6",71858:"4bc2929e",71863:"92de78c1",71877:"2ec93eca",71910:"16d68f54",71964:"70da7109",72011:"7070f410",72043:"dc1ef129",72053:"6c6b59b0",72122:"23fdf7ea",72135:"5d936594",72246:"0f8806ae",72322:"8245e8b1",72353:"8d7cc6bd",72358:"7f58ed97",72446:"4a887c84",72527:"bc4dd3e0",72573:"dda0531c",72599:"9a7c5694",72634:"2c57b1ce",72668:"a2ebdf55",72675:"062aa684",72707:"7fcd7169",72759:"16cfab86",72815:"370f154f",72835:"07d5ab1d",72880:"82729a0d",72907:"6e8fb4cd",72914:"a6b31fb7",72925:"04c27620",73019:"5eb6a457",73084:"48ab7c0f",73193:"fc9f3e78",73264:"6ccefbd7",73276:"4d9bb901",73290:"d109a779",73316:"d595c06c",73331:"3e2d12a8",73376:"df8d786f",73397:"5d1ec000",73472:"2c6afda4",73493:"6c824c9e",73539:"a9e1fae9",73540:"d2683542",73569:"3aebe524",73607:"5d5dfef0",73609:"c5233a93",73624:"660e3035",73684:"8c31bfad",73693:"7d0c657f",73741:"c203b285",73756:"e59be998",73800:"bd55d6a9",73841:"d5ca1fa3",73846:"669a7fc7",73888:"46723720",73891:"335d1a8a",73905:"74bdfa12",73940:"e1201e1b",74019:"da089245",74027:"f505499b",74039:"a154b9e1",74046:"80b43a0e",74069:"bf9b50b1",74121:"976ee526",74134:"78e4ce3b",74282:"530f2a45",74312:"1776f3bf",74388:"455542b1",74403:"f4e7381a",74418:"3ab1a45d",74490:"800980fe",74524:"411bcbe4",74588:"4657c99b",74657:"071be4bc",74684:"08c31347",74792:"7bee6d52",74880:"8302c738",74902:"404c15e2",74945:"ae83d79c",74961:"1ab74c24",74994:"50e20aa9",75036:"6923b486",75043:"9bf3467b",75051:"483179e4",75062:"c02cd0c9",75078:"a71daff9",75105:"a4f9c66a",75106:"b618c014",75173:"0650181c",75267:"1905bdc5",75309:"d03c9c6d",75359:"1199c533",75378:"7152a165",75405:"98e83edf",75450:"0e82a67d",75459:"0049814e",75666:"0d1db8f4",75695:"09919d70",75696:"49a8d4e6",75718:"3efe0489",75735:"0b7281c8",75759:"29828f86",75775:"034e9612",75805:"cdf0f609",75866:"b5edd83e",75911:"e2c5cb8b",75919:"5d46debe",76041:"73d8152b",76123:"ee2b987d",76163:"eec9e7aa",76166:"d34b4fe7",76215:"f8abf276",76235:"02562da7",76257:"3ae01493",76262:"5ea97bda",76264:"e627ec8b",76274:"ab0d6c32",76285:"0742bfe0",76289:"208c9bec",76368:"500ae3ed",76530:"595f3583",76641:"2e5945d0",76683:"45b5ebf0",76719:"3fa3d99b",76748:"3d43af04",76850:"b0aa9be8",76854:"54e40af3",76871:"3cc12515",76873:"6ade5fbb",77077:"9dd7d520",77088:"19b3c698",77096:"d15e01a9",77123:"f06a5da1",77145:"470371c5",77174:"7f4d362f",77183:"3e975e2c",77200:"2f3da969",77222:"32602dc6",77261:"34bc5584",77298:"0e6e1364",77369:"789a51cd",77391:"a5d2357e",77596:"f28bf1fc",77679:"3ef8cf50",77698:"897d517b",77749:"57524945",77764:"96ce0e27",77787:"ebaf27f5",77794:"a1d36ea7",77920:"32922c56",78001:"494fb1aa",78037:"380f20f2",78055:"64043d5a",78087:"792a9bde",78159:"4f38a4f8",78199:"7352f166",78312:"4227ef96",78354:"e1a80164",78421:"90fce091",78497:"f3762333",78512:"53548a02",78522:"3a8bb73f",78544:"6a741e05",78583:"16c7d56d",78632:"2e8da915",78704:"8074d8fc",78758:"bd259526",78764:"21ea3c33",78787:"79135f9e",78820:"8b478ac3",78858:"34bc29ba",78876:"59d1e0a4",78880:"57c23eae",78912:"b1c543a5",78919:"dfaaf169",78926:"01258cb1",78985:"b28dc1c0",78988:"76e47634",79039:"56222027",79048:"a78c49a8",79150:"7f9b8fbc",79157:"5c77fbba",79180:"001af72a",79302:"4003d6b5",79416:"d8803eb4",79474:"ce9bb68e",79485:"abc97de2",79506:"c5a051c0",79520:"7ee03445",79521:"34c92224",79656:"aaf407c1",79739:"28dafb21",79841:"bb848e98",79866:"72d729c2",79987:"ec16d719",80018:"8fe0883c",80046:"6b819d70",80091:"cf6c8fc7",80102:"9c77890f",80198:"ae37fddf",80205:"8b305082",80259:"2a9fd9bf",80260:"cb06e1c4",80299:"67a193ac",80310:"825dba4c",80362:"777aaaa9",80375:"c431c14a",80408:"65e68152",80424:"2b9e2beb",80442:"138beb03",80457:"a89f5ad8",80458:"05820e47",80491:"31389da7",80531:"16becf9e",80557:"c57e7621",80598:"f70e808c",80632:"3aff62bf",80649:"47ad624c",80677:"4c372437",80744:"595e9d0b",80750:"73b5b786",80772:"832cafa9",80781:"304645e6",80794:"1edbd938",80841:"aefb64da",80863:"9f9ec4bc",80947:"39b525ca",80957:"97a18955",81012:"7a14d07b",81019:"0757a63a",81050:"4ca32e8c",81085:"e860a612",81125:"4f6a5985",81175:"cd0071f2",81188:"9d386ddb",81212:"6b747f92",81285:"b35bde59",81300:"8a132e02",81319:"5eca8594",81346:"96f50bd6",81390:"35ed9e45",81410:"1b63b983",81482:"bf8e657a",81530:"c7de49da",81544:"9f053080",81583:"5d60f872",81639:"2f3e574a",81666:"310e4ba3",81692:"cd67aa57",81737:"bc202717",81761:"c2e8f014",81770:"f9f0bc0a",81791:"514758f4",81795:"fe21b98a",81802:"33f4867c",81891:"85e8a888",81902:"972577b8",81903:"6ea756ad",81943:"bda6f1f4",81982:"45b0a42d",81990:"7dbdd021",82012:"b83ac31c",82019:"09be3a79",82237:"96c3210a",82242:"a8849529",82261:"65a3a905",82297:"4ce54554",82354:"e6079d9a",82362:"4bfee9a1",82431:"c58b9a06",82456:"a76fa164",82486:"6ee2f109",82553:"b2f3c04c",82581:"4ac5a8bc",82588:"22192259",82663:"e2968488",82722:"a43dfc55",82754:"1f4c6ca0",82847:"f1160e5f",82905:"facce5bc",82939:"3ffe9e05",82987:"27acfdea",83027:"eff4badb",83078:"e1a47202",83089:"c7ada7b9",83103:"3840f51a",83109:"6414a4ba",83111:"56e10872",83121:"006dc26d",83127:"f69c75fe",83182:"cef47da6",83203:"6e8afdc3",83213:"569e617a",83249:"32d3403c",83260:"c6525628",83273:"38f30c97",83316:"b0b27b89",83378:"aac56db8",83470:"71c00062",83574:"a3dc9dce",83608:"ee9f57b5",83670:"8fa9b576",83700:"060932b3",83779:"50eea83c",83797:"ca389040",83824:"09a61fd1",83841:"e29e4267",83849:"a66ff3dc",83928:"6c3fffad",83932:"7e88d302",83954:"0e32797d",83958:"bbdcafaa",83970:"2b543913",83976:"968c9e99",84013:"6a35ce6e",84070:"f86c329b",84107:"cdeafde2",84152:"00a2579f",84227:"dd167da5",84232:"fb6c362a",84255:"5f7c3639",84259:"a83b5248",84319:"add20ab0",84332:"ed66d686",84527:"a2acefd3",84530:"7b34a9d4",84563:"692274ef",84572:"790e2aae",84760:"175a5b9f",84773:"2493d544",84813:"39aa10b6",84869:"b3c6188c",84963:"75f5a097",85014:"3b5a5dea",85095:"6e925ba8",85097:"1682c825",85105:"b97600ae",85205:"b80556e6",85209:"5ee954e1",85243:"01e4ab56",85257:"b95de7f5",85279:"9d896a2f",85322:"18b44b2b",85358:"30512b2a",85442:"7970ece3",85453:"fb1e1d1e",85537:"c0626242",85581:"7500bb20",85588:"53c18d68",85736:"48cb5964",85796:"e203b806",85806:"fbd285ee",85817:"f02bbb8e",85896:"e9b359a5",85899:"ef3290b1",85917:"e7d86b26",85960:"f16cb757",85973:"1a5c8931",85997:"db6152cf",86053:"4dc95938",86074:"741302c3",86121:"594f4aa4",86129:"7cb605a7",86167:"3ce460dc",86215:"77a5d5a6",86216:"bef3c0fc",86246:"e0349554",86354:"bc7c5dc8",86417:"a1124a7e",86434:"dc8e21d6",86478:"84cf68a0",86480:"06949ebe",86501:"9d7d8716",86586:"8c579e0a",86597:"9bd3dc22",86623:"a74edf8c",86659:"0e19cb86",86669:"3e544ff8",86685:"45e653c2",86807:"3d614f42",86829:"00572ffd",86846:"9070c2f2",86856:"28df0c06",86888:"0615aab2",86890:"fce759e0",86914:"0fb4f3b2",86939:"8b586edf",86992:"8a207a53",87004:"c486e5ea",87087:"05aae5c6",87159:"443cc7aa",87184:"a039315d",87186:"57a6b3ca",87205:"b2690949",87217:"1f696713",87269:"35be2680",87282:"c1f408d5",87377:"bbb33c7e",87407:"5da9e9b5",87432:"2a58f20b",87456:"30fa1b01",87459:"ca9b021b",87473:"7572fe2b",87483:"e76cd711",87485:"074d2936",87547:"8a3e31a9",87589:"a5c128db",87614:"29322f97",87688:"abe56e79",87747:"99cd7148",87781:"89e64bd0",87863:"5fd2edbf",87875:"a9ccf0bd",87880:"bd9c4f07",87905:"5b6b1941",87945:"05f869bf",87971:"1b696ed9",87995:"341abd86",87996:"23c299a7",88047:"a9a1b642",88111:"6e8bb269",88163:"2c3c6b0d",88222:"9b39dc9b",88248:"f8851e5d",88298:"10ee8dff",88310:"36767ebb",88327:"774b80c7",88393:"5ffb00fa",88394:"903eae4c",88399:"c0edc4c4",88436:"2424bc8e",88441:"98d13908",88468:"ee29a68a",88478:"46e46ed6",88522:"8af566d6",88547:"7ac33681",88622:"441ab315",88626:"5b4795b9",88654:"eadecd16",88696:"3e68290f",88775:"06f05fbd",88815:"c077e43d",88817:"9e1a7664",88821:"cee6cb12",88847:"988a32ab",88852:"414f6661",88855:"0a2c96aa",88865:"e8542a46",88903:"e122d6fd",88986:"0bc77a5d",89018:"8a55ca24",89093:"b18e7a97",89097:"aa5fb21a",89172:"f79b59df",89175:"d0983721",89210:"395fbb55",89289:"d1f4bf4f",89338:"efe97fec",89353:"e7814320",89362:"780293e3",89402:"4de66462",89415:"6fb43246",89437:"90d090a3",89455:"f8dbee27",89489:"c8cc5158",89534:"da6951a5",89554:"a784419c",89610:"cc130b82",89641:"9d5b345b",89696:"abcb22e4",89801:"cb16760f",89810:"9e2ddc23",89858:"8b837402",89873:"0d66abd8",89986:"49804246",90066:"ecb816b0",90071:"f51c662f",90110:"cf0b8805",90115:"f497c160",90135:"d3605a71",90214:"23fc1725",90257:"6105e05b",90280:"9e2d7785",90317:"0dbcd032",90378:"47701034",90414:"4258fc22",90416:"410119bd",90438:"817c940d",90513:"91bc9a3b",90562:"b9ee764a",90593:"eac7c7dc",90598:"bd31cfd9",90625:"183eaa34",90627:"69608c40",90717:"f97b214a",90749:"f70bc7ca",90831:"3b92aace",90842:"ea14dbf2",90849:"39cca96c",90910:"0098609d",90950:"e0bca964",90972:"4dfbb0c4",91025:"baab9bea",91058:"6d57ca17",91109:"22f0de7c",91187:"ff56e27b",91203:"7e4cc839",91257:"5b4a526c",91305:"c2578a79",91319:"302da679",91333:"bb1412e1",91359:"67ea2072",91405:"c7144869",91428:"d8c3b11a",91530:"9b1454b8",91540:"18f2c91b",91581:"2c4a9a6c",91587:"5ac8f274",91597:"1fa2692d",91621:"67795e38",91695:"55515b28",91724:"20a3ceb2",91787:"bf5ab72e",91844:"46dfa8ad",91895:"5d4b082b",91916:"9ebdbb47",91993:"8c22cc82",92018:"8b6adee1",92031:"fe024597",92105:"5cefee77",92125:"683c7611",92196:"4b555b09",92223:"38a9da1c",92241:"28e0f6e0",92273:"f9a086ad",92329:"021f8e8b",92410:"4f523206",92412:"0fea7b37",92475:"3181ced3",92535:"63822ab0",92544:"15f57ee3",92653:"c1972b89",92664:"728dae56",92673:"39debf2e",92955:"89495ccb",93057:"a805415e",93085:"6b1e261e",93166:"5f6aac76",93206:"a2bf9194",93209:"13044cf3",93210:"85ec11dd",93269:"1029ee46",93273:"a527fd2c",93341:"7dde88bf",93361:"3d0e28ec",93362:"b3248d4e",93438:"eda79199",93442:"8344dacb",93534:"ede04b1c",93546:"d382b725",93602:"56ae7f49",93636:"259ed984",93795:"395d0490",93849:"00e1630b",93854:"c47af2be",93884:"e3d67ca0",94e3:"85a8b76e",94065:"6e8f3ab7",94082:"b6dbf702",94091:"578df47f",94106:"7ccfcc6b",94153:"b039c689",94168:"d6078fe7",94227:"970cd00b",94251:"9e3cf38b",94314:"d3489683",94344:"cd30ed80",94361:"9a28b459",94417:"394f998e",94538:"f82ebe9d",94555:"70e87010",94561:"a0b349d3",94568:"5a296dcb",94625:"98b3088f",94646:"e5304cee",94648:"f6228d59",94685:"438776dc",94711:"611b1dc8",94713:"58810f4d",94788:"6fc1dd4f",94796:"4010c4d3",94841:"89ae3e4e",94843:"828d0dc0",94863:"55a59675",94864:"7c75a8b5",94910:"d465e058",94925:"8f642dfc",94926:"aae8d19c",94980:"93fccaed",94997:"d853cfde",95020:"5e8185a7",95058:"75d979d0",95078:"41cdca60",95093:"423cea85",95136:"797d7fa0",95159:"1a0d6a0e",95183:"dfc87c30",95187:"85f160a6",95231:"b9c65497",95240:"7c6cb8db",95245:"dbd1b852",95330:"8e4b3ab8",95427:"9aa9c150",95443:"f7ec7ba1",95470:"87fd0551",95542:"91ccb5d3",95605:"6c76232e",95641:"0addadba",95649:"6a65e3ce",95659:"0a1f4efb",95768:"80c58542",95785:"48f89240",95818:"16d5276d",95909:"aa84deac",95911:"529b3233",95912:"423bd8a9",96022:"afa72882",96086:"085de370",96155:"e89275d6",96225:"fbcf69e0",96239:"843c315c",96268:"8b0816d9",96276:"82ebc6ff",96325:"75b0ccfb",96425:"769273ca",96463:"f832da4d",96470:"be797944",96555:"d21049e9",96652:"2f23cc7f",96693:"1d428461",96745:"6967bd1e",96771:"dc2aa01a",96778:"f5680f39",96793:"e0a23a9d",96881:"d4be0935",96963:"8985d561",97006:"598d7afd",97033:"fe730233",97047:"87cbec5b",97107:"18c4752e",97114:"9cc27416",97123:"040c8599",97167:"1238b646",97189:"23708f52",97223:"c8e4b82c",97246:"17ce0e36",97253:"b41c2a94",97296:"a57c26cb",97342:"52841075",97358:"c769b875",97379:"57d3846e",97420:"81fe43ee",97424:"a55b1584",97476:"56cd85f4",97536:"b4e3b3c7",97554:"005cc38e",97562:"bb8d8d2e",97585:"59a181fb",97664:"4e7bff16",97670:"a4274e75",97732:"0b31f7d8",97737:"2f8afde7",97753:"53aae94a",97763:"f430820c",97821:"f80efef2",97829:"5d36ccb6",97863:"f8cc590a",97887:"8c7c5b59",97895:"05685ac0",97901:"67fd6666",97905:"fd91bb9d",97913:"43f18326",98012:"6c29418a",98020:"96dae171",98021:"460aa0c1",98030:"a757e267",98058:"1c320273",98059:"6e7c26fa",98087:"0b0abad7",98094:"4dd0cc8b",98139:"7eab7866",98147:"7e92b0f4",98165:"2a383035",98237:"4eecdd21",98271:"a3781957",98308:"82707bbb",98311:"2e182187",98392:"2f73849c",98425:"bdd345cf",98473:"34829e79",98477:"ec2092dc",98534:"15f60b76",98700:"1fd78c55",98750:"89bad922",98758:"6d0f7cf8",98761:"e46ef735",98779:"84885d5b",98804:"6f3a5963",98867:"b7ac1bd7",98908:"e0e363a6",98925:"57095a25",98935:"86078de4",98941:"dcb08cf0",98947:"5f9ce70b",98982:"bdfdb56f",99001:"bc35de59",99095:"ee8e46b4",99146:"7b22214e",99151:"42d6760d",99252:"8f9df3bd",99254:"0688518f",99299:"a59c607a",99306:"56c8bfe8",99330:"3327c94a",99335:"b5287441",99437:"2c8966f9",99451:"b554daf7",99502:"00a479c5",99504:"2e6b3e55",99528:"7e312bbc",99531:"e8f43f56",99534:"428df931",99543:"b88fd084",99611:"1da1e411",99644:"d506a7c9",99678:"1b66abd1",99701:"10059403",99705:"1a05760e",99709:"3640fd16",99710:"ffd9ccf4",99746:"4b4c2ec6",99747:"9fa0b3a5",99872:"d78a1b1f",99905:"0b59e46f",99913:"7b5a7e5b",99987:"e88defa7"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),c={},b="hudi:",r.l=(e,a,f,d)=>{if(c[e])c[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=c[e];if(delete c[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={12164231:"43113",12935692:"36790",13171783:"29452",13883961:"54772",14828316:"41944",16243474:"98020",16640689:"53619",17896441:"18401",18891827:"71235",21719437:"65957",23348138:"57155",27077527:"44840",27211971:"57547",30769210:"44891",31863783:"2256",33241236:"33621",33732613:"14363",34689118:"51937",34900881:"79520",35313843:"23641",37844666:"63075",38836367:"99913",39583919:"70606",42545929:"37827",43764587:"32949",47074836:"39260",48455675:"66715",50536743:"43078",50737734:"21373",52166518:"76123",52375367:"70689",52676037:"54487",53317765:"39058",53798754:"21191",55946737:"45113",56040849:"72815",59171146:"67989",59700627:"95187",60165173:"44719",60753781:"68470",61773850:"22504",63786366:"93442",65511420:"32875",66405406:"89534",67474760:"63332",67922501:"65221",70570476:"12513",74555694:"79302",75914136:"65091",77787075:"36689",88937603:"61939",89514438:"17709",91415840:"9003",92328698:"20924",93340492:"41159",95789563:"59923",98749210:"96963",98826249:"68315","0583dad8":"16",a33c645e:"25","0da1f28a":"28",a978e5ab:"39",a674d2f7:"48",e9bd6ef2:"60","56169fa6":"67","6c6aeb2d":"106","275b5c51":"129",af8190e8:"159",b1f77b90:"217",a1a7cea0:"278",fcc9c1b0:"292",be9655ff:"323","43d16b11":"335","0b4da2f0":"354","19ac452e":"387",a168e2e0:"437",b4a99b76:"569","0a87a91b":"614","5c109a5d":"805","79cc09db":"822","8b10f6da":"851",e9038c17:"878",ce3da75c:"910","02b5547e":"917","9699c87d":"924","0c459987":"940","4b935b7f":"1103","060b2af9":"1107",e3b4090c:"1119",ae09e9a1:"1136",b0127f30:"1190",ea1c8f1c:"1251","62a07427":"1284","9cab4fb3":"1337",eb8e7dea:"1360","562c897e":"1422","50f3bb83":"1442","4b25608f":"1506",da868c82:"1517","8425e24c":"1550","73c8d421":"1635",cc5200ca:"1656","7a51e13d":"1658","89dd9b54":"1784","269ce614":"1785","4b2ed2d0":"1791","92bb01f4":"1841","9f349e0c":"1846",d032d8fc:"1857",c28fec2b:"1882","6e47a3c2":"1928","45b94beb":"1946","7fbadf7c":"1955",b93dc3c9:"1983","3c15683d":"2016","7a3be72c":"2053",fdb4abad:"2121",ef5805c5:"2172","32aa7863":"2214","9781112c":"2225","2b154460":"2239","7d9ec3a3":"2262",d2a01f74:"2298",fb4f9065:"2385","3b3f1ad3":"2450","1b7e3feb":"2472",e8b490f7:"2540",b9e56da2:"2577","372d2263":"2638",dba6e014:"2640","9ed88412":"2652","9d0312da":"2663","7e9327af":"2679","5e58268b":"2700","4c5bb0e3":"2739","7c87f31d":"2748",d28b7dcd:"2759",ad32f2e8:"2768","48f24bab":"2772",ba2305d7:"2791","00cd9d46":"2839","093ec6b1":"2854",c03096de:"2867","8539bc43":"2884","404a423b":"2912","580eda40":"2932","6e7eafb1":"2954",a80470ee:"3075","32dcc326":"3125",d29911ee:"3131","4f7cd6bb":"3137",aed1d196:"3144","5c3bdea9":"3179","6be904db":"3303",a3e90044:"3313",b9073401:"3323","1c4da86a":"3471","7fb3fac1":"3558",b783cafb:"3693","5e85aa31":"3694","50cd3db4":"3722",dc1f5b39:"3740","394bb252":"3764","43d31177":"3847","260d7fd0":"3940",d18b6106:"3965","50494a26":"3968",c943b655:"4014","04ae9608":"4028",b4ced939:"4040","0bf991f2":"4060","817ed3cf":"4074",d772531a:"4117",b18f8924:"4133","1a47b5e7":"4137","0c12eeea":"4205","18ffe98c":"4269","1497bce1":"4355","25fe5fdb":"4368","56471e5f":"4382","1dcf0194":"4405",ff5a6f64:"4467","3e8d408e":"4514","1cb4ff83":"4530",d9f219f0:"4574","405284b3":"4591","9920fffc":"4602","43d0cc21":"4777","3b6474f3":"4790",a0c4b68b:"4863","7c52b6f4":"4890","4929a6fa":"4919","066b815f":"4949","006c64a3":"4980","6880fe95":"5008",f5c507c6:"5028",ca8c3af7:"5029","25ed107d":"5065",d0ff2798:"5193","8c7f4a45":"5195","4b9df2bb":"5206","627b1f39":"5269","6ff0c558":"5270",b3a451d2:"5289",bbc3d059:"5295","44fefb3e":"5304","22b4f68c":"5322","86642e8b":"5334","0e11b6db":"5338","0c74166d":"5594",fb863cab:"5622","32ba6a4c":"5631",a804bb8e:"5633",d03e0408:"5647","58c4a37c":"5679","42bda306":"5721","1adb4ab6":"5806","6a34bd67":"5834",b5960565:"5887","478a7123":"5888","4959f63e":"5936","959a592e":"6022","87c914ef":"6054","384f1d9f":"6090","0d706529":"6158","14ed99c2":"6170","0ba05648":"6203",baed6a8a:"6225","59ba4d58":"6289","14a73a68":"6310",ce3c8465:"6350","207e0bd3":"6368","4658250f":"6371","5c865244":"6372","47ddb104":"6407","3faff22d":"6467","316bb886":"6475",ae59a273:"6552","21b16c5b":"6559",f6a1f09d:"6636",ea2cf37a:"6677","0cca5757":"6692","17ace3c3":"6697",debf2b54:"6709","01ceb854":"6739","507d925b":"6761","9cb5abfe":"6778",ae0384e2:"6791","4f684eef":"6823",b52407fb:"6897",ac385e9e:"6930","52f660a4":"6944",e841f655:"7035","6e78b29b":"7071",e7c12d1f:"7100","9d67d055":"7103",b744ccc8:"7125",bfd461a8:"7167",b1b9fe16:"7317","96f48bd9":"7355","502758cc":"7444","8fdc7f76":"7458","4abd5d51":"7517","12a626af":"7566","9df106ad":"7622","2a74f6a7":"7629","06a1e3b2":"7715",d6b46894:"7734","79a2ad2d":"7747","869d1599":"7773",deab0229:"7802","68c81474":"7850","7ba20019":"7907",df4b657d:"7953",f85e4dd8:"8003","0480b142":"8070",addb1e87:"8139","464278e7":"8174","38122bdb":"8177",c7a3e7d6:"8183","934057b1":"8192","01a85c17":"8209",c286af15:"8289","09ff3d76":"8348",db9fbbab:"8354","24179e00":"8363",abd23114:"8367","7a049829":"8407",cd17745a:"8413",bbced460:"8417","497095d8":"8585","15c2f51a":"8619","22351c69":"8632","212a125d":"8645","80bd773e":"8651","8f08e203":"8699","1cd42d14":"8762","7a11cfa3":"8766",e161c803:"8840","3a6a48c9":"8888",effd3c61:"8889",eebb3a9f:"8900",dc8afb47:"8902",b6e28713:"8965","6d5644d6":"8978","7c9ee56f":"9045","4c492fb9":"9066","52b6ceb8":"9076","29c12ff9":"9127","17666b14":"9152",d4eb85a9:"9189",b2d2727d:"9195",d336ca2e:"9228","0687df23":"9257","29a0dcae":"9262","4c14260d":"9351","7fd1d1a0":"9379","409e52b6":"9380","8ea09047":"9385",cfb1206c:"9428","8cd4ff44":"9432","49b92117":"9446","762ed4b3":"9458","01964c8d":"9460",ebf12a38:"9471","953153ea":"9499","2fec12c7":"9516",bf1307fc:"9525","8eea179e":"9570","13ab27aa":"9573","79e67a34":"9631","5e95c892":"9647","747973bc":"9650",e4d28161:"9676",a0d28f55:"9702",c35662b8:"9722","46e7f252":"9724","0d37dd31":"9737","6a0b8fcc":"9790","2fd2285d":"9836",d6d00b14:"9860","36e3724e":"9870","8a5cd0c4":"9891","9c0f572d":"9907","06b7dbb6":"9914","9ee88b57":"9944",c782ecef:"9986",c2277200:"10030",f89af623:"10118",f7519df0:"10181",ce5d6b55:"10198","0eb44ec6":"10238",b69fdc1c:"10285","8c29db87":"10354","0ca8e4c5":"10472",dc8e8e39:"10488","40011a75":"10492","79c374cf":"10535","1ca50c03":"10545",b1051fbd:"10610","6a326c1d":"10637","936cf648":"10642","5bf02344":"10653",f71afd42:"10688",f53cf472:"10727","931768b8":"10767","10fb8f29":"10789","9009d9a7":"10884",ac65ed35:"10887",b964b0d3:"10907","42746bb6":"10920",f0c78ca3:"10924","726b1d2e":"10956","90db14b9":"10978","9f1f18ec":"11052","7c44e50a":"11058","2750cc84":"11111",f97de939:"11156","2e961a80":"11275","82b971d3":"11289",ac338f84:"11299",f9cb0cea:"11326","6ed20719":"11355","039c7621":"11508","3d026c66":"11565",d2a270f8:"11631","9aee6bed":"11684","8fa68fae":"11716","51e360fd":"11725","446810fe":"11745","4cc89b71":"11768","3f65fb56":"11782","43ff550e":"11795",b9168984:"11804","7cb0ba19":"11806",f630dd79:"11842","51e592eb":"11855","43c57b15":"11869","41b6dd58":"11905","757b41cf":"11906","608a85b6":"11977",d25544dd:"12047","088c57bd":"12134","5617941b":"12144","3deb4153":"12186","77a5f3f8":"12316","9b28f794":"12318","2592f25d":"12378","7d05d2dd":"12393",a0fb693a:"12395","61c30610":"12431",f4a568da:"12452",ac9a039d:"12477","3e8ec4bd":"12485","2ca30cc7":"12535","0bce5bfd":"12542",ae632d28:"12608",bb6acec0:"12613","98af85a1":"12654","755aa830":"12679",f81e2128:"12686","0166538a":"12763","236efcfc":"12869",bc561320:"12945","72ed5e19":"12995","9b078b3d":"13021","075d0b63":"13060","6695bce8":"13063","4d01f822":"13152",a5fd3751:"13203","326f3c2b":"13210","814487fc":"13236",be65306b:"13298",bb230ab4:"13321",c7690f1a:"13366","0c9b8a46":"13374","15be7f5e":"13375",cdd81d53:"13406","05f125a2":"13419",f7887fd4:"13465","3f9b0969":"13511","35f2b245":"13514","559e18a5":"13522",aeb9cb2b:"13525",a221d960:"13534","27aec4ea":"13535","1b3749bd":"13575",b7ffc82e:"13580","16444e78":"13626",e32c93f6:"13698",e4126631:"13733","35ace877":"13762","5005f1cd":"13803",fdf3b0ba:"13849",a586ac12:"13918","79c522c5":"13943",f4dd7c05:"13982",bb5bef2a:"13996",fe0a5e13:"14003","4fe2812d":"14027","6c6eb236":"14042","2da40935":"14043",c58d5881:"14125","88677a17":"14134","5ba7f3a0":"14136","0c792305":"14152","79f5ed7e":"14163","0466f8a1":"14179","973a6c2e":"14257","4d62164b":"14259","881e0310":"14261","15b03510":"14264","2d2f3863":"14317","02704d8d":"14340","4330e2c5":"14388","95a29cbe":"14399","262f048a":"14410","5a1ac6cd":"14433",a2218d2d:"14435","0dc66419":"14496",b812e3a7:"14536","04287605":"14599","6b0d4b59":"14627",cb290368:"14726","8049dc2a":"14750","4193b389":"14802",da9a6aef:"14822","3145e86d":"14835","9c9e6d14":"14868","281df6d1":"14871",b2f79aaf:"14917","68aea991":"14919",b634826e:"14943",e8bf575a:"15038","6773b5f7":"15078","461201e5":"15079",e6691bac:"15144","29fcaeb8":"15165","809a1b46":"15186",e0719818:"15220","246d116d":"15235",ee5dc595:"15272","7bd6096e":"15292",a0583d0f:"15316",bbbd3731:"15403","413b2e2c":"15407","63067f40":"15427",ad07d5ed:"15473","259868d4":"15501","1ff337bc":"15552",a309ba1a:"15607","0d11ee2a":"15764","65df1ffd":"15805","520bf372":"15857","04d2875d":"15917",f05cb9af:"15947","1ea67680":"15955","777c5b61":"16017","7f5a2db2":"16032","5685cb00":"16100",f0db470e:"16209",d05ef008:"16231","1839a246":"16319","8eca1d9c":"16377","58c0e7a1":"16499",b5eb2b1f:"16500","3d8e248c":"16622","4ccf094c":"16641",ab84da8d:"16747","7c3644b1":"16885","426a3c0f":"16942",bd7a3684:"16950",a3848d24:"17009","30e67995":"17033","3687929f":"17115","87557f51":"17119",bc36781c:"17232","82fc01c6":"17294",b4762a45:"17332",de821e02:"17368",b629aa71:"17402","496a5e3a":"17411",c5c8072f:"17441",f7750a15:"17474",dddd9631:"17502","80e60ab1":"17508","8c212f85":"17530","46e89fee":"17581","47f3a505":"17626",a2af438a:"17681",b1e22259:"17739",bc4a985b:"17805","2d9024ae":"17818","7cfc22c1":"17860","9130943e":"17867","36f96221":"17944",f67021ea:"17987",a3255c75:"17988","059d2658":"18006",c1fa975f:"18033","7707ed5e":"18103","3a2db09e":"18121",c15d9823:"18146","889bcd45":"18350","670426f7":"18351","7eea383c":"18438","762cb2d4":"18445","905fdac9":"18520","1bdcf2af":"18620",e798c07e:"18645","3b375bfc":"18738","10b6d210":"18757","6c76cc4e":"18798","6cc2587c":"18940",d75d009b:"18950","7487c019":"18998","378587af":"19042","6e547e58":"19052","6f878c05":"19070","6f3d983d":"19108","868e6cc1":"19109","9c3fccaa":"19136",e77e0240:"19237",d9884433:"19252","1354c4fd":"19267","345a8726":"19271",a2cfe627:"19369","9228ff94":"19387",c61ed569:"19396",efd9e5ca:"19425","4b6ad6c1":"19428",a3c850e8:"19474","3faa4dcb":"19513","7f5a4e86":"19521","3548485f":"19542","76b52ed8":"19664","547af68c":"19687","0e4a3360":"19711","9e46f997":"19736","3c6c92ad":"19774","83c71362":"19798",a5052667:"19801","7e53000f":"19865","389b06c3":"19891","99bce14a":"19999","0ef00d46":"20038","430ee71a":"20103",ecc82a52:"20160","69fce7d3":"20194","5aae4c30":"20229",f60a8e85:"20286","6b7b009f":"20325",a55cf427:"20358","784d2d5b":"20361",a170c4b2:"20405","839320c8":"20415",c97a4f9f:"20424","39c0c867":"20434","4c056f0f":"20491",ca16b0fe:"20535","2925f13d":"20541",eae39fd7:"20619","874c4928":"20676",ff781369:"20713",a827f20e:"20812",bd440596:"20857","1d99c39c":"20892",de69fdc1:"20931","5ef30e9e":"20951",e3b4fd8a:"21070","7ff678ac":"21077",c1b7702d:"21121","574aa417":"21177","58f98693":"21273",e737da10:"21275",fab95ca2:"21290",e4bea80c:"21303","266d37b9":"21316",b23dd436:"21341",b2c62a3d:"21346","5105c354":"21401","9db9c0e0":"21417","995d9cd2":"21448","5f404bc7":"21482","69f9ca18":"21524","6c888f35":"21560","263bc6da":"21574",d17a9646:"21585",aad02470:"21630","6224d640":"21635",b1722c22:"21662",ea9d899a:"21729",df2a910d:"21764","1926d3d7":"21805",fe2d6fd6:"21816","7ce47929":"21837",a54a9a31:"21874",d3de5519:"21909",a8a7f86a:"21921","625beb64":"22141","334d7764":"22313","83a16324":"22369","9a5e9795":"22385","47425d5b":"22428",f93d9ca9:"22447","494588b9":"22472","95d688dd":"22483","2923e8f3":"22499",ff15e2eb:"22501","6f37f43d":"22534",ca5d6ba8:"22595",a36f1f19:"22628","69375b61":"22640",c760fa6a:"22647",c699b29d:"22673","74c5eee6":"22709",f701b058:"22750","70db0e3d":"22816",d6ededeb:"22844","9a29e675":"22911",d49fdba3:"22916","0d5f3865":"22932","70a32eac":"22973","1fd06df8":"23002","07da43c6":"23041",ef1c4348:"23081","7050405a":"23083","39307ee6":"23119",a1c39b3f:"23141",b994507e:"23172",fe86f3f9:"23332",fa5f4abf:"23388","95d97af4":"23438",fdeab78a:"23475",a67ef186:"23547",f24f712d:"23563","53746e73":"23591",af9b00f1:"23600","996abb7f":"23625","59e9dc06":"23634","9c150758":"23637",cb16b650:"23666",d235b83f:"23676",ea8366f8:"23700",fac8c34b:"23765","2153fb85":"23773","3affb2e4":"23880",be354741:"23938",afe4349e:"23998","9c7497bb":"24022","5ef1cef9":"24065","4ed60a8a":"24084","89ad6a53":"24098","897856d4":"24126","5ce7213e":"24140","1d2c1565":"24172","3af3061a":"24234","7ebf6f1e":"24265",a4e075be:"24340","99d3870c":"24366","5cbd92da":"24373",b5b376a0:"24377","4066930f":"24381","77b23935":"24437","045bd6f5":"24475","6cf93e89":"24476","3befffe2":"24704","91c64349":"24728","931beacc":"24729",e2c09daf:"24741",a852ca5b:"24776",a68f650d:"24815",ed6ec893:"24826","7cfd7c3a":"24853",e0c51b98:"24866",b4972e92:"24867",c6301cab:"24868",f0709bee:"24891","8e01a36e":"24912",cf6129a8:"24919","51fff4d3":"24932","231cac3a":"24970","1e3d98df":"25013","9cd11b72":"25044","9531441e":"25067","8bd2257d":"25101",b277530c:"25130","96046d19":"25186","19531bab":"25273","1da16fcf":"25285","537936fe":"25335",d78b8cbc:"25396","4083b748":"25397",b973fe72:"25426","5ef8e026":"25452",af5c68f9:"25531","40ebd41e":"25532","7fb09d55":"25539",c7382291:"25578","65603bfa":"25582","7205cbcf":"25601",d56bdeaf:"25778",ba115cad:"25781",d2c3f17d:"25845","6d1cdd35":"25869",c9953bfc:"25871","17268e53":"25874",f7f19049:"25959","1645b95d":"25987","92db1d5a":"25993","90c5833e":"26003","20f9256f":"26009","7662a79c":"26060","2316ae30":"26064",de97f7b0:"26081",fd6c914a:"26183","4e3e1e17":"26216","477cc2f7":"26260","878dce9b":"26305","9579dcb9":"26333","65009e94":"26337","14fd0d1c":"26414","9a5789a7":"26548","8eca70a5":"26577","8353278b":"26627",ba839983:"26630","960d3eb8":"26632","1802ae9e":"26722","78bc6f25":"26724","21e535c3":"26744","4681e75f":"26797",e2fe7a08:"26833","04fb6378":"26859","958a296c":"26882",b3749361:"26900",aca5eee4:"27012","58714c61":"27020","1547c10f":"27088",e37692b4:"27115",c4d1e829:"27123",cbec0238:"27179",ce710151:"27212",f52b34fb:"27369",f7e205e5:"27388",a3983124:"27398","7a3be7e3":"27444","31ed8f07":"27473","9f8f3c52":"27663","6d701be3":"27737",f95764fc:"27823",b0d5c266:"27887","10ccea9f":"27921","2e7e1134":"27955",ee4b8f19:"27995",ecd026d3:"28020","2cc67ca6":"28086","859500dc":"28127",abde445c:"28147","8120957a":"28166","513b54fb":"28169","9adef974":"28178","758b9bc9":"28204","20a81622":"28235",b8d3e47d:"28252",ec410c33:"28319","89cbd1b8":"28410",b212a261:"28428","5b374304":"28435","261fe657":"28499","54ad050e":"28627","0871002b":"28679",ab48a39f:"28687",c3856c66:"28701",fd5c5192:"28782","379ac6de":"28793","8b6fbbb4":"28803","7ed2bc06":"28834","4c00d6b9":"28853","2a0b5233":"28889",e7ef6e16:"28920","8c5b1685":"28941",f382fc88:"28945","8e7128cd":"28993","9c7a2f87":"29060","763fa02a":"29123","6f3c73f2":"29171",d4836e14:"29204",d330b699:"29243","8a472aba":"29337",fbce6636:"29408",b92135a6:"29414","163a1bae":"29421",e4d4ec4e:"29457",da05f515:"29498",b2f58160:"29523",b45a54e9:"29526","13f72d6c":"29653","6e0a413f":"29679",b1633424:"29690",a642dcef:"29698","80b93830":"29708",da10e58f:"29733",e6557239:"29795","16381f20":"29820",d973177d:"29829","5d94dea0":"29845","26f5f607":"29891","5397b577":"29922","5de1c39a":"29950","332b14e0":"29969","87546ad3":"30035","6b836ac4":"30066","339988c0":"30154","22bf7f69":"30167","5320ed26":"30262","132be4b3":"30265",af953e30:"30317","4b678e99":"30355","5c5d3a2d":"30378",e4a43002:"30396","90ffbe81":"30410","407230da":"30564",c7165ecb:"30569","1ee0a129":"30579","775c5b43":"30583","6ee9522e":"30628","5d70257a":"30654",a7c3ebee:"30790","5814834c":"30827",ced554c7:"30831",d8412727:"30842","677757ca":"30848","44c28e7f":"30934","7dea1595":"31004","416fb909":"31016","71d5b1f8":"31039","3f9a993f":"31047",c3c8ddc4:"31125",be9442ac:"31141",fbf25af7:"31144",b8ab477f:"31220","5c81ce12":"31255","67f1ea1e":"31257",fa366c46:"31272","07f6d4d1":"31393",cc564cf4:"31465","1668cad9":"31541",c602d51d:"31544","8c4bf82a":"31567",b38306ed:"31680","05957343":"31705","0a70c05a":"31720","624fba40":"31726","974bc2fa":"31749","04eab06f":"31791","14a26e2a":"31797",a14af959:"31861",c791a767:"31862","2dcd9099":"31869","2e31e40f":"31957","4ef864ee":"31972","8dbbcff6":"31996",f0dc0726:"32005","9ba9284f":"32012","116b7e55":"32039","5110a7b7":"32183",eb05a324:"32225","53ba3577":"32270","149a2d9e":"32278",f9a4941d:"32335",fe345ee5:"32365",e1407f5b:"32391",c08ba4cb:"32472",e6c2d44b:"32527","40c3731f":"32558","798484e3":"32691","1b520177":"32728","943ce597":"32824",fdddbf66:"32825","8590fd3e":"32847","225cc45a":"32960","604cd7c5":"32993","97e51b1f":"33049",a172f6b1:"33065",ee003a92:"33192","2a422024":"33214","465994bd":"33234","7da68ccc":"33290",f5ff1a23:"33303","2d0c5b52":"33350",c16e0158:"33458","3ed70074":"33517",f81c13fc:"33524","65ea2434":"33533",fe7ac0b7:"33540","8f00bf20":"33559","6075be34":"33567","269d704a":"33572",df68b7b1:"33577","3f933ca5":"33612",d294bdb0:"33638",da7149d8:"33643","81a6b262":"33659","755872dc":"33724","1b31aebb":"33804","07399e71":"33806","45f2496e":"33816",f8a443f2:"33825","06758c2b":"33854",a7690409:"33881",e9c7c2b7:"33889","49aa1a16":"33999","18b5779a":"34127",f5c63bac:"34156","3f4396e6":"34179","80f4f5b6":"34182","13e6af21":"34196",e8a8dea2:"34255","164e61b9":"34331","6153f283":"34335","79fbf53e":"34388","538371ec":"34520",b038a3ec:"34528","782eae4d":"34543","0735e5be":"34549","40cd51eb":"34597",f30fab6f:"34621","852f3aa7":"34638",ef071c32:"34662","02e54e09":"34691","47a1bde9":"34706",a5fea1bd:"34750",e076fc92:"34803","2e6ef254":"34808","924dcf98":"34810","10fcd509":"34837",dc7f8f8b:"34847",f7702246:"34877",f44e1bcd:"34904",c9cac9d9:"34918","40dc6b06":"34970","5e2f1fff":"35044","47cb0ede":"35067","35788c78":"35088","6fe5390f":"35139","83829ea7":"35144","372475fb":"35179","2947aa63":"35248","0f3b9f0c":"35288",d42065ad:"35325",a7827f50:"35329",d9454955:"35379","976ab233":"35402","388d5845":"35532","97bb73fe":"35618","2b4cfa56":"35730","8fc868c2":"35733",aba21aa0:"35742",ff6f6072:"35766","3019fa66":"35767",d240c26d:"35784",dd61deac:"35837","8852ad6f":"35881","92928c02":"35922",a3142532:"35932",dfa4e294:"35960",b5a599e0:"35983","04afe417":"36009","59be0e8d":"36055",ceff0062:"36067","28f38ec5":"36113","307d712e":"36144",b60e28b6:"36192","8a759f03":"36264",eafd7a74:"36302","467ff4a0":"36379",e23d1069:"36387","5ea64d6c":"36549","1472dfa3":"36569","94a5efbc":"36594","2573355f":"36619","1084a32f":"36640",b6fb003b:"36672",a3015275:"36747","649faa0e":"36851","1007513a":"36885",d73e6b67:"37109","0b4fcfba":"37115","97da4333":"37147",d786420c:"37191","8f3b27f1":"37204","43dcd746":"37206",e34cac0e:"37209","37524cd6":"37257","554882a9":"37329","6013ac2e":"37366","32b44a8d":"37403",ce46a18e:"37486","6a293d29":"37489",e9705ef5:"37577",e17d733a:"37578",be2ede3f:"37617",a6aa9e1f:"37643",e2657c7c:"37673","2cfb265a":"37740",feab7dcb:"37799","5f87fd99":"37809",d5e29b01:"37839","9ad03801":"37841",cd060f40:"37842","88d0aec4":"37872","3f272b07":"37954","690cbdd8":"38001","8d086d51":"38003",baad6bf9:"38056","1efbb938":"38107","66372f10":"38158","2e9f383c":"38238",bbc1ba35:"38348",cf858c26:"38370","7c15a7a1":"38385",dcd7017c:"38416","9474fc0c":"38439","91335d19":"38449",f0fb7623:"38451",b4a84943:"38468","0f497157":"38600","6dc06ee1":"38605","7eaa135a":"38607","1bf4b05b":"38700",c4de5678:"38767","872a41d4":"38786","5ea125b2":"38816","6495713a":"38835","110e78c3":"38839","6f5eeb66":"38888","2c50796a":"38974",daa4f13d:"38999","5560f355":"39088",cb9e1f3d:"39110","755ebe0d":"39138",b5f01515:"39142","0b8a4e62":"39153","09b62bf8":"39192","484cbf74":"39197","8b795044":"39202","93f7a5ff":"39208",b992801d:"39230","90f157dc":"39240",b40642d4:"39265",b1043e58:"39283",cc6505da:"39405","995840bc":"39407","085b8128":"39417",a615dd65:"39423","0f65ccfb":"39444","9d833fad":"39487",b326207c:"39494","7b2a260d":"39496","782d926e":"39505","630bda65":"39518","441dded5":"39520","4a80e27a":"39555","06a8eab3":"39569","7d0e1375":"39587","97ae1fff":"39608","8f64cb7a":"39712",a68f0e64:"39715","07bef82a":"39758",fb3759c3:"39773","320da59d":"39777","3c2d0811":"39781","8fa753de":"39840","9b0c8626":"39887",d76c455f:"39901","09a52b17":"39908","6471fe03":"39921",d4a2e930:"39973","5f469a3b":"40065",bc817d28:"40124","0508dae2":"40178",edf7dc61:"40205",ecaa52af:"40245","3c36ce76":"40369","0cd1a20c":"40463","4d1df301":"40464","3415fffa":"40555","3e032765":"40606","12a5de9b":"40616",bf5126e1:"40651",dfc3c224:"40690",cc01a9d7:"40697","8393a516":"40755","1a7b33c3":"40758",d2110cc0:"40797",ddebc8bf:"40827","2662e92d":"40847","321dafc4":"40907","2884dc3d":"40919","881bebdd":"40927",ca0149b2:"40959","68c5632a":"40999","33d4a0d4":"41030","0fa5c29b":"41125","85ffab62":"41135","6c9200cf":"41260","247909f7":"41361","2bf5edd4":"41455",fd517388:"41461",c3f88c36:"41491","8cd118b0":"41504",bf9d9be8:"41518",da172daa:"41594",d407c2c6:"41640",e8e3bd30:"41651","9017a110":"41677",b9edf71b:"41739",bc38a1dd:"41750","29db9f25":"41852","78f0e259":"41867","58b3152e":"41872",dc5506b6:"41892",b7a56be4:"41907","7c49023e":"41954",c413ce11:"42068","295cb0c0":"42187","671726ea":"42196","89c8b6fe":"42268","3fa17fc2":"42298","1f979aba":"42299","6df57399":"42350",ffac4af0:"42368",b8212f90:"42465","203cc654":"42487","34825c6d":"42518","2b505997":"42566",b184a577:"42576",eafac744:"42596","165a93e5":"42690","28826a4b":"42702",d8ed3ccd:"42723","89f1622a":"42794","5314580d":"42799",bf3d61ec:"42801",aeca0a21:"42879","432e670c":"42881",c9d95cbd:"42900","145364e0":"42905","39c7a203":"42911",ebbd9274:"42920",a8c92c97:"42937","19028add":"42942","2812e3b9":"42995",e3477e52:"43029","2907d5eb":"43035","676c7c8e":"43040",bec2896b:"43042","341293cf":"43088",d831e3b2:"43195",fe9b6676:"43286","4c07ba53":"43352",f048922c:"43421",fbf82623:"43432","83fec35c":"43445","7b89671b":"43461",d319e9f2:"43512","4cd0ba1b":"43642","7117a8cd":"43677","752351f9":"43739",c09831a6:"43868",a8b66660:"43922","509aac2d":"43980","5a8b22a0":"44008","454b7ded":"44022","43d1bad2":"44040","894f5c0e":"44045","6503f568":"44118",e2fc22cf:"44123",ca2b0f7e:"44125",d653d7ed:"44129","19acc4ed":"44143","4f087d20":"44290",cfca4f26:"44326","0a91021f":"44339","8fd374dc":"44380",d363a80c:"44405","216bf65d":"44419","6fb01322":"44489","9882af90":"44492","9b2ae5ff":"44551","502906a9":"44567","20bfa334":"44640",d65b2c25:"44662",bdc69003:"44682","260982a7":"44876",f3d02b29:"44933","43f3c18b":"44939",c7a67184:"44948","12b957b7":"44960","8914fdfe":"44964","41af2803":"44994","6e34e766":"44997","86fe1f77":"45117",b528d4d0:"45146","49a37e79":"45210","7737fe61":"45231",c3f790da:"45238",db90ec2b:"45290","815e47ce":"45323","24d4b044":"45339","459dbf85":"45460",e85bde03:"45500",a722b43a:"45541","7dce0476":"45561",ef7891f5:"45640",c36346e3:"45670","3533dbd1":"45682",a2a2954f:"45919","9926d60d":"45983","95aba771":"45988","8cf74eb7":"46001","2e048b0f":"46008","1fb7523b":"46025",f724037a:"46039","67893f6a":"46063",f1087137:"46074","53cdeba4":"46156","8e4df3f0":"46197",ea511817:"46244","04b49851":"46296",e49bd305:"46375","00239e8e":"46425","4bb02a47":"46451",bcb734aa:"46472","9dfe5a97":"46513",c13f246c:"46515",c5427124:"46547","8012465a":"46578","8393d26f":"46598","5f0630da":"46652","4f48cd24":"46662","2b6a7ab0":"46754","8f07070c":"46802",b2e2853b:"46840","917a523c":"46850",db9d1243:"46888","85f8bce5":"46891","57a58e78":"46905",ff13b684:"46911","7b0a3d41":"46917",a28b89d0:"46921","37ffd066":"46937",a9afee85:"46979",bbb92300:"47041","26996ad6":"47060",a5c8a2aa:"47087","696d889c":"47106","1366dd9b":"47110",c648308f:"47127","4d2e69a6":"47206","131c6f6e":"47236","5048202c":"47247",c7e2144d:"47248","6111afa9":"47297",b9a767d8:"47433","09e5dcaa":"47517",df0967b2:"47537","0029660c":"47555","0c1ff092":"47622",b1899f7e:"47668","39a07549":"47693","17093d00":"47699","4edf53e5":"47730","6bb76d2c":"47917","7ad7688e":"48003","47f96c4a":"48023",ca713325:"48050",c17f9567:"48063","852ff8c6":"48071","0cc98403":"48091",f81c1134:"48130",c467a11b:"48132","519b5759":"48162","00021e3e":"48167","9d8965aa":"48188",bef59fc9:"48214",e672d61a:"48285",e2b4c006:"48295","189e3ac3":"48304",f6884a75:"48310",d8c836b4:"48355","959b45a2":"48360","712c16a5":"48361","2896ce7a":"48532","0a5f31be":"48544",c1506482:"48592","7a556257":"48613",ef4f3413:"48661","5db19d16":"48673",d009d47f:"48733",e054d919:"48768",b71be52f:"48793","79392e36":"48803",d0b9fc21:"48842",ce18dbde:"48883","9d9f8394":"49013",c68848f4:"49046",be94b749:"49055","97d17d75":"49071","3455c0d5":"49112","0ac5df82":"49174","7795e379":"49199",f2a06fea:"49226","6111bc4c":"49280",ad0a2b75:"49305","2417a912":"49350","8f1510f6":"49388","2019135a":"49461","49d63cc6":"49521","0d819826":"49569",e01bb6c7:"49579","8ec8c5c5":"49583","2cbb324b":"49587",b0ba51ed:"49655","2391d372":"49676",acf72eb8:"49783","5bd6f6db":"49786","3fc6d2b7":"49880","1d5cbb7b":"49991","40c88f7a":"50012","837c6843":"50095","756c7559":"50176","18dddf22":"50178",f2790563:"50183",ea981684:"50259",ec6a0daf:"50261",fc6a53b6:"50293","09a0b8d6":"50361",c59a4667:"50414",a33de290:"50428",eaebafad:"50446",a4e24d6c:"50472","313c653e":"50486","129c4e7a":"50507",c112d1b7:"50570","3fd21eb6":"50584",e964b083:"50642","75be343d":"50700","0914ee26":"50703","0d98f85b":"50747",a339c33e:"50769",b365f6bc:"50800","4251704e":"50819",aa04bdb6:"50827","8aa0dce2":"50839",e7b82dc0:"50934","4dd6f8d8":"51047","6bd6fe03":"51049",e1758f93:"51060","12aaf145":"51090","3304ac90":"51102",d366555a:"51116","5e85b509":"51170",c39359c5:"51175","90d97cfa":"51184",a06af3ed:"51229","85a6e3f4":"51237","0a8d92af":"51378",fe2deb8c:"51412","7a04b795":"51420","14515c80":"51438","65eb0274":"51494","45b02367":"51548","8447ad38":"51578","4c2a4e19":"51584",f762fff5:"51589",ba5671ab:"51636","6537c712":"51649","65d842b9":"51665","612cc46d":"51694","89bdbd96":"51711",b50c8022:"51755","9199f8bd":"51763","1bd7f091":"51769","91a39dd0":"51814","44e51e65":"51828","5c238f81":"51837","48b6c251":"51878",b5fb4df8:"51890","1d79e793":"52036","7f8ebea7":"52042",edea4b8a:"52093","95cc61bd":"52102","3498be82":"52132",d0ed28b7:"52135","81d19844":"52176","508f03f4":"52207","1562cf35":"52218",fadc68df:"52235","8ec5e058":"52250","3e088827":"52266","6818c2e9":"52267",be224150:"52282","8e1e17e5":"52286","0dd8c0ac":"52342",ab586159:"52408","2dc793da":"52450","3016c86b":"52462","8c67a0ff":"52466",cda1618e:"52478",ca57223f:"52488",f2da277e:"52563","7199ad43":"52569",a9417ee3:"52572","27f2e2a4":"52612",c4f5d8e4:"52634","2124517a":"52680","9e4087bc":"52711",c8f57d29:"52731","85afc7f5":"52770","25eae11f":"52785",ce319efa:"52826","9e1bed9d":"52840",fa2ae802:"52882","69fcecaa":"52895","4d4179b3":"52911","82c60778":"52912","4adafdbf":"52913","2f32a261":"53074","5de85215":"53132",aaf3ff15:"53170","71514a42":"53178",d670063b:"53201","79ab3378":"53237",fa713049:"53256","76a0389c":"53266",f8fe23f1:"53288","5440b68b":"53314",e2bce80a:"53449","63436e22":"53458",a45dd8f5:"53492","92f1a745":"53540","5a2d67ad":"53629",f6ef9721:"53633","6c9978fa":"53646","52ed38a1":"53670","77612fce":"53742","3a447539":"53771",e352cccc:"53786","7c8deb08":"53832",e623e42b:"53860","2a5e97be":"53861","94dd9534":"53871",e9a95c5e:"53881",a4da17e3:"53901",a8933372:"53925",d5f056f5:"53982",f72b3fe4:"53990","8c317219":"54097","93b4d825":"54106",f97d7d88:"54200","3a55b748":"54240","5ba9c4b5":"54246",e5c0ea66:"54270",f020ef51:"54272",b7bc328b:"54274","71e2c4b4":"54277","25aa47d2":"54399",c87c5e1b:"54415","0c3d0366":"54462",fb9e14c7:"54500","66193a96":"54540","633af835":"54568",d4522125:"54730",ff4fb41e:"54749","0f7d8652":"54759",a2de6851:"54851",a872c629:"54879",c46bba44:"54881","55f8cc28":"54927","0a893fdf":"54950","98bd463b":"54951","5bcffa9a":"54992","37d125cb":"55004","70d55848":"55100","152d0582":"55144",c1cb0a0b:"55167",aaa8a12d:"55206",c962ae4a:"55276",facc4cc2:"55302",ee44120f:"55342","2027fd18":"55401","342d2e6b":"55483",f7fa3381:"55526",ab685cdb:"55534","29cf75d4":"55559",c8861997:"55566","3a9c66ce":"55579",d5caed5f:"55616",a7511015:"55664",bbaa8144:"55668","069b26b8":"55754",d425e9d6:"55780","94b063ba":"55836","2cbaf53f":"55929","41adf405":"55942","194c8540":"55955",e1a6f6ca:"56028","69ef23f7":"56037",cde3e47b:"56062",c96d4604:"56087","096bca72":"56097",a7b4d0d7:"56122","602e2465":"56123","887c7539":"56133","5160d3b0":"56190",e028a908:"56256","75a12619":"56259","575869e5":"56297",fec58251:"56384",cbb5064a:"56408","858f1266":"56493","86a45dc2":"56510",c9c31477:"56560","609f9177":"56607","06eed450":"56648",beb32294:"56662","8dd3eb38":"56688","69e6c429":"56723","9a502a1c":"56725","2d57b909":"56767","6664c24a":"56779",eec5649b:"56826",ebc13825:"56916","1dbfdc18":"56948","39ed0ae4":"56974","97b1d23e":"57054","4d68fc5d":"57119","037241c6":"57141",e15f47bb:"57159","034f0308":"57165","2575da36":"57178",a2f498c0:"57182","8ee4a7d7":"57222",e3b05f38:"57245","779bba71":"57251","5e727800":"57283","55b89dea":"57302","3ed58e4a":"57326","841b525c":"57359","79cc2eba":"57361","533bed85":"57426","0b7a8a63":"57529",b20f9cb2:"57581","2b2d1be1":"57594",dd48b375:"57614","0ed7fb46":"57647","658997e4":"57730",c07b5739:"57749","73d3ccec":"57760","27b8ef72":"57762",f1691dde:"57885",e2070fcf:"58000","31fce735":"58002","2655f170":"58079",fa4b529c:"58111",a2171a4d:"58144","400deb23":"58255","078daaf7":"58259",b296abb0:"58301",cbf83637:"58351",a5e62092:"58359","15ea2a5f":"58393",ec854811:"58428","2a882da6":"58479","36d29ed8":"58484","0ba9210d":"58492",f0e5f3ed:"58581","6bd22ece":"58594",a1e59af5:"58666",a36e07dd:"58667","7fde9a4c":"58704","6b6aadc5":"58707","9ffdcfdf":"58721",b7d1b016:"58780",bec552c1:"58857","030dfd2b":"58874","52e97b50":"58880","7dd8c933":"59004","39fca8ac":"59005",a169aa70:"59009",e84457bb:"59020","11b61292":"59053",c43c6f4f:"59070",c762272b:"59104","1a20bc57":"59114","17ffd4ff":"59123","97db775f":"59262",e2b886c9:"59326","156bd387":"59349","55d26943":"59475","150f4998":"59493",b2555332:"59521",c5c8b091:"59614","70cca634":"59680",c9b0e9c8:"59702","9873f053":"59732",ab90a7b7:"59740","28553a2f":"59779","0e7c02dc":"59781","03f08ad1":"59866",b37c8625:"59873",b62e8859:"59874","888f35af":"59940","03137a3d":"59981",cc3a93a6:"60020","66eb519d":"60119","152819f0":"60167",e04f784f:"60185",a52bfe45:"60187","5c430979":"60193","5c417b7f":"60198","5c5dd48c":"60203","3fa5d64e":"60257","3d3aadb0":"60267","93d54c10":"60294","42d452f1":"60315",f83acba0:"60445","821320eb":"60510","492bd0ed":"60565","3523854b":"60613","7a82ef89":"60625","244c7b0a":"60676",d163928b:"60696","73e80d5d":"60725",e9d18558:"60762","0614dce3":"60765",c316a3d7:"60819","2df3fdca":"60830",d2436a2b:"60837",c9d25191:"60861","709e1a02":"60884","00b58b18":"60901",fe53d354:"60908","3e85731b":"60953","4d18bf1b":"60965",b1506a50:"61027","127f988d":"61114","4521c19b":"61228",a7456010:"61235","84536aab":"61265","31eb78c6":"61300",f12e5474:"61345",c90911b0:"61378",a1e3441b:"61416",b0f00280:"61481","6b206066":"61559","55b57e06":"61584","35190cab":"61627","495a3878":"61652",faa24029:"61702","4f3239be":"61721",ad2a3b86:"61734",bc80aebf:"61740",aa1329f2:"61786","14da6f38":"61844","124bf435":"61886","820ef6f8":"61950","9df3c51e":"61959",a6972a3c:"61991","5cc68a8f":"62015",f1b1ae9c:"62037","2638eb20":"62061",d2289dcb:"62111",cf1cd5da:"62120","1a4e3797":"62138","8d364c04":"62147","5955b5ee":"62149","22c027ab":"62162","0e7e04d8":"62182","1e38d1de":"62188","9b695413":"62254",cb69dde4:"62264","8041f857":"62400","856bc38c":"62431","3e9695b6":"62456",f448ea15:"62469","564f4b07":"62501",cca423c7:"62549",abfb0eb9:"62568","61b91652":"62635","0f378f0f":"62639","58728d91":"62641",fcaa2a90:"62672",d9175e87:"62691","345b88a3":"62703",f9a8c23e:"62712","1769198d":"62714","4e78ea4f":"62827",ae5c2262:"62845","07853d90":"62867",f1096413:"62875",c03ef713:"62927","7a0d5539":"62953",e5c6728d:"62957",baa95a18:"62975",b0635fce:"63005","754efc6e":"63064",d4bcf69a:"63124","93f4c2fc":"63151","29fd9202":"63181","34c77011":"63228",df8bdaca:"63262","2f1bf685":"63291","259b7e50":"63298","7dd3b2a7":"63317","60b75cbd":"63330","44bdb747":"63367","5f87f962":"63382","9780a9d6":"63387","04ea9cef":"63420","465af2b7":"63430",f30739cc:"63455",a3041c66:"63515","58f053e0":"63521","1fd2ca4a":"63553",b9795b3d:"63576","43a56d47":"63627","47298c37":"63646",f82e3d74:"63682",eadd254f:"63700","81a5dcd4":"63739",c2750739:"63779",a4974adf:"63795","95e06d9c":"63836","57e245ce":"63907","8bbbdfbb":"63951","2278c359":"63966",b81d6cb2:"63975",c47fd21a:"64045",e34c241a:"64099",f4f77456:"64184","88ed6425":"64209","192402a6":"64264","48a72e90":"64275","7c0dabe4":"64351",b65b26fc:"64391",dfa86ee4:"64442",e4307155:"64447",e9f47cd4:"64465","9c8cec5f":"64473","5d817499":"64502",dae07133:"64527","3756d209":"64535",a2a8ce40:"64577","9c273b44":"64597",e52d80fa:"64623","6ae279e9":"64659","46693c0b":"64670","1d00ec5b":"64737","2da5f59f":"64749","9a8a6b3c":"64838",e80f330c:"64899",a3fde46e:"65013",f08c8322:"65017",f04b050d:"65094",c9bcea67:"65133",d0cf31b7:"65193","2a11e6a7":"65223","0530d392":"65233",ba47c7e8:"65246","517960c0":"65350","8db42357":"65356","070df7e5":"65359",a21d3492:"65473","26115f23":"65497","8008d958":"65569","5d7f3e2f":"65611",e1ba57a0:"65625","26cbee69":"65629","75ba6401":"65647",c7850e27:"65648","329c66a5":"65658",e29a1e9b:"65727",d1be0dfb:"65745","02ff5d42":"65756","7d5633f0":"65759",fbd3de42:"65835","38147e44":"65897","587a0b3e":"65918","567cfed1":"65926","1f391b9e":"66061",fada9729:"66062",ceca85fb:"66097","331ad65a":"66135","136587f9":"66140",cf5645b0:"66162","0b7cbed9":"66169","2b53c3fa":"66210",cc9fb6c4:"66237",eee168db:"66327",dcbc8483:"66338","8fb804ed":"66372","9019bc0f":"66381",c0d2ab5d:"66394","6f47e633":"66415",cb8920e1:"66461","85e49a93":"66499",b01f49d5:"66504","79d5f27a":"66510",c6ec7d6a:"66518","83037ff5":"66524",d0550e1e:"66538",ecb74126:"66559",b0e34666:"66575","9fce9e91":"66602","5389895e":"66753",e381e7b7:"66759","62e9fea7":"66822",e1fde1ef:"66832","58b9aab4":"66867","47f8f95a":"66903","6e955522":"66912","6faab85c":"66947",ba8ea34b:"66995","1b143eab":"67044",c1050649:"67061",a7bd4aaa:"67098","27c39d7f":"67100","06073810":"67104","0d86fe8d":"67114","11235f31":"67149","9736a6b2":"67189","2d4f05ca":"67229","60cef16d":"67252","01ed4ae3":"67376",b6d7433d:"67438","814f3328":"67472","3477cc36":"67489","77139df7":"67507",d89aa357:"67545",a1a96ebc:"67581","8775fa1c":"67587",eedfeff5:"67649","47766edd":"67668",cace8592:"67683","8fb89e11":"67704","4d59e059":"67720","2c18bef5":"67729",b57b3f07:"67755","39b26ead":"67775","0a0dd03a":"67914","8aec9a60":"67954","863f8530":"68038",c1c9577e:"68043","0924bdf1":"68045",e981d05e:"68094",a148d810:"68210","3b8a31a8":"68246",e48e4dc9:"68249","89c88bb6":"68253","8ea5f648":"68304","9d05a91f":"68334","975aa772":"68434",bb6faf52:"68467",f553a3a8:"68515","9a8c2230":"68551",d81421b8:"68569",f645a9e6:"68665","0b87289b":"68685",dbf13a93:"68710","719a7d9b":"68765","14033dfb":"68770","3ac10f9a":"68839",bb1a3e9c:"68861","08299697":"68865","62cdbb35":"68910","5aa406a5":"68930",f9d38c6e:"68955",b60b94c8:"68991",ef13094f:"69017","8a752d6d":"69030","8df5dc78":"69038","4a55387a":"69129",fc384521:"69169",f0589cfc:"69199",de9d53d2:"69347","4d2a5110":"69365","5a360e6e":"69384","7ffd9a5f":"69457",fc15228a:"69501","8a4df687":"69517","4d573718":"69570",a3713279:"69588","05c96a0d":"69633","9c10cdcf":"69638","36e398ec":"69671",b1e8d27b:"69770","787caf51":"69787","615fd764":"69844",b58f381c:"69875","8e981336":"69982","0860d759":"70008",c8d1e051:"70022","73a7a1a2":"70058",b318f3b6:"70100","9f3d620b":"70117",f68988f2:"70126",dae6ce88:"70127","2f2d1edf":"70133",e04f6385:"70174",cb543535:"70179","529aff45":"70209","8367b76d":"70210",e76e0aa8:"70234","5e1c183f":"70253",aefdabf4:"70268",d2786aa3:"70399","0bbbad22":"70418",b71c2d32:"70452","8c596cb7":"70502","0bd456dc":"70551",ac5d28bd:"70560","6d5145e1":"70612",a9f446ca:"70645","0920b03b":"70649",dcc774d2:"70669","70ca6744":"70687","52be8247":"70696",cb488bcc:"70712","07338b13":"70728",ecba2f16:"70749",f3e1c72c:"70755",ac00e857:"70784",fda5ba18:"70791",c1dff2d3:"70794",c3c05d38:"70814","1d89db06":"70825","23421dc8":"70826","6763bf32":"70828",e34cf2a2:"70853","4f594038":"70870",d1fa94a6:"70947","87d75f25":"70953","16029e49":"70963","05f6486e":"71021","5e0cf2ca":"71026","9b8a5dc6":"71051","48c07d39":"71111","92f96583":"71117",af7ce5e3:"71162","131dae92":"71227","40d0141e":"71374","7380ddcc":"71407",ff761994:"71473",f89e6cd1:"71531","83c3bea7":"71565",d7e2cd1f:"71585",ed47441b:"71590",a29b4047:"71612","7ec29cb2":"71656","4a74d13d":"71715",e3aab494:"71784",d2a882d8:"71792","09138901":"71858",acec9ba2:"71863","466f5a64":"71877",f783f7a9:"71910","835d6f03":"71964","31b399ad":"72011",f0dc2560:"72043","95f36a1a":"72053","3d095b6b":"72122","8cec3a3f":"72135",cf8b2bc1:"72246","4941c7ed":"72322",f23d42f7:"72353","4419dbb7":"72358","27d3d4e0":"72446",ac84c584:"72527",bd203bf3:"72573","3336b76f":"72599",c8768069:"72634","049fd4ea":"72668",f81aef8e:"72675",eb3eed60:"72707","69f425f4":"72759","2d34e835":"72835","43b52908":"72880","491d56e0":"72907","37eca2aa":"72914",b724edf8:"72925",fca979f9:"73019",b8385eea:"73084",da144c90:"73193","33e8889e":"73264","7bd25ebf":"73276",c7f860be:"73290","8b1b48fb":"73316","97d2cbab":"73331","21838a86":"73376","681664ad":"73397","092425ad":"73472","4c26df07":"73493","5ebbf59b":"73539","73d617e8":"73540",ac6289fa:"73569","01689e9b":"73607","622b7911":"73609",edefc60b:"73624","35be90fa":"73684",c6ea0115:"73693",eb08ed44:"73741",d8415e6f:"73756","5cf43a2c":"73800","569e0588":"73841","4d015a5e":"73846","06dd3057":"73888",d721a748:"73891",d502d9c9:"73905",f4731b9a:"73940","14841d7a":"74019","9d891c91":"74027","2e6d9cc0":"74039",b7aeb8c2:"74046",ea5e46ff:"74069",da7bf323:"74121","393be207":"74134","2fd7ee6b":"74282",acf7953e:"74312","57eb6545":"74388",bc42f283:"74403","103c2fe7":"74418","3d4e54c7":"74490","111d9467":"74524","84939cad":"74588","033d3629":"74657",e6ce3bd9:"74684",a5ac74f6:"74792",ec7a5af3:"74880","43c329f5":"74902",ad848ffa:"74945","9b3f2ab9":"74961",eb5c136f:"74994","0c90e710":"75036","1c4d0413":"75043","13d28288":"75051","8df3f976":"75062",dd620de6:"75078",e2585025:"75105","9f49c871":"75106","3126d1b1":"75173","6dab9497":"75267","07deb48b":"75309","84aa8d64":"75359","847c1b9e":"75378",ceaa6e69:"75405","97c492a6":"75450","605c3775":"75459","2aa42d18":"75666","68f2aae3":"75695","1ad07866":"75696",d2250181:"75718","691ef278":"75735","217c03e5":"75759","724a4edc":"75775",ad132b09:"75805",a3541f3b:"75866",f18854fb:"75911",e01c8f09:"75919","03240ae1":"76041","20a6876f":"76163","1778a2f7":"76166",d9605822:"76215","6a3d5afb":"76235",cc7760fb:"76257","075f4b70":"76262",cb46984a:"76264","5d06256e":"76274","0d71ae17":"76285","1ed4b1ad":"76289","9267add8":"76368","594c10ba":"76530",eb0d63b4:"76641",b6f16885:"76683",a50107bb:"76719","9a68cfff":"76748",d5a221f8:"76850","2b00a752":"76854",e364f7ff:"76871",a91e6a0a:"76873",a01a15fc:"77077",bf048e24:"77088","61ee4158":"77096","62825cc3":"77123","30ae1693":"77145",ce019e24:"77174",eaf93d9c:"77183",a95aede3:"77200",fe2389d2:"77222","1aef3c3b":"77261","109d395b":"77298",c4acdd50:"77369",d0c84d34:"77391","0235a442":"77596","5ef28561":"77679","60381fc6":"77698","3a31d53f":"77749","8c3793bd":"77764",d9e41302:"77787","62e7b5b0":"77794",a52788ff:"77920","33ab05f6":"78001",c9599a77:"78037","30175d3c":"78055","90caa6a1":"78087","8df10e0f":"78159","5455ca0e":"78199","1682c6e0":"78312",c1b680b7:"78354",b1a2ea9a:"78421","28ebe10c":"78497",b7e5c092:"78512",ff4a022d:"78522","4adc4126":"78544","95365ba3":"78583","4f1d1584":"78632",b80df7ca:"78704","667a9f57":"78758","6000d05b":"78764",a7f76e11:"78787","04c3dd09":"78820","4f0afd2f":"78858","499efff2":"78876","335badf9":"78880",c8939218:"78912",f73fc2b7:"78919","73bc484b":"78926",ccd7c88f:"78985","0ee8b775":"78988","803df44c":"79039",a94703ab:"79048",cdc43a7d:"79150",c884c38e:"79157",cc426672:"79180",a2030166:"79416","120bc0be":"79474","8b7dab17":"79485","368f9c22":"79506","09b9b020":"79521","1bfbaba8":"79656","8be24c4d":"79739",fc26a5d5:"79841","619263e9":"79866",dd6ea91b:"79987","5e4ec6cd":"80018","93c339e4":"80046","587df15f":"80091","7349f9da":"80102",d38a6f54:"80198","0cc20099":"80205","45cd5638":"80259","8aabb1ce":"80260","8657657d":"80299","3c89ed52":"80310","2fd10e89":"80362","6e954188":"80375","81c96f91":"80408",abf14b6e:"80424",e1a35040:"80442","992bda30":"80457","318980ec":"80458","7080aeb9":"80491","27321f21":"80531","5cb06d06":"80557","1f97a7ff":"80598","9abd9d66":"80632","80f24550":"80649","6d70fa33":"80677","641786b9":"80744","84ac5929":"80750",fd440a88:"80772",cfdba83a:"80781","442da8c1":"80794","413bf93f":"80841",b6aee096:"80863",a7f213e3:"80947",c141421f:"80957","820b9813":"81012",f74d3bfd:"81019",c88d5fcd:"81050","104fa664":"81085",aee88ae1:"81125",f98df6cf:"81175",ddf9f187:"81188","347b93da":"81212","54e1e905":"81285","2195a7cc":"81300","12363bc4":"81319",a20f65a6:"81346",e6c5d4a7:"81390","7af33a93":"81410",ae0ec9f4:"81482","654827c2":"81530","13685ceb":"81544","15a3ce9a":"81583",ffe2a86d:"81639",a74d38f6:"81666","0d9e9c41":"81692",c75c3ca5:"81737","932d66ca":"81761",fddd2104:"81770",d3571192:"81791",b90928c1:"81795","6066240e":"81802",b3dc9cb4:"81891","29470dda":"81902",acecf23e:"81903","4b93078e":"81943","2a59c009":"81982",f9ecf61e:"81990","4a7139ae":"82012","755e7c7e":"82019",cb7dc7d1:"82242",d2c9f0b8:"82261","226eff01":"82297",b87f99cc:"82354","7345c721":"82362","5d210bb4":"82431","24f4e7d7":"82456","4393156b":"82486","0add85e5":"82553","907fc94b":"82581","4cd82028":"82588",dd0ce7a8:"82663","72e3e702":"82722","4ccba4b8":"82754",dd09cc7b:"82847","12cecbf6":"82905","2a7d5452":"82939","732a7c43":"82987",dac8839d:"83027","42174d87":"83078","686a74aa":"83089","21cd7edb":"83103","79ca5236":"83109","6060cc06":"83111",deacbd9b:"83121","10757cc8":"83127",e5cd0e7f:"83182","95126e44":"83203","828aa184":"83213",ccc49370:"83249","5c26bf07":"83260","2b6eabf2":"83273","0ba08ea0":"83316",d0f169c8:"83378",e6ccb422:"83470",c85c7bc6:"83574","19560f91":"83608","9e37e644":"83670",a8c902bd:"83700",e6fc8a9b:"83779",b6cd0ba6:"83797",f5dd5915:"83824",cc517726:"83841",c48426e8:"83849","345eb925":"83928","757c6784":"83932",e67a83cf:"83954","2bf0d1a9":"83958",e200187b:"83970","0e384e19":"83976",c17d6939:"84013","511d3e84":"84070",ed83b9b9:"84107",d2ed2b82:"84152","17d9fbbc":"84227",ddd99a22:"84232","901160ed":"84255","2ffd8514":"84259","1132d5f6":"84319","0b82d45d":"84332","8180940b":"84527","2e72ea50":"84530","2760fb69":"84563",d9a7203a:"84572","21f4f354":"84760",b738b15f:"84773","6875c492":"84813","6bd2e919":"84869",d9d878d8:"84963",ae42df76:"85014",ec2ed6e2:"85095","7c86d680":"85097",ab380486:"85105","0cf3b0b8":"85205","8beefa16":"85209","78c968cb":"85243",ffec2b37:"85257","8f4a15da":"85279",c9ff545e:"85322","813f53ba":"85358","2f6614a5":"85442",de5aeda1:"85453","2c88985c":"85537","8f9bc413":"85581","24e645af":"85588","0e8c3a89":"85736",a4a3eadf:"85796","3e226f70":"85806",d40aab8b:"85817",ddb0149a:"85896","41639dad":"85899","716f14d9":"85917","5268c144":"85960","5733876a":"85973","83b6afd8":"85997",ae271c01:"86053","199e6876":"86074","677325f0":"86121",fb03d32d:"86129","1f8198a4":"86167","95ee2976":"86215",abe1b280:"86216","7a2c4c43":"86246",d630316d:"86354","669193a7":"86417",d5f51703:"86434","2a1b9f9a":"86478","3a311bb0":"86480",f4e1ab69:"86501",b76e61dd:"86586","0e0dfb6a":"86597","49bbb99a":"86623","7ff6577b":"86659","927f97a3":"86669","58421c87":"86685",b0445ba0:"86807","5626901c":"86829","57ec2762":"86846",c942990c:"86856","5687c7cb":"86888","319b6f13":"86890","869411c7":"86914","7a06eb83":"86939",d2a66e94:"86992",b62a4e5f:"87004","40df2769":"87087","4eec7d8d":"87159","4462c0cc":"87184","767cce31":"87186",bad31f72:"87205","9c71777e":"87217","33ac18ed":"87269",c884ad6a:"87282",c4f2c374:"87377",cd08112a:"87407","0b425eb3":"87432","33bf4676":"87456",b8f2cc13:"87459",baf4021b:"87473",d5762a9f:"87483","643da015":"87485",e29c32f4:"87547",d2b2e5aa:"87589","7c29a585":"87614","137db567":"87688","3f1a4665":"87747","6f831635":"87781","4194f325":"87863","01f93a4b":"87875",f553a7ec:"87880",fc17862c:"87905","5b17955f":"87945",dc4ee1bb:"87971","85f9f5a6":"87995","72a68b3b":"87996",a5f4f54c:"88047",ca3d464c:"88111","2e05ee79":"88163",b8fd1a8c:"88222",ed990644:"88248","85e50ec2":"88298","0169a509":"88310",fbfb0bb0:"88327","3cf947bf":"88393","5ae50f21":"88394","078339bb":"88399",a13618bc:"88436","40e4b7d4":"88441",bf79ed6f:"88468","23a811a2":"88478",d3f32089:"88522","2283659c":"88547","5871fbee":"88622","6e8a38ea":"88626","6dc022b8":"88654","6be5dbf9":"88696",b330ac5c:"88775","71cde98c":"88815",d3065e4e:"88817",b0b71a2a:"88821","014c2cb9":"88847","508d741f":"88852","5edce1ad":"88855",d15e98db:"88865","568a0660":"88903","7b658d8e":"88986","2c9ce68e":"89018",fc93a2ea:"89093","24f450eb":"89097",adb96665:"89172","9f15c6e7":"89175","9b191135":"89210",d8e6b3db:"89289","324cb577":"89338",b919dab0:"89353",cb2f16be:"89362","39ac0d5b":"89402","9ed26de9":"89415",ce1709a8:"89437","978ca64f":"89455","145c1cc4":"89489","7ff4234e":"89554","2709984f":"89610",cde9af88:"89641","837dc7e4":"89696","084a80b5":"89801","9bfa1541":"89810","36994c47":"89858","65f8c8fd":"89873",e582f766:"89986",bfb3b697:"90066","7e60f0fb":"90071",dbe2cfea:"90110","1026ad00":"90115","8abd7194":"90135","9db841c0":"90214","7b773c92":"90257",a80ed580:"90280",b3abe364:"90317",c633f93f:"90378",ed2667fa:"90414","9947fe09":"90416",fe49dcfb:"90438","6157713d":"90513","32eb34e5":"90562","99144b30":"90593","2563c97b":"90598","73554d19":"90625",bfa9eb5d:"90627",fff1effb:"90717","48dc1693":"90749",e96ddf11:"90831","837010ac":"90842","0058b4c6":"90849",e03c6723:"90910","271ea2f9":"90950","70e8710e":"90972","466375b7":"91025","42003ca2":"91058","014625f4":"91109","3629c812":"91187",ece3ee5e:"91203",f657ed9f:"91257",af1525aa:"91305","0f84f33f":"91319",d1980a1b:"91333","88f66091":"91359",ae3304ee:"91405","284c57b4":"91428","7118d0f0":"91530","980d0b86":"91540","8614d32b":"91581","1fecd571":"91587",e33cf622:"91597","7907a033":"91621","6033c607":"91695","9964550a":"91724",df99aa82:"91787","41ca93cc":"91844",b7201a27:"91895","72fdaa88":"91916","8ce0215f":"91993","0ce689e1":"92018",e2c3948d:"92031","6342cf5e":"92105","4cce6e5a":"92125","56a0d755":"92196",e772c536:"92223",bef29d9e:"92241","85fe7d70":"92273","4a4c6752":"92329","4c434b32":"92410",d888d821:"92412","1be20fdf":"92475",b6eb7220:"92535",e53ee22f:"92544",efa442c3:"92653","7c1d6f5a":"92664","9dfaf941":"92673","3e082aad":"92955",adfd3bc1:"93057",b5ea0533:"93085",fed5be48:"93166","2ed2a721":"93206","47b26a6d":"93209",e55ca189:"93210",b12147a6:"93269",cf32db66:"93273",aba187b8:"93341","2357dc71":"93361","7a234181":"93362",f5e9d1c4:"93438",a9c52207:"93534",d9e43198:"93546","44c6f0c9":"93602",e1847ef7:"93636",f179621d:"93795","09bacf3b":"93849","0a07ac32":"93854",c3c082a1:"93884","45a5cd1f":"94000",ee71d619:"94065","8c0fb9c6":"94082",beceb38b:"94091",acddd5ca:"94106","6ee6a410":"94153",c6b4dc09:"94168",f0cc57e7:"94227","824e6f8c":"94251","00f9d3c8":"94314","8b44df1d":"94344","657bf45c":"94361","85c8b6c7":"94417","13feb7a8":"94538","8e7aaae8":"94555",a1e44e64:"94561","745d4b8c":"94568","0a02a2d0":"94625","30549b42":"94646","50774ec6":"94648","8520f5db":"94685","0c2c2d88":"94711","6dfe2e3e":"94713",c26e67a5:"94788","256701a3":"94796",a1282170:"94841","3e1f4a39":"94843",fc66001f:"94863","95ec5604":"94864",bb63d03e:"94910",e8b41ff0:"94925","98700a51":"94926","5fc8caff":"94980","8d65e26f":"94997","63c4b13e":"95020","4b69979c":"95058","10ac9a3e":"95078","818bb2cd":"95093",c0df5757:"95136",cdb727d9:"95159",f58814fb:"95183","1cb0fe52":"95231",b4030b00:"95240",ed211a79:"95245","9b4185c1":"95330","52910a8f":"95427",e1afbf8c:"95443","8a40ff6b":"95470","5917c028":"95542","9a8fdb53":"95605","188015be":"95641","4885c521":"95649","30d4e84f":"95659","89ce4ba3":"95768","8c79a60d":"95785",dbea5ca6:"95818","9e488927":"95909",accd2b0e:"95911",cbc2448c:"95912","5180e398":"96022",eb84cef2:"96086",a267572b:"96155","838df61f":"96225","380e17bf":"96239","638db053":"96268","82a7c68f":"96276","65d1ec04":"96325",ddd9290b:"96463","1b260ed9":"96470",d4083900:"96555","5b0025cd":"96652","8c42b153":"96693","4f748135":"96745",a98ffe6a:"96771","181eb1b5":"96778",c3c125b1:"96793",d527c17c:"96881","7ab01152":"97006",e9032a0d:"97033","763a8986":"97047","9331da7d":"97107","32bb5bcb":"97114","9d2e74da":"97123","20a30ea0":"97167","1b3061f3":"97189","7fa05810":"97223","365a7fd7":"97246","1a8a162f":"97253","205cdcf8":"97296",c2a473ad:"97342","76276d52":"97358","3bfbd79c":"97379","224c7e3e":"97420",ba47c136:"97424",b93a682d:"97476","3a6c6e5b":"97536","6ccd70b6":"97554","3d08e0be":"97562","8e81e342":"97585",facb0528:"97664","1dba1ecf":"97670",b58e88de:"97732","8fa9d00b":"97737","41b1becf":"97753","7d2fd416":"97763","97a057b3":"97821",e5562b89:"97829","47edbc34":"97863","26ec8ae2":"97887",ab8b4014:"97895",bf7dfc7c:"97901",ff509459:"97905","1e228808":"97913","350cc719":"98012","139d61ea":"98021","95f25ea6":"98030",fbb50b04:"98058","75dbe45b":"98059",b18455bc:"98087","48f67822":"98094",a2219ebb:"98139",fc46979d:"98147",c8e5bf38:"98165","3539b92c":"98237",f62bafa2:"98271","756094a5":"98308","9e297776":"98311","1c3a958e":"98392",b943b6ea:"98425","94dcd3de":"98473",ea6f04d4:"98477","6065ad54":"98534","99e64d04":"98700","19bfb940":"98750",af6e9729:"98758","3314c9d3":"98761",a48978f5:"98779",bf667688:"98804","3e8495a1":"98867",b4e94af8:"98908",ab37b32f:"98925","5de60d34":"98935",c9ba7c72:"98941",ef00b8a0:"98947",e8178b53:"98982","82a5d7f7":"99001","1c27379d":"99095","210305d4":"99146","8e563661":"99151","3047f3e7":"99252",c14fcab2:"99254","8944e56a":"99299",bdecca0c:"99306",b3e98411:"99330",df09200e:"99335","5ffb8f23":"99437",c0684476:"99451","2263a65b":"99502","76af5d51":"99504","16e939a3":"99528","8c2cbe8e":"99531",c49eb59b:"99534","25c655c3":"99543","9cc8ffa2":"99611",bfbfac54:"99644","25e15e7c":"99678","5a4dd75d":"99701","5fb14ca8":"99705",dc330c71:"99709","6e34d00c":"99710",f4a839f6:"99746",a32c0324:"99747","8e34a11f":"99872","2f7d15c4":"99905","4b2e4980":"99987"}[e]||e,r.p+r.u(e)},(()=>{var e={45354:0,71869:0};r.f.j=(a,f)=>{var c=r.o(e,a)?e[a]:void 0;if(0!==c)if(c)f.push(c[2]);else if(/^(45354|71869)$/.test(a))e[a]=0;else{var b=new Promise(((f,b)=>c=e[a]=[f,b]));f.push(c[2]=b);var d=r.p+r.u(a),t=new Error;r.l(d,(f=>{if(r.o(e,a)&&(0!==(c=e[a])&&(e[a]=void 0),c)){var b=f&&("load"===f.type?"missing":f.type),d=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+b+": "+d+")",t.name="ChunkLoadError",t.type=b,t.request=d,c[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var c,b,d=f[0],t=f[1],o=f[2],n=0;if(d.some((a=>0!==e[a]))){for(c in t)r.o(t,c)&&(r.m[c]=t[c]);if(o)var i=o(r)}for(a&&a(f);n - + diff --git a/content/blog/2016/12/30/strata-talk-2017/index.html b/content/blog/2016/12/30/strata-talk-2017/index.html index 4e728cef62205..87e08e42e4180 100644 --- a/content/blog/2016/12/30/strata-talk-2017/index.html +++ b/content/blog/2016/12/30/strata-talk-2017/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2017/03/12/Hoodie-Uber-Engineerings-Incremental-Processing-Framework-on-Hadoop/index.html b/content/blog/2017/03/12/Hoodie-Uber-Engineerings-Incremental-Processing-Framework-on-Hadoop/index.html index 0d6e16bfc704f..0f777f58b7910 100644 --- a/content/blog/2017/03/12/Hoodie-Uber-Engineerings-Incremental-Processing-Framework-on-Hadoop/index.html +++ b/content/blog/2017/03/12/Hoodie-Uber-Engineerings-Incremental-Processing-Framework-on-Hadoop/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2019/01/18/asf-incubation/index.html b/content/blog/2019/01/18/asf-incubation/index.html index 8d491b1545c9e..f795499f2f15e 100644 --- a/content/blog/2019/01/18/asf-incubation/index.html +++ b/content/blog/2019/01/18/asf-incubation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2019/03/07/batch-vs-incremental/index.html b/content/blog/2019/03/07/batch-vs-incremental/index.html index a6fb3435a0c56..4f7919622672e 100644 --- a/content/blog/2019/03/07/batch-vs-incremental/index.html +++ b/content/blog/2019/03/07/batch-vs-incremental/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2019/05/14/registering-dataset-to-hive/index.html b/content/blog/2019/05/14/registering-dataset-to-hive/index.html index 3b75130835770..0696462291581 100644 --- a/content/blog/2019/05/14/registering-dataset-to-hive/index.html +++ b/content/blog/2019/05/14/registering-dataset-to-hive/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2019/09/09/ingesting-database-changes/index.html b/content/blog/2019/09/09/ingesting-database-changes/index.html index cdc9b37b67530..8e5f00452bb61 100644 --- a/content/blog/2019/09/09/ingesting-database-changes/index.html +++ b/content/blog/2019/09/09/ingesting-database-changes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2019/10/22/Hudi-On-Hops/index.html b/content/blog/2019/10/22/Hudi-On-Hops/index.html index ea5bf129bf60c..e66dc2585299a 100644 --- a/content/blog/2019/10/22/Hudi-On-Hops/index.html +++ b/content/blog/2019/10/22/Hudi-On-Hops/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2019/11/15/New-Insert-Update-Delete-Data-on-S3-with-Amazon-EMR-and-Apache-Hudi/index.html b/content/blog/2019/11/15/New-Insert-Update-Delete-Data-on-S3-with-Amazon-EMR-and-Apache-Hudi/index.html index 61c4d8af532b3..9bea10a66b92d 100644 --- a/content/blog/2019/11/15/New-Insert-Update-Delete-Data-on-S3-with-Amazon-EMR-and-Apache-Hudi/index.html +++ b/content/blog/2019/11/15/New-Insert-Update-Delete-Data-on-S3-with-Amazon-EMR-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/01/15/delete-support-in-hudi/index.html b/content/blog/2020/01/15/delete-support-in-hudi/index.html index 6de204458748e..990e0a795af49 100644 --- a/content/blog/2020/01/15/delete-support-in-hudi/index.html +++ b/content/blog/2020/01/15/delete-support-in-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/01/20/change-capture-using-aws/index.html b/content/blog/2020/01/20/change-capture-using-aws/index.html index 89cd0da6a7d95..81999be8fb31f 100644 --- a/content/blog/2020/01/20/change-capture-using-aws/index.html +++ b/content/blog/2020/01/20/change-capture-using-aws/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/03/22/exporting-hudi-datasets/index.html b/content/blog/2020/03/22/exporting-hudi-datasets/index.html index 055c001af8fd7..080688f141bfc 100644 --- a/content/blog/2020/03/22/exporting-hudi-datasets/index.html +++ b/content/blog/2020/03/22/exporting-hudi-datasets/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/04/27/apache-hudi-apache-zepplin/index.html b/content/blog/2020/04/27/apache-hudi-apache-zepplin/index.html index 5bf402873dc42..c2842e1f2d733 100644 --- a/content/blog/2020/04/27/apache-hudi-apache-zepplin/index.html +++ b/content/blog/2020/04/27/apache-hudi-apache-zepplin/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/05/28/monitoring-hudi-metrics-with-datadog/index.html b/content/blog/2020/05/28/monitoring-hudi-metrics-with-datadog/index.html index 930bedc8a2be7..c7d8f50b145c0 100644 --- a/content/blog/2020/05/28/monitoring-hudi-metrics-with-datadog/index.html +++ b/content/blog/2020/05/28/monitoring-hudi-metrics-with-datadog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/06/04/The-Apache-Software-Foundation-Announces-Apache-Hudi-as-a-Top-Level-Project/index.html b/content/blog/2020/06/04/The-Apache-Software-Foundation-Announces-Apache-Hudi-as-a-Top-Level-Project/index.html index f10a77098021e..b371c2bab32d1 100644 --- a/content/blog/2020/06/04/The-Apache-Software-Foundation-Announces-Apache-Hudi-as-a-Top-Level-Project/index.html +++ b/content/blog/2020/06/04/The-Apache-Software-Foundation-Announces-Apache-Hudi-as-a-Top-Level-Project/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/06/09/Building-a-Large-scale-Transactional-Data-Lake-at-Uber-Using-Apache-Hudi/index.html b/content/blog/2020/06/09/Building-a-Large-scale-Transactional-Data-Lake-at-Uber-Using-Apache-Hudi/index.html index 7248b9bfe0cb4..1da7f170fc3bf 100644 --- a/content/blog/2020/06/09/Building-a-Large-scale-Transactional-Data-Lake-at-Uber-Using-Apache-Hudi/index.html +++ b/content/blog/2020/06/09/Building-a-Large-scale-Transactional-Data-Lake-at-Uber-Using-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/06/16/Apache-Hudi-grows-cloud-data-lake-maturity/index.html b/content/blog/2020/06/16/Apache-Hudi-grows-cloud-data-lake-maturity/index.html index f2977e4ece4cb..d318bb97d3e60 100644 --- a/content/blog/2020/06/16/Apache-Hudi-grows-cloud-data-lake-maturity/index.html +++ b/content/blog/2020/06/16/Apache-Hudi-grows-cloud-data-lake-maturity/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/08/04/PrestoDB-and-Apache-Hudi/index.html b/content/blog/2020/08/04/PrestoDB-and-Apache-Hudi/index.html index c58f2118e5322..66479ccc0bd65 100644 --- a/content/blog/2020/08/04/PrestoDB-and-Apache-Hudi/index.html +++ b/content/blog/2020/08/04/PrestoDB-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/08/18/hudi-incremental-processing-on-data-lakes/index.html b/content/blog/2020/08/18/hudi-incremental-processing-on-data-lakes/index.html index 5d1cf2fa79a4a..615189c8eaa27 100644 --- a/content/blog/2020/08/18/hudi-incremental-processing-on-data-lakes/index.html +++ b/content/blog/2020/08/18/hudi-incremental-processing-on-data-lakes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/08/20/efficient-migration-of-large-parquet-tables/index.html b/content/blog/2020/08/20/efficient-migration-of-large-parquet-tables/index.html index 597979bcbafac..e6c1a2fff2090 100644 --- a/content/blog/2020/08/20/efficient-migration-of-large-parquet-tables/index.html +++ b/content/blog/2020/08/20/efficient-migration-of-large-parquet-tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/08/21/async-compaction-deployment-model/index.html b/content/blog/2020/08/21/async-compaction-deployment-model/index.html index bd467339b944a..747a054220f70 100644 --- a/content/blog/2020/08/21/async-compaction-deployment-model/index.html +++ b/content/blog/2020/08/21/async-compaction-deployment-model/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/08/22/ingest-multiple-tables-using-hudi/index.html b/content/blog/2020/08/22/ingest-multiple-tables-using-hudi/index.html index c030271807256..be7c9da009717 100644 --- a/content/blog/2020/08/22/ingest-multiple-tables-using-hudi/index.html +++ b/content/blog/2020/08/22/ingest-multiple-tables-using-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/10/06/cdc-solution-using-hudi-by-nclouds/index.html b/content/blog/2020/10/06/cdc-solution-using-hudi-by-nclouds/index.html index c98920ca5763a..a0f1b9254137a 100644 --- a/content/blog/2020/10/06/cdc-solution-using-hudi-by-nclouds/index.html +++ b/content/blog/2020/10/06/cdc-solution-using-hudi-by-nclouds/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/10/15/apache-hudi-meets-apache-flink/index.html b/content/blog/2020/10/15/apache-hudi-meets-apache-flink/index.html index d4d32750ec9eb..d30af5afd635e 100644 --- a/content/blog/2020/10/15/apache-hudi-meets-apache-flink/index.html +++ b/content/blog/2020/10/15/apache-hudi-meets-apache-flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/10/19/Origins-of-Data-Lake-at-Grofers/index.html b/content/blog/2020/10/19/Origins-of-Data-Lake-at-Grofers/index.html index abe1b19acedc9..5890372f563a6 100644 --- a/content/blog/2020/10/19/Origins-of-Data-Lake-at-Grofers/index.html +++ b/content/blog/2020/10/19/Origins-of-Data-Lake-at-Grofers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/10/19/hudi-meets-aws-emr-and-aws-dms/index.html b/content/blog/2020/10/19/hudi-meets-aws-emr-and-aws-dms/index.html index c2cf210054412..92baf34afdc8c 100644 --- a/content/blog/2020/10/19/hudi-meets-aws-emr-and-aws-dms/index.html +++ b/content/blog/2020/10/19/hudi-meets-aws-emr-and-aws-dms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/10/21/Architecting-Data-Lakes-for-the-Modern-Enterprise-at-Data-Summit-Connect-Fall-2020/index.html b/content/blog/2020/10/21/Architecting-Data-Lakes-for-the-Modern-Enterprise-at-Data-Summit-Connect-Fall-2020/index.html index 32f827b0ec1a5..7f8675917a714 100644 --- a/content/blog/2020/10/21/Architecting-Data-Lakes-for-the-Modern-Enterprise-at-Data-Summit-Connect-Fall-2020/index.html +++ b/content/blog/2020/10/21/Architecting-Data-Lakes-for-the-Modern-Enterprise-at-Data-Summit-Connect-Fall-2020/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/10/21/Data-Lake-Change-Capture-using-Apache-Hudi-and-Amazon-AMS-EMR/index.html b/content/blog/2020/10/21/Data-Lake-Change-Capture-using-Apache-Hudi-and-Amazon-AMS-EMR/index.html index 417847d8cb193..1781b4383214a 100644 --- a/content/blog/2020/10/21/Data-Lake-Change-Capture-using-Apache-Hudi-and-Amazon-AMS-EMR/index.html +++ b/content/blog/2020/10/21/Data-Lake-Change-Capture-using-Apache-Hudi-and-Amazon-AMS-EMR/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/11/11/hudi-indexing-mechanisms/index.html b/content/blog/2020/11/11/hudi-indexing-mechanisms/index.html index 962feef28dd7a..535ff4e3358bd 100644 --- a/content/blog/2020/11/11/hudi-indexing-mechanisms/index.html +++ b/content/blog/2020/11/11/hudi-indexing-mechanisms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/11/29/Can-Big-Data-Solutions-Be-Affordable/index.html b/content/blog/2020/11/29/Can-Big-Data-Solutions-Be-Affordable/index.html index 5dfd3a2f1fae5..2e95ae4c626b0 100644 --- a/content/blog/2020/11/29/Can-Big-Data-Solutions-Be-Affordable/index.html +++ b/content/blog/2020/11/29/Can-Big-Data-Solutions-Be-Affordable/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2020/12/01/high-perf-data-lake-with-hudi-and-alluxio-t3go/index.html b/content/blog/2020/12/01/high-perf-data-lake-with-hudi-and-alluxio-t3go/index.html index 0d2af074f7d16..b4460f68e82bf 100644 --- a/content/blog/2020/12/01/high-perf-data-lake-with-hudi-and-alluxio-t3go/index.html +++ b/content/blog/2020/12/01/high-perf-data-lake-with-hudi-and-alluxio-t3go/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/01/27/hudi-clustering-intro/index.html b/content/blog/2021/01/27/hudi-clustering-intro/index.html index 085e85d59fbb9..ea24940a52a4f 100644 --- a/content/blog/2021/01/27/hudi-clustering-intro/index.html +++ b/content/blog/2021/01/27/hudi-clustering-intro/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/02/13/hudi-key-generators/index.html b/content/blog/2021/02/13/hudi-key-generators/index.html index da7b98e2cd6bb..bc99d2e026def 100644 --- a/content/blog/2021/02/13/hudi-key-generators/index.html +++ b/content/blog/2021/02/13/hudi-key-generators/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/02/24/Time-travel-operations-in-Hopsworks-Feature-Store/index.html b/content/blog/2021/02/24/Time-travel-operations-in-Hopsworks-Feature-Store/index.html index 0e51e9ff528ef..62952e38cd92d 100644 --- a/content/blog/2021/02/24/Time-travel-operations-in-Hopsworks-Feature-Store/index.html +++ b/content/blog/2021/02/24/Time-travel-operations-in-Hopsworks-Feature-Store/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/03/01/Data-Lakehouse-Building-the-Next-Generation-of-Data-Lakes-using-Apache-Hudi/index.html b/content/blog/2021/03/01/Data-Lakehouse-Building-the-Next-Generation-of-Data-Lakes-using-Apache-Hudi/index.html index f38cacc98afbe..775381754afe7 100644 --- a/content/blog/2021/03/01/Data-Lakehouse-Building-the-Next-Generation-of-Data-Lakes-using-Apache-Hudi/index.html +++ b/content/blog/2021/03/01/Data-Lakehouse-Building-the-Next-Generation-of-Data-Lakes-using-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/03/01/hudi-file-sizing/index.html b/content/blog/2021/03/01/hudi-file-sizing/index.html index f32ccbf399721..1b44b45ba71f5 100644 --- a/content/blog/2021/03/01/hudi-file-sizing/index.html +++ b/content/blog/2021/03/01/hudi-file-sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/03/04/Build-a-data-lake-using-amazon-kinesis-data-stream-for-amazon-dynamodb-and-apache-hudi/index.html b/content/blog/2021/03/04/Build-a-data-lake-using-amazon-kinesis-data-stream-for-amazon-dynamodb-and-apache-hudi/index.html index 9a1f93738c36d..ad33eb31be3aa 100644 --- a/content/blog/2021/03/04/Build-a-data-lake-using-amazon-kinesis-data-stream-for-amazon-dynamodb-and-apache-hudi/index.html +++ b/content/blog/2021/03/04/Build-a-data-lake-using-amazon-kinesis-data-stream-for-amazon-dynamodb-and-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/03/11/New-features-from-Apache-hudi-in-Amazon-EMR/index.html b/content/blog/2021/03/11/New-features-from-Apache-hudi-in-Amazon-EMR/index.html index d45de21a05667..430906ba21ae3 100644 --- a/content/blog/2021/03/11/New-features-from-Apache-hudi-in-Amazon-EMR/index.html +++ b/content/blog/2021/03/11/New-features-from-Apache-hudi-in-Amazon-EMR/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/04/12/Build-Slowly-Changing-Dimensions-Type-2-SCD2-with-Apache-Spark-and-Apache-Hudi-on-Amazon-EMR/index.html b/content/blog/2021/04/12/Build-Slowly-Changing-Dimensions-Type-2-SCD2-with-Apache-Spark-and-Apache-Hudi-on-Amazon-EMR/index.html index da79ce4a0b0d3..691f422f86a4f 100644 --- a/content/blog/2021/04/12/Build-Slowly-Changing-Dimensions-Type-2-SCD2-with-Apache-Spark-and-Apache-Hudi-on-Amazon-EMR/index.html +++ b/content/blog/2021/04/12/Build-Slowly-Changing-Dimensions-Type-2-SCD2-with-Apache-Spark-and-Apache-Hudi-on-Amazon-EMR/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/05/12/Experts-primer-on-Apache-Hudi/index.html b/content/blog/2021/05/12/Experts-primer-on-Apache-Hudi/index.html index 5889bc4129c3a..e5fffd993907e 100644 --- a/content/blog/2021/05/12/Experts-primer-on-Apache-Hudi/index.html +++ b/content/blog/2021/05/12/Experts-primer-on-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/06/04/Apache-Hudi-How-Uber-gets-data-a-ride-to-its-destination/index.html b/content/blog/2021/06/04/Apache-Hudi-How-Uber-gets-data-a-ride-to-its-destination/index.html index bbfc0fca678d4..941a47405dd83 100644 --- a/content/blog/2021/06/04/Apache-Hudi-How-Uber-gets-data-a-ride-to-its-destination/index.html +++ b/content/blog/2021/06/04/Apache-Hudi-How-Uber-gets-data-a-ride-to-its-destination/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/06/10/employing-right-configurations-for-hudi-cleaner/index.html b/content/blog/2021/06/10/employing-right-configurations-for-hudi-cleaner/index.html index 1db9b63fc330a..72c13f627aa1e 100644 --- a/content/blog/2021/06/10/employing-right-configurations-for-hudi-cleaner/index.html +++ b/content/blog/2021/06/10/employing-right-configurations-for-hudi-cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/07/16/Amazon-Athena-expands-Apache-Hudi-support/index.html b/content/blog/2021/07/16/Amazon-Athena-expands-Apache-Hudi-support/index.html index e8e490ded021c..c210db7a0e3fb 100644 --- a/content/blog/2021/07/16/Amazon-Athena-expands-Apache-Hudi-support/index.html +++ b/content/blog/2021/07/16/Amazon-Athena-expands-Apache-Hudi-support/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/07/16/Query-apache-hudi-dataset-in-an-amazon-S3-data-lake-with-amazon-athena-Read-optimized-queries/index.html b/content/blog/2021/07/16/Query-apache-hudi-dataset-in-an-amazon-S3-data-lake-with-amazon-athena-Read-optimized-queries/index.html index 0f3abec81e3a3..36f0500cd3315 100644 --- a/content/blog/2021/07/16/Query-apache-hudi-dataset-in-an-amazon-S3-data-lake-with-amazon-athena-Read-optimized-queries/index.html +++ b/content/blog/2021/07/16/Query-apache-hudi-dataset-in-an-amazon-S3-data-lake-with-amazon-athena-Read-optimized-queries/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/07/21/streaming-data-lake-platform/index.html b/content/blog/2021/07/21/streaming-data-lake-platform/index.html index 8ad7ef01711e0..86c75457becb2 100644 --- a/content/blog/2021/07/21/streaming-data-lake-platform/index.html +++ b/content/blog/2021/07/21/streaming-data-lake-platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/07/26/Baixin-banksreal-time-data-lake-evolution-scheme-based-on-Apache-Hudi/index.html b/content/blog/2021/07/26/Baixin-banksreal-time-data-lake-evolution-scheme-based-on-Apache-Hudi/index.html index e27b15214ac5e..449a88d2cee93 100644 --- a/content/blog/2021/07/26/Baixin-banksreal-time-data-lake-evolution-scheme-based-on-Apache-Hudi/index.html +++ b/content/blog/2021/07/26/Baixin-banksreal-time-data-lake-evolution-scheme-based-on-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/08/03/MLOps-Wars-Versioned-Feature-Data-with-a-Lakehouse/index.html b/content/blog/2021/08/03/MLOps-Wars-Versioned-Feature-Data-with-a-Lakehouse/index.html index f28887c2ee16f..6ca8551365546 100644 --- a/content/blog/2021/08/03/MLOps-Wars-Versioned-Feature-Data-with-a-Lakehouse/index.html +++ b/content/blog/2021/08/03/MLOps-Wars-Versioned-Feature-Data-with-a-Lakehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/08/11/Cost-Efficient-Open-Source-Big-Data-Platform-at-Uber/index.html b/content/blog/2021/08/11/Cost-Efficient-Open-Source-Big-Data-Platform-at-Uber/index.html index a4ebff8bd419e..8ec6869fd9dd7 100644 --- a/content/blog/2021/08/11/Cost-Efficient-Open-Source-Big-Data-Platform-at-Uber/index.html +++ b/content/blog/2021/08/11/Cost-Efficient-Open-Source-Big-Data-Platform-at-Uber/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/08/16/kafka-custom-deserializer/index.html b/content/blog/2021/08/16/kafka-custom-deserializer/index.html index b3f1e08366a5b..70f45f6fdafdb 100644 --- a/content/blog/2021/08/16/kafka-custom-deserializer/index.html +++ b/content/blog/2021/08/16/kafka-custom-deserializer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/08/18/improving-marker-mechanism/index.html b/content/blog/2021/08/18/improving-marker-mechanism/index.html index 027bc197dc840..9620a16f772a4 100644 --- a/content/blog/2021/08/18/improving-marker-mechanism/index.html +++ b/content/blog/2021/08/18/improving-marker-mechanism/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/08/18/virtual-keys/index.html b/content/blog/2021/08/18/virtual-keys/index.html index 96f8c33ddecb2..b5740912561fd 100644 --- a/content/blog/2021/08/18/virtual-keys/index.html +++ b/content/blog/2021/08/18/virtual-keys/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/08/23/async-clustering/index.html b/content/blog/2021/08/23/async-clustering/index.html index 38bdab5ea10a0..fdeeb17f80535 100644 --- a/content/blog/2021/08/23/async-clustering/index.html +++ b/content/blog/2021/08/23/async-clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/08/23/s3-events-source/index.html b/content/blog/2021/08/23/s3-events-source/index.html index 5500ac0f5820b..8ac5bf26abe68 100644 --- a/content/blog/2021/08/23/s3-events-source/index.html +++ b/content/blog/2021/08/23/s3-events-source/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/09/01/building-eb-level-data-lake-using-hudi-at-bytedance/index.html b/content/blog/2021/09/01/building-eb-level-data-lake-using-hudi-at-bytedance/index.html index 5029545cd0722..69d03f42ea6ba 100644 --- a/content/blog/2021/09/01/building-eb-level-data-lake-using-hudi-at-bytedance/index.html +++ b/content/blog/2021/09/01/building-eb-level-data-lake-using-hudi-at-bytedance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/10/05/Data-Platform-2.0-Part-I/index.html b/content/blog/2021/10/05/Data-Platform-2.0-Part-I/index.html index 5af4344f8d79f..ba16ae12d69c6 100644 --- a/content/blog/2021/10/05/Data-Platform-2.0-Part-I/index.html +++ b/content/blog/2021/10/05/Data-Platform-2.0-Part-I/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/10/14/How-Amazon-Transportation-Service-enabled-near-real-time-event-analytics-at-petabyte-scale-using-AWS-Glue-with-Apache-Hudi/index.html b/content/blog/2021/10/14/How-Amazon-Transportation-Service-enabled-near-real-time-event-analytics-at-petabyte-scale-using-AWS-Glue-with-Apache-Hudi/index.html index ec81844831413..b2d6dbbe74382 100644 --- a/content/blog/2021/10/14/How-Amazon-Transportation-Service-enabled-near-real-time-event-analytics-at-petabyte-scale-using-AWS-Glue-with-Apache-Hudi/index.html +++ b/content/blog/2021/10/14/How-Amazon-Transportation-Service-enabled-near-real-time-event-analytics-at-petabyte-scale-using-AWS-Glue-with-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/10/21/Practice-of-Apache-Hudi-in-building-real-time-data-lake-at-station-B/index.html b/content/blog/2021/10/21/Practice-of-Apache-Hudi-in-building-real-time-data-lake-at-station-B/index.html index e409c957d928a..f81a2b9ed98db 100644 --- a/content/blog/2021/10/21/Practice-of-Apache-Hudi-in-building-real-time-data-lake-at-station-B/index.html +++ b/content/blog/2021/10/21/Practice-of-Apache-Hudi-in-building-real-time-data-lake-at-station-B/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/11/16/How-GE-Aviation-built-cloud-native-data-pipelines-at-enterprise-scale-using-the-AWS-platform/index.html b/content/blog/2021/11/16/How-GE-Aviation-built-cloud-native-data-pipelines-at-enterprise-scale-using-the-AWS-platform/index.html index 0325c1b3289a7..0b3b2197e3fe2 100644 --- a/content/blog/2021/11/16/How-GE-Aviation-built-cloud-native-data-pipelines-at-enterprise-scale-using-the-AWS-platform/index.html +++ b/content/blog/2021/11/16/How-GE-Aviation-built-cloud-native-data-pipelines-at-enterprise-scale-using-the-AWS-platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/11/22/Apache-Hudi-Architecture-Tools-and-Best-Practices/index.html b/content/blog/2021/11/22/Apache-Hudi-Architecture-Tools-and-Best-Practices/index.html index 752977c2866a4..9b57c1a90519a 100644 --- a/content/blog/2021/11/22/Apache-Hudi-Architecture-Tools-and-Best-Practices/index.html +++ b/content/blog/2021/11/22/Apache-Hudi-Architecture-Tools-and-Best-Practices/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/12/16/lakehouse-concurrency-control-are-we-too-optimistic/index.html b/content/blog/2021/12/16/lakehouse-concurrency-control-are-we-too-optimistic/index.html index 9f498a13f1101..fd8b37775ef89 100644 --- a/content/blog/2021/12/16/lakehouse-concurrency-control-are-we-too-optimistic/index.html +++ b/content/blog/2021/12/16/lakehouse-concurrency-control-are-we-too-optimistic/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/12/20/New-features-from-Apache-Hudi-0.7.0-and-0.8.0-available-on-Amazon-EMR/index.html b/content/blog/2021/12/20/New-features-from-Apache-Hudi-0.7.0-and-0.8.0-available-on-Amazon-EMR/index.html index bfcf560a18e4d..48c01f5da99b2 100644 --- a/content/blog/2021/12/20/New-features-from-Apache-Hudi-0.7.0-and-0.8.0-available-on-Amazon-EMR/index.html +++ b/content/blog/2021/12/20/New-features-from-Apache-Hudi-0.7.0-and-0.8.0-available-on-Amazon-EMR/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/12/29/hudi-zorder-and-hilbert-space-filling-curves/index.html b/content/blog/2021/12/29/hudi-zorder-and-hilbert-space-filling-curves/index.html index ccdf529bb1277..d34ac7ee7655e 100644 --- a/content/blog/2021/12/29/hudi-zorder-and-hilbert-space-filling-curves/index.html +++ b/content/blog/2021/12/29/hudi-zorder-and-hilbert-space-filling-curves/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2021/12/31/The-Art-of-Building-Open-Data-Lakes-with-Apache-Hudi-Kafka-Hive-and-Debezium/index.html b/content/blog/2021/12/31/The-Art-of-Building-Open-Data-Lakes-with-Apache-Hudi-Kafka-Hive-and-Debezium/index.html index 2f5e3d60ea9b0..1a5b5083f9d3a 100644 --- a/content/blog/2021/12/31/The-Art-of-Building-Open-Data-Lakes-with-Apache-Hudi-Kafka-Hive-and-Debezium/index.html +++ b/content/blog/2021/12/31/The-Art-of-Building-Open-Data-Lakes-with-Apache-Hudi-Kafka-Hive-and-Debezium/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/01/06/apache-hudi-2021-a-year-in-review/index.html b/content/blog/2022/01/06/apache-hudi-2021-a-year-in-review/index.html index a457fdd67f43f..a4372eeac2596 100644 --- a/content/blog/2022/01/06/apache-hudi-2021-a-year-in-review/index.html +++ b/content/blog/2022/01/06/apache-hudi-2021-a-year-in-review/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/01/14/change-data-capture-with-debezium-and-apache-hudi/index.html b/content/blog/2022/01/14/change-data-capture-with-debezium-and-apache-hudi/index.html index 20f9b771aecbf..0e2fc598adf21 100644 --- a/content/blog/2022/01/14/change-data-capture-with-debezium-and-apache-hudi/index.html +++ b/content/blog/2022/01/14/change-data-capture-with-debezium-and-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/01/18/Why-and-How-I-Integrated-Airbyte-and-Apache-Hudi/index.html b/content/blog/2022/01/18/Why-and-How-I-Integrated-Airbyte-and-Apache-Hudi/index.html index a1bf93ff997ae..ca2195540317a 100644 --- a/content/blog/2022/01/18/Why-and-How-I-Integrated-Airbyte-and-Apache-Hudi/index.html +++ b/content/blog/2022/01/18/Why-and-How-I-Integrated-Airbyte-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/01/20/Hudi-powering-data-lake-efforts-at-Walmart-and-Disney-Hotstar/index.html b/content/blog/2022/01/20/Hudi-powering-data-lake-efforts-at-Walmart-and-Disney-Hotstar/index.html index 4bde4d898db62..e241457985382 100644 --- a/content/blog/2022/01/20/Hudi-powering-data-lake-efforts-at-Walmart-and-Disney-Hotstar/index.html +++ b/content/blog/2022/01/20/Hudi-powering-data-lake-efforts-at-Walmart-and-Disney-Hotstar/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/01/25/Cost-Efficiency-Scale-in-Big-Data-File-Format/index.html b/content/blog/2022/01/25/Cost-Efficiency-Scale-in-Big-Data-File-Format/index.html index 9fd34f81eec22..574a3ef836201 100644 --- a/content/blog/2022/01/25/Cost-Efficiency-Scale-in-Big-Data-File-Format/index.html +++ b/content/blog/2022/01/25/Cost-Efficiency-Scale-in-Big-Data-File-Format/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/02/02/Onehouse-Commitment-to-Openness/index.html b/content/blog/2022/02/02/Onehouse-Commitment-to-Openness/index.html index 7e28255a2abcc..41aa60ae24052 100644 --- a/content/blog/2022/02/02/Onehouse-Commitment-to-Openness/index.html +++ b/content/blog/2022/02/02/Onehouse-Commitment-to-Openness/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/02/03/Onehouse-brings-a-fully-managed-lakehouse-to-Apache-Hudi/index.html b/content/blog/2022/02/03/Onehouse-brings-a-fully-managed-lakehouse-to-Apache-Hudi/index.html index df9fb4f5214b5..4ee9936ceb382 100644 --- a/content/blog/2022/02/03/Onehouse-brings-a-fully-managed-lakehouse-to-Apache-Hudi/index.html +++ b/content/blog/2022/02/03/Onehouse-brings-a-fully-managed-lakehouse-to-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/02/09/ACID-transformations-on-Distributed-file-system/index.html b/content/blog/2022/02/09/ACID-transformations-on-Distributed-file-system/index.html index 9a52e91c14dd1..f420fba02d0c9 100644 --- a/content/blog/2022/02/09/ACID-transformations-on-Distributed-file-system/index.html +++ b/content/blog/2022/02/09/ACID-transformations-on-Distributed-file-system/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/02/12/Open-Source-Data-Lake-Table-Formats-Evaluating-Current-Interest-and-Rate-of-Adoption/index.html b/content/blog/2022/02/12/Open-Source-Data-Lake-Table-Formats-Evaluating-Current-Interest-and-Rate-of-Adoption/index.html index d6dda91e7d0bc..7b7d4a3756902 100644 --- a/content/blog/2022/02/12/Open-Source-Data-Lake-Table-Formats-Evaluating-Current-Interest-and-Rate-of-Adoption/index.html +++ b/content/blog/2022/02/12/Open-Source-Data-Lake-Table-Formats-Evaluating-Current-Interest-and-Rate-of-Adoption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/02/17/Fresher-Data-Lake-on-AWS-S3/index.html b/content/blog/2022/02/17/Fresher-Data-Lake-on-AWS-S3/index.html index 0bf9860b6d568..757c5cc3b752e 100644 --- a/content/blog/2022/02/17/Fresher-Data-Lake-on-AWS-S3/index.html +++ b/content/blog/2022/02/17/Fresher-Data-Lake-on-AWS-S3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/02/20/Understanding-its-core-concepts-from-hudi-persistence-files/index.html b/content/blog/2022/02/20/Understanding-its-core-concepts-from-hudi-persistence-files/index.html index d647de27da23c..1e3aaf3f8febe 100644 --- a/content/blog/2022/02/20/Understanding-its-core-concepts-from-hudi-persistence-files/index.html +++ b/content/blog/2022/02/20/Understanding-its-core-concepts-from-hudi-persistence-files/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/03/01/Create-a-low-latency-source-to-data-lake-pipeline-using-Amazon-MSK-Connect-Apache-Flink-and-Apache-Hudi/index.html b/content/blog/2022/03/01/Create-a-low-latency-source-to-data-lake-pipeline-using-Amazon-MSK-Connect-Apache-Flink-and-Apache-Hudi/index.html index 24ca0dd789171..326e4def20f01 100644 --- a/content/blog/2022/03/01/Create-a-low-latency-source-to-data-lake-pipeline-using-Amazon-MSK-Connect-Apache-Flink-and-Apache-Hudi/index.html +++ b/content/blog/2022/03/01/Create-a-low-latency-source-to-data-lake-pipeline-using-Amazon-MSK-Connect-Apache-Flink-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/03/09/Build-a-serverless-pipeline-to-analyze-streaming-data-using-AWS-Glue-Apache-Hudi-and-Amazon-S3/index.html b/content/blog/2022/03/09/Build-a-serverless-pipeline-to-analyze-streaming-data-using-AWS-Glue-Apache-Hudi-and-Amazon-S3/index.html index db92068f0b8e0..526be0037135a 100644 --- a/content/blog/2022/03/09/Build-a-serverless-pipeline-to-analyze-streaming-data-using-AWS-Glue-Apache-Hudi-and-Amazon-S3/index.html +++ b/content/blog/2022/03/09/Build-a-serverless-pipeline-to-analyze-streaming-data-using-AWS-Glue-Apache-Hudi-and-Amazon-S3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/03/24/Zendesk-Insights-for-CTOs-Part-3-Growing-your-business-with-modern-data-capabilities/index.html b/content/blog/2022/03/24/Zendesk-Insights-for-CTOs-Part-3-Growing-your-business-with-modern-data-capabilities/index.html index a878ed4daf13d..6abeb85aa2d31 100644 --- a/content/blog/2022/03/24/Zendesk-Insights-for-CTOs-Part-3-Growing-your-business-with-modern-data-capabilities/index.html +++ b/content/blog/2022/03/24/Zendesk-Insights-for-CTOs-Part-3-Growing-your-business-with-modern-data-capabilities/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/04/04/Key-Learnings-on-Using-Apache-HUDI-in-building-Lakehouse-Architecture-at-Halodoc/index.html b/content/blog/2022/04/04/Key-Learnings-on-Using-Apache-HUDI-in-building-Lakehouse-Architecture-at-Halodoc/index.html index a646d43539df7..5b4b3ae71b622 100644 --- a/content/blog/2022/04/04/Key-Learnings-on-Using-Apache-HUDI-in-building-Lakehouse-Architecture-at-Halodoc/index.html +++ b/content/blog/2022/04/04/Key-Learnings-on-Using-Apache-HUDI-in-building-Lakehouse-Architecture-at-Halodoc/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/04/04/New-features-from-Apache-Hudi-0.9.0-on-Amazon-EMR/index.html b/content/blog/2022/04/04/New-features-from-Apache-Hudi-0.9.0-on-Amazon-EMR/index.html index a82a48170fed6..0291b5e0fa5d5 100644 --- a/content/blog/2022/04/04/New-features-from-Apache-Hudi-0.9.0-on-Amazon-EMR/index.html +++ b/content/blog/2022/04/04/New-features-from-Apache-Hudi-0.9.0-on-Amazon-EMR/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/04/19/Corrections-in-data-lakehouse-table-format-comparisons/index.html b/content/blog/2022/04/19/Corrections-in-data-lakehouse-table-format-comparisons/index.html index 739432e48a9cb..b025d997d727c 100644 --- a/content/blog/2022/04/19/Corrections-in-data-lakehouse-table-format-comparisons/index.html +++ b/content/blog/2022/04/19/Corrections-in-data-lakehouse-table-format-comparisons/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/05/17/Introducing-Multi-Modal-Index-for-the-Lakehouse-in-Apache-Hudi/index.html b/content/blog/2022/05/17/Introducing-Multi-Modal-Index-for-the-Lakehouse-in-Apache-Hudi/index.html index 6eb3740cd54f7..d7e5220c30347 100644 --- a/content/blog/2022/05/17/Introducing-Multi-Modal-Index-for-the-Lakehouse-in-Apache-Hudi/index.html +++ b/content/blog/2022/05/17/Introducing-Multi-Modal-Index-for-the-Lakehouse-in-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/05/25/Record-by-record-deletable-data-lake-using-Apache-Hudi/index.html b/content/blog/2022/05/25/Record-by-record-deletable-data-lake-using-Apache-Hudi/index.html index 30a27f81a490d..b748c938c2987 100644 --- a/content/blog/2022/05/25/Record-by-record-deletable-data-lake-using-Apache-Hudi/index.html +++ b/content/blog/2022/05/25/Record-by-record-deletable-data-lake-using-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/06/04/Asynchronous-Indexing-Using-Hudi/index.html b/content/blog/2022/06/04/Asynchronous-Indexing-Using-Hudi/index.html index 4e993c9aca53c..93c2a7c337e60 100644 --- a/content/blog/2022/06/04/Asynchronous-Indexing-Using-Hudi/index.html +++ b/content/blog/2022/06/04/Asynchronous-Indexing-Using-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/06/09/Singificant-queries-speedup-from-Hudi-Column-Stats-Index-and-Data-Skipping-features/index.html b/content/blog/2022/06/09/Singificant-queries-speedup-from-Hudi-Column-Stats-Index-and-Data-Skipping-features/index.html index 6af1e40bc80c6..350b304551967 100644 --- a/content/blog/2022/06/09/Singificant-queries-speedup-from-Hudi-Column-Stats-Index-and-Data-Skipping-features/index.html +++ b/content/blog/2022/06/09/Singificant-queries-speedup-from-Hudi-Column-Stats-Index-and-Data-Skipping-features/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/06/29/Apache-Hudi-vs-Delta-Lake-transparent-tpc-ds-lakehouse-performance-benchmarks/index.html b/content/blog/2022/06/29/Apache-Hudi-vs-Delta-Lake-transparent-tpc-ds-lakehouse-performance-benchmarks/index.html index d57df77c4ed04..0bf7515240ed8 100644 --- a/content/blog/2022/06/29/Apache-Hudi-vs-Delta-Lake-transparent-tpc-ds-lakehouse-performance-benchmarks/index.html +++ b/content/blog/2022/06/29/Apache-Hudi-vs-Delta-Lake-transparent-tpc-ds-lakehouse-performance-benchmarks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/07/11/build-open-lakehouse-using-apache-hudi-and-dbt/index.html b/content/blog/2022/07/11/build-open-lakehouse-using-apache-hudi-and-dbt/index.html index e008bafd84dc6..bee0af3cf6542 100644 --- a/content/blog/2022/07/11/build-open-lakehouse-using-apache-hudi-and-dbt/index.html +++ b/content/blog/2022/07/11/build-open-lakehouse-using-apache-hudi-and-dbt/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/08/09/How-NerdWallet-uses-AWS-and-Apache-Hudi-to-build-a-serverless-real-time-analytics-platform/index.html b/content/blog/2022/08/09/How-NerdWallet-uses-AWS-and-Apache-Hudi-to-build-a-serverless-real-time-analytics-platform/index.html index 4246efdb74426..d2a7b0ad62683 100644 --- a/content/blog/2022/08/09/How-NerdWallet-uses-AWS-and-Apache-Hudi-to-build-a-serverless-real-time-analytics-platform/index.html +++ b/content/blog/2022/08/09/How-NerdWallet-uses-AWS-and-Apache-Hudi-to-build-a-serverless-real-time-analytics-platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/08/12/Use-Flink-Hudi-to-Build-a-Streaming-Data-Lake-Platform/index.html b/content/blog/2022/08/12/Use-Flink-Hudi-to-Build-a-Streaming-Data-Lake-Platform/index.html index ea880d7c3c752..112ba8969ebc8 100644 --- a/content/blog/2022/08/12/Use-Flink-Hudi-to-Build-a-Streaming-Data-Lake-Platform/index.html +++ b/content/blog/2022/08/12/Use-Flink-Hudi-to-Build-a-Streaming-Data-Lake-Platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/08/24/Implementation-of-SCD-2-with-Apache-Hudi-and-Spark/index.html b/content/blog/2022/08/24/Implementation-of-SCD-2-with-Apache-Hudi-and-Spark/index.html index cc52555281cb0..5001ffafd9f0a 100644 --- a/content/blog/2022/08/24/Implementation-of-SCD-2-with-Apache-Hudi-and-Spark/index.html +++ b/content/blog/2022/08/24/Implementation-of-SCD-2-with-Apache-Hudi-and-Spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/08/25/Data-Lake-Lakehouse-Guide-Powered-by-Data-Lake-Table-Formats-Delta-Lake-Iceberg-Hudi/index.html b/content/blog/2022/08/25/Data-Lake-Lakehouse-Guide-Powered-by-Data-Lake-Table-Formats-Delta-Lake-Iceberg-Hudi/index.html index 1a54ebb567402..b0c26c9b7c78c 100644 --- a/content/blog/2022/08/25/Data-Lake-Lakehouse-Guide-Powered-by-Data-Lake-Table-Formats-Delta-Lake-Iceberg-Hudi/index.html +++ b/content/blog/2022/08/25/Data-Lake-Lakehouse-Guide-Powered-by-Data-Lake-Table-Formats-Delta-Lake-Iceberg-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/09/20/Building-Streaming-Data-Lakes-with-Hudi-and-MinIO/index.html b/content/blog/2022/09/20/Building-Streaming-Data-Lakes-with-Hudi-and-MinIO/index.html index 66ed406294636..2be210bf554d5 100644 --- a/content/blog/2022/09/20/Building-Streaming-Data-Lakes-with-Hudi-and-MinIO/index.html +++ b/content/blog/2022/09/20/Building-Streaming-Data-Lakes-with-Hudi-and-MinIO/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/09/28/Data-processing-with-Spark-time-traveling/index.html b/content/blog/2022/09/28/Data-processing-with-Spark-time-traveling/index.html index ed1d007b14048..88a8a49f60fa8 100644 --- a/content/blog/2022/09/28/Data-processing-with-Spark-time-traveling/index.html +++ b/content/blog/2022/09/28/Data-processing-with-Spark-time-traveling/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/10/06/Ingest-streaming-data-to-Apache-Hudi-using-AWS-Glue-and-DeltaStreamer/index.html b/content/blog/2022/10/06/Ingest-streaming-data-to-Apache-Hudi-using-AWS-Glue-and-DeltaStreamer/index.html index 1af5bd540f649..dc59ac6b3b60f 100644 --- a/content/blog/2022/10/06/Ingest-streaming-data-to-Apache-Hudi-using-AWS-Glue-and-DeltaStreamer/index.html +++ b/content/blog/2022/10/06/Ingest-streaming-data-to-Apache-Hudi-using-AWS-Glue-and-DeltaStreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/10/08/what-why-and-how-apache-hudis-bloom-index/index.html b/content/blog/2022/10/08/what-why-and-how-apache-hudis-bloom-index/index.html index dc5a0366e7793..ea13e7a499c17 100644 --- a/content/blog/2022/10/08/what-why-and-how-apache-hudis-bloom-index/index.html +++ b/content/blog/2022/10/08/what-why-and-how-apache-hudis-bloom-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/10/17/Get-started-with-Apache-Hudi-using-AWS/index.html b/content/blog/2022/10/17/Get-started-with-Apache-Hudi-using-AWS/index.html index 174dee12597b5..e658c7ee6e724 100644 --- a/content/blog/2022/10/17/Get-started-with-Apache-Hudi-using-AWS/index.html +++ b/content/blog/2022/10/17/Get-started-with-Apache-Hudi-using-AWS/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/11/10/How-Hudl-built-a-cost-optimized-AWS-Glue-pipeline-with-Apache-Hudi-datasets/index.html b/content/blog/2022/11/10/How-Hudl-built-a-cost-optimized-AWS-Glue-pipeline-with-Apache-Hudi-datasets/index.html index 3abeedb19a230..21b3fa136a977 100644 --- a/content/blog/2022/11/10/How-Hudl-built-a-cost-optimized-AWS-Glue-pipeline-with-Apache-Hudi-datasets/index.html +++ b/content/blog/2022/11/10/How-Hudl-built-a-cost-optimized-AWS-Glue-pipeline-with-Apache-Hudi-datasets/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/11/22/Build-your-Apache-Hudi-data-lake-on-AWS-using-Amazon-EMR-Part-1/index.html b/content/blog/2022/11/22/Build-your-Apache-Hudi-data-lake-on-AWS-using-Amazon-EMR-Part-1/index.html index a0d9e970574a3..13594b43df529 100644 --- a/content/blog/2022/11/22/Build-your-Apache-Hudi-data-lake-on-AWS-using-Amazon-EMR-Part-1/index.html +++ b/content/blog/2022/11/22/Build-your-Apache-Hudi-data-lake-on-AWS-using-Amazon-EMR-Part-1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/12/01/Run-apache-hudi-at-scale-on-aws/index.html b/content/blog/2022/12/01/Run-apache-hudi-at-scale-on-aws/index.html index a1beacc1185f5..64fdf25ea2780 100644 --- a/content/blog/2022/12/01/Run-apache-hudi-at-scale-on-aws/index.html +++ b/content/blog/2022/12/01/Run-apache-hudi-at-scale-on-aws/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/12/19/Build-Your-First-Hudi-Lakehouse-with-AWS-Glue-and-AWS-S3/index.html b/content/blog/2022/12/19/Build-Your-First-Hudi-Lakehouse-with-AWS-Glue-and-AWS-S3/index.html index 9b1c32f4e5de9..c8d1734fdd588 100644 --- a/content/blog/2022/12/19/Build-Your-First-Hudi-Lakehouse-with-AWS-Glue-and-AWS-S3/index.html +++ b/content/blog/2022/12/19/Build-Your-First-Hudi-Lakehouse-with-AWS-Glue-and-AWS-S3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2022/12/29/Apache-Hudi-2022-A-Year-In-Review/index.html b/content/blog/2022/12/29/Apache-Hudi-2022-A-Year-In-Review/index.html index 7c3bfe10812b4..0bf10a4d58ac3 100644 --- a/content/blog/2022/12/29/Apache-Hudi-2022-A-Year-In-Review/index.html +++ b/content/blog/2022/12/29/Apache-Hudi-2022-A-Year-In-Review/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/01/11/Apache-Hudi-vs-Delta-Lake-vs-Apache-Iceberg-Lakehouse-Feature-Comparison/index.html b/content/blog/2023/01/11/Apache-Hudi-vs-Delta-Lake-vs-Apache-Iceberg-Lakehouse-Feature-Comparison/index.html index a09945ab2052d..1027eef632830 100644 --- a/content/blog/2023/01/11/Apache-Hudi-vs-Delta-Lake-vs-Apache-Iceberg-Lakehouse-Feature-Comparison/index.html +++ b/content/blog/2023/01/11/Apache-Hudi-vs-Delta-Lake-vs-Apache-Iceberg-Lakehouse-Feature-Comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/01/27/Introducing-native-support-for-Apache-Hudi-Delta-Lake-Apache-Iceberg-on-AWS-Glue-for-Apache-Spark/index.html b/content/blog/2023/01/27/Introducing-native-support-for-Apache-Hudi-Delta-Lake-Apache-Iceberg-on-AWS-Glue-for-Apache-Spark/index.html index cda73ee04a284..296569893d60a 100644 --- a/content/blog/2023/01/27/Introducing-native-support-for-Apache-Hudi-Delta-Lake-Apache-Iceberg-on-AWS-Glue-for-Apache-Spark/index.html +++ b/content/blog/2023/01/27/Introducing-native-support-for-Apache-Hudi-Delta-Lake-Apache-Iceberg-on-AWS-Glue-for-Apache-Spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/02/07/automate-schema-evolution-at-scale-with-apache-hudi-in-aws-glue/index.html b/content/blog/2023/02/07/automate-schema-evolution-at-scale-with-apache-hudi-in-aws-glue/index.html index e3d0ee9539a78..e0d5dbcee7ba4 100644 --- a/content/blog/2023/02/07/automate-schema-evolution-at-scale-with-apache-hudi-in-aws-glue/index.html +++ b/content/blog/2023/02/07/automate-schema-evolution-at-scale-with-apache-hudi-in-aws-glue/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/02/12/table-service-deployment-models-in-apache-hudi/index.html b/content/blog/2023/02/12/table-service-deployment-models-in-apache-hudi/index.html index b1436e8ec54bd..4ef6c357f312a 100644 --- a/content/blog/2023/02/12/table-service-deployment-models-in-apache-hudi/index.html +++ b/content/blog/2023/02/12/table-service-deployment-models-in-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/02/19/bulk-insert-sort-modes-with-apache-hudi/index.html b/content/blog/2023/02/19/bulk-insert-sort-modes-with-apache-hudi/index.html index a93a97bc6d767..6b0c2dfa6b955 100644 --- a/content/blog/2023/02/19/bulk-insert-sort-modes-with-apache-hudi/index.html +++ b/content/blog/2023/02/19/bulk-insert-sort-modes-with-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/02/22/Getting-Started-Manage-your-Hudi-tables-with-the-admin-Hudi-CLI-tool/index.html b/content/blog/2023/02/22/Getting-Started-Manage-your-Hudi-tables-with-the-admin-Hudi-CLI-tool/index.html index 3c47149435e61..7be56269a9590 100644 --- a/content/blog/2023/02/22/Getting-Started-Manage-your-Hudi-tables-with-the-admin-Hudi-CLI-tool/index.html +++ b/content/blog/2023/02/22/Getting-Started-Manage-your-Hudi-tables-with-the-admin-Hudi-CLI-tool/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/03/16/Setting-Uber-Transactional-Data-Lake-in-Motion-with-Incremental-ETL-Using-Apache-Hudi/index.html b/content/blog/2023/03/16/Setting-Uber-Transactional-Data-Lake-in-Motion-with-Incremental-ETL-Using-Apache-Hudi/index.html index b097d50a8d174..7e6547008c097 100644 --- a/content/blog/2023/03/16/Setting-Uber-Transactional-Data-Lake-in-Motion-with-Incremental-ETL-Using-Apache-Hudi/index.html +++ b/content/blog/2023/03/16/Setting-Uber-Transactional-Data-Lake-in-Motion-with-Incremental-ETL-Using-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/03/17/introduction-to-apache-hudi/index.html b/content/blog/2023/03/17/introduction-to-apache-hudi/index.html index e1eef610201fc..819549bb91d20 100644 --- a/content/blog/2023/03/17/introduction-to-apache-hudi/index.html +++ b/content/blog/2023/03/17/introduction-to-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/03/20/Introducing-native-support-for-Apache Hudi-Delta-Lake-and-Apache-Iceberg-on-AWS-Glue-for-Apache-Spark-Part-2-AWS-Glue-Studio-Visual-Editor/index.html b/content/blog/2023/03/20/Introducing-native-support-for-Apache Hudi-Delta-Lake-and-Apache-Iceberg-on-AWS-Glue-for-Apache-Spark-Part-2-AWS-Glue-Studio-Visual-Editor/index.html index ec448f0489651..a4e3866954f33 100644 --- a/content/blog/2023/03/20/Introducing-native-support-for-Apache Hudi-Delta-Lake-and-Apache-Iceberg-on-AWS-Glue-for-Apache-Spark-Part-2-AWS-Glue-Studio-Visual-Editor/index.html +++ b/content/blog/2023/03/20/Introducing-native-support-for-Apache Hudi-Delta-Lake-and-Apache-Iceberg-on-AWS-Glue-for-Apache-Spark-Part-2-AWS-Glue-Studio-Visual-Editor/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/03/23/Spark-ETL-Chapter-8-with-Lakehouse-Apache-HUDI/index.html b/content/blog/2023/03/23/Spark-ETL-Chapter-8-with-Lakehouse-Apache-HUDI/index.html index c5fc45fbe7d0f..835e3e3b52129 100644 --- a/content/blog/2023/03/23/Spark-ETL-Chapter-8-with-Lakehouse-Apache-HUDI/index.html +++ b/content/blog/2023/03/23/Spark-ETL-Chapter-8-with-Lakehouse-Apache-HUDI/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/04/02/global-vs-non-global-index-in-apache-hudi/index.html b/content/blog/2023/04/02/global-vs-non-global-index-in-apache-hudi/index.html index d87d63322d21d..cd8baee54e964 100644 --- a/content/blog/2023/04/02/global-vs-non-global-index-in-apache-hudi/index.html +++ b/content/blog/2023/04/02/global-vs-non-global-index-in-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/04/07/Speed-up-your-write-latencies-using-Bucket-Index-in-Apache-Hudi/index.html b/content/blog/2023/04/07/Speed-up-your-write-latencies-using-Bucket-Index-in-Apache-Hudi/index.html index 8c9ce75a1af99..2f4b9c1a09098 100644 --- a/content/blog/2023/04/07/Speed-up-your-write-latencies-using-Bucket-Index-in-Apache-Hudi/index.html +++ b/content/blog/2023/04/07/Speed-up-your-write-latencies-using-Bucket-Index-in-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/04/18/getting-started-incrementally-process-data-with-apache-hudi/index.html b/content/blog/2023/04/18/getting-started-incrementally-process-data-with-apache-hudi/index.html index 58d220f3f4434..92e7bb672d901 100644 --- a/content/blog/2023/04/18/getting-started-incrementally-process-data-with-apache-hudi/index.html +++ b/content/blog/2023/04/18/getting-started-incrementally-process-data-with-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/04/26/the-lakehouse-trifecta/index.html b/content/blog/2023/04/26/the-lakehouse-trifecta/index.html index 90534fd37cc6f..5a8269ddb7eff 100644 --- a/content/blog/2023/04/26/the-lakehouse-trifecta/index.html +++ b/content/blog/2023/04/26/the-lakehouse-trifecta/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/04/29/can-you-concurrently-write-data-to-apache-hudi-w-o-any-lock-provider/index.html b/content/blog/2023/04/29/can-you-concurrently-write-data-to-apache-hudi-w-o-any-lock-provider/index.html index d9d5af13ae8f3..72438252102d5 100644 --- a/content/blog/2023/04/29/can-you-concurrently-write-data-to-apache-hudi-w-o-any-lock-provider/index.html +++ b/content/blog/2023/04/29/can-you-concurrently-write-data-to-apache-hudi-w-o-any-lock-provider/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/05/02/intro-to-hudi-and-flink/index.html b/content/blog/2023/05/02/intro-to-hudi-and-flink/index.html index d8b1650af1a19..00241c6731321 100644 --- a/content/blog/2023/05/02/intro-to-hudi-and-flink/index.html +++ b/content/blog/2023/05/02/intro-to-hudi-and-flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/05/03/lakehouse-at-fortune-1-scale/index.html b/content/blog/2023/05/03/lakehouse-at-fortune-1-scale/index.html index 1d9bfefb95bed..9af6a06d0c88f 100644 --- a/content/blog/2023/05/03/lakehouse-at-fortune-1-scale/index.html +++ b/content/blog/2023/05/03/lakehouse-at-fortune-1-scale/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/05/09/amazon-athena-apache-hudi/index.html b/content/blog/2023/05/09/amazon-athena-apache-hudi/index.html index 222f38eed3101..641efb3d91296 100644 --- a/content/blog/2023/05/09/amazon-athena-apache-hudi/index.html +++ b/content/blog/2023/05/09/amazon-athena-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/05/10/top-3-things-you-can-do-to-get-fast-upsert-performance-in-apache-hudi/index.html b/content/blog/2023/05/10/top-3-things-you-can-do-to-get-fast-upsert-performance-in-apache-hudi/index.html index 07da68a3535c8..9a4b7d1962fdd 100644 --- a/content/blog/2023/05/10/top-3-things-you-can-do-to-get-fast-upsert-performance-in-apache-hudi/index.html +++ b/content/blog/2023/05/10/top-3-things-you-can-do-to-get-fast-upsert-performance-in-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/05/12/ingesting-data-to-apache-hudi-using-spark-sql/index.html b/content/blog/2023/05/12/ingesting-data-to-apache-hudi-using-spark-sql/index.html index caf96fe5b78b2..241a231f2e824 100644 --- a/content/blog/2023/05/12/ingesting-data-to-apache-hudi-using-spark-sql/index.html +++ b/content/blog/2023/05/12/ingesting-data-to-apache-hudi-using-spark-sql/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/05/16/how-zoom-implemented-streaming-log-ingestion-and-efficient-gdpr-deletes-using-apache-hudi-on-amazon-emr/index.html b/content/blog/2023/05/16/how-zoom-implemented-streaming-log-ingestion-and-efficient-gdpr-deletes-using-apache-hudi-on-amazon-emr/index.html index b155361696ce1..a291ee2784171 100644 --- a/content/blog/2023/05/16/how-zoom-implemented-streaming-log-ingestion-and-efficient-gdpr-deletes-using-apache-hudi-on-amazon-emr/index.html +++ b/content/blog/2023/05/16/how-zoom-implemented-streaming-log-ingestion-and-efficient-gdpr-deletes-using-apache-hudi-on-amazon-emr/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/05/19/hudi-metafields-demystified/index.html b/content/blog/2023/05/19/hudi-metafields-demystified/index.html index 699a57ddc5d0f..9c541f9bb1ed8 100644 --- a/content/blog/2023/05/19/hudi-metafields-demystified/index.html +++ b/content/blog/2023/05/19/hudi-metafields-demystified/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/05/29/different-query-types-with-apache-hudi/index.html b/content/blog/2023/05/29/different-query-types-with-apache-hudi/index.html index ad3fadc69420e..aed7a6a0ded45 100644 --- a/content/blog/2023/05/29/different-query-types-with-apache-hudi/index.html +++ b/content/blog/2023/05/29/different-query-types-with-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/06/03/text-based-search-from-elastic-search-to-vector-search/index.html b/content/blog/2023/06/03/text-based-search-from-elastic-search-to-vector-search/index.html index 21ecebd467b27..84d6ec79ce467 100644 --- a/content/blog/2023/06/03/text-based-search-from-elastic-search-to-vector-search/index.html +++ b/content/blog/2023/06/03/text-based-search-from-elastic-search-to-vector-search/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/06/11/cleaner-and-archival-in-apache-hudi/index.html b/content/blog/2023/06/11/cleaner-and-archival-in-apache-hudi/index.html index a63d741813ea4..ef7c8292a839b 100644 --- a/content/blog/2023/06/11/cleaner-and-archival-in-apache-hudi/index.html +++ b/content/blog/2023/06/11/cleaner-and-archival-in-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/06/16/Exploring-New-Frontiers-How-Apache-Flink-Apache-Hudi-and-Presto-Power-New-Insights-at-Scale/index.html b/content/blog/2023/06/16/Exploring-New-Frontiers-How-Apache-Flink-Apache-Hudi-and-Presto-Power-New-Insights-at-Scale/index.html index 05c7185e33a49..df55b0c27950a 100644 --- a/content/blog/2023/06/16/Exploring-New-Frontiers-How-Apache-Flink-Apache-Hudi-and-Presto-Power-New-Insights-at-Scale/index.html +++ b/content/blog/2023/06/16/Exploring-New-Frontiers-How-Apache-Flink-Apache-Hudi-and-Presto-Power-New-Insights-at-Scale/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/06/20/How-to-query-data-in-Apache-Hudi-using-StarRocks/index.html b/content/blog/2023/06/20/How-to-query-data-in-Apache-Hudi-using-StarRocks/index.html index f1de37425699a..155f1371bcc3b 100644 --- a/content/blog/2023/06/20/How-to-query-data-in-Apache-Hudi-using-StarRocks/index.html +++ b/content/blog/2023/06/20/How-to-query-data-in-Apache-Hudi-using-StarRocks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/06/20/timeline-server-in-apache-hudi/index.html b/content/blog/2023/06/20/timeline-server-in-apache-hudi/index.html index 3fa8e2084b1c8..cd54dba4da29d 100644 --- a/content/blog/2023/06/20/timeline-server-in-apache-hudi/index.html +++ b/content/blog/2023/06/20/timeline-server-in-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/06/24/multi-writer-support-in-apache-hudi/index.html b/content/blog/2023/06/24/multi-writer-support-in-apache-hudi/index.html index a1efab9aba7a4..e5f335a575c4c 100644 --- a/content/blog/2023/06/24/multi-writer-support-in-apache-hudi/index.html +++ b/content/blog/2023/06/24/multi-writer-support-in-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/06/26/Unlimited-Big-Data-Exchange-A-Wonderful-Review-of-Apache-DolphinScheduler-and-Hudi-Hangzhou-Meetup/index.html b/content/blog/2023/06/26/Unlimited-Big-Data-Exchange-A-Wonderful-Review-of-Apache-DolphinScheduler-and-Hudi-Hangzhou-Meetup/index.html index b5427d55df02d..9652ebd6d7478 100644 --- a/content/blog/2023/06/26/Unlimited-Big-Data-Exchange-A-Wonderful-Review-of-Apache-DolphinScheduler-and-Hudi-Hangzhou-Meetup/index.html +++ b/content/blog/2023/06/26/Unlimited-Big-Data-Exchange-A-Wonderful-Review-of-Apache-DolphinScheduler-and-Hudi-Hangzhou-Meetup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/06/30/What-about-Apache-Hudi-Apache-Iceberg-and-Delta-Lake/index.html b/content/blog/2023/06/30/What-about-Apache-Hudi-Apache-Iceberg-and-Delta-Lake/index.html index e85b7675a47fe..04ddd8fde6a4a 100644 --- a/content/blog/2023/06/30/What-about-Apache-Hudi-Apache-Iceberg-and-Delta-Lake/index.html +++ b/content/blog/2023/06/30/What-about-Apache-Hudi-Apache-Iceberg-and-Delta-Lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/07/01/monitoring-table-size-stats/index.html b/content/blog/2023/07/01/monitoring-table-size-stats/index.html index 52058fd836e81..39dacb01f2957 100644 --- a/content/blog/2023/07/01/monitoring-table-size-stats/index.html +++ b/content/blog/2023/07/01/monitoring-table-size-stats/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/07/02/Hudi-Best-Practices-Handling-Failed-Inserts-Upserts-with-Error-Tables/index.html b/content/blog/2023/07/02/Hudi-Best-Practices-Handling-Failed-Inserts-Upserts-with-Error-Tables/index.html index 74f665326e89e..1e9ed32d5ed91 100644 --- a/content/blog/2023/07/02/Hudi-Best-Practices-Handling-Failed-Inserts-Upserts-with-Error-Tables/index.html +++ b/content/blog/2023/07/02/Hudi-Best-Practices-Handling-Failed-Inserts-Upserts-with-Error-Tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/07/07/Skip-rocks-and-files-Turbocharge-Trino-queries-with-Hudi-multi-modal-indexing-subsystem/index.html b/content/blog/2023/07/07/Skip-rocks-and-files-Turbocharge-Trino-queries-with-Hudi-multi-modal-indexing-subsystem/index.html index 8d62b749bcdb1..d5e751ccf3999 100644 --- a/content/blog/2023/07/07/Skip-rocks-and-files-Turbocharge-Trino-queries-with-Hudi-multi-modal-indexing-subsystem/index.html +++ b/content/blog/2023/07/07/Skip-rocks-and-files-Turbocharge-Trino-queries-with-Hudi-multi-modal-indexing-subsystem/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/07/08/Quickly-start-using-Apache-Hudi-on-AWS-EMR/index.html b/content/blog/2023/07/08/Quickly-start-using-Apache-Hudi-on-AWS-EMR/index.html index 2494200ce22ba..360156ea337ee 100644 --- a/content/blog/2023/07/08/Quickly-start-using-Apache-Hudi-on-AWS-EMR/index.html +++ b/content/blog/2023/07/08/Quickly-start-using-Apache-Hudi-on-AWS-EMR/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/07/09/Hoodie-Timeline-Foundational-pillar-for-ACID-transactions/index.html b/content/blog/2023/07/09/Hoodie-Timeline-Foundational-pillar-for-ACID-transactions/index.html index 0b8921c216f44..4e04400bf942f 100644 --- a/content/blog/2023/07/09/Hoodie-Timeline-Foundational-pillar-for-ACID-transactions/index.html +++ b/content/blog/2023/07/09/Hoodie-Timeline-Foundational-pillar-for-ACID-transactions/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/07/20/Backfilling-Apache-Hudi-Tables-in-Production-Techniques-and-Approaches-Using-AWS-Glue-by-Job-Target-LLC/index.html b/content/blog/2023/07/20/Backfilling-Apache-Hudi-Tables-in-Production-Techniques-and-Approaches-Using-AWS-Glue-by-Job-Target-LLC/index.html index fc9d88e826138..c11442a8c52f3 100644 --- a/content/blog/2023/07/20/Backfilling-Apache-Hudi-Tables-in-Production-Techniques-and-Approaches-Using-AWS-Glue-by-Job-Target-LLC/index.html +++ b/content/blog/2023/07/20/Backfilling-Apache-Hudi-Tables-in-Production-Techniques-and-Approaches-Using-AWS-Glue-by-Job-Target-LLC/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/07/21/AWS-Glue-Crawlers-now-supports-Apache-Hudi-Tables/index.html b/content/blog/2023/07/21/AWS-Glue-Crawlers-now-supports-Apache-Hudi-Tables/index.html index d95e5382b3f73..1d0871f7eb604 100644 --- a/content/blog/2023/07/21/AWS-Glue-Crawlers-now-supports-Apache-Hudi-Tables/index.html +++ b/content/blog/2023/07/21/AWS-Glue-Crawlers-now-supports-Apache-Hudi-Tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/07/27/Apache-Hudi-Revolutionizing-Big-Data-Management-for-Real-Time-Analytics/index.html b/content/blog/2023/07/27/Apache-Hudi-Revolutionizing-Big-Data-Management-for-Real-Time-Analytics/index.html index 8fb6cb8566109..14d7a50bfd60d 100644 --- a/content/blog/2023/07/27/Apache-Hudi-Revolutionizing-Big-Data-Management-for-Real-Time-Analytics/index.html +++ b/content/blog/2023/07/27/Apache-Hudi-Revolutionizing-Big-Data-Management-for-Real-Time-Analytics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/08/03/Apache-Hudi-on-AWS-Glue-A-Step-by-Step-Guide/index.html b/content/blog/2023/08/03/Apache-Hudi-on-AWS-Glue-A-Step-by-Step-Guide/index.html index db5ace5d1183a..93bd5e7810995 100644 --- a/content/blog/2023/08/03/Apache-Hudi-on-AWS-Glue-A-Step-by-Step-Guide/index.html +++ b/content/blog/2023/08/03/Apache-Hudi-on-AWS-Glue-A-Step-by-Step-Guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/08/03/Create-an-Apache-Hudi-based-near-real-time-transactional-data lake-using-AWS-DMS-Amazon-Kinesis-AWS-Glue-streaming-ETL-and-data-visualization-using-Amazon-QuickSight/index.html b/content/blog/2023/08/03/Create-an-Apache-Hudi-based-near-real-time-transactional-data lake-using-AWS-DMS-Amazon-Kinesis-AWS-Glue-streaming-ETL-and-data-visualization-using-Amazon-QuickSight/index.html index 0e16b1c358882..115e413f60f1f 100644 --- a/content/blog/2023/08/03/Create-an-Apache-Hudi-based-near-real-time-transactional-data lake-using-AWS-DMS-Amazon-Kinesis-AWS-Glue-streaming-ETL-and-data-visualization-using-Amazon-QuickSight/index.html +++ b/content/blog/2023/08/03/Create-an-Apache-Hudi-based-near-real-time-transactional-data lake-using-AWS-DMS-Amazon-Kinesis-AWS-Glue-streaming-ETL-and-data-visualization-using-Amazon-QuickSight/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/08/03/Data-lake-Table-formats-Apache-Iceberg-vs-Apache-Hudi-vs-Delta-lake/index.html b/content/blog/2023/08/03/Data-lake-Table-formats-Apache-Iceberg-vs-Apache-Hudi-vs-Delta-lake/index.html index e9fd05b17abe9..d283254e07fff 100644 --- a/content/blog/2023/08/03/Data-lake-Table-formats-Apache-Iceberg-vs-Apache-Hudi-vs-Delta-lake/index.html +++ b/content/blog/2023/08/03/Data-lake-Table-formats-Apache-Iceberg-vs-Apache-Hudi-vs-Delta-lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/08/05/Data-Lakehouse-Architecture-for-Big-Data-with-Apache-Hudi/index.html b/content/blog/2023/08/05/Data-Lakehouse-Architecture-for-Big-Data-with-Apache-Hudi/index.html index 82f7370501310..93526310e9c7b 100644 --- a/content/blog/2023/08/05/Data-Lakehouse-Architecture-for-Big-Data-with-Apache-Hudi/index.html +++ b/content/blog/2023/08/05/Data-Lakehouse-Architecture-for-Big-Data-with-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/08/09/Lakehouse-Trifecta-Delta-Lake-Apache-Iceberg-and-Apache-Hudi/index.html b/content/blog/2023/08/09/Lakehouse-Trifecta-Delta-Lake-Apache-Iceberg-and-Apache-Hudi/index.html index d7e5ed6b2f8b5..c67dae9d14580 100644 --- a/content/blog/2023/08/09/Lakehouse-Trifecta-Delta-Lake-Apache-Iceberg-and-Apache-Hudi/index.html +++ b/content/blog/2023/08/09/Lakehouse-Trifecta-Delta-Lake-Apache-Iceberg-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/08/22/Exploring-various-storage-types-in-Apache-Hudi/index.html b/content/blog/2023/08/22/Exploring-various-storage-types-in-Apache-Hudi/index.html index 09e91e12191fd..515a0a1f58e0a 100644 --- a/content/blog/2023/08/22/Exploring-various-storage-types-in-Apache-Hudi/index.html +++ b/content/blog/2023/08/22/Exploring-various-storage-types-in-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/08/25/Delta-Hudi-Iceberg-Which-is-most-popular/index.html b/content/blog/2023/08/25/Delta-Hudi-Iceberg-Which-is-most-popular/index.html index 52f8a05257a77..b39ab30008a95 100644 --- a/content/blog/2023/08/25/Delta-Hudi-Iceberg-Which-is-most-popular/index.html +++ b/content/blog/2023/08/25/Delta-Hudi-Iceberg-Which-is-most-popular/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/08/28/Apache-Hudi-From-Zero-To-One/index.html b/content/blog/2023/08/28/Apache-Hudi-From-Zero-To-One/index.html index 30efe91eb53f6..48e624821225c 100644 --- a/content/blog/2023/08/28/Apache-Hudi-From-Zero-To-One/index.html +++ b/content/blog/2023/08/28/Apache-Hudi-From-Zero-To-One/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/08/28/Delta-Hudi-Iceberg-A-Benchmark-Compilation/index.html b/content/blog/2023/08/28/Delta-Hudi-Iceberg-A-Benchmark-Compilation/index.html index d90ff4cc072cf..17961ed45e616 100644 --- a/content/blog/2023/08/28/Delta-Hudi-Iceberg-A-Benchmark-Compilation/index.html +++ b/content/blog/2023/08/28/Delta-Hudi-Iceberg-A-Benchmark-Compilation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/08/31/Incremental-Queries-with-Apache-Hudi-and-Apache-Flink/index.html b/content/blog/2023/08/31/Incremental-Queries-with-Apache-Hudi-and-Apache-Flink/index.html index de10533351cbd..f27ac8c277b75 100644 --- a/content/blog/2023/08/31/Incremental-Queries-with-Apache-Hudi-and-Apache-Flink/index.html +++ b/content/blog/2023/08/31/Incremental-Queries-with-Apache-Hudi-and-Apache-Flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/09/06/Apache-Hudi-From-Zero-To-One-blog-2/index.html b/content/blog/2023/09/06/Apache-Hudi-From-Zero-To-One-blog-2/index.html index 7a7d17d0de91a..915bd24942d0d 100644 --- a/content/blog/2023/09/06/Apache-Hudi-From-Zero-To-One-blog-2/index.html +++ b/content/blog/2023/09/06/Apache-Hudi-From-Zero-To-One-blog-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/09/06/Lakehouse-or-Warehouse-Part-1-of-2/index.html b/content/blog/2023/09/06/Lakehouse-or-Warehouse-Part-1-of-2/index.html index d79b4ff939093..4f16279088428 100644 --- a/content/blog/2023/09/06/Lakehouse-or-Warehouse-Part-1-of-2/index.html +++ b/content/blog/2023/09/06/Lakehouse-or-Warehouse-Part-1-of-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/09/10/Demystifying-Copy-on-Write-in-Apache-Hudi-Understanding-Read-and-Write-Operations/index.html b/content/blog/2023/09/10/Demystifying-Copy-on-Write-in-Apache-Hudi-Understanding-Read-and-Write-Operations/index.html index c549f78b5de17..268b3b463990f 100644 --- a/content/blog/2023/09/10/Demystifying-Copy-on-Write-in-Apache-Hudi-Understanding-Read-and-Write-Operations/index.html +++ b/content/blog/2023/09/10/Demystifying-Copy-on-Write-in-Apache-Hudi-Understanding-Read-and-Write-Operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/09/12/Lakehouse-or-Warehouse-Part-2-of-2/index.html b/content/blog/2023/09/12/Lakehouse-or-Warehouse-Part-2-of-2/index.html index f8f0a468421a4..94ef93027e6e1 100644 --- a/content/blog/2023/09/12/Lakehouse-or-Warehouse-Part-2-of-2/index.html +++ b/content/blog/2023/09/12/Lakehouse-or-Warehouse-Part-2-of-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/09/13/Simplify-operational-data-processing-in-data-lakes-using-AWS-Glue-and-Apache-Hudi/index.html b/content/blog/2023/09/13/Simplify-operational-data-processing-in-data-lakes-using-AWS-Glue-and-Apache-Hudi/index.html index cb138c177eae4..fa5a7192641af 100644 --- a/content/blog/2023/09/13/Simplify-operational-data-processing-in-data-lakes-using-AWS-Glue-and-Apache-Hudi/index.html +++ b/content/blog/2023/09/13/Simplify-operational-data-processing-in-data-lakes-using-AWS-Glue-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/09/15/Apache-Hudi-From-Zero-To-One-blog-3/index.html b/content/blog/2023/09/15/Apache-Hudi-From-Zero-To-One-blog-3/index.html index 9315d17a88fc2..4e98a356b43d0 100644 --- a/content/blog/2023/09/15/Apache-Hudi-From-Zero-To-One-blog-3/index.html +++ b/content/blog/2023/09/15/Apache-Hudi-From-Zero-To-One-blog-3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/09/19/A-Beginners-Guide-to-Apache-Hudi-with-PySpark-Part-1-of-2/index.html b/content/blog/2023/09/19/A-Beginners-Guide-to-Apache-Hudi-with-PySpark-Part-1-of-2/index.html index 7bfcb854c435b..30c565a8f4e60 100644 --- a/content/blog/2023/09/19/A-Beginners-Guide-to-Apache-Hudi-with-PySpark-Part-1-of-2/index.html +++ b/content/blog/2023/09/19/A-Beginners-Guide-to-Apache-Hudi-with-PySpark-Part-1-of-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/09/22/Exploring-the-Architecture-of-Apache-Iceberg-Delta-Lake-and-Apache-Hudi/index.html b/content/blog/2023/09/22/Exploring-the-Architecture-of-Apache-Iceberg-Delta-Lake-and-Apache-Hudi/index.html index e1f6885c527b2..a7ccfce0162dd 100644 --- a/content/blog/2023/09/22/Exploring-the-Architecture-of-Apache-Iceberg-Delta-Lake-and-Apache-Hudi/index.html +++ b/content/blog/2023/09/22/Exploring-the-Architecture-of-Apache-Iceberg-Delta-Lake-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/09/27/Apache-Hudi-From-Zero-To-One-blog-4/index.html b/content/blog/2023/09/27/Apache-Hudi-From-Zero-To-One-blog-4/index.html index c555516ebacd3..3e18a581ee96e 100644 --- a/content/blog/2023/09/27/Apache-Hudi-From-Zero-To-One-blog-4/index.html +++ b/content/blog/2023/09/27/Apache-Hudi-From-Zero-To-One-blog-4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/10/06/Apache-Hudi-Copy-on-Write-CoW-Table/index.html b/content/blog/2023/10/06/Apache-Hudi-Copy-on-Write-CoW-Table/index.html index 3b5bf20b136d0..c8be1085be4ce 100644 --- a/content/blog/2023/10/06/Apache-Hudi-Copy-on-Write-CoW-Table/index.html +++ b/content/blog/2023/10/06/Apache-Hudi-Copy-on-Write-CoW-Table/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/10/11/starrocks-query-performance-with-apache-hudi-and-onehouse/index.html b/content/blog/2023/10/11/starrocks-query-performance-with-apache-hudi-and-onehouse/index.html index 428373333ae7f..ddb5edcce828d 100644 --- a/content/blog/2023/10/11/starrocks-query-performance-with-apache-hudi-and-onehouse/index.html +++ b/content/blog/2023/10/11/starrocks-query-performance-with-apache-hudi-and-onehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/10/17/Get-started-with-Apache-Hudi-using-AWS-Glue-by-implementing-key-design-concepts-Part-1/index.html b/content/blog/2023/10/17/Get-started-with-Apache-Hudi-using-AWS-Glue-by-implementing-key-design-concepts-Part-1/index.html index c11a04fb2ad56..eaf7fefd36f46 100644 --- a/content/blog/2023/10/17/Get-started-with-Apache-Hudi-using-AWS-Glue-by-implementing-key-design-concepts-Part-1/index.html +++ b/content/blog/2023/10/17/Get-started-with-Apache-Hudi-using-AWS-Glue-by-implementing-key-design-concepts-Part-1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/10/18/Apache-Hudi-From-Zero-To-One-blog-5/index.html b/content/blog/2023/10/18/Apache-Hudi-From-Zero-To-One-blog-5/index.html index 6a5ee33c72043..aeeda70086962 100644 --- a/content/blog/2023/10/18/Apache-Hudi-From-Zero-To-One-blog-5/index.html +++ b/content/blog/2023/10/18/Apache-Hudi-From-Zero-To-One-blog-5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/10/19/load-data-incrementally-from-transactional-data-lakes-to-data-warehouses/index.html b/content/blog/2023/10/19/load-data-incrementally-from-transactional-data-lakes-to-data-warehouses/index.html index a294e8f36e5c4..e35dcde66434c 100644 --- a/content/blog/2023/10/19/load-data-incrementally-from-transactional-data-lakes-to-data-warehouses/index.html +++ b/content/blog/2023/10/19/load-data-incrementally-from-transactional-data-lakes-to-data-warehouses/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/10/20/Its-Time-for-the-Universal-Data-Lakehouse/index.html b/content/blog/2023/10/20/Its-Time-for-the-Universal-Data-Lakehouse/index.html index 8fb1f203f4330..ab7879dfa7e5a 100644 --- a/content/blog/2023/10/20/Its-Time-for-the-Universal-Data-Lakehouse/index.html +++ b/content/blog/2023/10/20/Its-Time-for-the-Universal-Data-Lakehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/10/22/Tipico-Facilitates-Faster-Data-Access-with-a-Modern-Data-Strategy-on-AWS/index.html b/content/blog/2023/10/22/Tipico-Facilitates-Faster-Data-Access-with-a-Modern-Data-Strategy-on-AWS/index.html index 9005a6b99da68..d0b210cb23669 100644 --- a/content/blog/2023/10/22/Tipico-Facilitates-Faster-Data-Access-with-a-Modern-Data-Strategy-on-AWS/index.html +++ b/content/blog/2023/10/22/Tipico-Facilitates-Faster-Data-Access-with-a-Modern-Data-Strategy-on-AWS/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/10/29/UPSERT-Performance-Evaluation-of-Hudi-0-14-and-Spark-3-4-1-Record-Level-Index-Global-Bloom-Global-Simple-Indexes/index.html b/content/blog/2023/10/29/UPSERT-Performance-Evaluation-of-Hudi-0-14-and-Spark-3-4-1-Record-Level-Index-Global-Bloom-Global-Simple-Indexes/index.html index 4ef906247f2f6..ac5d37bfbe01c 100644 --- a/content/blog/2023/10/29/UPSERT-Performance-Evaluation-of-Hudi-0-14-and-Spark-3-4-1-Record-Level-Index-Global-Bloom-Global-Simple-Indexes/index.html +++ b/content/blog/2023/10/29/UPSERT-Performance-Evaluation-of-Hudi-0-14-and-Spark-3-4-1-Record-Level-Index-Global-Bloom-Global-Simple-Indexes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/11/01/record-level-index/index.html b/content/blog/2023/11/01/record-level-index/index.html index 212e6f1ba3036..71f01d9a089e2 100644 --- a/content/blog/2023/11/01/record-level-index/index.html +++ b/content/blog/2023/11/01/record-level-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/11/13/Apache-Hudi-From-Zero-To-One-blog-6/index.html b/content/blog/2023/11/13/Apache-Hudi-From-Zero-To-One-blog-6/index.html index 9542c777af526..d3c01acd409f1 100644 --- a/content/blog/2023/11/13/Apache-Hudi-From-Zero-To-One-blog-6/index.html +++ b/content/blog/2023/11/13/Apache-Hudi-From-Zero-To-One-blog-6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/11/19/Hudi-Streamer-DeltaStreamer-Hands-On-Guide-Local-Ingestion-from-Parquet-Source/index.html b/content/blog/2023/11/19/Hudi-Streamer-DeltaStreamer-Hands-On-Guide-Local-Ingestion-from-Parquet-Source/index.html index 618cd39508cf4..2e422fa11d6d6 100644 --- a/content/blog/2023/11/19/Hudi-Streamer-DeltaStreamer-Hands-On-Guide-Local-Ingestion-from-Parquet-Source/index.html +++ b/content/blog/2023/11/19/Hudi-Streamer-DeltaStreamer-Hands-On-Guide-Local-Ingestion-from-Parquet-Source/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/11/22/Introducing-Apache-Hudi-support-with-AWS-Glue-crawlers/index.html b/content/blog/2023/11/22/Introducing-Apache-Hudi-support-with-AWS-Glue-crawlers/index.html index 134d8fc1b43ec..148a85c5f9358 100644 --- a/content/blog/2023/11/22/Introducing-Apache-Hudi-support-with-AWS-Glue-crawlers/index.html +++ b/content/blog/2023/11/22/Introducing-Apache-Hudi-support-with-AWS-Glue-crawlers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/11/26/Real-Time-Data-Processing-with-Postgres-Debezium-Kafka-Schema-Registry-and-DeltaStreamer-Guide-for-Begineers/index.html b/content/blog/2023/11/26/Real-Time-Data-Processing-with-Postgres-Debezium-Kafka-Schema-Registry-and-DeltaStreamer-Guide-for-Begineers/index.html index 7ea003220d742..a1b65fa6bfa00 100644 --- a/content/blog/2023/11/26/Real-Time-Data-Processing-with-Postgres-Debezium-Kafka-Schema-Registry-and-DeltaStreamer-Guide-for-Begineers/index.html +++ b/content/blog/2023/11/26/Real-Time-Data-Processing-with-Postgres-Debezium-Kafka-Schema-Registry-and-DeltaStreamer-Guide-for-Begineers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/11/28/Apache-Hudi-Part-1-History-Getting-Started/index.html b/content/blog/2023/11/28/Apache-Hudi-Part-1-History-Getting-Started/index.html index dfbb1b8f38321..efa7bde52a074 100644 --- a/content/blog/2023/11/28/Apache-Hudi-Part-1-History-Getting-Started/index.html +++ b/content/blog/2023/11/28/Apache-Hudi-Part-1-History-Getting-Started/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/11/30/Mastering-Data-Lakes-A-Deep-Dive-into-MINIO-Hudi-and-Delta-Streamer/index.html b/content/blog/2023/11/30/Mastering-Data-Lakes-A-Deep-Dive-into-MINIO-Hudi-and-Delta-Streamer/index.html index 1e0c9d7cc3619..67326a61ae614 100644 --- a/content/blog/2023/11/30/Mastering-Data-Lakes-A-Deep-Dive-into-MINIO-Hudi-and-Delta-Streamer/index.html +++ b/content/blog/2023/11/30/Mastering-Data-Lakes-A-Deep-Dive-into-MINIO-Hudi-and-Delta-Streamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/12/01/Getting-started-with-Apache-Hudi/index.html b/content/blog/2023/12/01/Getting-started-with-Apache-Hudi/index.html index 97e65407e60f2..6f8cbf83e32e6 100644 --- a/content/blog/2023/12/01/Getting-started-with-Apache-Hudi/index.html +++ b/content/blog/2023/12/01/Getting-started-with-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/12/06/Apache-Hudi-From-Zero-To-One-blog-7/index.html b/content/blog/2023/12/06/Apache-Hudi-From-Zero-To-One-blog-7/index.html index 9859ec1281a46..765aced325b51 100644 --- a/content/blog/2023/12/06/Apache-Hudi-From-Zero-To-One-blog-7/index.html +++ b/content/blog/2023/12/06/Apache-Hudi-From-Zero-To-One-blog-7/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/12/09/Getting-started-with-Apache-Hudi/index.html b/content/blog/2023/12/09/Getting-started-with-Apache-Hudi/index.html index c7104f61766d2..73f9b8d0c5f0a 100644 --- a/content/blog/2023/12/09/Getting-started-with-Apache-Hudi/index.html +++ b/content/blog/2023/12/09/Getting-started-with-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/12/13/what-is-apache-hudi/index.html b/content/blog/2023/12/13/what-is-apache-hudi/index.html index 2e1db31ea825d..9e127cf157d0f 100644 --- a/content/blog/2023/12/13/what-is-apache-hudi/index.html +++ b/content/blog/2023/12/13/what-is-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2023/12/28/apache-hudi-2023-a-year-in-review/index.html b/content/blog/2023/12/28/apache-hudi-2023-a-year-in-review/index.html index 2067a221d49fb..695ac756b5061 100644 --- a/content/blog/2023/12/28/apache-hudi-2023-a-year-in-review/index.html +++ b/content/blog/2023/12/28/apache-hudi-2023-a-year-in-review/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/01/01/From-Data-lake-to-Microservices-Unleashing-the-Power-of-Apache-Hudi-Record-Level-Index-with-FastAPI-and-Spark-Connect/index.html b/content/blog/2024/01/01/From-Data-lake-to-Microservices-Unleashing-the-Power-of-Apache-Hudi-Record-Level-Index-with-FastAPI-and-Spark-Connect/index.html index fa99fc19d9da8..1c5f0308ce8a9 100644 --- a/content/blog/2024/01/01/From-Data-lake-to-Microservices-Unleashing-the-Power-of-Apache-Hudi-Record-Level-Index-with-FastAPI-and-Spark-Connect/index.html +++ b/content/blog/2024/01/01/From-Data-lake-to-Microservices-Unleashing-the-Power-of-Apache-Hudi-Record-Level-Index-with-FastAPI-and-Spark-Connect/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/01/02/Build-a-federated-query-solution-with-Apache-Doris-Apache-Flink-and-Apache-Hudi/index.html b/content/blog/2024/01/02/Build-a-federated-query-solution-with-Apache-Doris-Apache-Flink-and-Apache-Hudi/index.html index bac75396db713..e3bdc95546d8e 100644 --- a/content/blog/2024/01/02/Build-a-federated-query-solution-with-Apache-Doris-Apache-Flink-and-Apache-Hudi/index.html +++ b/content/blog/2024/01/02/Build-a-federated-query-solution-with-Apache-Doris-Apache-Flink-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/01/05/Small-Talk-about-Apache-Hudi/index.html b/content/blog/2024/01/05/Small-Talk-about-Apache-Hudi/index.html index ebda285cac18c..24b99cfc5c95a 100644 --- a/content/blog/2024/01/05/Small-Talk-about-Apache-Hudi/index.html +++ b/content/blog/2024/01/05/Small-Talk-about-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/01/09/introduction-to-apache-hudi/index.html b/content/blog/2024/01/09/introduction-to-apache-hudi/index.html index 929566bcff286..7206f4711039a 100644 --- a/content/blog/2024/01/09/introduction-to-apache-hudi/index.html +++ b/content/blog/2024/01/09/introduction-to-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/01/11/In-House-Data-Lake-with-CDC-Processing-Hudi-Docker/index.html b/content/blog/2024/01/11/In-House-Data-Lake-with-CDC-Processing-Hudi-Docker/index.html index 3ca52baae8f35..2ff3e7def2ee1 100644 --- a/content/blog/2024/01/11/In-House-Data-Lake-with-CDC-Processing-Hudi-Docker/index.html +++ b/content/blog/2024/01/11/In-House-Data-Lake-with-CDC-Processing-Hudi-Docker/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/01/17/Enforce-fine-grained-access-control-on-Open-Table-Formats-via-Amazon-EMR-integrated-with-AWS-Lake-Formation/index.html b/content/blog/2024/01/17/Enforce-fine-grained-access-control-on-Open-Table-Formats-via-Amazon-EMR-integrated-with-AWS-Lake-Formation/index.html index b6fd14e259efd..0284f9e243b2d 100644 --- a/content/blog/2024/01/17/Enforce-fine-grained-access-control-on-Open-Table-Formats-via-Amazon-EMR-integrated-with-AWS-Lake-Formation/index.html +++ b/content/blog/2024/01/17/Enforce-fine-grained-access-control-on-Open-Table-Formats-via-Amazon-EMR-integrated-with-AWS-Lake-Formation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/01/18/Deleting-Items-from-Apache-Hudi-using-Delta-Streamer-in-UPSERT-Mode-with-Kafka-Avro-Messages/index.html b/content/blog/2024/01/18/Deleting-Items-from-Apache-Hudi-using-Delta-Streamer-in-UPSERT-Mode-with-Kafka-Avro-Messages/index.html index 8d69ab8caf38c..26719e8cc49b1 100644 --- a/content/blog/2024/01/18/Deleting-Items-from-Apache-Hudi-using-Delta-Streamer-in-UPSERT-Mode-with-Kafka-Avro-Messages/index.html +++ b/content/blog/2024/01/18/Deleting-Items-from-Apache-Hudi-using-Delta-Streamer-in-UPSERT-Mode-with-Kafka-Avro-Messages/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/01/20/Data-Engineering-Bootstrapping-Data-lake-with-Apache-Hudi/index.html b/content/blog/2024/01/20/Data-Engineering-Bootstrapping-Data-lake-with-Apache-Hudi/index.html index a9f8b85abe859..da4568d019b25 100644 --- a/content/blog/2024/01/20/Data-Engineering-Bootstrapping-Data-lake-with-Apache-Hudi/index.html +++ b/content/blog/2024/01/20/Data-Engineering-Bootstrapping-Data-lake-with-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/01/20/Learn-How-to-Move-Data-From-MongoDB-to-Apache-Hudi-Using-PySpark/index.html b/content/blog/2024/01/20/Learn-How-to-Move-Data-From-MongoDB-to-Apache-Hudi-Using-PySpark/index.html index eca230ed3882f..80297b9d9c365 100644 --- a/content/blog/2024/01/20/Learn-How-to-Move-Data-From-MongoDB-to-Apache-Hudi-Using-PySpark/index.html +++ b/content/blog/2024/01/20/Learn-How-to-Move-Data-From-MongoDB-to-Apache-Hudi-Using-PySpark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/01/24/Use-Amazon-Athena-with-Spark-SQL-for-your-open-source-transactional-table-formats/index.html b/content/blog/2024/01/24/Use-Amazon-Athena-with-Spark-SQL-for-your-open-source-transactional-table-formats/index.html index 28cbceb261a73..1f6929290a987 100644 --- a/content/blog/2024/01/24/Use-Amazon-Athena-with-Spark-SQL-for-your-open-source-transactional-table-formats/index.html +++ b/content/blog/2024/01/24/Use-Amazon-Athena-with-Spark-SQL-for-your-open-source-transactional-table-formats/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/01/30/Leverage-Partition-Paths-of-your-data-lake-tables-to-Optimize-Data-Retrieval-Costs-on-the-cloud/index.html b/content/blog/2024/01/30/Leverage-Partition-Paths-of-your-data-lake-tables-to-Optimize-Data-Retrieval-Costs-on-the-cloud/index.html index 54f30b1c21589..f75b1bd13410a 100644 --- a/content/blog/2024/01/30/Leverage-Partition-Paths-of-your-data-lake-tables-to-Optimize-Data-Retrieval-Costs-on-the-cloud/index.html +++ b/content/blog/2024/01/30/Leverage-Partition-Paths-of-your-data-lake-tables-to-Optimize-Data-Retrieval-Costs-on-the-cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/02/04/Apache-Hudi-Managing-Partition-on-a-petabyte-scale-table/index.html b/content/blog/2024/02/04/Apache-Hudi-Managing-Partition-on-a-petabyte-scale-table/index.html index 62d2de18b9684..ce0444cc36dc3 100644 --- a/content/blog/2024/02/04/Apache-Hudi-Managing-Partition-on-a-petabyte-scale-table/index.html +++ b/content/blog/2024/02/04/Apache-Hudi-Managing-Partition-on-a-petabyte-scale-table/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/02/06/Building-an-Open-Source-Data-Lake-House-with-Hudi-Postgres-Hive-Metastore-Minio-and-StarRocks/index.html b/content/blog/2024/02/06/Building-an-Open-Source-Data-Lake-House-with-Hudi-Postgres-Hive-Metastore-Minio-and-StarRocks/index.html index b152d16be11d1..1039479155933 100644 --- a/content/blog/2024/02/06/Building-an-Open-Source-Data-Lake-House-with-Hudi-Postgres-Hive-Metastore-Minio-and-StarRocks/index.html +++ b/content/blog/2024/02/06/Building-an-Open-Source-Data-Lake-House-with-Hudi-Postgres-Hive-Metastore-Minio-and-StarRocks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/02/06/Combine-Transactional-Integrity-and-Data-Lake-Operations-with-YugabyteDB-and-Apache-Hudi/index.html b/content/blog/2024/02/06/Combine-Transactional-Integrity-and-Data-Lake-Operations-with-YugabyteDB-and-Apache-Hudi/index.html index e52aeba29fbab..2cca89be3b16e 100644 --- a/content/blog/2024/02/06/Combine-Transactional-Integrity-and-Data-Lake-Operations-with-YugabyteDB-and-Apache-Hudi/index.html +++ b/content/blog/2024/02/06/Combine-Transactional-Integrity-and-Data-Lake-Operations-with-YugabyteDB-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/02/12/How-a-POC-became-a-production-ready-Hudi-data-lakehouse-through-close-team-collaboration/index.html b/content/blog/2024/02/12/How-a-POC-became-a-production-ready-Hudi-data-lakehouse-through-close-team-collaboration/index.html index 7afbc7009662c..a18d184e07a6c 100644 --- a/content/blog/2024/02/12/How-a-POC-became-a-production-ready-Hudi-data-lakehouse-through-close-team-collaboration/index.html +++ b/content/blog/2024/02/12/How-a-POC-became-a-production-ready-Hudi-data-lakehouse-through-close-team-collaboration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/02/23/Enabling-near-real-time-data-analytics-on-the-data-lake/index.html b/content/blog/2024/02/23/Enabling-near-real-time-data-analytics-on-the-data-lake/index.html index 3a587bff4db4c..5b0c81aafecaa 100644 --- a/content/blog/2024/02/23/Enabling-near-real-time-data-analytics-on-the-data-lake/index.html +++ b/content/blog/2024/02/23/Enabling-near-real-time-data-analytics-on-the-data-lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/02/27/Building-Data-Lakes-on-AWS-with-Kafka-Connect-Debezium-Apicurio-Registry-and-Apache-Hudi/index.html b/content/blog/2024/02/27/Building-Data-Lakes-on-AWS-with-Kafka-Connect-Debezium-Apicurio-Registry-and-Apache-Hudi/index.html index 53cd364c108c1..41892f0c4d82b 100644 --- a/content/blog/2024/02/27/Building-Data-Lakes-on-AWS-with-Kafka-Connect-Debezium-Apicurio-Registry-and-Apache-Hudi/index.html +++ b/content/blog/2024/02/27/Building-Data-Lakes-on-AWS-with-Kafka-Connect-Debezium-Apicurio-Registry-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/02/27/empowering-data-driven-excellence-how-the-bluestone-data-platform-embraced-data-mesh-for-success/index.html b/content/blog/2024/02/27/empowering-data-driven-excellence-how-the-bluestone-data-platform-embraced-data-mesh-for-success/index.html index 3907ecbd05b0b..20fb67cfbd41d 100644 --- a/content/blog/2024/02/27/empowering-data-driven-excellence-how-the-bluestone-data-platform-embraced-data-mesh-for-success/index.html +++ b/content/blog/2024/02/27/empowering-data-driven-excellence-how-the-bluestone-data-platform-embraced-data-mesh-for-success/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/03/05/Apache-Hudi-From-Zero-To-One-blog-9/index.html b/content/blog/2024/03/05/Apache-Hudi-From-Zero-To-One-blog-9/index.html index 46b271ea99099..800ab8f8b82f4 100644 --- a/content/blog/2024/03/05/Apache-Hudi-From-Zero-To-One-blog-9/index.html +++ b/content/blog/2024/03/05/Apache-Hudi-From-Zero-To-One-blog-9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/03/10/navigating-the-future-the-evolutionary-journey-of-upstoxs-data-platform/index.html b/content/blog/2024/03/10/navigating-the-future-the-evolutionary-journey-of-upstoxs-data-platform/index.html index c9f0fabd34af7..42a11b1a28001 100644 --- a/content/blog/2024/03/10/navigating-the-future-the-evolutionary-journey-of-upstoxs-data-platform/index.html +++ b/content/blog/2024/03/10/navigating-the-future-the-evolutionary-journey-of-upstoxs-data-platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/03/14/Modern-Datalakes-with-Hudi--MinIO--and-HMS/index.html b/content/blog/2024/03/14/Modern-Datalakes-with-Hudi--MinIO--and-HMS/index.html index d742eb618d60b..016c0e8080354 100644 --- a/content/blog/2024/03/14/Modern-Datalakes-with-Hudi--MinIO--and-HMS/index.html +++ b/content/blog/2024/03/14/Modern-Datalakes-with-Hudi--MinIO--and-HMS/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/03/16/Open-Table-Formats-part-1-Apache-Hudi-Hadoop-Upserts-Deletes-and-Incrementals/index.html b/content/blog/2024/03/16/Open-Table-Formats-part-1-Apache-Hudi-Hadoop-Upserts-Deletes-and-Incrementals/index.html index ababc73184894..7f2781eb6c18d 100644 --- a/content/blog/2024/03/16/Open-Table-Formats-part-1-Apache-Hudi-Hadoop-Upserts-Deletes-and-Incrementals/index.html +++ b/content/blog/2024/03/16/Open-Table-Formats-part-1-Apache-Hudi-Hadoop-Upserts-Deletes-and-Incrementals/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/03/22/data-lake-cost-optimisation-strategies/index.html b/content/blog/2024/03/22/data-lake-cost-optimisation-strategies/index.html index dd1b2a4f65c5d..cb4b98cf229b2 100644 --- a/content/blog/2024/03/22/data-lake-cost-optimisation-strategies/index.html +++ b/content/blog/2024/03/22/data-lake-cost-optimisation-strategies/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/03/23/options-on-kafka-sink-to-open-table-formats-apache-iceberg-and-apache-hudi/index.html b/content/blog/2024/03/23/options-on-kafka-sink-to-open-table-formats-apache-iceberg-and-apache-hudi/index.html index 04855f369a11a..f049b364bd023 100644 --- a/content/blog/2024/03/23/options-on-kafka-sink-to-open-table-formats-apache-iceberg-and-apache-hudi/index.html +++ b/content/blog/2024/03/23/options-on-kafka-sink-to-open-table-formats-apache-iceberg-and-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/03/30/record-level-indexing-apache-hudi-delivers-70-faster-point/index.html b/content/blog/2024/03/30/record-level-indexing-apache-hudi-delivers-70-faster-point/index.html index ce49aa5f200dc..3c7af4e81b3d8 100644 --- a/content/blog/2024/03/30/record-level-indexing-apache-hudi-delivers-70-faster-point/index.html +++ b/content/blog/2024/03/30/record-level-indexing-apache-hudi-delivers-70-faster-point/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/04/03/hands-on-guide-reading-data-from-hudi-tables-joining-delta/index.html b/content/blog/2024/04/03/hands-on-guide-reading-data-from-hudi-tables-joining-delta/index.html index 91ee677da8a0b..1adccc7319880 100644 --- a/content/blog/2024/04/03/hands-on-guide-reading-data-from-hudi-tables-joining-delta/index.html +++ b/content/blog/2024/04/03/hands-on-guide-reading-data-from-hudi-tables-joining-delta/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/04/21/build-real-time-streaming-pipeline-with-kinesis-apache-flink-and-apache-hudi/index.html b/content/blog/2024/04/21/build-real-time-streaming-pipeline-with-kinesis-apache-flink-and-apache-hudi/index.html index 734ac5e24beed..44b01349dc970 100644 --- a/content/blog/2024/04/21/build-real-time-streaming-pipeline-with-kinesis-apache-flink-and-apache-hudi/index.html +++ b/content/blog/2024/04/21/build-real-time-streaming-pipeline-with-kinesis-apache-flink-and-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-1/index.html b/content/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-1/index.html index 891bca3093c5c..d46ad69ebfd7b 100644 --- a/content/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-1/index.html +++ b/content/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-2/index.html b/content/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-2/index.html index c9eaa34ee34c0..487164108a14b 100644 --- a/content/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-2/index.html +++ b/content/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-3/index.html b/content/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-3/index.html index 23b59d95d6f4b..6c9f01be27ac2 100644 --- a/content/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-3/index.html +++ b/content/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/04/25/apache-hudi-vs-apache-iceberg-a-comprehensive-comparison/index.html b/content/blog/2024/04/25/apache-hudi-vs-apache-iceberg-a-comprehensive-comparison/index.html index 6fcc8b2900157..f012dcc16894c 100644 --- a/content/blog/2024/04/25/apache-hudi-vs-apache-iceberg-a-comprehensive-comparison/index.html +++ b/content/blog/2024/04/25/apache-hudi-vs-apache-iceberg-a-comprehensive-comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/05/02/how-query-apache-hudi-tables-python-using-daft-spark-free/index.html b/content/blog/2024/05/02/how-query-apache-hudi-tables-python-using-daft-spark-free/index.html index d05acf31359f0..6311b9558b222 100644 --- a/content/blog/2024/05/02/how-query-apache-hudi-tables-python-using-daft-spark-free/index.html +++ b/content/blog/2024/05/02/how-query-apache-hudi-tables-python-using-daft-spark-free/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/05/07/learn-how-read-hudi-data-aws-glue-ray-using-daft-spark/index.html b/content/blog/2024/05/07/learn-how-read-hudi-data-aws-glue-ray-using-daft-spark/index.html index ba720f89e3e01..5a74a5a47f083 100644 --- a/content/blog/2024/05/07/learn-how-read-hudi-data-aws-glue-ray-using-daft-spark/index.html +++ b/content/blog/2024/05/07/learn-how-read-hudi-data-aws-glue-ray-using-daft-spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/05/10/building-analytical-apps-on-the-lakehouse-using-apache-hudi-daft-streamlit/index.html b/content/blog/2024/05/10/building-analytical-apps-on-the-lakehouse-using-apache-hudi-daft-streamlit/index.html index 79a16f5f35786..ab18843f094d4 100644 --- a/content/blog/2024/05/10/building-analytical-apps-on-the-lakehouse-using-apache-hudi-daft-streamlit/index.html +++ b/content/blog/2024/05/10/building-analytical-apps-on-the-lakehouse-using-apache-hudi-daft-streamlit/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/05/19/apache-hudi-on-aws-glue/index.html b/content/blog/2024/05/19/apache-hudi-on-aws-glue/index.html index 155a897257266..40f5b8dc2ce2c 100644 --- a/content/blog/2024/05/19/apache-hudi-on-aws-glue/index.html +++ b/content/blog/2024/05/19/apache-hudi-on-aws-glue/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/05/22/use-aws-data-exchange-to-seamlessly-share-apache-hudi-datasets/index.html b/content/blog/2024/05/22/use-aws-data-exchange-to-seamlessly-share-apache-hudi-datasets/index.html index c3add62568fbd..a48336a9d9d40 100644 --- a/content/blog/2024/05/22/use-aws-data-exchange-to-seamlessly-share-apache-hudi-datasets/index.html +++ b/content/blog/2024/05/22/use-aws-data-exchange-to-seamlessly-share-apache-hudi-datasets/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/05/27/apache-hudi-vs-delta-lake-choosing-the-right-tool-for-your-data-lake-on-aws/index.html b/content/blog/2024/05/27/apache-hudi-vs-delta-lake-choosing-the-right-tool-for-your-data-lake-on-aws/index.html index 2af27b5846851..b80f776f6c1d6 100644 --- a/content/blog/2024/05/27/apache-hudi-vs-delta-lake-choosing-the-right-tool-for-your-data-lake-on-aws/index.html +++ b/content/blog/2024/05/27/apache-hudi-vs-delta-lake-choosing-the-right-tool-for-your-data-lake-on-aws/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/06/07/apache-hudi-a-deep-dive-with-python-code-examples/index.html b/content/blog/2024/06/07/apache-hudi-a-deep-dive-with-python-code-examples/index.html index 3810d07ec1e62..a250c7420f2a8 100644 --- a/content/blog/2024/06/07/apache-hudi-a-deep-dive-with-python-code-examples/index.html +++ b/content/blog/2024/06/07/apache-hudi-a-deep-dive-with-python-code-examples/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/06/18/how-to-use-apache-hudi-with-databricks/index.html b/content/blog/2024/06/18/how-to-use-apache-hudi-with-databricks/index.html index 313ffc42339ee..eaddc8da1addb 100644 --- a/content/blog/2024/06/18/how-to-use-apache-hudi-with-databricks/index.html +++ b/content/blog/2024/06/18/how-to-use-apache-hudi-with-databricks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/07/11/what-is-a-data-lakehouse/index.html b/content/blog/2024/07/11/what-is-a-data-lakehouse/index.html index d4f6ff5743971..fbd11ab84bddb 100644 --- a/content/blog/2024/07/11/what-is-a-data-lakehouse/index.html +++ b/content/blog/2024/07/11/what-is-a-data-lakehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/07/30/data-lake-cdc/index.html b/content/blog/2024/07/30/data-lake-cdc/index.html index c9a41e540b6c4..e76d4e76cdc6b 100644 --- a/content/blog/2024/07/30/data-lake-cdc/index.html +++ b/content/blog/2024/07/30/data-lake-cdc/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/07/31/hudi-file-formats/index.html b/content/blog/2024/07/31/hudi-file-formats/index.html index b4d473dbd6fc9..f9dc7bf58741a 100644 --- a/content/blog/2024/07/31/hudi-file-formats/index.html +++ b/content/blog/2024/07/31/hudi-file-formats/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/09/04/developer-guide-how-to-submit-hudi-pyspark-python-jobs-to-emr-serverless/index.html b/content/blog/2024/09/04/developer-guide-how-to-submit-hudi-pyspark-python-jobs-to-emr-serverless/index.html index 9697b7051d85c..946c40a3ddd13 100644 --- a/content/blog/2024/09/04/developer-guide-how-to-submit-hudi-pyspark-python-jobs-to-emr-serverless/index.html +++ b/content/blog/2024/09/04/developer-guide-how-to-submit-hudi-pyspark-python-jobs-to-emr-serverless/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/09/09/use-apache-hudi-tables-in-athena-for-spark/index.html b/content/blog/2024/09/09/use-apache-hudi-tables-in-athena-for-spark/index.html index 8776c8929f2fc..c70be15483ee5 100644 --- a/content/blog/2024/09/09/use-apache-hudi-tables-in-athena-for-spark/index.html +++ b/content/blog/2024/09/09/use-apache-hudi-tables-in-athena-for-spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/09/11/comparing-apache-hudi-apache-iceberg-and-delta-lake/index.html b/content/blog/2024/09/11/comparing-apache-hudi-apache-iceberg-and-delta-lake/index.html index 3e2adf426c10f..8c0579f53b457 100644 --- a/content/blog/2024/09/11/comparing-apache-hudi-apache-iceberg-and-delta-lake/index.html +++ b/content/blog/2024/09/11/comparing-apache-hudi-apache-iceberg-and-delta-lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/09/14/Ubers-Big-Data-Revolution-From-MySQL-to-Hadoop-and-Beyond/index.html b/content/blog/2024/09/14/Ubers-Big-Data-Revolution-From-MySQL-to-Hadoop-and-Beyond/index.html index b1762bbcdff98..fe043291f93e4 100644 --- a/content/blog/2024/09/14/Ubers-Big-Data-Revolution-From-MySQL-to-Hadoop-and-Beyond/index.html +++ b/content/blog/2024/09/14/Ubers-Big-Data-Revolution-From-MySQL-to-Hadoop-and-Beyond/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/09/17/how-apache-hudi-transformed-yuno-s-data-lake/index.html b/content/blog/2024/09/17/how-apache-hudi-transformed-yuno-s-data-lake/index.html index c71bd71c31247..0a8e6e1ce1260 100644 --- a/content/blog/2024/09/17/how-apache-hudi-transformed-yuno-s-data-lake/index.html +++ b/content/blog/2024/09/17/how-apache-hudi-transformed-yuno-s-data-lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/09/22/hands-on-with-apache-hudi-and-spark/index.html b/content/blog/2024/09/22/hands-on-with-apache-hudi-and-spark/index.html index ea880a3eeace8..900b07174b444 100644 --- a/content/blog/2024/09/22/hands-on-with-apache-hudi-and-spark/index.html +++ b/content/blog/2024/09/22/hands-on-with-apache-hudi-and-spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/09/24/hudi-iceberg-and-delta-lake-data-lake-table-formats-compared/index.html b/content/blog/2024/09/24/hudi-iceberg-and-delta-lake-data-lake-table-formats-compared/index.html index e5ae3f88c0be4..798df06842c60 100644 --- a/content/blog/2024/09/24/hudi-iceberg-and-delta-lake-data-lake-table-formats-compared/index.html +++ b/content/blog/2024/09/24/hudi-iceberg-and-delta-lake-data-lake-table-formats-compared/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/09/30/change-query-support-in-apache-hudi-0-15/index.html b/content/blog/2024/09/30/change-query-support-in-apache-hudi-0-15/index.html index 63a019d9a59d5..15e9039a47d91 100644 --- a/content/blog/2024/09/30/change-query-support-in-apache-hudi-0-15/index.html +++ b/content/blog/2024/09/30/change-query-support-in-apache-hudi-0-15/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/10/02/apache-hudi-spark-and-minio-hands-on-lab-in-docker/index.html b/content/blog/2024/10/02/apache-hudi-spark-and-minio-hands-on-lab-in-docker/index.html index 7858b5bb9ae91..dd15134d15a4e 100644 --- a/content/blog/2024/10/02/apache-hudi-spark-and-minio-hands-on-lab-in-docker/index.html +++ b/content/blog/2024/10/02/apache-hudi-spark-and-minio-hands-on-lab-in-docker/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/10/07/iceberg-vs-delta-lake-vs-hudi-a-comparative-look-at-lakehouse-architectures/index.html b/content/blog/2024/10/07/iceberg-vs-delta-lake-vs-hudi-a-comparative-look-at-lakehouse-architectures/index.html index 9bb59f7fffd01..d756e2f1e72e9 100644 --- a/content/blog/2024/10/07/iceberg-vs-delta-lake-vs-hudi-a-comparative-look-at-lakehouse-architectures/index.html +++ b/content/blog/2024/10/07/iceberg-vs-delta-lake-vs-hudi-a-comparative-look-at-lakehouse-architectures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/10/07/mastering-slowly-changing-dimensions-with-apache-hudi-and-spark-sql/index.html b/content/blog/2024/10/07/mastering-slowly-changing-dimensions-with-apache-hudi-and-spark-sql/index.html index a930d0d6cd51e..c072648e4477d 100644 --- a/content/blog/2024/10/07/mastering-slowly-changing-dimensions-with-apache-hudi-and-spark-sql/index.html +++ b/content/blog/2024/10/07/mastering-slowly-changing-dimensions-with-apache-hudi-and-spark-sql/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/10/14/streaming-dynamodb-data-into-a-hudi-table-aws-glue-in-action/index.html b/content/blog/2024/10/14/streaming-dynamodb-data-into-a-hudi-table-aws-glue-in-action/index.html index 1df77a5ffff47..d7285173558d4 100644 --- a/content/blog/2024/10/14/streaming-dynamodb-data-into-a-hudi-table-aws-glue-in-action/index.html +++ b/content/blog/2024/10/14/streaming-dynamodb-data-into-a-hudi-table-aws-glue-in-action/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/10/22/exploring-time-travel-queries-in-apache-hudi/index.html b/content/blog/2024/10/22/exploring-time-travel-queries-in-apache-hudi/index.html index 87ea7998c277c..855e9c54b056b 100644 --- a/content/blog/2024/10/22/exploring-time-travel-queries-in-apache-hudi/index.html +++ b/content/blog/2024/10/22/exploring-time-travel-queries-in-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/10/23/Using-Apache-Hudi-with-Apache-Flink/index.html b/content/blog/2024/10/23/Using-Apache-Hudi-with-Apache-Flink/index.html index 4412db9957369..fd9e2095dc91a 100644 --- a/content/blog/2024/10/23/Using-Apache-Hudi-with-Apache-Flink/index.html +++ b/content/blog/2024/10/23/Using-Apache-Hudi-with-Apache-Flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/10/23/mastering-open-table-formats-a-guide-to-apache-iceberg-hudi-and-delta-lake/index.html b/content/blog/2024/10/23/mastering-open-table-formats-a-guide-to-apache-iceberg-hudi-and-delta-lake/index.html index 1d17cd8ecce3e..9df9ee05b1395 100644 --- a/content/blog/2024/10/23/mastering-open-table-formats-a-guide-to-apache-iceberg-hudi-and-delta-lake/index.html +++ b/content/blog/2024/10/23/mastering-open-table-formats-a-guide-to-apache-iceberg-hudi-and-delta-lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/10/26/moving-large-tables-from-snowflake-to-s3-using-the-copy-into-command-and-hudi/index.html b/content/blog/2024/10/26/moving-large-tables-from-snowflake-to-s3-using-the-copy-into-command-and-hudi/index.html index a1bbfedb25dc5..9cf42efa490a3 100644 --- a/content/blog/2024/10/26/moving-large-tables-from-snowflake-to-s3-using-the-copy-into-command-and-hudi/index.html +++ b/content/blog/2024/10/26/moving-large-tables-from-snowflake-to-s3-using-the-copy-into-command-and-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/10/27/I-spent-5-hours-exploring-the-story-behind-Apache-Hudi/index.html b/content/blog/2024/10/27/I-spent-5-hours-exploring-the-story-behind-Apache-Hudi/index.html index 5a952c0e468bd..dac82cdd83d21 100644 --- a/content/blog/2024/10/27/I-spent-5-hours-exploring-the-story-behind-Apache-Hudi/index.html +++ b/content/blog/2024/10/27/I-spent-5-hours-exploring-the-story-behind-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/11/12/record-level-indexing-in-apache-hudi/index.html b/content/blog/2024/11/12/record-level-indexing-in-apache-hudi/index.html index 162b0f94c7e4e..a175234c66ee3 100644 --- a/content/blog/2024/11/12/record-level-indexing-in-apache-hudi/index.html +++ b/content/blog/2024/11/12/record-level-indexing-in-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/11/12/storing-200-billion-entities-notions/index.html b/content/blog/2024/11/12/storing-200-billion-entities-notions/index.html index f165080235fa9..322d47132dcd4 100644 --- a/content/blog/2024/11/12/storing-200-billion-entities-notions/index.html +++ b/content/blog/2024/11/12/storing-200-billion-entities-notions/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/11/12/understanding-cow-and-mor-in-apache-hudi/index.html b/content/blog/2024/11/12/understanding-cow-and-mor-in-apache-hudi/index.html index 7dcddf0f71f84..349f47d85a90a 100644 --- a/content/blog/2024/11/12/understanding-cow-and-mor-in-apache-hudi/index.html +++ b/content/blog/2024/11/12/understanding-cow-and-mor-in-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/11/19/automated-small-file-handling/index.html b/content/blog/2024/11/19/automated-small-file-handling/index.html index f2bb33dd98aaf..390997ab51a3c 100644 --- a/content/blog/2024/11/19/automated-small-file-handling/index.html +++ b/content/blog/2024/11/19/automated-small-file-handling/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/12/06/non-blocking-concurrency-control/index.html b/content/blog/2024/12/06/non-blocking-concurrency-control/index.html index 51b6e517fc84e..be8ba62b5013b 100644 --- a/content/blog/2024/12/06/non-blocking-concurrency-control/index.html +++ b/content/blog/2024/12/06/non-blocking-concurrency-control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/12/16/announcing-hudi-1-0-0/index.html b/content/blog/2024/12/16/announcing-hudi-1-0-0/index.html index 3970c697082e2..c1ad724cc3f72 100644 --- a/content/blog/2024/12/16/announcing-hudi-1-0-0/index.html +++ b/content/blog/2024/12/16/announcing-hudi-1-0-0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/2024/12/29/apache-hudi-2024-a-year-in-review/index.html b/content/blog/2024/12/29/apache-hudi-2024-a-year-in-review/index.html index 6265fabe327c7..1433ab5f59980 100644 --- a/content/blog/2024/12/29/apache-hudi-2024-a-year-in-review/index.html +++ b/content/blog/2024/12/29/apache-hudi-2024-a-year-in-review/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/archive/index.html b/content/blog/archive/index.html index eaaa804b64130..911c4bde11176 100644 --- a/content/blog/archive/index.html +++ b/content/blog/archive/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/index.html b/content/blog/index.html index cf40424d8b094..18e16c831f597 100644 --- a/content/blog/index.html +++ b/content/blog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/10/index.html b/content/blog/page/10/index.html index e9483a00eb728..87a37fa4d05e4 100644 --- a/content/blog/page/10/index.html +++ b/content/blog/page/10/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/11/index.html b/content/blog/page/11/index.html index 835a869aa1889..6519b43a3c52c 100644 --- a/content/blog/page/11/index.html +++ b/content/blog/page/11/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/12/index.html b/content/blog/page/12/index.html index c765cde482eab..30e9fea595d43 100644 --- a/content/blog/page/12/index.html +++ b/content/blog/page/12/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/13/index.html b/content/blog/page/13/index.html index c7e2ffab0b72a..679c96b357fba 100644 --- a/content/blog/page/13/index.html +++ b/content/blog/page/13/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/14/index.html b/content/blog/page/14/index.html index 8ae4e6a908015..e9346598a44e0 100644 --- a/content/blog/page/14/index.html +++ b/content/blog/page/14/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/15/index.html b/content/blog/page/15/index.html index b8f8360dc08a7..58a1e48fa8263 100644 --- a/content/blog/page/15/index.html +++ b/content/blog/page/15/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/16/index.html b/content/blog/page/16/index.html index a5df1b9f09a72..87ecfda4bce84 100644 --- a/content/blog/page/16/index.html +++ b/content/blog/page/16/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/17/index.html b/content/blog/page/17/index.html index 1ee5f4a3e26dd..0b9222b7e9bd7 100644 --- a/content/blog/page/17/index.html +++ b/content/blog/page/17/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/18/index.html b/content/blog/page/18/index.html index 2b7175855ed3b..ea2c5a0dc7f3a 100644 --- a/content/blog/page/18/index.html +++ b/content/blog/page/18/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/19/index.html b/content/blog/page/19/index.html index 7e5f676ba5c3f..8936113d1b4b5 100644 --- a/content/blog/page/19/index.html +++ b/content/blog/page/19/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/2/index.html b/content/blog/page/2/index.html index 3cac668167129..2160807a2bd25 100644 --- a/content/blog/page/2/index.html +++ b/content/blog/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/20/index.html b/content/blog/page/20/index.html index 2fb459d46af2d..ba9ce6fa13ab4 100644 --- a/content/blog/page/20/index.html +++ b/content/blog/page/20/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/21/index.html b/content/blog/page/21/index.html index 7cdc4fc3701b8..08c075970c7df 100644 --- a/content/blog/page/21/index.html +++ b/content/blog/page/21/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/3/index.html b/content/blog/page/3/index.html index 730121924ef27..e273cb0c04a28 100644 --- a/content/blog/page/3/index.html +++ b/content/blog/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/4/index.html b/content/blog/page/4/index.html index dc39a1d125505..e5c355baa8230 100644 --- a/content/blog/page/4/index.html +++ b/content/blog/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/5/index.html b/content/blog/page/5/index.html index 91fbfb5ca2769..86a3584e43c20 100644 --- a/content/blog/page/5/index.html +++ b/content/blog/page/5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/6/index.html b/content/blog/page/6/index.html index 2a0026ea6f5cb..ace5d77da92c6 100644 --- a/content/blog/page/6/index.html +++ b/content/blog/page/6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/7/index.html b/content/blog/page/7/index.html index b8102be265495..26259f621e268 100644 --- a/content/blog/page/7/index.html +++ b/content/blog/page/7/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/8/index.html b/content/blog/page/8/index.html index 34d021bae7d05..18a84972ba353 100644 --- a/content/blog/page/8/index.html +++ b/content/blog/page/8/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/page/9/index.html b/content/blog/page/9/index.html index fe1be2257c52f..5ed6dc2074a8e 100644 --- a/content/blog/page/9/index.html +++ b/content/blog/page/9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/streaming-data-lake-platform/index.html b/content/blog/streaming-data-lake-platform/index.html index b207a69b5461e..bb4710fc92d28 100644 --- a/content/blog/streaming-data-lake-platform/index.html +++ b/content/blog/streaming-data-lake-platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/access-control/index.html b/content/blog/tags/access-control/index.html index 68fa0e1dd32bd..9fd0cf01aeefb 100644 --- a/content/blog/tags/access-control/index.html +++ b/content/blog/tags/access-control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/acid/index.html b/content/blog/tags/acid/index.html index 0ab78818f2145..c8742b0d2fa74 100644 --- a/content/blog/tags/acid/index.html +++ b/content/blog/tags/acid/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/active-timeline/index.html b/content/blog/tags/active-timeline/index.html index 73e5623468553..84291f147a572 100644 --- a/content/blog/tags/active-timeline/index.html +++ b/content/blog/tags/active-timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/airbyte/index.html b/content/blog/tags/airbyte/index.html index 9676de920e685..5e6537c8d7015 100644 --- a/content/blog/tags/airbyte/index.html +++ b/content/blog/tags/airbyte/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/alibabacloud/index.html b/content/blog/tags/alibabacloud/index.html index 1a3220a58fadd..d6a5baaa092a8 100644 --- a/content/blog/tags/alibabacloud/index.html +++ b/content/blog/tags/alibabacloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/amazon-athena/index.html b/content/blog/tags/amazon-athena/index.html index 6b2c5c70d1217..a40224683aed5 100644 --- a/content/blog/tags/amazon-athena/index.html +++ b/content/blog/tags/amazon-athena/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/amazon-dynamodb/index.html b/content/blog/tags/amazon-dynamodb/index.html index 86b8574ecb325..3c3a92151f59a 100644 --- a/content/blog/tags/amazon-dynamodb/index.html +++ b/content/blog/tags/amazon-dynamodb/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/amazon-eks/index.html b/content/blog/tags/amazon-eks/index.html index 4fe06c7c9a3d9..9075b0f212e9f 100644 --- a/content/blog/tags/amazon-eks/index.html +++ b/content/blog/tags/amazon-eks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/amazon-emr/index.html b/content/blog/tags/amazon-emr/index.html index 843f7ed11eb3e..4adfc75ddb088 100644 --- a/content/blog/tags/amazon-emr/index.html +++ b/content/blog/tags/amazon-emr/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/amazon-kinesis/index.html b/content/blog/tags/amazon-kinesis/index.html index bf17fa5cb1a30..6a2680cff6abf 100644 --- a/content/blog/tags/amazon-kinesis/index.html +++ b/content/blog/tags/amazon-kinesis/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/amazon-mks/index.html b/content/blog/tags/amazon-mks/index.html index 0722ee7deb6b6..1dfca8c4521a5 100644 --- a/content/blog/tags/amazon-mks/index.html +++ b/content/blog/tags/amazon-mks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/amazon-rds/index.html b/content/blog/tags/amazon-rds/index.html index d462e5d3b6642..7ca69a046ff57 100644 --- a/content/blog/tags/amazon-rds/index.html +++ b/content/blog/tags/amazon-rds/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/amazon-redshift/index.html b/content/blog/tags/amazon-redshift/index.html index e7c4ec61b541d..13ff15ed5fc40 100644 --- a/content/blog/tags/amazon-redshift/index.html +++ b/content/blog/tags/amazon-redshift/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/amazon-s-3/index.html b/content/blog/tags/amazon-s-3/index.html index 38a22ecaa06c9..0f5878d1da0a8 100644 --- a/content/blog/tags/amazon-s-3/index.html +++ b/content/blog/tags/amazon-s-3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/amazon-sagemaker/index.html b/content/blog/tags/amazon-sagemaker/index.html index 01b1753bd1b08..4ce86f7e45d6b 100644 --- a/content/blog/tags/amazon-sagemaker/index.html +++ b/content/blog/tags/amazon-sagemaker/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/amazon-spark/index.html b/content/blog/tags/amazon-spark/index.html index 0d6335b1cec47..cb26e88e77ee1 100644 --- a/content/blog/tags/amazon-spark/index.html +++ b/content/blog/tags/amazon-spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/amazon/index.html b/content/blog/tags/amazon/index.html index bd3449f06757b..8cd8a4966b80f 100644 --- a/content/blog/tags/amazon/index.html +++ b/content/blog/tags/amazon/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/amazon/page/2/index.html b/content/blog/tags/amazon/page/2/index.html index cf7a97386d0a8..7361c1515adc4 100644 --- a/content/blog/tags/amazon/page/2/index.html +++ b/content/blog/tags/amazon/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/amazon/page/3/index.html b/content/blog/tags/amazon/page/3/index.html index 954ae1df194f9..2ff65eed3d38d 100644 --- a/content/blog/tags/amazon/page/3/index.html +++ b/content/blog/tags/amazon/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/analytics-at-scale/index.html b/content/blog/tags/analytics-at-scale/index.html index 69ae53d811a5c..3279b3adf1336 100644 --- a/content/blog/tags/analytics-at-scale/index.html +++ b/content/blog/tags/analytics-at-scale/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/analyticsinsight/index.html b/content/blog/tags/analyticsinsight/index.html index ea43bbcaf6f74..a53aa80f4a070 100644 --- a/content/blog/tags/analyticsinsight/index.html +++ b/content/blog/tags/analyticsinsight/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/antstack/index.html b/content/blog/tags/antstack/index.html index 1ccc6ae97f936..0b006a0841f78 100644 --- a/content/blog/tags/antstack/index.html +++ b/content/blog/tags/antstack/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-avro/index.html b/content/blog/tags/apache-avro/index.html index 60305c266adcb..d25f6805d5b9e 100644 --- a/content/blog/tags/apache-avro/index.html +++ b/content/blog/tags/apache-avro/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-dolphin-scheduler/index.html b/content/blog/tags/apache-dolphin-scheduler/index.html index cfa89d195c6c3..1219a4df8bbb1 100644 --- a/content/blog/tags/apache-dolphin-scheduler/index.html +++ b/content/blog/tags/apache-dolphin-scheduler/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-doris/index.html b/content/blog/tags/apache-doris/index.html index 02ed2634c87db..5a8b8fee651d4 100644 --- a/content/blog/tags/apache-doris/index.html +++ b/content/blog/tags/apache-doris/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-flink/index.html b/content/blog/tags/apache-flink/index.html index 57cec0763cda8..1a2a9bb91c0a5 100644 --- a/content/blog/tags/apache-flink/index.html +++ b/content/blog/tags/apache-flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-hive/index.html b/content/blog/tags/apache-hive/index.html index b8bcf63cacc72..99de7328ecaa3 100644 --- a/content/blog/tags/apache-hive/index.html +++ b/content/blog/tags/apache-hive/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-hudi-blogs/index.html b/content/blog/tags/apache-hudi-blogs/index.html index 11c5b395054fb..eb0f8b9161920 100644 --- a/content/blog/tags/apache-hudi-blogs/index.html +++ b/content/blog/tags/apache-hudi-blogs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-hudi/index.html b/content/blog/tags/apache-hudi/index.html index 8444199e4c3f9..9c786c3c84de7 100644 --- a/content/blog/tags/apache-hudi/index.html +++ b/content/blog/tags/apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-hudi/page/10/index.html b/content/blog/tags/apache-hudi/page/10/index.html index 79d39fb29185f..94a212abc5e60 100644 --- a/content/blog/tags/apache-hudi/page/10/index.html +++ b/content/blog/tags/apache-hudi/page/10/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-hudi/page/11/index.html b/content/blog/tags/apache-hudi/page/11/index.html index 9e45c8cab6d90..f089ad9b787d1 100644 --- a/content/blog/tags/apache-hudi/page/11/index.html +++ b/content/blog/tags/apache-hudi/page/11/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-hudi/page/12/index.html b/content/blog/tags/apache-hudi/page/12/index.html index b8e47dccdcee2..56efcb092bb51 100644 --- a/content/blog/tags/apache-hudi/page/12/index.html +++ b/content/blog/tags/apache-hudi/page/12/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-hudi/page/2/index.html b/content/blog/tags/apache-hudi/page/2/index.html index b888462c62055..6f3a8fa1868e0 100644 --- a/content/blog/tags/apache-hudi/page/2/index.html +++ b/content/blog/tags/apache-hudi/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-hudi/page/3/index.html b/content/blog/tags/apache-hudi/page/3/index.html index bc58eae5c2110..c1aa61da1400a 100644 --- a/content/blog/tags/apache-hudi/page/3/index.html +++ b/content/blog/tags/apache-hudi/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-hudi/page/4/index.html b/content/blog/tags/apache-hudi/page/4/index.html index 2fa9a3c4f050a..9bd6fa0a17e0a 100644 --- a/content/blog/tags/apache-hudi/page/4/index.html +++ b/content/blog/tags/apache-hudi/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-hudi/page/5/index.html b/content/blog/tags/apache-hudi/page/5/index.html index 8233960f88bb5..b72acaab93fb8 100644 --- a/content/blog/tags/apache-hudi/page/5/index.html +++ b/content/blog/tags/apache-hudi/page/5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-hudi/page/6/index.html b/content/blog/tags/apache-hudi/page/6/index.html index 43995d14d52cd..b053d3549aef3 100644 --- a/content/blog/tags/apache-hudi/page/6/index.html +++ b/content/blog/tags/apache-hudi/page/6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-hudi/page/7/index.html b/content/blog/tags/apache-hudi/page/7/index.html index 7d24bc7dd0af6..7e4180150263c 100644 --- a/content/blog/tags/apache-hudi/page/7/index.html +++ b/content/blog/tags/apache-hudi/page/7/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-hudi/page/8/index.html b/content/blog/tags/apache-hudi/page/8/index.html index 163ee40d97697..d87bb1c3cd6cf 100644 --- a/content/blog/tags/apache-hudi/page/8/index.html +++ b/content/blog/tags/apache-hudi/page/8/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-hudi/page/9/index.html b/content/blog/tags/apache-hudi/page/9/index.html index 9d589383b816b..6ad8570694fb6 100644 --- a/content/blog/tags/apache-hudi/page/9/index.html +++ b/content/blog/tags/apache-hudi/page/9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-iceberg/index.html b/content/blog/tags/apache-iceberg/index.html index 049d29a16f33e..cd8aff000c542 100644 --- a/content/blog/tags/apache-iceberg/index.html +++ b/content/blog/tags/apache-iceberg/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-kafka/index.html b/content/blog/tags/apache-kafka/index.html index 1eea074e0a85a..336824743ebf5 100644 --- a/content/blog/tags/apache-kafka/index.html +++ b/content/blog/tags/apache-kafka/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-orc/index.html b/content/blog/tags/apache-orc/index.html index d71b0303c6b7e..3cfb356d83314 100644 --- a/content/blog/tags/apache-orc/index.html +++ b/content/blog/tags/apache-orc/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-parquet/index.html b/content/blog/tags/apache-parquet/index.html index 1506d67b05b58..2a2f99ef24006 100644 --- a/content/blog/tags/apache-parquet/index.html +++ b/content/blog/tags/apache-parquet/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-spark/index.html b/content/blog/tags/apache-spark/index.html index 798c4db55ea97..5846e46d38cf9 100644 --- a/content/blog/tags/apache-spark/index.html +++ b/content/blog/tags/apache-spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-spark/page/2/index.html b/content/blog/tags/apache-spark/page/2/index.html index eb8de19fa5501..5e8b7a939d1f3 100644 --- a/content/blog/tags/apache-spark/page/2/index.html +++ b/content/blog/tags/apache-spark/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache-zeppelin/index.html b/content/blog/tags/apache-zeppelin/index.html index 5b89c46ad68ec..e62a6b1f647e1 100644 --- a/content/blog/tags/apache-zeppelin/index.html +++ b/content/blog/tags/apache-zeppelin/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apache/index.html b/content/blog/tags/apache/index.html index 291b7465b4634..a07b364c7f33c 100644 --- a/content/blog/tags/apache/index.html +++ b/content/blog/tags/apache/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apcache-spark/index.html b/content/blog/tags/apcache-spark/index.html index 98c9ef4c095c5..17dddc07cf6f3 100644 --- a/content/blog/tags/apcache-spark/index.html +++ b/content/blog/tags/apcache-spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/apicurio-registry/index.html b/content/blog/tags/apicurio-registry/index.html index 9bff113e1b697..a07d4ad9b1758 100644 --- a/content/blog/tags/apicurio-registry/index.html +++ b/content/blog/tags/apicurio-registry/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/architecture/index.html b/content/blog/tags/architecture/index.html index 8e94361d715db..66912ae0223e9 100644 --- a/content/blog/tags/architecture/index.html +++ b/content/blog/tags/architecture/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/archival-timeline/index.html b/content/blog/tags/archival-timeline/index.html index 65da37e374bf2..91227dd739b07 100644 --- a/content/blog/tags/archival-timeline/index.html +++ b/content/blog/tags/archival-timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/async-indexing/index.html b/content/blog/tags/async-indexing/index.html index df317e73bad62..67d2c31b64245 100644 --- a/content/blog/tags/async-indexing/index.html +++ b/content/blog/tags/async-indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/athena/index.html b/content/blog/tags/athena/index.html index 2c0d8d361bc2f..c2304d6a3b247 100644 --- a/content/blog/tags/athena/index.html +++ b/content/blog/tags/athena/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/aws-athena/index.html b/content/blog/tags/aws-athena/index.html index 813f454f64324..0cdbb458c45c6 100644 --- a/content/blog/tags/aws-athena/index.html +++ b/content/blog/tags/aws-athena/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/aws-cloud-9/index.html b/content/blog/tags/aws-cloud-9/index.html index 1b6ff6dfb3eb1..db79a6268a539 100644 --- a/content/blog/tags/aws-cloud-9/index.html +++ b/content/blog/tags/aws-cloud-9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/aws-data-exchange/index.html b/content/blog/tags/aws-data-exchange/index.html index 4f6ca2606afce..c938f84e0e545 100644 --- a/content/blog/tags/aws-data-exchange/index.html +++ b/content/blog/tags/aws-data-exchange/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/aws-emr/index.html b/content/blog/tags/aws-emr/index.html index 4e504c1ba436e..11865058adaaf 100644 --- a/content/blog/tags/aws-emr/index.html +++ b/content/blog/tags/aws-emr/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/aws-glue-crawlers/index.html b/content/blog/tags/aws-glue-crawlers/index.html index 3f0496b8928ab..e59e8957563f4 100644 --- a/content/blog/tags/aws-glue-crawlers/index.html +++ b/content/blog/tags/aws-glue-crawlers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/aws-glue/index.html b/content/blog/tags/aws-glue/index.html index 0e039e4fb7e76..e4f083986fe0c 100644 --- a/content/blog/tags/aws-glue/index.html +++ b/content/blog/tags/aws-glue/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/aws-glue/page/2/index.html b/content/blog/tags/aws-glue/page/2/index.html index cab3292e74b53..1b25c427d8d74 100644 --- a/content/blog/tags/aws-glue/page/2/index.html +++ b/content/blog/tags/aws-glue/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/aws-lake-formation/index.html b/content/blog/tags/aws-lake-formation/index.html index dac825a1d1f3e..ff1aa5271c557 100644 --- a/content/blog/tags/aws-lake-formation/index.html +++ b/content/blog/tags/aws-lake-formation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/aws-s-3/index.html b/content/blog/tags/aws-s-3/index.html index 8f1821d14d0ee..c8b5682057050 100644 --- a/content/blog/tags/aws-s-3/index.html +++ b/content/blog/tags/aws-s-3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/aws/index.html b/content/blog/tags/aws/index.html index 08d4aee72d284..13c0c15982ccc 100644 --- a/content/blog/tags/aws/index.html +++ b/content/blog/tags/aws/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/backfilling/index.html b/content/blog/tags/backfilling/index.html index 17e1e2ecfc8da..a31b1032b0f30 100644 --- a/content/blog/tags/backfilling/index.html +++ b/content/blog/tags/backfilling/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/beginner/index.html b/content/blog/tags/beginner/index.html index f445be55a7033..36190280c930a 100644 --- a/content/blog/tags/beginner/index.html +++ b/content/blog/tags/beginner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/beginner/page/2/index.html b/content/blog/tags/beginner/page/2/index.html index d9eda7c53babf..a4ed850ec6beb 100644 --- a/content/blog/tags/beginner/page/2/index.html +++ b/content/blog/tags/beginner/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/best-practices/index.html b/content/blog/tags/best-practices/index.html index 0cb5e74746d53..82b2ca51eedad 100644 --- a/content/blog/tags/best-practices/index.html +++ b/content/blog/tags/best-practices/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/big-data/index.html b/content/blog/tags/big-data/index.html index b471df5f35772..503b5473bdc35 100644 --- a/content/blog/tags/big-data/index.html +++ b/content/blog/tags/big-data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/bigdata/index.html b/content/blog/tags/bigdata/index.html index 3967fb2cf8e98..5b5879628e30e 100644 --- a/content/blog/tags/bigdata/index.html +++ b/content/blog/tags/bigdata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/blog/index.html b/content/blog/tags/blog/index.html index 92d49f5e9ae74..e399ecc36f0f3 100644 --- a/content/blog/tags/blog/index.html +++ b/content/blog/tags/blog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/blog/page/10/index.html b/content/blog/tags/blog/page/10/index.html index c616354bebdbc..23ca94b4b13fd 100644 --- a/content/blog/tags/blog/page/10/index.html +++ b/content/blog/tags/blog/page/10/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/blog/page/11/index.html b/content/blog/tags/blog/page/11/index.html index 5a8881a6bb2aa..9f3ed79480642 100644 --- a/content/blog/tags/blog/page/11/index.html +++ b/content/blog/tags/blog/page/11/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/blog/page/12/index.html b/content/blog/tags/blog/page/12/index.html index ca51600a1409a..93cbc633fef21 100644 --- a/content/blog/tags/blog/page/12/index.html +++ b/content/blog/tags/blog/page/12/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/blog/page/2/index.html b/content/blog/tags/blog/page/2/index.html index 3763b78c4c0f5..506dad54edc63 100644 --- a/content/blog/tags/blog/page/2/index.html +++ b/content/blog/tags/blog/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/blog/page/3/index.html b/content/blog/tags/blog/page/3/index.html index 3ccda63ab5798..389d43f921192 100644 --- a/content/blog/tags/blog/page/3/index.html +++ b/content/blog/tags/blog/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/blog/page/4/index.html b/content/blog/tags/blog/page/4/index.html index 3e6d07de0edef..4fc1c596b3317 100644 --- a/content/blog/tags/blog/page/4/index.html +++ b/content/blog/tags/blog/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/blog/page/5/index.html b/content/blog/tags/blog/page/5/index.html index 1384f6e25adcf..d7d025ce7070a 100644 --- a/content/blog/tags/blog/page/5/index.html +++ b/content/blog/tags/blog/page/5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/blog/page/6/index.html b/content/blog/tags/blog/page/6/index.html index efbe06c95faf6..8d52342c695cd 100644 --- a/content/blog/tags/blog/page/6/index.html +++ b/content/blog/tags/blog/page/6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/blog/page/7/index.html b/content/blog/tags/blog/page/7/index.html index 57f7560a2f299..2ab50a8583c9f 100644 --- a/content/blog/tags/blog/page/7/index.html +++ b/content/blog/tags/blog/page/7/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/blog/page/8/index.html b/content/blog/tags/blog/page/8/index.html index 0f15049e296c2..6cac71d4ed184 100644 --- a/content/blog/tags/blog/page/8/index.html +++ b/content/blog/tags/blog/page/8/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/blog/page/9/index.html b/content/blog/tags/blog/page/9/index.html index a482cbfdd672c..1d4b9f73e034e 100644 --- a/content/blog/tags/blog/page/9/index.html +++ b/content/blog/tags/blog/page/9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/bloom-index/index.html b/content/blog/tags/bloom-index/index.html index 6f116e52bbf21..3e7c1555013b6 100644 --- a/content/blog/tags/bloom-index/index.html +++ b/content/blog/tags/bloom-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/bloom/index.html b/content/blog/tags/bloom/index.html index 045cd5e8c81ae..4b03261dfc66f 100644 --- a/content/blog/tags/bloom/index.html +++ b/content/blog/tags/bloom/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/bootstrap/index.html b/content/blog/tags/bootstrap/index.html index f1490f926be65..d52a60d3e8c1b 100644 --- a/content/blog/tags/bootstrap/index.html +++ b/content/blog/tags/bootstrap/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/bucket-index/index.html b/content/blog/tags/bucket-index/index.html index 7a02daddcad60..efb6d9e66e102 100644 --- a/content/blog/tags/bucket-index/index.html +++ b/content/blog/tags/bucket-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/bulk-insert/index.html b/content/blog/tags/bulk-insert/index.html index 39f0ecf459480..d0215604ef542 100644 --- a/content/blog/tags/bulk-insert/index.html +++ b/content/blog/tags/bulk-insert/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/bytearray/index.html b/content/blog/tags/bytearray/index.html index 84c7d7b986a97..33cee728e25f9 100644 --- a/content/blog/tags/bytearray/index.html +++ b/content/blog/tags/bytearray/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/bytebytego/index.html b/content/blog/tags/bytebytego/index.html index 0d742d49de415..7b329f3297eb3 100644 --- a/content/blog/tags/bytebytego/index.html +++ b/content/blog/tags/bytebytego/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/caching/index.html b/content/blog/tags/caching/index.html index feea70fa8c075..70bf23b139310 100644 --- a/content/blog/tags/caching/index.html +++ b/content/blog/tags/caching/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/case-study/index.html b/content/blog/tags/case-study/index.html index d3ca18c119a71..98a3075f3aa53 100644 --- a/content/blog/tags/case-study/index.html +++ b/content/blog/tags/case-study/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/cdc/index.html b/content/blog/tags/cdc/index.html index dc3cbae63b49b..b6ee37bfcae01 100644 --- a/content/blog/tags/cdc/index.html +++ b/content/blog/tags/cdc/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/change-data-capture/index.html b/content/blog/tags/change-data-capture/index.html index 056c7c7bbf1d7..63cbc068c2cda 100644 --- a/content/blog/tags/change-data-capture/index.html +++ b/content/blog/tags/change-data-capture/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/cleaner/index.html b/content/blog/tags/cleaner/index.html index dbf2be146101c..7873703d9ca2e 100644 --- a/content/blog/tags/cleaner/index.html +++ b/content/blog/tags/cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/cleaning/index.html b/content/blog/tags/cleaning/index.html index 5a0714d8b8831..b04ca9cf11deb 100644 --- a/content/blog/tags/cleaning/index.html +++ b/content/blog/tags/cleaning/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/cloudthat/index.html b/content/blog/tags/cloudthat/index.html index 6781048ebe52a..7599746baa4d9 100644 --- a/content/blog/tags/cloudthat/index.html +++ b/content/blog/tags/cloudthat/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/clustering/index.html b/content/blog/tags/clustering/index.html index ed47c144da5cb..995195c4424c4 100644 --- a/content/blog/tags/clustering/index.html +++ b/content/blog/tags/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/code-sample/index.html b/content/blog/tags/code-sample/index.html index 6174407011c31..7793161220ef7 100644 --- a/content/blog/tags/code-sample/index.html +++ b/content/blog/tags/code-sample/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/commits/index.html b/content/blog/tags/commits/index.html index 6f8f6be7776c2..e1946ce73b7d7 100644 --- a/content/blog/tags/commits/index.html +++ b/content/blog/tags/commits/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/community/index.html b/content/blog/tags/community/index.html index f1351cdf9772e..3fe4e41ffc66d 100644 --- a/content/blog/tags/community/index.html +++ b/content/blog/tags/community/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/compaction/index.html b/content/blog/tags/compaction/index.html index eb786c965da03..60d80a1ecb362 100644 --- a/content/blog/tags/compaction/index.html +++ b/content/blog/tags/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/comparison/index.html b/content/blog/tags/comparison/index.html index 79c893b241933..e6d60a0198b93 100644 --- a/content/blog/tags/comparison/index.html +++ b/content/blog/tags/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/comparison/page/2/index.html b/content/blog/tags/comparison/page/2/index.html index eee12f6d3cfe1..aaaf011f0fc6a 100644 --- a/content/blog/tags/comparison/page/2/index.html +++ b/content/blog/tags/comparison/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/compression/index.html b/content/blog/tags/compression/index.html index 963491af81423..a5db7f7206f4a 100644 --- a/content/blog/tags/compression/index.html +++ b/content/blog/tags/compression/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/concurrency-control/index.html b/content/blog/tags/concurrency-control/index.html index f19f37fcf9f85..8e66c95bd77f1 100644 --- a/content/blog/tags/concurrency-control/index.html +++ b/content/blog/tags/concurrency-control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/concurrency/index.html b/content/blog/tags/concurrency/index.html index 8f02922a5dedb..004a754399d2b 100644 --- a/content/blog/tags/concurrency/index.html +++ b/content/blog/tags/concurrency/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/conference/index.html b/content/blog/tags/conference/index.html index 480b40c129189..5eacec9e1a807 100644 --- a/content/blog/tags/conference/index.html +++ b/content/blog/tags/conference/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/consistency/index.html b/content/blog/tags/consistency/index.html index eaf04b442ce54..161bb86e462c4 100644 --- a/content/blog/tags/consistency/index.html +++ b/content/blog/tags/consistency/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/cost-efficiency/index.html b/content/blog/tags/cost-efficiency/index.html index 6953d56c9f056..3833252ed37ae 100644 --- a/content/blog/tags/cost-efficiency/index.html +++ b/content/blog/tags/cost-efficiency/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/cost-optimization/index.html b/content/blog/tags/cost-optimization/index.html index bfa366ae24058..eed5d2da72bf2 100644 --- a/content/blog/tags/cost-optimization/index.html +++ b/content/blog/tags/cost-optimization/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/cost/index.html b/content/blog/tags/cost/index.html index 1eca6866feb74..a491dce399211 100644 --- a/content/blog/tags/cost/index.html +++ b/content/blog/tags/cost/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/cow/index.html b/content/blog/tags/cow/index.html index 9ee7645982e63..279d9d4d03b05 100644 --- a/content/blog/tags/cow/index.html +++ b/content/blog/tags/cow/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/daft/index.html b/content/blog/tags/daft/index.html index 3fb3edb0604b4..e04a6a228a44c 100644 --- a/content/blog/tags/daft/index.html +++ b/content/blog/tags/daft/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/data-lake/index.html b/content/blog/tags/data-lake/index.html index c0d3a8b06cd99..f39cbbd41ab11 100644 --- a/content/blog/tags/data-lake/index.html +++ b/content/blog/tags/data-lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/data-lakehouse/index.html b/content/blog/tags/data-lakehouse/index.html index c764178721d86..3939ba8165bfc 100644 --- a/content/blog/tags/data-lakehouse/index.html +++ b/content/blog/tags/data-lakehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/data-mesh/index.html b/content/blog/tags/data-mesh/index.html index 076a3865bc549..bcc9d506692aa 100644 --- a/content/blog/tags/data-mesh/index.html +++ b/content/blog/tags/data-mesh/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/data-platform/index.html b/content/blog/tags/data-platform/index.html index e677637499000..893300e8bf082 100644 --- a/content/blog/tags/data-platform/index.html +++ b/content/blog/tags/data-platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/data-processing/index.html b/content/blog/tags/data-processing/index.html index 966f6584558a8..eb22aea144f35 100644 --- a/content/blog/tags/data-processing/index.html +++ b/content/blog/tags/data-processing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/data-sahring/index.html b/content/blog/tags/data-sahring/index.html index 0309f7118783d..885e383bc1e76 100644 --- a/content/blog/tags/data-sahring/index.html +++ b/content/blog/tags/data-sahring/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/data-skipping/index.html b/content/blog/tags/data-skipping/index.html index 6bf1a53e81c83..b868fa51ea10f 100644 --- a/content/blog/tags/data-skipping/index.html +++ b/content/blog/tags/data-skipping/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/data-warehouse/index.html b/content/blog/tags/data-warehouse/index.html index 977f2de234690..72e0d2d936a4f 100644 --- a/content/blog/tags/data-warehouse/index.html +++ b/content/blog/tags/data-warehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/databricks/index.html b/content/blog/tags/databricks/index.html index 7c23a89cf893c..960188aac5141 100644 --- a/content/blog/tags/databricks/index.html +++ b/content/blog/tags/databricks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/datalake-platform/index.html b/content/blog/tags/datalake-platform/index.html index eebda7264abb3..bc01d59066615 100644 --- a/content/blog/tags/datalake-platform/index.html +++ b/content/blog/tags/datalake-platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/datalake/index.html b/content/blog/tags/datalake/index.html index 656916fd6486a..3f73d0b2ccf22 100644 --- a/content/blog/tags/datalake/index.html +++ b/content/blog/tags/datalake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/datumagic/index.html b/content/blog/tags/datumagic/index.html index 11b8aa0fdc671..2990a931e7e48 100644 --- a/content/blog/tags/datumagic/index.html +++ b/content/blog/tags/datumagic/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/dbta/index.html b/content/blog/tags/dbta/index.html index cb8195e2633e7..66bd3025e9c2a 100644 --- a/content/blog/tags/dbta/index.html +++ b/content/blog/tags/dbta/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/debezium/index.html b/content/blog/tags/debezium/index.html index 994a7d4332a96..71f2d1cf5b29d 100644 --- a/content/blog/tags/debezium/index.html +++ b/content/blog/tags/debezium/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/deep-dive/index.html b/content/blog/tags/deep-dive/index.html index d6ebb9b76afdf..a1fbc2b3964b2 100644 --- a/content/blog/tags/deep-dive/index.html +++ b/content/blog/tags/deep-dive/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/defogdata/index.html b/content/blog/tags/defogdata/index.html index e7be4967b8ab4..fabbcbe0a2ac1 100644 --- a/content/blog/tags/defogdata/index.html +++ b/content/blog/tags/defogdata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/delete-partition/index.html b/content/blog/tags/delete-partition/index.html index 72f46681fbe21..699c13b290524 100644 --- a/content/blog/tags/delete-partition/index.html +++ b/content/blog/tags/delete-partition/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/delete/index.html b/content/blog/tags/delete/index.html index 8f8d2a8b15014..dad0d17945619 100644 --- a/content/blog/tags/delete/index.html +++ b/content/blog/tags/delete/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/deletes/index.html b/content/blog/tags/deletes/index.html index 35f74134081b5..d5a377f44fd22 100644 --- a/content/blog/tags/deletes/index.html +++ b/content/blog/tags/deletes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/delta-lake/index.html b/content/blog/tags/delta-lake/index.html index 2f576b05f8449..b712f8434e77e 100644 --- a/content/blog/tags/delta-lake/index.html +++ b/content/blog/tags/delta-lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/delta-lake/page/2/index.html b/content/blog/tags/delta-lake/page/2/index.html index 36024caa32f78..b7f3d4cf05ddb 100644 --- a/content/blog/tags/delta-lake/page/2/index.html +++ b/content/blog/tags/delta-lake/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/delta/index.html b/content/blog/tags/delta/index.html index 89b1cab455fac..2552fd5e07e42 100644 --- a/content/blog/tags/delta/index.html +++ b/content/blog/tags/delta/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/deltastreamer/index.html b/content/blog/tags/deltastreamer/index.html index a2f900882de45..71e63416ee985 100644 --- a/content/blog/tags/deltastreamer/index.html +++ b/content/blog/tags/deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/deployment/index.html b/content/blog/tags/deployment/index.html index bc7760127c553..32a255cf6f900 100644 --- a/content/blog/tags/deployment/index.html +++ b/content/blog/tags/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/design/index.html b/content/blog/tags/design/index.html index 7be9dc3571f33..e763b5f66fedf 100644 --- a/content/blog/tags/design/index.html +++ b/content/blog/tags/design/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/design/page/2/index.html b/content/blog/tags/design/page/2/index.html index 285426eae2619..543418c8d39af 100644 --- a/content/blog/tags/design/page/2/index.html +++ b/content/blog/tags/design/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/det/index.html b/content/blog/tags/det/index.html index 945471eaba67d..e3a58bb0c8984 100644 --- a/content/blog/tags/det/index.html +++ b/content/blog/tags/det/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/dev-to/index.html b/content/blog/tags/dev-to/index.html index 246b7ad5cc351..32c141b669e4c 100644 --- a/content/blog/tags/dev-to/index.html +++ b/content/blog/tags/dev-to/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/developpaper/index.html b/content/blog/tags/developpaper/index.html index 43b20efbfcd22..32be8890ca9dd 100644 --- a/content/blog/tags/developpaper/index.html +++ b/content/blog/tags/developpaper/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/devgenius/index.html b/content/blog/tags/devgenius/index.html index 961f826307d9f..b5771d986ba2d 100644 --- a/content/blog/tags/devgenius/index.html +++ b/content/blog/tags/devgenius/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/diva-portal/index.html b/content/blog/tags/diva-portal/index.html index c581807ed8973..e7fd8a839e330 100644 --- a/content/blog/tags/diva-portal/index.html +++ b/content/blog/tags/diva-portal/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/docker/index.html b/content/blog/tags/docker/index.html index 99a4a682cd870..8056073da5218 100644 --- a/content/blog/tags/docker/index.html +++ b/content/blog/tags/docker/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/dremio/index.html b/content/blog/tags/dremio/index.html index fcc02a115c488..3a78b0301c02c 100644 --- a/content/blog/tags/dremio/index.html +++ b/content/blog/tags/dremio/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/dzone/index.html b/content/blog/tags/dzone/index.html index 57e9e6a59b232..dbddcfd4709a6 100644 --- a/content/blog/tags/dzone/index.html +++ b/content/blog/tags/dzone/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/etl/index.html b/content/blog/tags/etl/index.html index 09b09c4a0101e..d99427f350020 100644 --- a/content/blog/tags/etl/index.html +++ b/content/blog/tags/etl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/fast-api/index.html b/content/blog/tags/fast-api/index.html index cdc6df503f0be..c230bdf86d92b 100644 --- a/content/blog/tags/fast-api/index.html +++ b/content/blog/tags/fast-api/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/feature-store/index.html b/content/blog/tags/feature-store/index.html index ddb1a8bfb9c7b..3fcb0b9b8a893 100644 --- a/content/blog/tags/feature-store/index.html +++ b/content/blog/tags/feature-store/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/fiel-sizing/index.html b/content/blog/tags/fiel-sizing/index.html index 82999d68aa6c7..f770e788b72f6 100644 --- a/content/blog/tags/fiel-sizing/index.html +++ b/content/blog/tags/fiel-sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/file-sizing/index.html b/content/blog/tags/file-sizing/index.html index bb44aba8e5dca..aecd41dd3fa34 100644 --- a/content/blog/tags/file-sizing/index.html +++ b/content/blog/tags/file-sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/file-system-view/index.html b/content/blog/tags/file-system-view/index.html index 9d83d9dda9d88..63006a01d4061 100644 --- a/content/blog/tags/file-system-view/index.html +++ b/content/blog/tags/file-system-view/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/flink/index.html b/content/blog/tags/flink/index.html index b45cd800be09c..813b49d688fac 100644 --- a/content/blog/tags/flink/index.html +++ b/content/blog/tags/flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/forefathers/index.html b/content/blog/tags/forefathers/index.html index a809436ddb4b0..934744d3b2ae4 100644 --- a/content/blog/tags/forefathers/index.html +++ b/content/blog/tags/forefathers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/gdpr-deletion/index.html b/content/blog/tags/gdpr-deletion/index.html index 22d6a6bb87cf3..264db0a924a29 100644 --- a/content/blog/tags/gdpr-deletion/index.html +++ b/content/blog/tags/gdpr-deletion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/getting-started/index.html b/content/blog/tags/getting-started/index.html index 1061ffab942b4..d5018756ea912 100644 --- a/content/blog/tags/getting-started/index.html +++ b/content/blog/tags/getting-started/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/glue-crawler/index.html b/content/blog/tags/glue-crawler/index.html index 5e0da5ebb547f..225e73c63c5c2 100644 --- a/content/blog/tags/glue-crawler/index.html +++ b/content/blog/tags/glue-crawler/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/glue-studio/index.html b/content/blog/tags/glue-studio/index.html index d278d5e915c20..73267c5b8f9c1 100644 --- a/content/blog/tags/glue-studio/index.html +++ b/content/blog/tags/glue-studio/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/google-scholar/index.html b/content/blog/tags/google-scholar/index.html index acff59307169f..594afd86d134b 100644 --- a/content/blog/tags/google-scholar/index.html +++ b/content/blog/tags/google-scholar/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/grab/index.html b/content/blog/tags/grab/index.html index b223f561e02cb..53e59fdad22f8 100644 --- a/content/blog/tags/grab/index.html +++ b/content/blog/tags/grab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/grofers/index.html b/content/blog/tags/grofers/index.html index 79cc965880392..5e42d061c9d43 100644 --- a/content/blog/tags/grofers/index.html +++ b/content/blog/tags/grofers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/guide/index.html b/content/blog/tags/guide/index.html index 7b8e049497364..fa2f8c9af086b 100644 --- a/content/blog/tags/guide/index.html +++ b/content/blog/tags/guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/halodoc/index.html b/content/blog/tags/halodoc/index.html index c09d41445274e..3be5430d48075 100644 --- a/content/blog/tags/halodoc/index.html +++ b/content/blog/tags/halodoc/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/harshdaiya/index.html b/content/blog/tags/harshdaiya/index.html index 9c225581dd821..22aad0cb47fb2 100644 --- a/content/blog/tags/harshdaiya/index.html +++ b/content/blog/tags/harshdaiya/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/hbase-index/index.html b/content/blog/tags/hbase-index/index.html index 8b112a6ec4dd8..38acde7700016 100644 --- a/content/blog/tags/hbase-index/index.html +++ b/content/blog/tags/hbase-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/hive-metastore/index.html b/content/blog/tags/hive-metastore/index.html index 820fcfc1b42d2..9246febf608f3 100644 --- a/content/blog/tags/hive-metastore/index.html +++ b/content/blog/tags/hive-metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/hms/index.html b/content/blog/tags/hms/index.html index f70e416457376..054b7be718e7e 100644 --- a/content/blog/tags/hms/index.html +++ b/content/blog/tags/hms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/hopsworks/index.html b/content/blog/tags/hopsworks/index.html index d042ee3e7dcf9..3f64c226a6383 100644 --- a/content/blog/tags/hopsworks/index.html +++ b/content/blog/tags/hopsworks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/how-to/index.html b/content/blog/tags/how-to/index.html index f13b6ed8b9a75..254826b10c158 100644 --- a/content/blog/tags/how-to/index.html +++ b/content/blog/tags/how-to/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/how-to/page/2/index.html b/content/blog/tags/how-to/page/2/index.html index 38cf41ae5fac9..5a5928bf345ce 100644 --- a/content/blog/tags/how-to/page/2/index.html +++ b/content/blog/tags/how-to/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/how-to/page/3/index.html b/content/blog/tags/how-to/page/3/index.html index 8bbb13bd2161d..6ec3034f94c7f 100644 --- a/content/blog/tags/how-to/page/3/index.html +++ b/content/blog/tags/how-to/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/how-to/page/4/index.html b/content/blog/tags/how-to/page/4/index.html index c03ff3bd4e31e..75dec482f652d 100644 --- a/content/blog/tags/how-to/page/4/index.html +++ b/content/blog/tags/how-to/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/how-to/page/5/index.html b/content/blog/tags/how-to/page/5/index.html index 3aa02ff5a9e61..26a8ab1805164 100644 --- a/content/blog/tags/how-to/page/5/index.html +++ b/content/blog/tags/how-to/page/5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/hudi-cli/index.html b/content/blog/tags/hudi-cli/index.html index d6e46982db4a4..bdee8774bfb03 100644 --- a/content/blog/tags/hudi-cli/index.html +++ b/content/blog/tags/hudi-cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/hudi-streamer/index.html b/content/blog/tags/hudi-streamer/index.html index 489cd818ce278..a7335009c373c 100644 --- a/content/blog/tags/hudi-streamer/index.html +++ b/content/blog/tags/hudi-streamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/hudi/index.html b/content/blog/tags/hudi/index.html index 06a04f696a944..6a1e1d33cd667 100644 --- a/content/blog/tags/hudi/index.html +++ b/content/blog/tags/hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/iceberg/index.html b/content/blog/tags/iceberg/index.html index 5b69c3c87574c..d051c2c05accf 100644 --- a/content/blog/tags/iceberg/index.html +++ b/content/blog/tags/iceberg/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/incremental-etl/index.html b/content/blog/tags/incremental-etl/index.html index 1e70b9e434aa9..efe2a38267111 100644 --- a/content/blog/tags/incremental-etl/index.html +++ b/content/blog/tags/incremental-etl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/incremental-processing/index.html b/content/blog/tags/incremental-processing/index.html index fc43d56f82d86..a67cd1ac0e8fc 100644 --- a/content/blog/tags/incremental-processing/index.html +++ b/content/blog/tags/incremental-processing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/incremental-processing/page/2/index.html b/content/blog/tags/incremental-processing/page/2/index.html index db778b910cc1d..7cdd8da41dbf9 100644 --- a/content/blog/tags/incremental-processing/page/2/index.html +++ b/content/blog/tags/incremental-processing/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/incremental-query/index.html b/content/blog/tags/incremental-query/index.html index b5242e17bb423..3c1ac169456b6 100644 --- a/content/blog/tags/incremental-query/index.html +++ b/content/blog/tags/incremental-query/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/incremental-updates/index.html b/content/blog/tags/incremental-updates/index.html index 73eeee0f62801..95b8e4d0f70fc 100644 --- a/content/blog/tags/incremental-updates/index.html +++ b/content/blog/tags/incremental-updates/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/index.html b/content/blog/tags/index.html index 8ad1427b15084..ac1ec4949fc60 100644 --- a/content/blog/tags/index.html +++ b/content/blog/tags/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/indexing/index.html b/content/blog/tags/indexing/index.html index 77971cf21666d..610abeff54d10 100644 --- a/content/blog/tags/indexing/index.html +++ b/content/blog/tags/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/inserts/index.html b/content/blog/tags/inserts/index.html index f103726a46c0c..5bb27870cc3ea 100644 --- a/content/blog/tags/inserts/index.html +++ b/content/blog/tags/inserts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/intermediate/index.html b/content/blog/tags/intermediate/index.html index 1de876502da3f..a662186742237 100644 --- a/content/blog/tags/intermediate/index.html +++ b/content/blog/tags/intermediate/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/interoperability/index.html b/content/blog/tags/interoperability/index.html index 70e1cdac5b781..ecd537ca1c2f7 100644 --- a/content/blog/tags/interoperability/index.html +++ b/content/blog/tags/interoperability/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/introduction/index.html b/content/blog/tags/introduction/index.html index 93281946d542a..9ebeb8b3d4859 100644 --- a/content/blog/tags/introduction/index.html +++ b/content/blog/tags/introduction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/itnext/index.html b/content/blog/tags/itnext/index.html index e863f89568a0d..968eee046da51 100644 --- a/content/blog/tags/itnext/index.html +++ b/content/blog/tags/itnext/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/jack-vanlightly/index.html b/content/blog/tags/jack-vanlightly/index.html index abb184174ccba..24c3c40fb4f5e 100644 --- a/content/blog/tags/jack-vanlightly/index.html +++ b/content/blog/tags/jack-vanlightly/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/kafka-connect/index.html b/content/blog/tags/kafka-connect/index.html index 164a0973c314e..967d117feb8b9 100644 --- a/content/blog/tags/kafka-connect/index.html +++ b/content/blog/tags/kafka-connect/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/key-generators/index.html b/content/blog/tags/key-generators/index.html index 0036484894ad6..8f3184e735bf8 100644 --- a/content/blog/tags/key-generators/index.html +++ b/content/blog/tags/key-generators/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/lakefs/index.html b/content/blog/tags/lakefs/index.html index da6777e9febf9..6d16b3fe2a9d1 100644 --- a/content/blog/tags/lakefs/index.html +++ b/content/blog/tags/lakefs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/lakehouse/index.html b/content/blog/tags/lakehouse/index.html index 36f7ea84b22d8..f18613402470f 100644 --- a/content/blog/tags/lakehouse/index.html +++ b/content/blog/tags/lakehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/leboncoin-tech-blog/index.html b/content/blog/tags/leboncoin-tech-blog/index.html index e3ca512765efb..518d26fee5388 100644 --- a/content/blog/tags/leboncoin-tech-blog/index.html +++ b/content/blog/tags/leboncoin-tech-blog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/linkedin/index.html b/content/blog/tags/linkedin/index.html index d401b2a6a7e89..bbad035bf06cb 100644 --- a/content/blog/tags/linkedin/index.html +++ b/content/blog/tags/linkedin/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/linkedin/page/2/index.html b/content/blog/tags/linkedin/page/2/index.html index 8b32c7f02cdf1..615a2b57fcd97 100644 --- a/content/blog/tags/linkedin/page/2/index.html +++ b/content/blog/tags/linkedin/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/lock-provider/index.html b/content/blog/tags/lock-provider/index.html index 2e87f442104b9..3966f662f14b1 100644 --- a/content/blog/tags/lock-provider/index.html +++ b/content/blog/tags/lock-provider/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/logicalclocks/index.html b/content/blog/tags/logicalclocks/index.html index 2e0477679daa5..04c7308172906 100644 --- a/content/blog/tags/logicalclocks/index.html +++ b/content/blog/tags/logicalclocks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/markers/index.html b/content/blog/tags/markers/index.html index d3170db6ae852..4bfb8ecd0b1e8 100644 --- a/content/blog/tags/markers/index.html +++ b/content/blog/tags/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/medallion-architecture/index.html b/content/blog/tags/medallion-architecture/index.html index 67e99cfa6f1f7..b25a982d5c0ed 100644 --- a/content/blog/tags/medallion-architecture/index.html +++ b/content/blog/tags/medallion-architecture/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/medium/index.html b/content/blog/tags/medium/index.html index bf2f86b2f64a5..c901016b1ffab 100644 --- a/content/blog/tags/medium/index.html +++ b/content/blog/tags/medium/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/medium/page/2/index.html b/content/blog/tags/medium/page/2/index.html index 0456859930fbc..de30b80e43687 100644 --- a/content/blog/tags/medium/page/2/index.html +++ b/content/blog/tags/medium/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/medium/page/3/index.html b/content/blog/tags/medium/page/3/index.html index 3edb5ea59e782..e027860999010 100644 --- a/content/blog/tags/medium/page/3/index.html +++ b/content/blog/tags/medium/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/medium/page/4/index.html b/content/blog/tags/medium/page/4/index.html index 579c23080359a..95e6c4682fece 100644 --- a/content/blog/tags/medium/page/4/index.html +++ b/content/blog/tags/medium/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/meetup/index.html b/content/blog/tags/meetup/index.html index 00863d14e4923..d270dca3259eb 100644 --- a/content/blog/tags/meetup/index.html +++ b/content/blog/tags/meetup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/metadata/index.html b/content/blog/tags/metadata/index.html index b764ea560e9ca..d26362406b699 100644 --- a/content/blog/tags/metadata/index.html +++ b/content/blog/tags/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/metafields/index.html b/content/blog/tags/metafields/index.html index 921d0f6887147..581efa82bd66e 100644 --- a/content/blog/tags/metafields/index.html +++ b/content/blog/tags/metafields/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/metrics/index.html b/content/blog/tags/metrics/index.html index 3376d2fbc27f0..56f33cdecb1ff 100644 --- a/content/blog/tags/metrics/index.html +++ b/content/blog/tags/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/migration/index.html b/content/blog/tags/migration/index.html index 49de034f4c6bd..64d4a35d40936 100644 --- a/content/blog/tags/migration/index.html +++ b/content/blog/tags/migration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/min/index.html b/content/blog/tags/min/index.html index eeb16eabb673b..ec75b05a3e6f0 100644 --- a/content/blog/tags/min/index.html +++ b/content/blog/tags/min/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/minio/index.html b/content/blog/tags/minio/index.html index 88a076d43fbe8..0d51397d06fd6 100644 --- a/content/blog/tags/minio/index.html +++ b/content/blog/tags/minio/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/mino/index.html b/content/blog/tags/mino/index.html index 4f15805296619..2c65ed48dd4a6 100644 --- a/content/blog/tags/mino/index.html +++ b/content/blog/tags/mino/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/mlops/index.html b/content/blog/tags/mlops/index.html index b65876d093014..44224433aeeaa 100644 --- a/content/blog/tags/mlops/index.html +++ b/content/blog/tags/mlops/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/modern-data-architecture/index.html b/content/blog/tags/modern-data-architecture/index.html index ca49db8b407ac..67f3d8abbec3b 100644 --- a/content/blog/tags/modern-data-architecture/index.html +++ b/content/blog/tags/modern-data-architecture/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/mongodb/index.html b/content/blog/tags/mongodb/index.html index af81535bb6e00..47cf23ff9db45 100644 --- a/content/blog/tags/mongodb/index.html +++ b/content/blog/tags/mongodb/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/monotonic-timestamp/index.html b/content/blog/tags/monotonic-timestamp/index.html index 34b3b97d9c1d3..692dcc487d892 100644 --- a/content/blog/tags/monotonic-timestamp/index.html +++ b/content/blog/tags/monotonic-timestamp/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/mor/index.html b/content/blog/tags/mor/index.html index b2d3e8a283c36..c30deb7ffa86e 100644 --- a/content/blog/tags/mor/index.html +++ b/content/blog/tags/mor/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/multi-deltastreamer/index.html b/content/blog/tags/multi-deltastreamer/index.html index e031b6f71703c..d96cbd23a1efc 100644 --- a/content/blog/tags/multi-deltastreamer/index.html +++ b/content/blog/tags/multi-deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/multi-modal-indexing/index.html b/content/blog/tags/multi-modal-indexing/index.html index caa76e034cd08..46fb1d15697f3 100644 --- a/content/blog/tags/multi-modal-indexing/index.html +++ b/content/blog/tags/multi-modal-indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/multi-writer/index.html b/content/blog/tags/multi-writer/index.html index 561d1e7b0d130..f3e8750e52a6d 100644 --- a/content/blog/tags/multi-writer/index.html +++ b/content/blog/tags/multi-writer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/near-real-time-analytics/index.html b/content/blog/tags/near-real-time-analytics/index.html index 6d517780442e3..e0bb496d7d69f 100644 --- a/content/blog/tags/near-real-time-analytics/index.html +++ b/content/blog/tags/near-real-time-analytics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/onehouse/index.html b/content/blog/tags/onehouse/index.html index 74a7a4aa38462..36a3b0ba55183 100644 --- a/content/blog/tags/onehouse/index.html +++ b/content/blog/tags/onehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/onehouse/page/2/index.html b/content/blog/tags/onehouse/page/2/index.html index ef4a8d77c7968..a41ab47229942 100644 --- a/content/blog/tags/onehouse/page/2/index.html +++ b/content/blog/tags/onehouse/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/open-architecture/index.html b/content/blog/tags/open-architecture/index.html index f1e3baa52a5e1..3957c44542afb 100644 --- a/content/blog/tags/open-architecture/index.html +++ b/content/blog/tags/open-architecture/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/opstree/index.html b/content/blog/tags/opstree/index.html index 7c532f721edb0..57a91c7be833e 100644 --- a/content/blog/tags/opstree/index.html +++ b/content/blog/tags/opstree/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/optimization/index.html b/content/blog/tags/optimization/index.html index 576df6c5e297f..31b9c0a96c504 100644 --- a/content/blog/tags/optimization/index.html +++ b/content/blog/tags/optimization/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/oreilly/index.html b/content/blog/tags/oreilly/index.html index 80bbeef2580d7..69ff4163e9f83 100644 --- a/content/blog/tags/oreilly/index.html +++ b/content/blog/tags/oreilly/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/partition/index.html b/content/blog/tags/partition/index.html index e8c5222e9d026..5739fbabaa0a6 100644 --- a/content/blog/tags/partition/index.html +++ b/content/blog/tags/partition/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/performance/index.html b/content/blog/tags/performance/index.html index 244bb29116023..14d7743414262 100644 --- a/content/blog/tags/performance/index.html +++ b/content/blog/tags/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/postgres/index.html b/content/blog/tags/postgres/index.html index 8e8daa43df44f..1044514fbe7e9 100644 --- a/content/blog/tags/postgres/index.html +++ b/content/blog/tags/postgres/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/postgresql/index.html b/content/blog/tags/postgresql/index.html index 0a975a5765b78..de0fae3d1bcb2 100644 --- a/content/blog/tags/postgresql/index.html +++ b/content/blog/tags/postgresql/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/presto/index.html b/content/blog/tags/presto/index.html index c972c149e6a89..7d28bbf6a29d6 100644 --- a/content/blog/tags/presto/index.html +++ b/content/blog/tags/presto/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/prestocon/index.html b/content/blog/tags/prestocon/index.html index edf99da1cb243..eaf883961af48 100644 --- a/content/blog/tags/prestocon/index.html +++ b/content/blog/tags/prestocon/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/prestodb/index.html b/content/blog/tags/prestodb/index.html index d20e9bd54d0e5..809a793e51ba8 100644 --- a/content/blog/tags/prestodb/index.html +++ b/content/blog/tags/prestodb/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/programmer/index.html b/content/blog/tags/programmer/index.html index d3df0b90b0fe8..39153428fbbee 100644 --- a/content/blog/tags/programmer/index.html +++ b/content/blog/tags/programmer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/pyspark/index.html b/content/blog/tags/pyspark/index.html index 1c978898337ab..5310412531bfc 100644 --- a/content/blog/tags/pyspark/index.html +++ b/content/blog/tags/pyspark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/python/index.html b/content/blog/tags/python/index.html index a111c410a3c56..32db3e4940257 100644 --- a/content/blog/tags/python/index.html +++ b/content/blog/tags/python/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/queries/index.html b/content/blog/tags/queries/index.html index 997c2e6d4b52d..ad5cf755560c8 100644 --- a/content/blog/tags/queries/index.html +++ b/content/blog/tags/queries/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/query-performance/index.html b/content/blog/tags/query-performance/index.html index d9393d8ccca70..132e383289136 100644 --- a/content/blog/tags/query-performance/index.html +++ b/content/blog/tags/query-performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/querying/index.html b/content/blog/tags/querying/index.html index 61de9e942b543..3924e18d73f40 100644 --- a/content/blog/tags/querying/index.html +++ b/content/blog/tags/querying/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/ray/index.html b/content/blog/tags/ray/index.html index 63f8c349fedc3..b29783fbc6847 100644 --- a/content/blog/tags/ray/index.html +++ b/content/blog/tags/ray/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/read-optimized-query/index.html b/content/blog/tags/read-optimized-query/index.html index 26d707932e931..a977e53850d31 100644 --- a/content/blog/tags/read-optimized-query/index.html +++ b/content/blog/tags/read-optimized-query/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/reads/index.html b/content/blog/tags/reads/index.html index 9f38388dfe8f6..1e618184b260e 100644 --- a/content/blog/tags/reads/index.html +++ b/content/blog/tags/reads/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/real-time-datalake/index.html b/content/blog/tags/real-time-datalake/index.html index 8e54e1d1df81d..6271ac9f81e9a 100644 --- a/content/blog/tags/real-time-datalake/index.html +++ b/content/blog/tags/real-time-datalake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/real-time-query/index.html b/content/blog/tags/real-time-query/index.html index aa8fbbcde35b3..a00835351a28d 100644 --- a/content/blog/tags/real-time-query/index.html +++ b/content/blog/tags/real-time-query/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/record-index/index.html b/content/blog/tags/record-index/index.html index bfbadcc457e00..0ad3b0451fa90 100644 --- a/content/blog/tags/record-index/index.html +++ b/content/blog/tags/record-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/record-level-index/index.html b/content/blog/tags/record-level-index/index.html index ad38de151945c..383f2c8caa799 100644 --- a/content/blog/tags/record-level-index/index.html +++ b/content/blog/tags/record-level-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/release/index.html b/content/blog/tags/release/index.html index bacffc0a8c56d..adce9e4e14a57 100644 --- a/content/blog/tags/release/index.html +++ b/content/blog/tags/release/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/risingwave/index.html b/content/blog/tags/risingwave/index.html index 952b838f61d1b..07c68683983dd 100644 --- a/content/blog/tags/risingwave/index.html +++ b/content/blog/tags/risingwave/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/robinhood/index.html b/content/blog/tags/robinhood/index.html index 0b7e35e4928a4..511f021ebb743 100644 --- a/content/blog/tags/robinhood/index.html +++ b/content/blog/tags/robinhood/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/rtinsights/index.html b/content/blog/tags/rtinsights/index.html index 9b0957bcab2d4..541d5ffeeb3b0 100644 --- a/content/blog/tags/rtinsights/index.html +++ b/content/blog/tags/rtinsights/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/scd-1/index.html b/content/blog/tags/scd-1/index.html index 06d3d6969e721..df1d413ac922a 100644 --- a/content/blog/tags/scd-1/index.html +++ b/content/blog/tags/scd-1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/scd-2/index.html b/content/blog/tags/scd-2/index.html index ddf295493966e..e33782501f1ac 100644 --- a/content/blog/tags/scd-2/index.html +++ b/content/blog/tags/scd-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/scd-3/index.html b/content/blog/tags/scd-3/index.html index 649d22ea43b6c..b57f92c7424dd 100644 --- a/content/blog/tags/scd-3/index.html +++ b/content/blog/tags/scd-3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/schema-evolution/index.html b/content/blog/tags/schema-evolution/index.html index 3ce6fb4764bb6..9ad5c69b6b67c 100644 --- a/content/blog/tags/schema-evolution/index.html +++ b/content/blog/tags/schema-evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/schema/index.html b/content/blog/tags/schema/index.html index 3d803310183de..674f0548e9aae 100644 --- a/content/blog/tags/schema/index.html +++ b/content/blog/tags/schema/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/selectfrom/index.html b/content/blog/tags/selectfrom/index.html index 2ac6bb51f351f..4325dfced663f 100644 --- a/content/blog/tags/selectfrom/index.html +++ b/content/blog/tags/selectfrom/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/snapshot-exporter/index.html b/content/blog/tags/snapshot-exporter/index.html index 6a75a21cbef72..f4b2d64bc4a04 100644 --- a/content/blog/tags/snapshot-exporter/index.html +++ b/content/blog/tags/snapshot-exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/snapshot-query/index.html b/content/blog/tags/snapshot-query/index.html index d7fbc2fad0650..0ba6756db3dea 100644 --- a/content/blog/tags/snapshot-query/index.html +++ b/content/blog/tags/snapshot-query/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/space-filling-curves/index.html b/content/blog/tags/space-filling-curves/index.html index 4d9576fe2daba..13dfc3caf1d7e 100644 --- a/content/blog/tags/space-filling-curves/index.html +++ b/content/blog/tags/space-filling-curves/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/spark-sql/index.html b/content/blog/tags/spark-sql/index.html index f9b8a06f29d59..ba07f11979aac 100644 --- a/content/blog/tags/spark-sql/index.html +++ b/content/blog/tags/spark-sql/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/sql-transformer/index.html b/content/blog/tags/sql-transformer/index.html index f27477c21748d..1913776b78dc2 100644 --- a/content/blog/tags/sql-transformer/index.html +++ b/content/blog/tags/sql-transformer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/starrocks/index.html b/content/blog/tags/starrocks/index.html index 113650a5d785b..dba9a648d28d7 100644 --- a/content/blog/tags/starrocks/index.html +++ b/content/blog/tags/starrocks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/storage-spec/index.html b/content/blog/tags/storage-spec/index.html index 57ecc90429341..8c50694d25508 100644 --- a/content/blog/tags/storage-spec/index.html +++ b/content/blog/tags/storage-spec/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/storage-types/index.html b/content/blog/tags/storage-types/index.html index 91ae3d25b9421..60c978554183a 100644 --- a/content/blog/tags/storage-types/index.html +++ b/content/blog/tags/storage-types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/storage/index.html b/content/blog/tags/storage/index.html index 8625ea28549e4..815c0a1e972c0 100644 --- a/content/blog/tags/storage/index.html +++ b/content/blog/tags/storage/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/streaming-ingestion/index.html b/content/blog/tags/streaming-ingestion/index.html index 0233ceb48ee1c..322d9e6611953 100644 --- a/content/blog/tags/streaming-ingestion/index.html +++ b/content/blog/tags/streaming-ingestion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/streaming/index.html b/content/blog/tags/streaming/index.html index 4b51258ce8252..d03a5a7e6f197 100644 --- a/content/blog/tags/streaming/index.html +++ b/content/blog/tags/streaming/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/streamlit/index.html b/content/blog/tags/streamlit/index.html index 915221fc37ff3..78e7e86286d0d 100644 --- a/content/blog/tags/streamlit/index.html +++ b/content/blog/tags/streamlit/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/substack/index.html b/content/blog/tags/substack/index.html index 71a16b057a24e..99b416739c3db 100644 --- a/content/blog/tags/substack/index.html +++ b/content/blog/tags/substack/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/table-formats/index.html b/content/blog/tags/table-formats/index.html index d111a81363e58..6df7f8ba34409 100644 --- a/content/blog/tags/table-formats/index.html +++ b/content/blog/tags/table-formats/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/table-service/index.html b/content/blog/tags/table-service/index.html index c2fb3b414ded4..349046ef8fcae 100644 --- a/content/blog/tags/table-service/index.html +++ b/content/blog/tags/table-service/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/table-services/index.html b/content/blog/tags/table-services/index.html index 369ceb83537fc..72a53f02abd28 100644 --- a/content/blog/tags/table-services/index.html +++ b/content/blog/tags/table-services/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/table-size-stats/index.html b/content/blog/tags/table-size-stats/index.html index e54bc529ede9d..66de2cb196a2b 100644 --- a/content/blog/tags/table-size-stats/index.html +++ b/content/blog/tags/table-size-stats/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/techtarget/index.html b/content/blog/tags/techtarget/index.html index 6b9e9c4963109..a6384147df6a7 100644 --- a/content/blog/tags/techtarget/index.html +++ b/content/blog/tags/techtarget/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/time-travel-query/index.html b/content/blog/tags/time-travel-query/index.html index 5fa6f41a3168c..027a973b7c6d2 100644 --- a/content/blog/tags/time-travel-query/index.html +++ b/content/blog/tags/time-travel-query/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/timeline-server/index.html b/content/blog/tags/timeline-server/index.html index f23a9c116ca83..6d3ef25cea92e 100644 --- a/content/blog/tags/timeline-server/index.html +++ b/content/blog/tags/timeline-server/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/timeline/index.html b/content/blog/tags/timeline/index.html index 970fbfe95ebb3..e3ca8216fdd3b 100644 --- a/content/blog/tags/timeline/index.html +++ b/content/blog/tags/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/timestamp-as-of-query/index.html b/content/blog/tags/timestamp-as-of-query/index.html index 6d20cf82c04f6..bf144f1544f89 100644 --- a/content/blog/tags/timestamp-as-of-query/index.html +++ b/content/blog/tags/timestamp-as-of-query/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/timestamp-collision/index.html b/content/blog/tags/timestamp-collision/index.html index 26a6e790cfe75..94e579c57e8f8 100644 --- a/content/blog/tags/timestamp-collision/index.html +++ b/content/blog/tags/timestamp-collision/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/tla-specification/index.html b/content/blog/tags/tla-specification/index.html index 4a456f95d7279..f5a99bfa29e6f 100644 --- a/content/blog/tags/tla-specification/index.html +++ b/content/blog/tags/tla-specification/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/towardsdatascience/index.html b/content/blog/tags/towardsdatascience/index.html index 8c34cd6a3a695..c7ff9e69a0f49 100644 --- a/content/blog/tags/towardsdatascience/index.html +++ b/content/blog/tags/towardsdatascience/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/transactions/index.html b/content/blog/tags/transactions/index.html index 5f40dc7437e76..105c300f173eb 100644 --- a/content/blog/tags/transactions/index.html +++ b/content/blog/tags/transactions/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/trino/index.html b/content/blog/tags/trino/index.html index 06e15f88978ad..2e72106c7c3bd 100644 --- a/content/blog/tags/trino/index.html +++ b/content/blog/tags/trino/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/uber/index.html b/content/blog/tags/uber/index.html index e7e0deeeff715..823fe2990deb1 100644 --- a/content/blog/tags/uber/index.html +++ b/content/blog/tags/uber/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/upsert/index.html b/content/blog/tags/upsert/index.html index 62e758aee70ad..e5e399cf8d2fa 100644 --- a/content/blog/tags/upsert/index.html +++ b/content/blog/tags/upsert/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/upserts/index.html b/content/blog/tags/upserts/index.html index 5ef05b21de331..d811ede7e0365 100644 --- a/content/blog/tags/upserts/index.html +++ b/content/blog/tags/upserts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/upstox-engineering/index.html b/content/blog/tags/upstox-engineering/index.html index 405af00753ec4..17b4751886b2f 100644 --- a/content/blog/tags/upstox-engineering/index.html +++ b/content/blog/tags/upstox-engineering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/use-case/index.html b/content/blog/tags/use-case/index.html index fd666dd6f0d13..8f0bc2db8808c 100644 --- a/content/blog/tags/use-case/index.html +++ b/content/blog/tags/use-case/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/use-case/page/2/index.html b/content/blog/tags/use-case/page/2/index.html index 1ae8cc3c4a052..c23326282222e 100644 --- a/content/blog/tags/use-case/page/2/index.html +++ b/content/blog/tags/use-case/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/use-case/page/3/index.html b/content/blog/tags/use-case/page/3/index.html index d5fb16ede1c67..9a19045aed0f4 100644 --- a/content/blog/tags/use-case/page/3/index.html +++ b/content/blog/tags/use-case/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/vector-search/index.html b/content/blog/tags/vector-search/index.html index c5c032337d7ae..007bceca96536 100644 --- a/content/blog/tags/vector-search/index.html +++ b/content/blog/tags/vector-search/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/venturebeat/index.html b/content/blog/tags/venturebeat/index.html index 9f32d74bb8945..912cff4b3d262 100644 --- a/content/blog/tags/venturebeat/index.html +++ b/content/blog/tags/venturebeat/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/walmartglobaltech/index.html b/content/blog/tags/walmartglobaltech/index.html index 78c45f7f2025a..1df4defbc081e 100644 --- a/content/blog/tags/walmartglobaltech/index.html +++ b/content/blog/tags/walmartglobaltech/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/writes/index.html b/content/blog/tags/writes/index.html index f706a65b001c0..992ddf30ab76c 100644 --- a/content/blog/tags/writes/index.html +++ b/content/blog/tags/writes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/xenonstack/index.html b/content/blog/tags/xenonstack/index.html index 1badd4d9b00cc..9eba56ee12c49 100644 --- a/content/blog/tags/xenonstack/index.html +++ b/content/blog/tags/xenonstack/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/y-uno/index.html b/content/blog/tags/y-uno/index.html index e9e5c2b976d9d..76e3c175db8f1 100644 --- a/content/blog/tags/y-uno/index.html +++ b/content/blog/tags/y-uno/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/yahoo/index.html b/content/blog/tags/yahoo/index.html index 3350eecb5253e..d5f0b7e3415ce 100644 --- a/content/blog/tags/yahoo/index.html +++ b/content/blog/tags/yahoo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/blog/tags/yugabyte/index.html b/content/blog/tags/yugabyte/index.html index 49e77b9ba6e88..4947b80d5cbe7 100644 --- a/content/blog/tags/yugabyte/index.html +++ b/content/blog/tags/yugabyte/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/404.html b/content/cn/404.html index c8dfea712b5a5..9761b4e19e188 100644 --- a/content/cn/404.html +++ b/content/cn/404.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/404/index.html b/content/cn/404/index.html index 40c3b8d9ea2cb..93404ec31ba77 100644 --- a/content/cn/404/index.html +++ b/content/cn/404/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/assets/js/02e54e09.429268a3.js b/content/cn/assets/js/02e54e09.641379dc.js similarity index 95% rename from content/cn/assets/js/02e54e09.429268a3.js rename to content/cn/assets/js/02e54e09.641379dc.js index e988186363bfc..0c6bfc614f663 100644 --- a/content/cn/assets/js/02e54e09.429268a3.js +++ b/content/cn/assets/js/02e54e09.641379dc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[34691],{28372:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>u,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"clustering","title":"Clustering","description":"Background","source":"@site/docs/clustering.md","sourceDirName":".","slug":"/clustering","permalink":"/cn/docs/next/clustering","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/clustering.md","tags":[],"version":"current","frontMatter":{"title":"Clustering","summary":"In this page, we describe async compaction in Hudi.","toc":true,"last_modified_at":null},"sidebar":"docs","previous":{"title":"Compaction","permalink":"/cn/docs/next/compaction"},"next":{"title":"Indexing","permalink":"/cn/docs/next/metadata_indexing"}}');var s=i(74848),r=i(28453);const a={title:"Clustering",summary:"In this page, we describe async compaction in Hudi.",toc:!0,last_modified_at:null},l=void 0,o={},c=[{value:"Background",id:"background",level:2},{value:"How is compaction different from clustering?",id:"how-is-compaction-different-from-clustering",level:2},{value:"Clustering Architecture",id:"clustering-architecture",level:2},{value:"Overall, there are 2 steps to clustering",id:"overall-there-are-2-steps-to-clustering",level:3},{value:"Schedule clustering",id:"schedule-clustering",level:3},{value:"Execute clustering",id:"execute-clustering",level:3},{value:"Clustering Usecases",id:"clustering-usecases",level:2},{value:"Batching small files",id:"batching-small-files",level:3},{value:"Cluster by sort key",id:"cluster-by-sort-key",level:3},{value:"Clustering Strategies",id:"clustering-strategies",level:2},{value:"Plan Strategy",id:"plan-strategy",level:3},{value:"Size-based clustering strategies",id:"size-based-clustering-strategies",level:4},{value:"SparkSingleFileSortPlanStrategy",id:"sparksinglefilesortplanstrategy",level:4},{value:"SparkConsistentBucketClusteringPlanStrategy",id:"sparkconsistentbucketclusteringplanstrategy",level:4},{value:"Execution Strategy",id:"execution-strategy",level:3},{value:"Update Strategy",id:"update-strategy",level:3},{value:"Inline clustering",id:"inline-clustering",level:2},{value:"Async Clustering",id:"async-clustering",level:2},{value:"Setup Asynchronous Clustering",id:"setup-asynchronous-clustering",level:2},{value:"HoodieClusteringJob",id:"hoodieclusteringjob",level:3},{value:"HoodieStreamer",id:"hoodiestreamer",level:3},{value:"Spark Structured Streaming",id:"spark-structured-streaming",level:3},{value:"Java Client",id:"java-client",level:2},{value:"Related Resources",id:"related-resources",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"background",children:"Background"}),"\n",(0,s.jsxs)(t.p,{children:["Apache Hudi brings stream processing to big data, providing fresh data while being an order of magnitude efficient over traditional batch processing. In a data lake/warehouse, one of the key trade-offs is between ingestion speed and query performance. Data ingestion typically prefers small files to improve parallelism and make data available to queries as soon as possible. However, query performance degrades poorly with a lot of small files. Also, during ingestion, data is typically co-located based on arrival time. However, the query engines perform better when the data frequently queried is co-located together. In most architectures each of these systems tend to add optimizations independently to improve performance which hits limitations due to un-optimized data layouts. This doc introduces a new kind of table service called clustering ",(0,s.jsx)(t.a,{href:"https://cwiki.apache.org/confluence/display/HUDI/RFC+-+19+Clustering+data+for+freshness+and+query+performance",children:"[RFC-19]"})," to reorganize data for improved query performance without compromising on ingestion speed."]}),"\n",(0,s.jsx)(t.h2,{id:"how-is-compaction-different-from-clustering",children:"How is compaction different from clustering?"}),"\n",(0,s.jsxs)(t.p,{children:["Hudi is modeled like a log-structured storage engine with multiple versions of the data.\nParticularly, ",(0,s.jsx)(t.a,{href:"/docs/table_types#merge-on-read-table",children:"Merge-On-Read"}),"\ntables in Hudi store data using a combination of base file in columnar format and row-based delta logs that contain\nupdates. Compaction is a way to merge the delta logs with base files to produce the latest file slices with the most\nrecent snapshot of data. Compaction helps to keep the query performance in check (larger delta log files would incur\nlonger merge times on query side). On the other hand, clustering is a data layout optimization technique. One can stitch\ntogether small files into larger files using clustering. Additionally, data can be clustered by sort key so that queries\ncan take advantage of data locality."]}),"\n",(0,s.jsx)(t.h2,{id:"clustering-architecture",children:"Clustering Architecture"}),"\n",(0,s.jsxs)(t.p,{children:["At a high level, Hudi provides different operations such as insert/upsert/bulk_insert through it\u2019s write client API to be able to write data to a Hudi table. To be able to choose a trade-off between file size and ingestion speed, Hudi provides a knob ",(0,s.jsx)(t.code,{children:"hoodie.parquet.small.file.limit"})," to be able to configure the smallest allowable file size. Users are able to configure the small file ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/configurations/#hoodieparquetsmallfilelimit",children:"soft limit"})," to ",(0,s.jsx)(t.code,{children:"0"})," to force new data to go into a new set of filegroups or set it to a higher value to ensure new data gets \u201cpadded\u201d to existing files until it meets that limit that adds to ingestion latencies."]}),"\n",(0,s.jsx)(t.p,{children:"To be able to support an architecture that allows for fast ingestion without compromising query performance, we have introduced a \u2018clustering\u2019 service to rewrite the data to optimize Hudi data lake file layout."}),"\n",(0,s.jsx)(t.p,{children:"Clustering table service can run asynchronously or synchronously adding a new action type called \u201cREPLACE\u201d, that will mark the clustering action in the Hudi metadata timeline."}),"\n",(0,s.jsx)(t.h3,{id:"overall-there-are-2-steps-to-clustering",children:"Overall, there are 2 steps to clustering"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Scheduling clustering: Create a clustering plan using a pluggable clustering strategy."}),"\n",(0,s.jsx)(t.li,{children:"Execute clustering: Process the plan using an execution strategy to create new files and replace old files."}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"schedule-clustering",children:"Schedule clustering"}),"\n",(0,s.jsx)(t.p,{children:"Following steps are followed to schedule clustering."}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Identify files that are eligible for clustering: Depending on the clustering strategy chosen, the scheduling logic will identify the files eligible for clustering."}),"\n",(0,s.jsx)(t.li,{children:"Group files that are eligible for clustering based on specific criteria. Each group is expected to have data size in multiples of \u2018targetFileSize\u2019. Grouping is done as part of \u2018strategy\u2019 defined in the plan. Additionally, there is an option to put a cap on group size to improve parallelism and avoid shuffling large amounts of data."}),"\n",(0,s.jsxs)(t.li,{children:["Finally, the clustering plan is saved to the timeline in an avro ",(0,s.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-common/src/main/avro/HoodieClusteringPlan.avsc",children:"metadata format"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"execute-clustering",children:"Execute clustering"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Read the clustering plan and get the \u2018clusteringGroups\u2019 that mark the file groups that need to be clustered."}),"\n",(0,s.jsx)(t.li,{children:"For each group, we instantiate appropriate strategy class with strategyParams (example: sortColumns) and apply that strategy to rewrite the data."}),"\n",(0,s.jsxs)(t.li,{children:["Create a \u201cREPLACE\u201d commit and update the metadata in ",(0,s.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-common/src/main/java/org/apache/hudi/common/model/HoodieReplaceCommitMetadata.java",children:"HoodieReplaceCommitMetadata"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Clustering Service builds on Hudi\u2019s MVCC based design to allow for writers to continue to insert new data while clustering action runs in the background to reformat data layout, ensuring snapshot isolation between concurrent readers and writers."}),"\n",(0,s.jsx)(t.p,{children:"NOTE: Clustering can only be scheduled for tables / partitions not receiving any concurrent updates. In the future, concurrent updates use-case will be supported as well."}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"Clustering example",src:i(7004).A+"",width:"6827",height:"3334"}),"\n",(0,s.jsx)(t.em,{children:"Figure: Illustrating query performance improvements by clustering"})]}),"\n",(0,s.jsx)(t.h2,{id:"clustering-usecases",children:"Clustering Usecases"}),"\n",(0,s.jsx)(t.h3,{id:"batching-small-files",children:"Batching small files"}),"\n",(0,s.jsx)(t.p,{children:"As mentioned in the intro, streaming ingestion generally results in smaller files in your data lake. But having a lot of\nsuch small files could lead to higher query latency. From our experience supporting community users, there are quite a\nfew users who are using Hudi just for small file handling capabilities. So, you could employ clustering to batch a lot\nof such small files into larger ones."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Batching small files",src:i(67491).A+"",width:"3100",height:"1620"})}),"\n",(0,s.jsx)(t.h3,{id:"cluster-by-sort-key",children:"Cluster by sort key"}),"\n",(0,s.jsx)(t.p,{children:"Another classic problem in data lake is the arrival time vs event time problem. Generally you write data based on\narrival time, while query predicates do not sit well with it. With clustering, you can re-write your data by sorting\nbased on query predicates and so, your data skipping will be very efficient and your query can ignore scanning a lot of\nunnecessary data."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Batching small files",src:i(14438).A+"",width:"5003",height:"1464"})}),"\n",(0,s.jsx)(t.h2,{id:"clustering-strategies",children:"Clustering Strategies"}),"\n",(0,s.jsx)(t.p,{children:"On a high level, clustering creates a plan based on a configurable strategy, groups eligible files based on specific\ncriteria and then executes the plan. As mentioned before, clustering plan as well as execution depends on configurable\nstrategy. These strategies can be broadly classified into three types: clustering plan strategy, execution strategy and\nupdate strategy."}),"\n",(0,s.jsx)(t.h3,{id:"plan-strategy",children:"Plan Strategy"}),"\n",(0,s.jsxs)(t.p,{children:["This strategy comes into play while creating clustering plan. It helps to decide what file groups should be clustered\nand how many output file groups should the clustering produce. Note that these strategies are easily pluggable using the\nconfig ",(0,s.jsx)(t.a,{href:"/docs/configurations#hoodieclusteringplanstrategyclass",children:"hoodie.clustering.plan.strategy.class"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"Different plan strategies are as follows:"}),"\n",(0,s.jsx)(t.h4,{id:"size-based-clustering-strategies",children:"Size-based clustering strategies"}),"\n",(0,s.jsxs)(t.p,{children:["This strategy creates clustering groups based on max size allowed per group. Also, it excludes files that are greater\nthan the small file limit from the clustering plan. Available strategies depending on write client\nare: ",(0,s.jsx)(t.code,{children:"SparkSizeBasedClusteringPlanStrategy"}),", ",(0,s.jsx)(t.code,{children:"FlinkSizeBasedClusteringPlanStrategy"}),"\nand ",(0,s.jsx)(t.code,{children:"JavaSizeBasedClusteringPlanStrategy"}),". Furthermore, Hudi provides flexibility to include or exclude partitions for\nclustering, tune the file size limits, maximum number of output groups. Please refer to ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations/#hoodieclusteringplanstrategysmallfilelimit",children:"hoodie.clustering.plan.strategy.small.file.limit"}),"\n, ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations/#hoodieclusteringplanstrategymaxnumgroups",children:"hoodie.clustering.plan.strategy.max.num.groups"}),", ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations/#hoodieclusteringplanstrategymaxbytespergroup",children:"hoodie.clustering.plan.strategy.max.bytes.per.group"}),"\n, ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations/#hoodieclusteringplanstrategytargetfilemaxbytes",children:"hoodie.clustering.plan.strategy.target.file.max.bytes"})," for more details."]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.plan.strategy.partition.selected"}),(0,s.jsxs)(t.td,{children:["N/A ",(0,s.jsx)(t.strong,{children:"(Required)"})]}),(0,s.jsxs)(t.td,{children:["Comma separated list of partitions to run clustering",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: PARTITION_SELECTED"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.11.0"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.plan.strategy.partition.regex.pattern"}),(0,s.jsxs)(t.td,{children:["N/A ",(0,s.jsx)(t.strong,{children:"(Required)"})]}),(0,s.jsxs)(t.td,{children:["Filter clustering partitions that matched regex pattern",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: PARTITION_REGEX_PATTERN"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.11.0"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.plan.partition.filter.mode"}),(0,s.jsx)(t.td,{children:"NONE (Optional)"}),(0,s.jsxs)(t.td,{children:["Partition filter mode used in the creation of clustering plan. Possible values:",(0,s.jsx)("br",{}),(0,s.jsxs)("ul",{children:[(0,s.jsxs)("li",{children:[(0,s.jsx)(t.code,{children:"NONE"}),": Do not filter partitions. The clustering plan will include all partitions that have clustering candidates."]}),(0,s.jsxs)("li",{children:[(0,s.jsx)(t.code,{children:"RECENT_DAYS"}),": This filter assumes that your data is partitioned by date. The clustering plan will only include partitions from K days ago to N days ago, where K >= N. K is determined by ",(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.daybased.lookback.partitions"})," and N is determined by ",(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.daybased.skipfromlatest.partitions"}),"."]}),(0,s.jsxs)("li",{children:[(0,s.jsx)(t.code,{children:"SELECTED_PARTITIONS"}),": The clustering plan will include only partition paths with names that sort within the inclusive range [",(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.cluster.begin.partition"}),", ",(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.cluster.end.partition"}),"]."]}),(0,s.jsxs)("li",{children:[(0,s.jsx)(t.code,{children:"DAY_ROLLING"}),": To determine the partitions in the clustering plan, the eligible partitions will be sorted in ascending order. Each partition will have an index i in that list. The clustering plan will only contain partitions such that i mod 24 = H, where H is the current hour of the day (from 0 to 23)."]})]}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: PLAN_PARTITION_FILTER_MODE_NAME"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.11.0"})]})]})]})]}),"\n",(0,s.jsx)(t.h4,{id:"sparksinglefilesortplanstrategy",children:"SparkSingleFileSortPlanStrategy"}),"\n",(0,s.jsxs)(t.p,{children:["In this strategy, clustering group for each partition is built in the same way as ",(0,s.jsx)(t.code,{children:"SparkSizeBasedClusteringPlanStrategy"}),"\n. The difference is that the output group is 1 and file group id remains the same,\nwhile ",(0,s.jsx)(t.code,{children:"SparkSizeBasedClusteringPlanStrategy"})," can create multiple file groups with newer fileIds."]}),"\n",(0,s.jsx)(t.h4,{id:"sparkconsistentbucketclusteringplanstrategy",children:"SparkConsistentBucketClusteringPlanStrategy"}),"\n",(0,s.jsx)(t.p,{children:"This strategy is specifically used for consistent bucket index. This will be leveraged to expand your bucket index (from\nstatic partitioning to dynamic). Typically, users don\u2019t need to use this strategy. Hudi internally uses this for\ndynamically expanding the buckets for bucket index datasets."}),"\n",(0,s.jsx)(t.admonition,{title:"The latter two strategies are applicable only for the Spark engine.",type:"note"}),"\n",(0,s.jsx)(t.h3,{id:"execution-strategy",children:"Execution Strategy"}),"\n",(0,s.jsxs)(t.p,{children:["After building the clustering groups in the planning phase, Hudi applies execution strategy, for each group, primarily\nbased on sort columns and size. The strategy can be specified using the\nconfig ",(0,s.jsx)(t.a,{href:"/docs/configurations/#hoodieclusteringexecutionstrategyclass",children:"hoodie.clustering.execution.strategy.class"}),". By\ndefault, Hudi sorts the file groups in the plan by the specified columns, while meeting the configured target file\nsizes."]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.execution.strategy.class"}),(0,s.jsx)(t.td,{children:"org.apache.hudi.client.clustering.run.strategy.SparkSortAndSizeExecutionStrategy (Optional)"}),(0,s.jsxs)(t.td,{children:["Config to provide a strategy class (subclass of RunClusteringStrategy) to define how the clustering plan is executed. By default, we sort the file groups in th plan by the specified columns, while meeting the configured target file sizes.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: EXECUTION_STRATEGY_CLASS_NAME"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.7.0"})]})]})})]}),"\n",(0,s.jsx)(t.p,{children:"The available strategies are as follows:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"SPARK_SORT_AND_SIZE_EXECUTION_STRATEGY"}),": Uses bulk_insert to re-write data from input file groups.","\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["Set ",(0,s.jsx)(t.code,{children:"hoodie.clustering.execution.strategy.class"}),"\nto ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.run.strategy.SparkSortAndSizeExecutionStrategy"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.sort.columns"}),": Columns to sort the data while clustering. This goes in\nconjunction with layout optimization strategies depending on your query predicates. One can set comma separated\nlist of columns that needs to be sorted in this config."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"JAVA_SORT_AND_SIZE_EXECUTION_STRATEGY"}),": Similar to ",(0,s.jsx)(t.code,{children:"SPARK_SORT_AND_SIZE_EXECUTION_STRATEGY"}),", for the Java and Flink\nengines. Set ",(0,s.jsx)(t.code,{children:"hoodie.clustering.execution.strategy.class"}),"\nto ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.run.strategy.JavaSortAndSizeExecutionStrategy"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"SPARK_CONSISTENT_BUCKET_EXECUTION_STRATEGY"}),": As the name implies, this is applicable to dynamically expand\nconsistent bucket index and only applicable to the Spark engine. Set ",(0,s.jsx)(t.code,{children:"hoodie.clustering.execution.strategy.class"}),"\nto ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.run.strategy.SparkConsistentBucketClusteringExecutionStrategy"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"update-strategy",children:"Update Strategy"}),"\n",(0,s.jsxs)(t.p,{children:["Currently, clustering can only be scheduled for tables/partitions not receiving any concurrent updates. By default,\nthe config for update strategy - ",(0,s.jsx)(t.a,{href:"/docs/configurations/#hoodieclusteringupdatesstrategy",children:(0,s.jsx)(t.code,{children:"hoodie.clustering.updates.strategy"})})," is set to ",(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:"SparkRejectUpdateStrategy"})}),". If some file group has updates during clustering then it will reject updates and throw an\nexception. However, in some use-cases updates are very sparse and do not touch most file groups. The default strategy to\nsimply reject updates does not seem fair. In such use-cases, users can set the config to ",(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:"SparkAllowUpdateStrategy"})}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["We discussed the critical strategy configurations. All other configurations related to clustering are\nlisted ",(0,s.jsx)(t.a,{href:"/docs/configurations/#Clustering-Configs",children:"here"}),". Out of this list, a few configurations that will be very useful\nfor inline or async clustering are shown below with code samples."]}),"\n",(0,s.jsx)(t.h2,{id:"inline-clustering",children:"Inline clustering"}),"\n",(0,s.jsx)(t.p,{children:"Inline clustering happens synchronously with the regular ingestion writer or as part of the data ingestion pipeline. This means the next round of ingestion cannot proceed until the clustering is complete With inline clustering, Hudi will schedule, plan clustering operations after each commit is completed and execute the clustering plans after it\u2019s created. This is the simplest deployment model to run because it\u2019s easier to manage than running different asynchronous Spark jobs. This mode is supported on Spark Datasource, Flink, Spark-SQL and DeltaStreamer in a sync-once mode."}),"\n",(0,s.jsxs)(t.p,{children:["For this deployment mode, please enable and set: ",(0,s.jsx)(t.code,{children:"hoodie.clustering.inline"})]}),"\n",(0,s.jsxs)(t.p,{children:["To choose how often clustering is triggered, also set: ",(0,s.jsx)(t.code,{children:"hoodie.clustering.inline.max.commits"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"Inline clustering can be setup easily using spark dataframe options.\nSee sample below:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-scala",children:'import org.apache.hudi.QuickstartUtils._\nimport scala.collection.JavaConversions._\nimport org.apache.spark.sql.SaveMode._\nimport org.apache.hudi.DataSourceReadOptions._\nimport org.apache.hudi.DataSourceWriteOptions._\nimport org.apache.hudi.config.HoodieWriteConfig._\n\n\nval df = //generate data frame\ndf.write.format("org.apache.hudi").\n options(getQuickstartWriteConfigs).\n option("hoodie.datasource.write.precombine.field", "ts").\n option("hoodie.datasource.write.recordkey.field", "uuid").\n option("hoodie.datasource.write.partitionpath.field", "partitionpath").\n option("hoodie.table.name", "tableName").\n option("hoodie.parquet.small.file.limit", "0").\n option("hoodie.clustering.inline", "true").\n option("hoodie.clustering.inline.max.commits", "4").\n option("hoodie.clustering.plan.strategy.target.file.max.bytes", "1073741824").\n option("hoodie.clustering.plan.strategy.small.file.limit", "629145600").\n option("hoodie.clustering.plan.strategy.sort.columns", "column1,column2"). //optional, if sorting is needed as part of rewriting data\n mode(Append).\n save("dfs://location");\n'})}),"\n",(0,s.jsx)(t.h2,{id:"async-clustering",children:"Async Clustering"}),"\n",(0,s.jsx)(t.p,{children:"Async clustering runs the clustering table service in the background without blocking the regular ingestions writers. There are three different ways to deploy an asynchronous clustering process:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Asynchronous execution within the same process"}),": In this deployment mode, Hudi will schedule and plan the clustering operations after each commit is completed as part of the ingestion pipeline. Separately, Hudi spins up another thread within the same job and executes the clustering table service. This is supported by Spark Streaming, Flink and DeltaStreamer in continuous mode. For this deployment mode, please enable ",(0,s.jsx)(t.code,{children:"hoodie.clustering.async.enabled"})," and ",(0,s.jsx)(t.code,{children:"hoodie.clustering.async.max.commits\u200b"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Asynchronous scheduling and execution by a separate process"}),": In this deployment mode, the application will write data to a Hudi table as part of the ingestion pipeline. A separate clustering job will schedule, plan and execute the clustering operation. By running a different job for the clustering operation, it rebalances how Hudi uses compute resources: fewer compute resources are needed for the ingestion, which makes ingestion latency stable, and an independent set of compute resources are reserved for the clustering process. Please configure the lock providers for the concurrency control among all jobs (both writer and table service jobs). In general, configure lock providers when there are two different jobs or two different processes occurring. All writers support this deployment model. For this deployment mode, no clustering configs should be set for the ingestion writer."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Scheduling inline and executing async"}),": In this deployment mode, the application ingests data and schedules the clustering in one job; in another, the application executes the clustering plan. The supported writers (see below) won\u2019t be blocked from ingesting data. If the metadata table is enabled, a lock provider is not needed. However, if the metadata table is enabled, please ensure all jobs have the lock providers configured for concurrency control. All writers support this deployment option. For this deployment mode, please enable, ",(0,s.jsx)(t.code,{children:"hoodie.clustering.schedule.inline"})," and ",(0,s.jsx)(t.code,{children:"hoodie.clustering.async.enabled"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Hudi supports ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/concurrency_control#enabling-multi-writing",children:"multi-writers"})," which provides\nsnapshot isolation between multiple table services, thus allowing writers to continue with ingestion while clustering\nruns in the background."]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.async.enabled"}),(0,s.jsx)(t.td,{children:"false (Optional)"}),(0,s.jsxs)(t.td,{children:["Enable running of clustering service, asynchronously as inserts happen on the table.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: ASYNC_CLUSTERING_ENABLE"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.7.0"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.async.max.commits"}),(0,s.jsx)(t.td,{children:"4 (Optional)"}),(0,s.jsxs)(t.td,{children:["Config to control frequency of async clustering",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: ASYNC_CLUSTERING_MAX_COMMITS"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.9.0"})]})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"setup-asynchronous-clustering",children:"Setup Asynchronous Clustering"}),"\n",(0,s.jsxs)(t.p,{children:["Users can leverage ",(0,s.jsx)(t.a,{href:"https://cwiki.apache.org/confluence/display/HUDI/RFC+-+19+Clustering+data+for+freshness+and+query+performance#RFC19Clusteringdataforfreshnessandqueryperformance-SetupforAsyncclusteringJob",children:"HoodieClusteringJob"}),"\nto setup 2-step asynchronous clustering."]}),"\n",(0,s.jsx)(t.h3,{id:"hoodieclusteringjob",children:"HoodieClusteringJob"}),"\n",(0,s.jsxs)(t.p,{children:["By specifying the ",(0,s.jsx)(t.code,{children:"scheduleAndExecute"})," mode both schedule as well as clustering can be achieved in the same step.\nThe appropriate mode can be specified using ",(0,s.jsx)(t.code,{children:"-mode"})," or ",(0,s.jsx)(t.code,{children:"-m"})," option. There are three modes:"]}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"schedule"}),": Make a clustering plan. This gives an instant which can be passed in execute mode."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"execute"}),": Execute a clustering plan at a particular instant. If no instant-time is specified, HoodieClusteringJob will execute for the earliest instant on the Hudi timeline."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"scheduleAndExecute"}),": Make a clustering plan first and execute that plan immediately."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Note that to run this job while the original writer is still running, please enable multi-writing:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"hoodie.write.concurrency.mode=optimistic_concurrency_control\nhoodie.write.lock.provider=org.apache.hudi.client.transaction.lock.ZookeeperBasedLockProvider\n"})}),"\n",(0,s.jsx)(t.p,{children:"A sample spark-submit command to setup HoodieClusteringJob is as below:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'spark-submit \\\n--jars "packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar,packaging/hudi-spark-bundle/target/hudi-spark3.5-bundle_2.12-1.0.0.jar" \\\n--class org.apache.hudi.utilities.HoodieClusteringJob \\\n/path/to/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar \\\n--props /path/to/config/clusteringjob.properties \\\n--mode scheduleAndExecute \\\n--base-path /path/to/hudi_table/basePath \\\n--table-name hudi_table_schedule_clustering \\\n--spark-memory 1g\n'})}),"\n",(0,s.jsxs)(t.p,{children:["A sample ",(0,s.jsx)(t.code,{children:"clusteringjob.properties"})," file:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"hoodie.clustering.async.enabled=true\nhoodie.clustering.async.max.commits=4\nhoodie.clustering.plan.strategy.target.file.max.bytes=1073741824\nhoodie.clustering.plan.strategy.small.file.limit=629145600\nhoodie.clustering.execution.strategy.class=org.apache.hudi.client.clustering.run.strategy.SparkSortAndSizeExecutionStrategy\nhoodie.clustering.plan.strategy.sort.columns=column1,column2\n"})}),"\n",(0,s.jsx)(t.h3,{id:"hoodiestreamer",children:"HoodieStreamer"}),"\n",(0,s.jsxs)(t.p,{children:["This brings us to our users' favorite utility in Hudi. Now, we can trigger asynchronous clustering with Hudi Streamer.\nJust set the ",(0,s.jsx)(t.code,{children:"hoodie.clustering.async.enabled"})," config to true and specify other clustering config in properties file\nwhose location can be pased as ",(0,s.jsx)(t.code,{children:"\u2014props"})," when starting the Hudi Streamer (just like in the case of HoodieClusteringJob)."]}),"\n",(0,s.jsx)(t.p,{children:"A sample spark-submit command to setup HoodieStreamer is as below:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'spark-submit \\\n--jars "packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar,packaging/hudi-spark-bundle/target/hudi-spark3.5-bundle_2.12-1.0.0.jar" \\\n--class org.apache.hudi.utilities.streamer.HoodieStreamer \\\n/path/to/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar \\\n--props /path/to/config/clustering_kafka.properties \\\n--schemaprovider-class org.apache.hudi.utilities.schema.SchemaRegistryProvider \\\n--source-class org.apache.hudi.utilities.sources.AvroKafkaSource \\\n--source-ordering-field impresssiontime \\\n--table-type COPY_ON_WRITE \\\n--target-base-path /path/to/hudi_table/basePath \\\n--target-table impressions_cow_cluster \\\n--op INSERT \\\n--hoodie-conf hoodie.clustering.async.enabled=true \\\n--continuous\n'})}),"\n",(0,s.jsx)(t.h3,{id:"spark-structured-streaming",children:"Spark Structured Streaming"}),"\n",(0,s.jsx)(t.p,{children:"We can also enable asynchronous clustering with Spark structured streaming sink as shown below."}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-scala",children:'val commonOpts = Map(\n "hoodie.insert.shuffle.parallelism" -> "4",\n "hoodie.upsert.shuffle.parallelism" -> "4",\n "hoodie.datasource.write.recordkey.field" -> "_row_key",\n "hoodie.datasource.write.partitionpath.field" -> "partition",\n "hoodie.datasource.write.precombine.field" -> "timestamp",\n "hoodie.table.name" -> "hoodie_test"\n)\n\ndef getAsyncClusteringOpts(isAsyncClustering: String, \n clusteringNumCommit: String, \n executionStrategy: String):Map[String, String] = {\n commonOpts + (DataSourceWriteOptions.ASYNC_CLUSTERING_ENABLE.key -> isAsyncClustering,\n HoodieClusteringConfig.ASYNC_CLUSTERING_MAX_COMMITS.key -> clusteringNumCommit,\n HoodieClusteringConfig.EXECUTION_STRATEGY_CLASS_NAME.key -> executionStrategy\n )\n}\n\ndef initStreamingWriteFuture(hudiOptions: Map[String, String]): Future[Unit] = {\n val streamingInput = // define the source of streaming\n Future {\n println("streaming starting")\n streamingInput\n .writeStream\n .format("org.apache.hudi")\n .options(hudiOptions)\n .option("checkpointLocation", basePath + "/checkpoint")\n .mode(Append)\n .start()\n .awaitTermination(10000)\n println("streaming ends")\n }\n}\n\ndef structuredStreamingWithClustering(): Unit = {\n val df = //generate data frame\n val hudiOptions = getClusteringOpts("true", "1", "org.apache.hudi.client.clustering.run.strategy.SparkSortAndSizeExecutionStrategy")\n val f1 = initStreamingWriteFuture(hudiOptions)\n Await.result(f1, Duration.Inf)\n}\n'})}),"\n",(0,s.jsx)(t.h2,{id:"java-client",children:"Java Client"}),"\n",(0,s.jsxs)(t.p,{children:["Clustering is also supported via Java client. Plan strategy ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.plan.strategy.JavaSizeBasedClusteringPlanStrategy"}),"\nand execution strategy ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.run.strategy.JavaSortAndSizeExecutionStrategy"})," are supported\nout-of-the-box. Note that as of now only linear sort is supported in Java execution strategy."]}),"\n",(0,s.jsx)(t.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,s.jsx)("h3",{children:"Videos"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://www.youtube.com/watch?v=R_sm4wlGXuE",children:"Understanding Clustering in Apache Hudi and the Benefits of Asynchronous Clustering"})}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},7004:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/clustering1_new-d67c9e691d235b140f7c80d68400f425.png"},67491:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/clustering2_new-0837c07b6db44ab75873633f0eab2e2c.png"},14438:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/clustering_3-8bc286ab44c48137f8409b5c342a7207.png"},28453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>l});var n=i(96540);const s={},r=n.createContext(s);function a(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[34691],{28372:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>u,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"clustering","title":"Clustering","description":"Background","source":"@site/docs/clustering.md","sourceDirName":".","slug":"/clustering","permalink":"/cn/docs/next/clustering","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/clustering.md","tags":[],"version":"current","frontMatter":{"title":"Clustering","summary":"In this page, we describe async compaction in Hudi.","toc":true,"last_modified_at":null},"sidebar":"docs","previous":{"title":"Compaction","permalink":"/cn/docs/next/compaction"},"next":{"title":"Indexing","permalink":"/cn/docs/next/metadata_indexing"}}');var s=i(74848),r=i(28453);const a={title:"Clustering",summary:"In this page, we describe async compaction in Hudi.",toc:!0,last_modified_at:null},l=void 0,o={},c=[{value:"Background",id:"background",level:2},{value:"How is compaction different from clustering?",id:"how-is-compaction-different-from-clustering",level:2},{value:"Clustering Architecture",id:"clustering-architecture",level:2},{value:"Overall, there are 2 steps to clustering",id:"overall-there-are-2-steps-to-clustering",level:3},{value:"Schedule clustering",id:"schedule-clustering",level:3},{value:"Execute clustering",id:"execute-clustering",level:3},{value:"Clustering Usecases",id:"clustering-usecases",level:2},{value:"Batching small files",id:"batching-small-files",level:3},{value:"Cluster by sort key",id:"cluster-by-sort-key",level:3},{value:"Clustering Strategies",id:"clustering-strategies",level:2},{value:"Plan Strategy",id:"plan-strategy",level:3},{value:"Size-based clustering strategies",id:"size-based-clustering-strategies",level:4},{value:"SparkSingleFileSortPlanStrategy",id:"sparksinglefilesortplanstrategy",level:4},{value:"SparkConsistentBucketClusteringPlanStrategy",id:"sparkconsistentbucketclusteringplanstrategy",level:4},{value:"Execution Strategy",id:"execution-strategy",level:3},{value:"Update Strategy",id:"update-strategy",level:3},{value:"Inline clustering",id:"inline-clustering",level:2},{value:"Async Clustering",id:"async-clustering",level:2},{value:"Setup Asynchronous Clustering",id:"setup-asynchronous-clustering",level:2},{value:"HoodieClusteringJob",id:"hoodieclusteringjob",level:3},{value:"HoodieStreamer",id:"hoodiestreamer",level:3},{value:"Spark Structured Streaming",id:"spark-structured-streaming",level:3},{value:"Java Client",id:"java-client",level:2},{value:"Related Resources",id:"related-resources",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"background",children:"Background"}),"\n",(0,s.jsxs)(t.p,{children:["Apache Hudi brings stream processing to big data, providing fresh data while being an order of magnitude efficient over traditional batch processing. In a data lake/warehouse, one of the key trade-offs is between ingestion speed and query performance. Data ingestion typically prefers small files to improve parallelism and make data available to queries as soon as possible. However, query performance degrades poorly with a lot of small files. Also, during ingestion, data is typically co-located based on arrival time. However, the query engines perform better when the data frequently queried is co-located together. In most architectures each of these systems tend to add optimizations independently to improve performance which hits limitations due to un-optimized data layouts. This doc introduces a new kind of table service called clustering ",(0,s.jsx)(t.a,{href:"https://cwiki.apache.org/confluence/display/HUDI/RFC+-+19+Clustering+data+for+freshness+and+query+performance",children:"[RFC-19]"})," to reorganize data for improved query performance without compromising on ingestion speed."]}),"\n",(0,s.jsx)(t.h2,{id:"how-is-compaction-different-from-clustering",children:"How is compaction different from clustering?"}),"\n",(0,s.jsxs)(t.p,{children:["Hudi is modeled like a log-structured storage engine with multiple versions of the data.\nParticularly, ",(0,s.jsx)(t.a,{href:"/docs/table_types#merge-on-read-table",children:"Merge-On-Read"}),"\ntables in Hudi store data using a combination of base file in columnar format and row-based delta logs that contain\nupdates. Compaction is a way to merge the delta logs with base files to produce the latest file slices with the most\nrecent snapshot of data. Compaction helps to keep the query performance in check (larger delta log files would incur\nlonger merge times on query side). On the other hand, clustering is a data layout optimization technique. One can stitch\ntogether small files into larger files using clustering. Additionally, data can be clustered by sort key so that queries\ncan take advantage of data locality."]}),"\n",(0,s.jsx)(t.h2,{id:"clustering-architecture",children:"Clustering Architecture"}),"\n",(0,s.jsxs)(t.p,{children:["At a high level, Hudi provides different operations such as insert/upsert/bulk_insert through it\u2019s write client API to be able to write data to a Hudi table. To be able to choose a trade-off between file size and ingestion speed, Hudi provides a knob ",(0,s.jsx)(t.code,{children:"hoodie.parquet.small.file.limit"})," to be able to configure the smallest allowable file size. Users are able to configure the small file ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/configurations/#hoodieparquetsmallfilelimit",children:"soft limit"})," to ",(0,s.jsx)(t.code,{children:"0"})," to force new data to go into a new set of filegroups or set it to a higher value to ensure new data gets \u201cpadded\u201d to existing files until it meets that limit that adds to ingestion latencies."]}),"\n",(0,s.jsx)(t.p,{children:"To be able to support an architecture that allows for fast ingestion without compromising query performance, we have introduced a \u2018clustering\u2019 service to rewrite the data to optimize Hudi data lake file layout."}),"\n",(0,s.jsx)(t.p,{children:"Clustering table service can run asynchronously or synchronously adding a new action type called \u201cREPLACE\u201d, that will mark the clustering action in the Hudi metadata timeline."}),"\n",(0,s.jsx)(t.h3,{id:"overall-there-are-2-steps-to-clustering",children:"Overall, there are 2 steps to clustering"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Scheduling clustering: Create a clustering plan using a pluggable clustering strategy."}),"\n",(0,s.jsx)(t.li,{children:"Execute clustering: Process the plan using an execution strategy to create new files and replace old files."}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"schedule-clustering",children:"Schedule clustering"}),"\n",(0,s.jsx)(t.p,{children:"Following steps are followed to schedule clustering."}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Identify files that are eligible for clustering: Depending on the clustering strategy chosen, the scheduling logic will identify the files eligible for clustering."}),"\n",(0,s.jsx)(t.li,{children:"Group files that are eligible for clustering based on specific criteria. Each group is expected to have data size in multiples of \u2018targetFileSize\u2019. Grouping is done as part of \u2018strategy\u2019 defined in the plan. Additionally, there is an option to put a cap on group size to improve parallelism and avoid shuffling large amounts of data."}),"\n",(0,s.jsxs)(t.li,{children:["Finally, the clustering plan is saved to the timeline in an avro ",(0,s.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-common/src/main/avro/HoodieClusteringPlan.avsc",children:"metadata format"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"execute-clustering",children:"Execute clustering"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Read the clustering plan and get the \u2018clusteringGroups\u2019 that mark the file groups that need to be clustered."}),"\n",(0,s.jsx)(t.li,{children:"For each group, we instantiate appropriate strategy class with strategyParams (example: sortColumns) and apply that strategy to rewrite the data."}),"\n",(0,s.jsxs)(t.li,{children:["Create a \u201cREPLACE\u201d commit and update the metadata in ",(0,s.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-common/src/main/java/org/apache/hudi/common/model/HoodieReplaceCommitMetadata.java",children:"HoodieReplaceCommitMetadata"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Clustering Service builds on Hudi\u2019s MVCC based design to allow for writers to continue to insert new data while clustering action runs in the background to reformat data layout, ensuring snapshot isolation between concurrent readers and writers."}),"\n",(0,s.jsx)(t.p,{children:"NOTE: Clustering can only be scheduled for tables / partitions not receiving any concurrent updates. In the future, concurrent updates use-case will be supported as well."}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"Clustering example",src:i(7004).A+"",width:"6827",height:"3334"}),"\n",(0,s.jsx)(t.em,{children:"Figure: Illustrating query performance improvements by clustering"})]}),"\n",(0,s.jsx)(t.h2,{id:"clustering-usecases",children:"Clustering Usecases"}),"\n",(0,s.jsx)(t.h3,{id:"batching-small-files",children:"Batching small files"}),"\n",(0,s.jsx)(t.p,{children:"As mentioned in the intro, streaming ingestion generally results in smaller files in your data lake. But having a lot of\nsuch small files could lead to higher query latency. From our experience supporting community users, there are quite a\nfew users who are using Hudi just for small file handling capabilities. So, you could employ clustering to batch a lot\nof such small files into larger ones."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Batching small files",src:i(67491).A+"",width:"3100",height:"1620"})}),"\n",(0,s.jsx)(t.h3,{id:"cluster-by-sort-key",children:"Cluster by sort key"}),"\n",(0,s.jsx)(t.p,{children:"Another classic problem in data lake is the arrival time vs event time problem. Generally you write data based on\narrival time, while query predicates do not sit well with it. With clustering, you can re-write your data by sorting\nbased on query predicates and so, your data skipping will be very efficient and your query can ignore scanning a lot of\nunnecessary data."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Batching small files",src:i(14438).A+"",width:"5003",height:"1464"})}),"\n",(0,s.jsx)(t.h2,{id:"clustering-strategies",children:"Clustering Strategies"}),"\n",(0,s.jsx)(t.p,{children:"On a high level, clustering creates a plan based on a configurable strategy, groups eligible files based on specific\ncriteria and then executes the plan. As mentioned before, clustering plan as well as execution depends on configurable\nstrategy. These strategies can be broadly classified into three types: clustering plan strategy, execution strategy and\nupdate strategy."}),"\n",(0,s.jsx)(t.h3,{id:"plan-strategy",children:"Plan Strategy"}),"\n",(0,s.jsxs)(t.p,{children:["This strategy comes into play while creating clustering plan. It helps to decide what file groups should be clustered\nand how many output file groups should the clustering produce. Note that these strategies are easily pluggable using the\nconfig ",(0,s.jsx)(t.a,{href:"/docs/configurations#hoodieclusteringplanstrategyclass",children:"hoodie.clustering.plan.strategy.class"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"Different plan strategies are as follows:"}),"\n",(0,s.jsx)(t.h4,{id:"size-based-clustering-strategies",children:"Size-based clustering strategies"}),"\n",(0,s.jsxs)(t.p,{children:["This strategy creates clustering groups based on max size allowed per group. Also, it excludes files that are greater\nthan the small file limit from the clustering plan. Available strategies depending on write client\nare: ",(0,s.jsx)(t.code,{children:"SparkSizeBasedClusteringPlanStrategy"}),", ",(0,s.jsx)(t.code,{children:"FlinkSizeBasedClusteringPlanStrategy"}),"\nand ",(0,s.jsx)(t.code,{children:"JavaSizeBasedClusteringPlanStrategy"}),". Furthermore, Hudi provides flexibility to include or exclude partitions for\nclustering, tune the file size limits, maximum number of output groups. Please refer to ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations/#hoodieclusteringplanstrategysmallfilelimit",children:"hoodie.clustering.plan.strategy.small.file.limit"}),"\n, ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations/#hoodieclusteringplanstrategymaxnumgroups",children:"hoodie.clustering.plan.strategy.max.num.groups"}),", ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations/#hoodieclusteringplanstrategymaxbytespergroup",children:"hoodie.clustering.plan.strategy.max.bytes.per.group"}),"\n, ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations/#hoodieclusteringplanstrategytargetfilemaxbytes",children:"hoodie.clustering.plan.strategy.target.file.max.bytes"})," for more details."]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.plan.strategy.partition.selected"}),(0,s.jsxs)(t.td,{children:["N/A ",(0,s.jsx)(t.strong,{children:"(Required)"})]}),(0,s.jsxs)(t.td,{children:["Comma separated list of partitions to run clustering",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: PARTITION_SELECTED"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.11.0"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.plan.strategy.partition.regex.pattern"}),(0,s.jsxs)(t.td,{children:["N/A ",(0,s.jsx)(t.strong,{children:"(Required)"})]}),(0,s.jsxs)(t.td,{children:["Filter clustering partitions that matched regex pattern",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: PARTITION_REGEX_PATTERN"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.11.0"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.plan.partition.filter.mode"}),(0,s.jsx)(t.td,{children:"NONE (Optional)"}),(0,s.jsxs)(t.td,{children:["Partition filter mode used in the creation of clustering plan. Possible values:",(0,s.jsx)("br",{}),(0,s.jsxs)("ul",{children:[(0,s.jsxs)("li",{children:[(0,s.jsx)(t.code,{children:"NONE"}),": Do not filter partitions. The clustering plan will include all partitions that have clustering candidates."]}),(0,s.jsxs)("li",{children:[(0,s.jsx)(t.code,{children:"RECENT_DAYS"}),": This filter assumes that your data is partitioned by date. The clustering plan will only include partitions from K days ago to N days ago, where K >= N. K is determined by ",(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.daybased.lookback.partitions"})," and N is determined by ",(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.daybased.skipfromlatest.partitions"}),"."]}),(0,s.jsxs)("li",{children:[(0,s.jsx)(t.code,{children:"SELECTED_PARTITIONS"}),": The clustering plan will include only partition paths with names that sort within the inclusive range [",(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.cluster.begin.partition"}),", ",(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.cluster.end.partition"}),"]."]}),(0,s.jsxs)("li",{children:[(0,s.jsx)(t.code,{children:"DAY_ROLLING"}),": To determine the partitions in the clustering plan, the eligible partitions will be sorted in ascending order. Each partition will have an index i in that list. The clustering plan will only contain partitions such that i mod 24 = H, where H is the current hour of the day (from 0 to 23)."]})]}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: PLAN_PARTITION_FILTER_MODE_NAME"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.11.0"})]})]})]})]}),"\n",(0,s.jsx)(t.h4,{id:"sparksinglefilesortplanstrategy",children:"SparkSingleFileSortPlanStrategy"}),"\n",(0,s.jsxs)(t.p,{children:["In this strategy, clustering group for each partition is built in the same way as ",(0,s.jsx)(t.code,{children:"SparkSizeBasedClusteringPlanStrategy"}),"\n. The difference is that the output group is 1 and file group id remains the same,\nwhile ",(0,s.jsx)(t.code,{children:"SparkSizeBasedClusteringPlanStrategy"})," can create multiple file groups with newer fileIds."]}),"\n",(0,s.jsx)(t.h4,{id:"sparkconsistentbucketclusteringplanstrategy",children:"SparkConsistentBucketClusteringPlanStrategy"}),"\n",(0,s.jsx)(t.p,{children:"This strategy is specifically used for consistent bucket index. This will be leveraged to expand your bucket index (from\nstatic partitioning to dynamic). Typically, users don\u2019t need to use this strategy. Hudi internally uses this for\ndynamically expanding the buckets for bucket index datasets."}),"\n",(0,s.jsx)(t.admonition,{title:"The latter two strategies are applicable only for the Spark engine.",type:"note"}),"\n",(0,s.jsx)(t.h3,{id:"execution-strategy",children:"Execution Strategy"}),"\n",(0,s.jsxs)(t.p,{children:["After building the clustering groups in the planning phase, Hudi applies execution strategy, for each group, primarily\nbased on sort columns and size. The strategy can be specified using the\nconfig ",(0,s.jsx)(t.a,{href:"/docs/configurations/#hoodieclusteringexecutionstrategyclass",children:"hoodie.clustering.execution.strategy.class"}),". By\ndefault, Hudi sorts the file groups in the plan by the specified columns, while meeting the configured target file\nsizes."]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.execution.strategy.class"}),(0,s.jsx)(t.td,{children:"org.apache.hudi.client.clustering.run.strategy.SparkSortAndSizeExecutionStrategy (Optional)"}),(0,s.jsxs)(t.td,{children:["Config to provide a strategy class (subclass of RunClusteringStrategy) to define how the clustering plan is executed. By default, we sort the file groups in th plan by the specified columns, while meeting the configured target file sizes.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: EXECUTION_STRATEGY_CLASS_NAME"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.7.0"})]})]})})]}),"\n",(0,s.jsx)(t.p,{children:"The available strategies are as follows:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"SPARK_SORT_AND_SIZE_EXECUTION_STRATEGY"}),": Uses bulk_insert to re-write data from input file groups.","\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["Set ",(0,s.jsx)(t.code,{children:"hoodie.clustering.execution.strategy.class"}),"\nto ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.run.strategy.SparkSortAndSizeExecutionStrategy"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"hoodie.clustering.plan.strategy.sort.columns"}),": Columns to sort the data while clustering. This goes in\nconjunction with layout optimization strategies depending on your query predicates. One can set comma separated\nlist of columns that needs to be sorted in this config."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"JAVA_SORT_AND_SIZE_EXECUTION_STRATEGY"}),": Similar to ",(0,s.jsx)(t.code,{children:"SPARK_SORT_AND_SIZE_EXECUTION_STRATEGY"}),", for the Java and Flink\nengines. Set ",(0,s.jsx)(t.code,{children:"hoodie.clustering.execution.strategy.class"}),"\nto ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.run.strategy.JavaSortAndSizeExecutionStrategy"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"SPARK_CONSISTENT_BUCKET_EXECUTION_STRATEGY"}),": As the name implies, this is applicable to dynamically expand\nconsistent bucket index and only applicable to the Spark engine. Set ",(0,s.jsx)(t.code,{children:"hoodie.clustering.execution.strategy.class"}),"\nto ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.run.strategy.SparkConsistentBucketClusteringExecutionStrategy"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"update-strategy",children:"Update Strategy"}),"\n",(0,s.jsxs)(t.p,{children:["Currently, clustering can only be scheduled for tables/partitions not receiving any concurrent updates. By default,\nthe config for update strategy - ",(0,s.jsx)(t.a,{href:"/docs/configurations/#hoodieclusteringupdatesstrategy",children:(0,s.jsx)(t.code,{children:"hoodie.clustering.updates.strategy"})})," is set to ",(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:"SparkRejectUpdateStrategy"})}),". If some file group has updates during clustering then it will reject updates and throw an\nexception. However, in some use-cases updates are very sparse and do not touch most file groups. The default strategy to\nsimply reject updates does not seem fair. In such use-cases, users can set the config to ",(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:"SparkAllowUpdateStrategy"})}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["We discussed the critical strategy configurations. All other configurations related to clustering are\nlisted ",(0,s.jsx)(t.a,{href:"/docs/configurations/#Clustering-Configs",children:"here"}),". Out of this list, a few configurations that will be very useful\nfor inline or async clustering are shown below with code samples."]}),"\n",(0,s.jsx)(t.h2,{id:"inline-clustering",children:"Inline clustering"}),"\n",(0,s.jsx)(t.p,{children:"Inline clustering happens synchronously with the regular ingestion writer or as part of the data ingestion pipeline. This means the next round of ingestion cannot proceed until the clustering is complete With inline clustering, Hudi will schedule, plan clustering operations after each commit is completed and execute the clustering plans after it\u2019s created. This is the simplest deployment model to run because it\u2019s easier to manage than running different asynchronous Spark jobs. This mode is supported on Spark Datasource, Flink, Spark-SQL and DeltaStreamer in a sync-once mode."}),"\n",(0,s.jsxs)(t.p,{children:["For this deployment mode, please enable and set: ",(0,s.jsx)(t.code,{children:"hoodie.clustering.inline"})]}),"\n",(0,s.jsxs)(t.p,{children:["To choose how often clustering is triggered, also set: ",(0,s.jsx)(t.code,{children:"hoodie.clustering.inline.max.commits"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"Inline clustering can be setup easily using spark dataframe options.\nSee sample below:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-scala",children:'import org.apache.hudi.QuickstartUtils._\nimport scala.collection.JavaConversions._\nimport org.apache.spark.sql.SaveMode._\nimport org.apache.hudi.DataSourceReadOptions._\nimport org.apache.hudi.DataSourceWriteOptions._\nimport org.apache.hudi.config.HoodieWriteConfig._\n\n\nval df = //generate data frame\ndf.write.format("org.apache.hudi").\n options(getQuickstartWriteConfigs).\n option("hoodie.datasource.write.precombine.field", "ts").\n option("hoodie.datasource.write.recordkey.field", "uuid").\n option("hoodie.datasource.write.partitionpath.field", "partitionpath").\n option("hoodie.table.name", "tableName").\n option("hoodie.parquet.small.file.limit", "0").\n option("hoodie.clustering.inline", "true").\n option("hoodie.clustering.inline.max.commits", "4").\n option("hoodie.clustering.plan.strategy.target.file.max.bytes", "1073741824").\n option("hoodie.clustering.plan.strategy.small.file.limit", "629145600").\n option("hoodie.clustering.plan.strategy.sort.columns", "column1,column2"). //optional, if sorting is needed as part of rewriting data\n mode(Append).\n save("dfs://location");\n'})}),"\n",(0,s.jsx)(t.h2,{id:"async-clustering",children:"Async Clustering"}),"\n",(0,s.jsx)(t.p,{children:"Async clustering runs the clustering table service in the background without blocking the regular ingestions writers. There are three different ways to deploy an asynchronous clustering process:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Asynchronous execution within the same process"}),": In this deployment mode, Hudi will schedule and plan the clustering operations after each commit is completed as part of the ingestion pipeline. Separately, Hudi spins up another thread within the same job and executes the clustering table service. This is supported by Spark Streaming, Flink and DeltaStreamer in continuous mode. For this deployment mode, please enable ",(0,s.jsx)(t.code,{children:"hoodie.clustering.async.enabled"})," and ",(0,s.jsx)(t.code,{children:"hoodie.clustering.async.max.commits\u200b"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Asynchronous scheduling and execution by a separate process"}),": In this deployment mode, the application will write data to a Hudi table as part of the ingestion pipeline. A separate clustering job will schedule, plan and execute the clustering operation. By running a different job for the clustering operation, it rebalances how Hudi uses compute resources: fewer compute resources are needed for the ingestion, which makes ingestion latency stable, and an independent set of compute resources are reserved for the clustering process. Please configure the lock providers for the concurrency control among all jobs (both writer and table service jobs). In general, configure lock providers when there are two different jobs or two different processes occurring. All writers support this deployment model. For this deployment mode, no clustering configs should be set for the ingestion writer."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Scheduling inline and executing async"}),": In this deployment mode, the application ingests data and schedules the clustering in one job; in another, the application executes the clustering plan. The supported writers (see below) won\u2019t be blocked from ingesting data. If the metadata table is enabled, a lock provider is not needed. However, if the metadata table is enabled, please ensure all jobs have the lock providers configured for concurrency control. All writers support this deployment option. For this deployment mode, please enable, ",(0,s.jsx)(t.code,{children:"hoodie.clustering.schedule.inline"})," and ",(0,s.jsx)(t.code,{children:"hoodie.clustering.async.enabled"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Hudi supports ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/concurrency_control#enabling-multi-writing",children:"multi-writers"})," which provides\nsnapshot isolation between multiple table services, thus allowing writers to continue with ingestion while clustering\nruns in the background."]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.async.enabled"}),(0,s.jsx)(t.td,{children:"false (Optional)"}),(0,s.jsxs)(t.td,{children:["Enable running of clustering service, asynchronously as inserts happen on the table.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: ASYNC_CLUSTERING_ENABLE"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.7.0"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.clustering.async.max.commits"}),(0,s.jsx)(t.td,{children:"4 (Optional)"}),(0,s.jsxs)(t.td,{children:["Config to control frequency of async clustering",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Config Param: ASYNC_CLUSTERING_MAX_COMMITS"}),(0,s.jsx)("br",{}),(0,s.jsx)(t.code,{children:"Since Version: 0.9.0"})]})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"setup-asynchronous-clustering",children:"Setup Asynchronous Clustering"}),"\n",(0,s.jsxs)(t.p,{children:["Users can leverage ",(0,s.jsx)(t.a,{href:"https://cwiki.apache.org/confluence/display/HUDI/RFC+-+19+Clustering+data+for+freshness+and+query+performance#RFC19Clusteringdataforfreshnessandqueryperformance-SetupforAsyncclusteringJob",children:"HoodieClusteringJob"}),"\nto setup 2-step asynchronous clustering."]}),"\n",(0,s.jsx)(t.h3,{id:"hoodieclusteringjob",children:"HoodieClusteringJob"}),"\n",(0,s.jsxs)(t.p,{children:["By specifying the ",(0,s.jsx)(t.code,{children:"scheduleAndExecute"})," mode both schedule as well as clustering can be achieved in the same step.\nThe appropriate mode can be specified using ",(0,s.jsx)(t.code,{children:"-mode"})," or ",(0,s.jsx)(t.code,{children:"-m"})," option. There are three modes:"]}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"schedule"}),": Make a clustering plan. This gives an instant which can be passed in execute mode."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"execute"}),": Execute a clustering plan at a particular instant. If no instant-time is specified, HoodieClusteringJob will execute for the earliest instant on the Hudi timeline."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"scheduleAndExecute"}),": Make a clustering plan first and execute that plan immediately."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Note that to run this job while the original writer is still running, please enable multi-writing:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"hoodie.write.concurrency.mode=optimistic_concurrency_control\nhoodie.write.lock.provider=org.apache.hudi.client.transaction.lock.ZookeeperBasedLockProvider\n"})}),"\n",(0,s.jsx)(t.p,{children:"A sample spark-submit command to setup HoodieClusteringJob is as below:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'spark-submit \\\n--jars "packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar,packaging/hudi-spark-bundle/target/hudi-spark3.5-bundle_2.12-1.0.0.jar" \\\n--class org.apache.hudi.utilities.HoodieClusteringJob \\\n/path/to/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar \\\n--props /path/to/config/clusteringjob.properties \\\n--mode scheduleAndExecute \\\n--base-path /path/to/hudi_table/basePath \\\n--table-name hudi_table_schedule_clustering \\\n--spark-memory 1g\n'})}),"\n",(0,s.jsxs)(t.p,{children:["A sample ",(0,s.jsx)(t.code,{children:"clusteringjob.properties"})," file:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"hoodie.clustering.async.enabled=true\nhoodie.clustering.async.max.commits=4\nhoodie.clustering.plan.strategy.target.file.max.bytes=1073741824\nhoodie.clustering.plan.strategy.small.file.limit=629145600\nhoodie.clustering.execution.strategy.class=org.apache.hudi.client.clustering.run.strategy.SparkSortAndSizeExecutionStrategy\nhoodie.clustering.plan.strategy.sort.columns=column1,column2\n"})}),"\n",(0,s.jsx)(t.h3,{id:"hoodiestreamer",children:"HoodieStreamer"}),"\n",(0,s.jsxs)(t.p,{children:["This brings us to our users' favorite utility in Hudi. Now, we can trigger asynchronous clustering with Hudi Streamer.\nJust set the ",(0,s.jsx)(t.code,{children:"hoodie.clustering.async.enabled"})," config to true and specify other clustering config in properties file\nwhose location can be pased as ",(0,s.jsx)(t.code,{children:"\u2014props"})," when starting the Hudi Streamer (just like in the case of HoodieClusteringJob)."]}),"\n",(0,s.jsx)(t.p,{children:"A sample spark-submit command to setup HoodieStreamer is as below:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'spark-submit \\\n--jars "packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar,packaging/hudi-spark-bundle/target/hudi-spark3.5-bundle_2.12-1.0.0.jar" \\\n--class org.apache.hudi.utilities.streamer.HoodieStreamer \\\n/path/to/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar \\\n--props /path/to/config/clustering_kafka.properties \\\n--schemaprovider-class org.apache.hudi.utilities.schema.SchemaRegistryProvider \\\n--source-class org.apache.hudi.utilities.sources.AvroKafkaSource \\\n--source-ordering-field impresssiontime \\\n--table-type COPY_ON_WRITE \\\n--target-base-path /path/to/hudi_table/basePath \\\n--target-table impressions_cow_cluster \\\n--op INSERT \\\n--hoodie-conf hoodie.clustering.async.enabled=true \\\n--continuous\n'})}),"\n",(0,s.jsx)(t.h3,{id:"spark-structured-streaming",children:"Spark Structured Streaming"}),"\n",(0,s.jsx)(t.p,{children:"We can also enable asynchronous clustering with Spark structured streaming sink as shown below."}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-scala",children:'val commonOpts = Map(\n "hoodie.insert.shuffle.parallelism" -> "4",\n "hoodie.upsert.shuffle.parallelism" -> "4",\n "hoodie.datasource.write.recordkey.field" -> "_row_key",\n "hoodie.datasource.write.partitionpath.field" -> "partition",\n "hoodie.datasource.write.precombine.field" -> "timestamp",\n "hoodie.table.name" -> "hoodie_test"\n)\n\ndef getAsyncClusteringOpts(isAsyncClustering: String, \n clusteringNumCommit: String, \n executionStrategy: String):Map[String, String] = {\n commonOpts + (DataSourceWriteOptions.ASYNC_CLUSTERING_ENABLE.key -> isAsyncClustering,\n HoodieClusteringConfig.ASYNC_CLUSTERING_MAX_COMMITS.key -> clusteringNumCommit,\n HoodieClusteringConfig.EXECUTION_STRATEGY_CLASS_NAME.key -> executionStrategy\n )\n}\n\ndef initStreamingWriteFuture(hudiOptions: Map[String, String]): Future[Unit] = {\n val streamingInput = // define the source of streaming\n Future {\n println("streaming starting")\n streamingInput\n .writeStream\n .format("org.apache.hudi")\n .options(hudiOptions)\n .option("checkpointLocation", basePath + "/checkpoint")\n .mode(Append)\n .start()\n .awaitTermination(10000)\n println("streaming ends")\n }\n}\n\ndef structuredStreamingWithClustering(): Unit = {\n val df = //generate data frame\n val hudiOptions = getClusteringOpts("true", "1", "org.apache.hudi.client.clustering.run.strategy.SparkSortAndSizeExecutionStrategy")\n val f1 = initStreamingWriteFuture(hudiOptions)\n Await.result(f1, Duration.Inf)\n}\n'})}),"\n",(0,s.jsx)(t.h2,{id:"java-client",children:"Java Client"}),"\n",(0,s.jsxs)(t.p,{children:["Clustering is also supported via Java client. Plan strategy ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.plan.strategy.JavaSizeBasedClusteringPlanStrategy"}),"\nand execution strategy ",(0,s.jsx)(t.code,{children:"org.apache.hudi.client.clustering.run.strategy.JavaSortAndSizeExecutionStrategy"})," are supported\nout-of-the-box. Note that as of now only linear sort is supported in Java execution strategy."]}),"\n",(0,s.jsx)(t.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)("h3",{children:"Blogs"}),"\n",(0,s.jsx)(t.a,{href:"https://www.onehouse.ai/blog/apachehudi-z-order-and-hilbert-space-filling-curves",children:"Apache Hudi Z-Order and Hilbert Space Filling Curves"}),"\n",(0,s.jsx)(t.a,{href:"https://medium.com/apache-hudi-blogs/hudi-z-order-and-hilbert-space-filling-curves-68fa28bffaf0",children:"Hudi Z-Order and Hilbert Space-filling Curves"})]}),"\n",(0,s.jsx)("h3",{children:"Videos"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://www.youtube.com/watch?v=R_sm4wlGXuE",children:"Understanding Clustering in Apache Hudi and the Benefits of Asynchronous Clustering"})}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},7004:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/clustering1_new-d67c9e691d235b140f7c80d68400f425.png"},67491:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/clustering2_new-0837c07b6db44ab75873633f0eab2e2c.png"},14438:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/clustering_3-8bc286ab44c48137f8409b5c342a7207.png"},28453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>l});var n=i(96540);const s={},r=n.createContext(s);function a(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/content/cn/assets/js/10b6d210.3f6cd12f.js b/content/cn/assets/js/10b6d210.3f6cd12f.js deleted file mode 100644 index 18f63107f1f72..0000000000000 --- a/content/cn/assets/js/10b6d210.3f6cd12f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[18757],{78367:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"compaction","title":"Compaction","description":"Background","source":"@site/docs/compaction.md","sourceDirName":".","slug":"/compaction","permalink":"/cn/docs/next/compaction","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/compaction.md","tags":[],"version":"current","frontMatter":{"title":"Compaction","summary":"In this page, we describe async compaction in Hudi.","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4,"last_modified_at":null},"sidebar":"docs","previous":{"title":"Cleaning","permalink":"/cn/docs/next/cleaning"},"next":{"title":"Clustering","permalink":"/cn/docs/next/clustering"}}');var o=t(74848),a=t(28453);const s={title:"Compaction",summary:"In this page, we describe async compaction in Hudi.",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4,last_modified_at:null},r=void 0,c={},l=[{value:"Background",id:"background",level:2},{value:"Why MOR tables need compaction?",id:"why-mor-tables-need-compaction",level:3},{value:"Compaction Architecture",id:"compaction-architecture",level:2},{value:"Strategies in Compaction Scheduling",id:"strategies-in-compaction-scheduling",level:3},{value:"Trigger Strategies",id:"trigger-strategies",level:4},{value:"Compaction Strategies",id:"compaction-strategies",level:4},{value:"Ways to trigger Compaction",id:"ways-to-trigger-compaction",level:2},{value:"Inline",id:"inline",level:3},{value:"Async & Offline Compaction models",id:"async--offline-compaction-models",level:3},{value:"Async execution within the same process",id:"async-execution-within-the-same-process",level:4},{value:"Spark Structured Streaming",id:"spark-structured-streaming",level:5},{value:"Hudi Streamer Continuous Mode",id:"hudi-streamer-continuous-mode",level:5},{value:"Scheduling and Execution by a separate process",id:"scheduling-and-execution-by-a-separate-process",level:4},{value:"Scheduling inline and executing async",id:"scheduling-inline-and-executing-async",level:4},{value:"Hudi Compactor Utility",id:"hudi-compactor-utility",level:4},{value:"Hudi CLI",id:"hudi-cli",level:4},{value:"Flink Offline Compaction",id:"flink-offline-compaction",level:4},{value:"Options",id:"options",level:4}];function d(e){const i={a:"a",admonition:"admonition",br:"br",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.h2,{id:"background",children:"Background"}),"\n",(0,o.jsx)(i.p,{children:"Compaction is a table service employed by Hudi specifically in Merge On Read(MOR) tables to merge updates from row-based log\nfiles to the corresponding columnar-based base file periodically to produce a new version of the base file. Compaction is\nnot applicable to Copy On Write(COW) tables and only applies to MOR tables."}),"\n",(0,o.jsx)(i.h3,{id:"why-mor-tables-need-compaction",children:"Why MOR tables need compaction?"}),"\n",(0,o.jsxs)(i.p,{children:["To understand the significance of compaction in MOR tables, it is helpful to understand the MOR table layout first. In Hudi,\ndata is organized in terms of ",(0,o.jsx)(i.a,{href:"https://hudi.apache.org/docs/file_layouts/",children:"file groups"}),". Each file group in a MOR table\nconsists of a base file and one or more log files. Typically, during writes, inserts are stored in the base file, and updates\nare appended to log files."]}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.img,{alt:"mor_table_file_layout",src:t(67587).A+"",width:"6528",height:"2450"}),"\n",(0,o.jsx)(i.em,{children:"Figure: MOR table file layout showing different file groups with base data file and log files"})]}),"\n",(0,o.jsx)(i.p,{children:"During the compaction process, updates from the log files are merged with the base file to form a new version of the\nbase file as shown below. Since MOR is designed to be write-optimized, on new writes, after index tagging is complete,\nHudi appends the records pertaining to each file groups as log blocks in log files. There is no synchronous merge\nhappening during write, resulting in a lower write amplification and better write latency. In contrast, on new writes to a\nCOW table, Hudi combines the new writes with the older base file to produce a new version of the base file resulting in\na higher write amplification and higher write latencies."}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.img,{alt:"mor_table_file_layout",src:t(56040).A+"",width:"5081",height:"3148"}),"\n",(0,o.jsx)(i.em,{children:"Figure: Compaction on a given file group"})]}),"\n",(0,o.jsx)(i.p,{children:"While serving the read query(snapshot read), for each file group, records in base file and all its corresponding log\nfiles are merged together and served. And hence the read latency for MOR snapshot query might be higher compared to\nCOW table since there is no merge involved in case of COW at read time. Compaction takes care of merging the updates from\nlog files with the base file at regular intervals to bound the growth of log files and to ensure the read latencies do not\nspike up."}),"\n",(0,o.jsx)(i.h2,{id:"compaction-architecture",children:"Compaction Architecture"}),"\n",(0,o.jsx)(i.p,{children:"There are two steps to compaction."}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.em,{children:(0,o.jsx)(i.strong,{children:"Compaction Scheduling"})}),": In this step, Hudi scans the partitions and selects file slices to be compacted. A compaction\nplan is finally written to Hudi timeline."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.em,{children:(0,o.jsx)(i.strong,{children:"Compaction Execution"})}),": In this step the compaction plan is read and file slices are compacted."]}),"\n"]}),"\n",(0,o.jsx)(i.h3,{id:"strategies-in-compaction-scheduling",children:"Strategies in Compaction Scheduling"}),"\n",(0,o.jsx)(i.p,{children:"There are two strategies involved in scheduling the compaction:"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"Trigger Strategy: Determines how often to trigger scheduling of the compaction."}),"\n",(0,o.jsx)(i.li,{children:"Compaction Strategy: Determines which file groups to compact."}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"Hudi provides various options for both these strategies as discussed below."}),"\n",(0,o.jsx)(i.h4,{id:"trigger-strategies",children:"Trigger Strategies"}),"\n",(0,o.jsxs)(i.table,{children:[(0,o.jsx)(i.thead,{children:(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.th,{children:"Config Name"}),(0,o.jsx)(i.th,{children:"Default"}),(0,o.jsx)(i.th,{children:"Description"})]})}),(0,o.jsxs)(i.tbody,{children:[(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:"hoodie.compact.inline.trigger.strategy"}),(0,o.jsx)(i.td,{children:"NUM_COMMITS (Optional)"}),(0,o.jsxs)(i.td,{children:["org.apache.hudi.table.action.compact.CompactionTriggerStrategy: Controls when compaction is scheduled.",(0,o.jsx)("br",{}),(0,o.jsx)(i.code,{children:"Config Param: INLINE_COMPACT_TRIGGER_STRATEGY"})," ",(0,o.jsx)("br",{})]})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsxs)("ul",{children:[(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"NUM_COMMITS"}),": triggers compaction when there are at least N delta commits after last completed compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"NUM_COMMITS_AFTER_LAST_REQUEST"}),": triggers compaction when there are at least N delta commits after last completed or requested compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"TIME_ELAPSED"}),": triggers compaction after N seconds since last compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"NUM_AND_TIME"}),": triggers compaction when both there are at least N delta commits and N seconds elapsed (both must be satisfied) after last completed compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"NUM_OR_TIME"}),": triggers compaction when both there are at least N delta commits or N seconds elapsed (either condition is satisfied) after last completed compaction."]})]})}),(0,o.jsx)(i.td,{}),(0,o.jsx)(i.td,{})]})]})]}),"\n",(0,o.jsx)(i.h4,{id:"compaction-strategies",children:"Compaction Strategies"}),"\n",(0,o.jsxs)(i.table,{children:[(0,o.jsx)(i.thead,{children:(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.th,{children:"Config Name"}),(0,o.jsx)(i.th,{children:"Default"}),(0,o.jsx)(i.th,{children:"Description"})]})}),(0,o.jsx)(i.tbody,{children:(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:"hoodie.compaction.strategy"}),(0,o.jsx)(i.td,{children:"org.apache.hudi.table.action.compact.strategy.LogFileSizeBasedCompactionStrategy (Optional)"}),(0,o.jsxs)(i.td,{children:["Compaction strategy decides which file groups are picked up for compaction during each compaction run. By default. Hudi picks the log file with most accumulated unmerged data. ",(0,o.jsx)("br",{}),(0,o.jsx)("br",{}),(0,o.jsx)(i.code,{children:"Config Param: COMPACTION_STRATEGY"})]})]})})]}),"\n",(0,o.jsxs)(i.p,{children:["Available Strategies (Provide the full package name when using the strategy): ",(0,o.jsxs)("ul",{children:[(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"LogFileNumBasedCompactionStrategy"}),":\norders the compactions based on the total log files count, filters the file group with log files count greater than the\nthreshold and limits the compactions within a configured IO bound."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"LogFileSizeBasedCompactionStrategy"}),": orders\nthe compactions based on the total log files size, filters the file group which log files size is greater than the\nthreshold and limits the compactions within a configured IO bound."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"BoundedIOCompactionStrategy"}),": CompactionStrategy\nwhich looks at total IO to be done for the compaction (read + write) and limits the list of compactions to be under a\nconfigured limit on the IO."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"BoundedPartitionAwareCompactionStrategy"}),":This"," strategy ensures that the last N partitions\nare picked up even if there are later partitions created for the table. lastNPartitions is defined as the N partitions before\nthe currentDate. currentDay = 2018/01/01 The table has partitions for 2018/02/02 and 2018/03/03 beyond the currentDay This\nstrategy will pick up the following partitions for compaction : (2018/01/01, allPartitionsInRange[(2018/01/01 - lastNPartitions)\nto 2018/01/01), 2018/02/02, 2018/03/03)"]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"DayBasedCompactionStrategy"}),":This"," strategy orders compactions in reverse\norder of creation of Hive Partitions. It helps to compact data in latest partitions first and then older capped at the\nTotal_IO allowed."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"UnBoundedCompactionStrategy"}),": UnBoundedCompactionStrategy will not change ordering or filter\nany compaction. It is a pass-through and will compact all the base files which has a log file. This usually means\nno-intelligence on compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"UnBoundedPartitionAwareCompactionStrategy"}),":UnBoundedPartitionAwareCompactionStrategy"," is a custom UnBounded Strategy. This will filter all the partitions that\nare eligible to be compacted by a {@link BoundedPartitionAwareCompactionStrategy} and return the result. This is done\nso that a long running UnBoundedPartitionAwareCompactionStrategy does not step over partitions in a shorter running\nBoundedPartitionAwareCompactionStrategy. Essentially, this is an inverse of the partitions chosen in\nBoundedPartitionAwareCompactionStrategy"]})]})]}),"\n",(0,o.jsx)(i.admonition,{type:"note",children:(0,o.jsxs)(i.p,{children:["Please refer to ",(0,o.jsx)(i.a,{href:"https://hudi.apache.org/docs/next/configurations#Compaction-Configs",children:"advanced configs"})," for more details."]})}),"\n",(0,o.jsx)(i.h2,{id:"ways-to-trigger-compaction",children:"Ways to trigger Compaction"}),"\n",(0,o.jsx)(i.h3,{id:"inline",children:"Inline"}),"\n",(0,o.jsx)(i.p,{children:"By default, compaction is run asynchronously."}),"\n",(0,o.jsx)(i.p,{children:"If latency of ingesting records is important for you, you are most likely using Merge-On-Read tables.\nMerge-On-Read tables store data using a combination of columnar (e.g parquet) + row based (e.g avro) file formats.\nUpdates are logged to delta files & later compacted to produce new versions of columnar files.\nTo improve ingestion latency, Async Compaction is the default configuration."}),"\n",(0,o.jsx)(i.p,{children:"If immediate read performance of a new commit is important for you, or you want simplicity of not managing separate compaction jobs,\nyou may want synchronous inline compaction, which means that as a commit is written it is also compacted by the same job."}),"\n",(0,o.jsxs)(i.p,{children:["For this deployment mode, please use ",(0,o.jsx)(i.code,{children:"hoodie.compact.inline = true"})," for Spark Datasource and Spark SQL writers. For\nHoodieStreamer sync once mode inline compaction can be achieved by passing the flag ",(0,o.jsx)(i.code,{children:"--disable-compaction"})," (Meaning to\ndisable async compaction). Further in HoodieStreamer when both\ningestion and compaction is running in the same spark context, you can use resource allocation configuration\nin Hudi Streamer CLI such as (",(0,o.jsx)(i.code,{children:"--delta-sync-scheduling-weight"}),",\n",(0,o.jsx)(i.code,{children:"--compact-scheduling-weight"}),", ",(0,o.jsx)(i.code,{children:"--delta-sync-scheduling-minshare"}),", and ",(0,o.jsx)(i.code,{children:"--compact-scheduling-minshare"}),")\nto control executor allocation between ingestion and compaction."]}),"\n",(0,o.jsx)(i.h3,{id:"async--offline-compaction-models",children:"Async & Offline Compaction models"}),"\n",(0,o.jsx)(i.p,{children:"There are a couple of ways here to trigger compaction ."}),"\n",(0,o.jsx)(i.h4,{id:"async-execution-within-the-same-process",children:"Async execution within the same process"}),"\n",(0,o.jsx)(i.p,{children:"In streaming ingestion write models like HoodieStreamer\ncontinuous mode, Flink and Spark Streaming, async compaction is enabled by default and runs alongside without blocking\nregular ingestion."}),"\n",(0,o.jsx)(i.h5,{id:"spark-structured-streaming",children:"Spark Structured Streaming"}),"\n",(0,o.jsx)(i.p,{children:"Compactions are scheduled and executed asynchronously inside the\nstreaming job.Here is an example snippet in java"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-properties",children:'import org.apache.hudi.DataSourceWriteOptions;\nimport org.apache.hudi.HoodieDataSourceHelpers;\nimport org.apache.hudi.config.HoodieCompactionConfig;\nimport org.apache.hudi.config.HoodieWriteConfig;\n\nimport org.apache.spark.sql.streaming.OutputMode;\nimport org.apache.spark.sql.streaming.ProcessingTime;\n\n\n DataStreamWriter writer = streamingInput.writeStream().format("org.apache.hudi")\n .option("hoodie.datasource.write.operation", operationType)\n .option("hoodie.datasource.write.table.type", tableType)\n .option("hoodie.datasource.write.recordkey.field", "_row_key")\n .option("hoodie.datasource.write.partitionpath.field", "partition")\n .option("hoodie.datasource.write.precombine.field"(), "timestamp")\n .option("hoodie.compact.inline.max.delta.commits", "10")\n .option("hoodie.datasource.compaction.async.enable", "true")\n .option("hoodie.table.name", tableName).option("checkpointLocation", checkpointLocation)\n .outputMode(OutputMode.Append());\n writer.trigger(new ProcessingTime(30000)).start(tablePath);\n'})}),"\n",(0,o.jsx)(i.h5,{id:"hudi-streamer-continuous-mode",children:"Hudi Streamer Continuous Mode"}),"\n",(0,o.jsxs)(i.p,{children:["Hudi Streamer provides continuous ingestion mode where a single long running spark application",(0,o.jsx)(i.br,{}),"\n","ingests data to Hudi table continuously from upstream sources. In this mode, Hudi supports managing asynchronous\ncompactions. Here is an example snippet for running in continuous mode with async compactions"]}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-properties",children:"spark-submit --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n--class org.apache.hudi.utilities.streamer.HoodieStreamer \\\n--table-type MERGE_ON_READ \\\n--target-base-path \\\n--target-table \\\n--source-class org.apache.hudi.utilities.sources.JsonDFSSource \\\n--source-ordering-field ts \\\n--props /path/to/source.properties \\\n--continous\n"})}),"\n",(0,o.jsx)(i.h4,{id:"scheduling-and-execution-by-a-separate-process",children:"Scheduling and Execution by a separate process"}),"\n",(0,o.jsxs)(i.p,{children:["For some use cases with long running table services, instead of having the regular writes block, users have the option to run\nboth steps of the compaction (",(0,o.jsx)(i.a,{href:"#compaction-architecture",children:"scheduling and execution"}),") offline in a separate process altogether.\nThis allows for regular writers to not bother about these compaction steps and allows users to provide more resources for\nthe compaction job as needed."]}),"\n",(0,o.jsx)(i.admonition,{type:"note",children:(0,o.jsx)(i.p,{children:"This model needs a lock provider configured for all jobs - the regular writer as well as the offline compaction job."})}),"\n",(0,o.jsx)(i.h4,{id:"scheduling-inline-and-executing-async",children:"Scheduling inline and executing async"}),"\n",(0,o.jsx)(i.p,{children:"In this model, it is possible for a Spark Datasource writer or a Flink job to just schedule the compaction inline ( that\nwill serialize the compaction plan in the timeline but will not execute it). And then a separate utility like\nHudiCompactor or HoodieFlinkCompactor can take care of periodically executing the compaction plan."}),"\n",(0,o.jsx)(i.admonition,{type:"note",children:(0,o.jsxs)(i.p,{children:["This model may need a lock provider ",(0,o.jsx)(i.strong,{children:"if"})," metadata table is enabled."]})}),"\n",(0,o.jsx)(i.h4,{id:"hudi-compactor-utility",children:"Hudi Compactor Utility"}),"\n",(0,o.jsxs)(i.p,{children:["Hudi provides a standalone tool to execute specific compactions asynchronously. Below is an example and you can read more in the ",(0,o.jsx)(i.a,{href:"/docs/cli#compactions",children:"deployment guide"}),"\nThe compactor utility allows to do scheduling and execution of compaction."]}),"\n",(0,o.jsx)(i.p,{children:"Example:"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-properties",children:"spark-submit --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n--class org.apache.hudi.utilities.HoodieCompactor \\\n--base-path \\\n--table-name \\\n--schema-file \\\n--instant-time \n"})}),"\n",(0,o.jsxs)(i.p,{children:["Note, the ",(0,o.jsx)(i.code,{children:"instant-time"})," parameter is now optional for the Hudi Compactor Utility. If using the utility without ",(0,o.jsx)(i.code,{children:"--instant time"}),",\nthe spark-submit will execute the earliest scheduled compaction on the Hudi timeline."]}),"\n",(0,o.jsx)(i.h4,{id:"hudi-cli",children:"Hudi CLI"}),"\n",(0,o.jsxs)(i.p,{children:["Hudi CLI is yet another way to execute specific compactions asynchronously. Here is an example and you can read more in the ",(0,o.jsx)(i.a,{href:"/docs/cli#compactions",children:"deployment guide"})]}),"\n",(0,o.jsx)(i.p,{children:"Example:"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-properties",children:"hudi:trips->compaction run --tableName --parallelism --compactionInstant \n...\n"})}),"\n",(0,o.jsx)(i.h4,{id:"flink-offline-compaction",children:"Flink Offline Compaction"}),"\n",(0,o.jsxs)(i.p,{children:["Offline compaction needs to submit the Flink task on the command line. The program entry is as follows: ",(0,o.jsx)(i.code,{children:"hudi-flink-bundle_2.11-0.9.0-SNAPSHOT.jar"})," :\n",(0,o.jsx)(i.code,{children:"org.apache.hudi.sink.compact.HoodieFlinkCompactor"})]}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-bash",children:"# Command line\n./bin/flink run -c org.apache.hudi.sink.compact.HoodieFlinkCompactor lib/hudi-flink-bundle_2.11-0.9.0.jar --path hdfs://xxx:9000/table\n"})}),"\n",(0,o.jsx)(i.h4,{id:"options",children:"Options"}),"\n",(0,o.jsxs)(i.table,{children:[(0,o.jsx)(i.thead,{children:(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.th,{children:"Option Name"}),(0,o.jsx)(i.th,{children:"Default"}),(0,o.jsx)(i.th,{children:"Description"})]})}),(0,o.jsxs)(i.tbody,{children:[(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--path"})}),(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"n/a **(Required)**"})}),(0,o.jsx)(i.td,{children:"The path where the target table is stored on Hudi"})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--compaction-max-memory"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"100"})," (Optional)"]}),(0,o.jsx)(i.td,{children:"The index map size of log data during compaction, 100 MB by default. If you have enough memory, you can turn up this parameter"})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--schedule"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"false"})," (Optional)"]}),(0,o.jsx)(i.td,{children:"whether to execute the operation of scheduling compaction plan. When the write process is still writing\uff0c turning on this parameter have a risk of losing data. Therefore, it must be ensured that there are no write tasks currently writing data to this table when this parameter is turned on"})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--seq"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"LIFO"})," (Optional)"]}),(0,o.jsxs)(i.td,{children:["The order in which compaction tasks are executed. Executing from the latest compaction plan by default. ",(0,o.jsx)(i.code,{children:"LIFO"}),": executing from the latest plan. ",(0,o.jsx)(i.code,{children:"FIFO"}),": executing from the oldest plan."]})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--service"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"false"})," (Optional)"]}),(0,o.jsx)(i.td,{children:"Whether to start a monitoring service that checks and schedules new compaction task in configured interval."})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--min-compaction-interval-seconds"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"600(s)"})," (optional)"]}),(0,o.jsx)(i.td,{children:"The checking interval for service mode, by default 10 minutes."})]})]})]})]})}function h(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},67587:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/hudi_mor_file_layout-643f9f7fda5aa0d532682af27fe3e42c.jpg"},56040:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/hudi_mor_file_layout_post_compaction-9f10af785d4927dc3d66303dac5bc7ba.jpg"},28453:(e,i,t)=>{t.d(i,{R:()=>s,x:()=>r});var n=t(96540);const o={},a=n.createContext(o);function s(e){const i=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/content/cn/assets/js/10b6d210.c61f07fc.js b/content/cn/assets/js/10b6d210.c61f07fc.js new file mode 100644 index 0000000000000..214be08b076ef --- /dev/null +++ b/content/cn/assets/js/10b6d210.c61f07fc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[18757],{78367:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"compaction","title":"Compaction","description":"Background","source":"@site/docs/compaction.md","sourceDirName":".","slug":"/compaction","permalink":"/cn/docs/next/compaction","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/compaction.md","tags":[],"version":"current","frontMatter":{"title":"Compaction","summary":"In this page, we describe async compaction in Hudi.","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4,"last_modified_at":null},"sidebar":"docs","previous":{"title":"Cleaning","permalink":"/cn/docs/next/cleaning"},"next":{"title":"Clustering","permalink":"/cn/docs/next/clustering"}}');var o=t(74848),a=t(28453);const s={title:"Compaction",summary:"In this page, we describe async compaction in Hudi.",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4,last_modified_at:null},r=void 0,c={},l=[{value:"Background",id:"background",level:2},{value:"Why MOR tables need compaction?",id:"why-mor-tables-need-compaction",level:3},{value:"Compaction Architecture",id:"compaction-architecture",level:2},{value:"Strategies in Compaction Scheduling",id:"strategies-in-compaction-scheduling",level:3},{value:"Trigger Strategies",id:"trigger-strategies",level:4},{value:"Compaction Strategies",id:"compaction-strategies",level:4},{value:"Ways to trigger Compaction",id:"ways-to-trigger-compaction",level:2},{value:"Inline",id:"inline",level:3},{value:"Async & Offline Compaction models",id:"async--offline-compaction-models",level:3},{value:"Async execution within the same process",id:"async-execution-within-the-same-process",level:4},{value:"Spark Structured Streaming",id:"spark-structured-streaming",level:5},{value:"Hudi Streamer Continuous Mode",id:"hudi-streamer-continuous-mode",level:5},{value:"Scheduling and Execution by a separate process",id:"scheduling-and-execution-by-a-separate-process",level:4},{value:"Scheduling inline and executing async",id:"scheduling-inline-and-executing-async",level:4},{value:"Hudi Compactor Utility",id:"hudi-compactor-utility",level:4},{value:"Hudi CLI",id:"hudi-cli",level:4},{value:"Flink Offline Compaction",id:"flink-offline-compaction",level:4},{value:"Options",id:"options",level:4},{value:"Related Resources",id:"related-resources",level:2}];function d(e){const i={a:"a",admonition:"admonition",br:"br",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.h2,{id:"background",children:"Background"}),"\n",(0,o.jsx)(i.p,{children:"Compaction is a table service employed by Hudi specifically in Merge On Read(MOR) tables to merge updates from row-based log\nfiles to the corresponding columnar-based base file periodically to produce a new version of the base file. Compaction is\nnot applicable to Copy On Write(COW) tables and only applies to MOR tables."}),"\n",(0,o.jsx)(i.h3,{id:"why-mor-tables-need-compaction",children:"Why MOR tables need compaction?"}),"\n",(0,o.jsxs)(i.p,{children:["To understand the significance of compaction in MOR tables, it is helpful to understand the MOR table layout first. In Hudi,\ndata is organized in terms of ",(0,o.jsx)(i.a,{href:"https://hudi.apache.org/docs/file_layouts/",children:"file groups"}),". Each file group in a MOR table\nconsists of a base file and one or more log files. Typically, during writes, inserts are stored in the base file, and updates\nare appended to log files."]}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.img,{alt:"mor_table_file_layout",src:t(67587).A+"",width:"6528",height:"2450"}),"\n",(0,o.jsx)(i.em,{children:"Figure: MOR table file layout showing different file groups with base data file and log files"})]}),"\n",(0,o.jsx)(i.p,{children:"During the compaction process, updates from the log files are merged with the base file to form a new version of the\nbase file as shown below. Since MOR is designed to be write-optimized, on new writes, after index tagging is complete,\nHudi appends the records pertaining to each file groups as log blocks in log files. There is no synchronous merge\nhappening during write, resulting in a lower write amplification and better write latency. In contrast, on new writes to a\nCOW table, Hudi combines the new writes with the older base file to produce a new version of the base file resulting in\na higher write amplification and higher write latencies."}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.img,{alt:"mor_table_file_layout",src:t(56040).A+"",width:"5081",height:"3148"}),"\n",(0,o.jsx)(i.em,{children:"Figure: Compaction on a given file group"})]}),"\n",(0,o.jsx)(i.p,{children:"While serving the read query(snapshot read), for each file group, records in base file and all its corresponding log\nfiles are merged together and served. And hence the read latency for MOR snapshot query might be higher compared to\nCOW table since there is no merge involved in case of COW at read time. Compaction takes care of merging the updates from\nlog files with the base file at regular intervals to bound the growth of log files and to ensure the read latencies do not\nspike up."}),"\n",(0,o.jsx)(i.h2,{id:"compaction-architecture",children:"Compaction Architecture"}),"\n",(0,o.jsx)(i.p,{children:"There are two steps to compaction."}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.em,{children:(0,o.jsx)(i.strong,{children:"Compaction Scheduling"})}),": In this step, Hudi scans the partitions and selects file slices to be compacted. A compaction\nplan is finally written to Hudi timeline."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.em,{children:(0,o.jsx)(i.strong,{children:"Compaction Execution"})}),": In this step the compaction plan is read and file slices are compacted."]}),"\n"]}),"\n",(0,o.jsx)(i.h3,{id:"strategies-in-compaction-scheduling",children:"Strategies in Compaction Scheduling"}),"\n",(0,o.jsx)(i.p,{children:"There are two strategies involved in scheduling the compaction:"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"Trigger Strategy: Determines how often to trigger scheduling of the compaction."}),"\n",(0,o.jsx)(i.li,{children:"Compaction Strategy: Determines which file groups to compact."}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"Hudi provides various options for both these strategies as discussed below."}),"\n",(0,o.jsx)(i.h4,{id:"trigger-strategies",children:"Trigger Strategies"}),"\n",(0,o.jsxs)(i.table,{children:[(0,o.jsx)(i.thead,{children:(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.th,{children:"Config Name"}),(0,o.jsx)(i.th,{children:"Default"}),(0,o.jsx)(i.th,{children:"Description"})]})}),(0,o.jsxs)(i.tbody,{children:[(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:"hoodie.compact.inline.trigger.strategy"}),(0,o.jsx)(i.td,{children:"NUM_COMMITS (Optional)"}),(0,o.jsxs)(i.td,{children:["org.apache.hudi.table.action.compact.CompactionTriggerStrategy: Controls when compaction is scheduled.",(0,o.jsx)("br",{}),(0,o.jsx)(i.code,{children:"Config Param: INLINE_COMPACT_TRIGGER_STRATEGY"})," ",(0,o.jsx)("br",{})]})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsxs)("ul",{children:[(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"NUM_COMMITS"}),": triggers compaction when there are at least N delta commits after last completed compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"NUM_COMMITS_AFTER_LAST_REQUEST"}),": triggers compaction when there are at least N delta commits after last completed or requested compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"TIME_ELAPSED"}),": triggers compaction after N seconds since last compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"NUM_AND_TIME"}),": triggers compaction when both there are at least N delta commits and N seconds elapsed (both must be satisfied) after last completed compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"NUM_OR_TIME"}),": triggers compaction when both there are at least N delta commits or N seconds elapsed (either condition is satisfied) after last completed compaction."]})]})}),(0,o.jsx)(i.td,{}),(0,o.jsx)(i.td,{})]})]})]}),"\n",(0,o.jsx)(i.h4,{id:"compaction-strategies",children:"Compaction Strategies"}),"\n",(0,o.jsxs)(i.table,{children:[(0,o.jsx)(i.thead,{children:(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.th,{children:"Config Name"}),(0,o.jsx)(i.th,{children:"Default"}),(0,o.jsx)(i.th,{children:"Description"})]})}),(0,o.jsx)(i.tbody,{children:(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:"hoodie.compaction.strategy"}),(0,o.jsx)(i.td,{children:"org.apache.hudi.table.action.compact.strategy.LogFileSizeBasedCompactionStrategy (Optional)"}),(0,o.jsxs)(i.td,{children:["Compaction strategy decides which file groups are picked up for compaction during each compaction run. By default. Hudi picks the log file with most accumulated unmerged data. ",(0,o.jsx)("br",{}),(0,o.jsx)("br",{}),(0,o.jsx)(i.code,{children:"Config Param: COMPACTION_STRATEGY"})]})]})})]}),"\n",(0,o.jsxs)(i.p,{children:["Available Strategies (Provide the full package name when using the strategy): ",(0,o.jsxs)("ul",{children:[(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"LogFileNumBasedCompactionStrategy"}),":\norders the compactions based on the total log files count, filters the file group with log files count greater than the\nthreshold and limits the compactions within a configured IO bound."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"LogFileSizeBasedCompactionStrategy"}),": orders\nthe compactions based on the total log files size, filters the file group which log files size is greater than the\nthreshold and limits the compactions within a configured IO bound."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"BoundedIOCompactionStrategy"}),": CompactionStrategy\nwhich looks at total IO to be done for the compaction (read + write) and limits the list of compactions to be under a\nconfigured limit on the IO."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"BoundedPartitionAwareCompactionStrategy"}),":This"," strategy ensures that the last N partitions\nare picked up even if there are later partitions created for the table. lastNPartitions is defined as the N partitions before\nthe currentDate. currentDay = 2018/01/01 The table has partitions for 2018/02/02 and 2018/03/03 beyond the currentDay This\nstrategy will pick up the following partitions for compaction : (2018/01/01, allPartitionsInRange[(2018/01/01 - lastNPartitions)\nto 2018/01/01), 2018/02/02, 2018/03/03)"]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"DayBasedCompactionStrategy"}),":This"," strategy orders compactions in reverse\norder of creation of Hive Partitions. It helps to compact data in latest partitions first and then older capped at the\nTotal_IO allowed."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"UnBoundedCompactionStrategy"}),": UnBoundedCompactionStrategy will not change ordering or filter\nany compaction. It is a pass-through and will compact all the base files which has a log file. This usually means\nno-intelligence on compaction."]}),(0,o.jsxs)("li",{children:[(0,o.jsx)(i.code,{children:"UnBoundedPartitionAwareCompactionStrategy"}),":UnBoundedPartitionAwareCompactionStrategy"," is a custom UnBounded Strategy. This will filter all the partitions that\nare eligible to be compacted by a {@link BoundedPartitionAwareCompactionStrategy} and return the result. This is done\nso that a long running UnBoundedPartitionAwareCompactionStrategy does not step over partitions in a shorter running\nBoundedPartitionAwareCompactionStrategy. Essentially, this is an inverse of the partitions chosen in\nBoundedPartitionAwareCompactionStrategy"]})]})]}),"\n",(0,o.jsx)(i.admonition,{type:"note",children:(0,o.jsxs)(i.p,{children:["Please refer to ",(0,o.jsx)(i.a,{href:"https://hudi.apache.org/docs/next/configurations#Compaction-Configs",children:"advanced configs"})," for more details."]})}),"\n",(0,o.jsx)(i.h2,{id:"ways-to-trigger-compaction",children:"Ways to trigger Compaction"}),"\n",(0,o.jsx)(i.h3,{id:"inline",children:"Inline"}),"\n",(0,o.jsx)(i.p,{children:"By default, compaction is run asynchronously."}),"\n",(0,o.jsx)(i.p,{children:"If latency of ingesting records is important for you, you are most likely using Merge-On-Read tables.\nMerge-On-Read tables store data using a combination of columnar (e.g parquet) + row based (e.g avro) file formats.\nUpdates are logged to delta files & later compacted to produce new versions of columnar files.\nTo improve ingestion latency, Async Compaction is the default configuration."}),"\n",(0,o.jsx)(i.p,{children:"If immediate read performance of a new commit is important for you, or you want simplicity of not managing separate compaction jobs,\nyou may want synchronous inline compaction, which means that as a commit is written it is also compacted by the same job."}),"\n",(0,o.jsxs)(i.p,{children:["For this deployment mode, please use ",(0,o.jsx)(i.code,{children:"hoodie.compact.inline = true"})," for Spark Datasource and Spark SQL writers. For\nHoodieStreamer sync once mode inline compaction can be achieved by passing the flag ",(0,o.jsx)(i.code,{children:"--disable-compaction"})," (Meaning to\ndisable async compaction). Further in HoodieStreamer when both\ningestion and compaction is running in the same spark context, you can use resource allocation configuration\nin Hudi Streamer CLI such as (",(0,o.jsx)(i.code,{children:"--delta-sync-scheduling-weight"}),",\n",(0,o.jsx)(i.code,{children:"--compact-scheduling-weight"}),", ",(0,o.jsx)(i.code,{children:"--delta-sync-scheduling-minshare"}),", and ",(0,o.jsx)(i.code,{children:"--compact-scheduling-minshare"}),")\nto control executor allocation between ingestion and compaction."]}),"\n",(0,o.jsx)(i.h3,{id:"async--offline-compaction-models",children:"Async & Offline Compaction models"}),"\n",(0,o.jsx)(i.p,{children:"There are a couple of ways here to trigger compaction ."}),"\n",(0,o.jsx)(i.h4,{id:"async-execution-within-the-same-process",children:"Async execution within the same process"}),"\n",(0,o.jsx)(i.p,{children:"In streaming ingestion write models like HoodieStreamer\ncontinuous mode, Flink and Spark Streaming, async compaction is enabled by default and runs alongside without blocking\nregular ingestion."}),"\n",(0,o.jsx)(i.h5,{id:"spark-structured-streaming",children:"Spark Structured Streaming"}),"\n",(0,o.jsx)(i.p,{children:"Compactions are scheduled and executed asynchronously inside the\nstreaming job.Here is an example snippet in java"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-properties",children:'import org.apache.hudi.DataSourceWriteOptions;\nimport org.apache.hudi.HoodieDataSourceHelpers;\nimport org.apache.hudi.config.HoodieCompactionConfig;\nimport org.apache.hudi.config.HoodieWriteConfig;\n\nimport org.apache.spark.sql.streaming.OutputMode;\nimport org.apache.spark.sql.streaming.ProcessingTime;\n\n\n DataStreamWriter writer = streamingInput.writeStream().format("org.apache.hudi")\n .option("hoodie.datasource.write.operation", operationType)\n .option("hoodie.datasource.write.table.type", tableType)\n .option("hoodie.datasource.write.recordkey.field", "_row_key")\n .option("hoodie.datasource.write.partitionpath.field", "partition")\n .option("hoodie.datasource.write.precombine.field"(), "timestamp")\n .option("hoodie.compact.inline.max.delta.commits", "10")\n .option("hoodie.datasource.compaction.async.enable", "true")\n .option("hoodie.table.name", tableName).option("checkpointLocation", checkpointLocation)\n .outputMode(OutputMode.Append());\n writer.trigger(new ProcessingTime(30000)).start(tablePath);\n'})}),"\n",(0,o.jsx)(i.h5,{id:"hudi-streamer-continuous-mode",children:"Hudi Streamer Continuous Mode"}),"\n",(0,o.jsxs)(i.p,{children:["Hudi Streamer provides continuous ingestion mode where a single long running spark application",(0,o.jsx)(i.br,{}),"\n","ingests data to Hudi table continuously from upstream sources. In this mode, Hudi supports managing asynchronous\ncompactions. Here is an example snippet for running in continuous mode with async compactions"]}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-properties",children:"spark-submit --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n--class org.apache.hudi.utilities.streamer.HoodieStreamer \\\n--table-type MERGE_ON_READ \\\n--target-base-path \\\n--target-table \\\n--source-class org.apache.hudi.utilities.sources.JsonDFSSource \\\n--source-ordering-field ts \\\n--props /path/to/source.properties \\\n--continous\n"})}),"\n",(0,o.jsx)(i.h4,{id:"scheduling-and-execution-by-a-separate-process",children:"Scheduling and Execution by a separate process"}),"\n",(0,o.jsxs)(i.p,{children:["For some use cases with long running table services, instead of having the regular writes block, users have the option to run\nboth steps of the compaction (",(0,o.jsx)(i.a,{href:"#compaction-architecture",children:"scheduling and execution"}),") offline in a separate process altogether.\nThis allows for regular writers to not bother about these compaction steps and allows users to provide more resources for\nthe compaction job as needed."]}),"\n",(0,o.jsx)(i.admonition,{type:"note",children:(0,o.jsx)(i.p,{children:"This model needs a lock provider configured for all jobs - the regular writer as well as the offline compaction job."})}),"\n",(0,o.jsx)(i.h4,{id:"scheduling-inline-and-executing-async",children:"Scheduling inline and executing async"}),"\n",(0,o.jsx)(i.p,{children:"In this model, it is possible for a Spark Datasource writer or a Flink job to just schedule the compaction inline ( that\nwill serialize the compaction plan in the timeline but will not execute it). And then a separate utility like\nHudiCompactor or HoodieFlinkCompactor can take care of periodically executing the compaction plan."}),"\n",(0,o.jsx)(i.admonition,{type:"note",children:(0,o.jsxs)(i.p,{children:["This model may need a lock provider ",(0,o.jsx)(i.strong,{children:"if"})," metadata table is enabled."]})}),"\n",(0,o.jsx)(i.h4,{id:"hudi-compactor-utility",children:"Hudi Compactor Utility"}),"\n",(0,o.jsxs)(i.p,{children:["Hudi provides a standalone tool to execute specific compactions asynchronously. Below is an example and you can read more in the ",(0,o.jsx)(i.a,{href:"/docs/cli#compactions",children:"deployment guide"}),"\nThe compactor utility allows to do scheduling and execution of compaction."]}),"\n",(0,o.jsx)(i.p,{children:"Example:"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-properties",children:"spark-submit --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n--class org.apache.hudi.utilities.HoodieCompactor \\\n--base-path \\\n--table-name \\\n--schema-file \\\n--instant-time \n"})}),"\n",(0,o.jsxs)(i.p,{children:["Note, the ",(0,o.jsx)(i.code,{children:"instant-time"})," parameter is now optional for the Hudi Compactor Utility. If using the utility without ",(0,o.jsx)(i.code,{children:"--instant time"}),",\nthe spark-submit will execute the earliest scheduled compaction on the Hudi timeline."]}),"\n",(0,o.jsx)(i.h4,{id:"hudi-cli",children:"Hudi CLI"}),"\n",(0,o.jsxs)(i.p,{children:["Hudi CLI is yet another way to execute specific compactions asynchronously. Here is an example and you can read more in the ",(0,o.jsx)(i.a,{href:"/docs/cli#compactions",children:"deployment guide"})]}),"\n",(0,o.jsx)(i.p,{children:"Example:"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-properties",children:"hudi:trips->compaction run --tableName --parallelism --compactionInstant \n...\n"})}),"\n",(0,o.jsx)(i.h4,{id:"flink-offline-compaction",children:"Flink Offline Compaction"}),"\n",(0,o.jsxs)(i.p,{children:["Offline compaction needs to submit the Flink task on the command line. The program entry is as follows: ",(0,o.jsx)(i.code,{children:"hudi-flink-bundle_2.11-0.9.0-SNAPSHOT.jar"})," :\n",(0,o.jsx)(i.code,{children:"org.apache.hudi.sink.compact.HoodieFlinkCompactor"})]}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-bash",children:"# Command line\n./bin/flink run -c org.apache.hudi.sink.compact.HoodieFlinkCompactor lib/hudi-flink-bundle_2.11-0.9.0.jar --path hdfs://xxx:9000/table\n"})}),"\n",(0,o.jsx)(i.h4,{id:"options",children:"Options"}),"\n",(0,o.jsxs)(i.table,{children:[(0,o.jsx)(i.thead,{children:(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.th,{children:"Option Name"}),(0,o.jsx)(i.th,{children:"Default"}),(0,o.jsx)(i.th,{children:"Description"})]})}),(0,o.jsxs)(i.tbody,{children:[(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--path"})}),(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"n/a **(Required)**"})}),(0,o.jsx)(i.td,{children:"The path where the target table is stored on Hudi"})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--compaction-max-memory"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"100"})," (Optional)"]}),(0,o.jsx)(i.td,{children:"The index map size of log data during compaction, 100 MB by default. If you have enough memory, you can turn up this parameter"})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--schedule"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"false"})," (Optional)"]}),(0,o.jsx)(i.td,{children:"whether to execute the operation of scheduling compaction plan. When the write process is still writing\uff0c turning on this parameter have a risk of losing data. Therefore, it must be ensured that there are no write tasks currently writing data to this table when this parameter is turned on"})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--seq"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"LIFO"})," (Optional)"]}),(0,o.jsxs)(i.td,{children:["The order in which compaction tasks are executed. Executing from the latest compaction plan by default. ",(0,o.jsx)(i.code,{children:"LIFO"}),": executing from the latest plan. ",(0,o.jsx)(i.code,{children:"FIFO"}),": executing from the oldest plan."]})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--service"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"false"})," (Optional)"]}),(0,o.jsx)(i.td,{children:"Whether to start a monitoring service that checks and schedules new compaction task in configured interval."})]}),(0,o.jsxs)(i.tr,{children:[(0,o.jsx)(i.td,{children:(0,o.jsx)(i.code,{children:"--min-compaction-interval-seconds"})}),(0,o.jsxs)(i.td,{children:[(0,o.jsx)(i.code,{children:"600(s)"})," (optional)"]}),(0,o.jsx)(i.td,{children:"The checking interval for service mode, by default 10 minutes."})]})]})]}),"\n",(0,o.jsx)(i.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)("h3",{children:"Blogs"}),"\n",(0,o.jsx)(i.a,{href:"https://medium.com/@simpsons/apache-hudi-compaction-6e6383790234",children:"Apache Hudi Compaction"}),"\n",(0,o.jsx)(i.a,{href:"https://medium.com/@simpsons/standalone-hoodiecompactor-utility-890198e4c539",children:"Standalone HoodieCompactor Utility"})]})]})}function h(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},67587:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/hudi_mor_file_layout-643f9f7fda5aa0d532682af27fe3e42c.jpg"},56040:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/hudi_mor_file_layout_post_compaction-9f10af785d4927dc3d66303dac5bc7ba.jpg"},28453:(e,i,t)=>{t.d(i,{R:()=>s,x:()=>r});var n=t(96540);const o={},a=n.createContext(o);function s(e){const i=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/content/cn/assets/js/1a20bc57.01c0b799.js b/content/cn/assets/js/1a20bc57.01c0b799.js deleted file mode 100644 index c9787f67f8e3e..0000000000000 --- a/content/cn/assets/js/1a20bc57.01c0b799.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[59114],{46768:(e,_,n)=>{n.r(_),n.d(_,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>t,toc:()=>r});const t=JSON.parse('{"id":"cli","title":"CLI","description":"Local set up","source":"@site/docs/cli.md","sourceDirName":".","slug":"/cli","permalink":"/cn/docs/next/cli","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/cli.md","tags":[],"version":"current","frontMatter":{"title":"CLI","keywords":["hudi","cli"],"last_modified_at":"2021-08-18T19:59:57.000Z"},"sidebar":"docs","previous":{"title":"SQL Procedures","permalink":"/cn/docs/next/procedures"},"next":{"title":"Metrics","permalink":"/cn/docs/next/metrics"}}');var i=n(74848),a=n(28453);const o={title:"CLI",keywords:["hudi","cli"],last_modified_at:new Date("2021-08-18T19:59:57.000Z")},s=void 0,l={},r=[{value:"Local set up",id:"local-set-up",level:3},{value:"Hudi CLI Bundle setup",id:"hudi-cli-bundle-setup",level:3},{value:"Base path",id:"base-path",level:3},{value:"Using Hudi-cli in S3",id:"using-hudi-cli-in-s3",level:3},{value:"Note: These AWS jar versions below are specific to Spark 3.2.0",id:"note-these-aws-jar-versions-below-are-specific-to-spark-320",level:4},{value:"Using hudi-cli on Google Dataproc",id:"using-hudi-cli-on-google-dataproc",level:3},{value:"Connect to a Kerberized cluster",id:"connect-to-a-kerberized-cluster",level:2},{value:"Using hudi-cli",id:"using-hudi-cli",level:2},{value:"Inspecting Commits",id:"inspecting-commits",level:3},{value:"Drilling Down to a specific Commit",id:"drilling-down-to-a-specific-commit",level:3},{value:"FileSystem View",id:"filesystem-view",level:3},{value:"Statistics",id:"statistics",level:3},{value:"Archived Commits",id:"archived-commits",level:3},{value:"Compactions",id:"compactions",level:3},{value:"Validate Compaction",id:"validate-compaction",level:3},{value:"Unscheduling Compaction",id:"unscheduling-compaction",level:3},{value:"Repair Compaction",id:"repair-compaction",level:3},{value:"Savepoint and Restore",id:"savepoint-and-restore",level:3},{value:"Upgrade and Downgrade Table",id:"upgrade-and-downgrade-table",level:3},{value:"Change Hudi Table Type",id:"change-hudi-table-type",level:3}];function c(e){const _={a:"a",admonition:"admonition",br:"br",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(_.h3,{id:"local-set-up",children:"Local set up"}),"\n",(0,i.jsxs)(_.p,{children:["Once hudi has been built, the shell can be fired by via ",(0,i.jsx)(_.code,{children:"cd hudi-cli && ./hudi-cli.sh"}),"."]}),"\n",(0,i.jsx)(_.h3,{id:"hudi-cli-bundle-setup",children:"Hudi CLI Bundle setup"}),"\n",(0,i.jsxs)(_.p,{children:["In release ",(0,i.jsx)(_.code,{children:"0.13.0"})," we have now added another way of launching the ",(0,i.jsx)(_.code,{children:"hudi cli"}),", which is using the ",(0,i.jsx)(_.code,{children:"hudi-cli-bundle"}),"."]}),"\n",(0,i.jsxs)(_.p,{children:["There are a couple of requirements when using this approach such as having ",(0,i.jsx)(_.code,{children:"spark"})," installed locally on your machine.\nIt is required to use a spark distribution with hadoop dependencies packaged such as ",(0,i.jsx)(_.code,{children:"spark-3.3.1-bin-hadoop2.tgz"})," from ",(0,i.jsx)(_.a,{href:"https://archive.apache.org/dist/spark/",children:"https://archive.apache.org/dist/spark/"}),".\nWe also recommend you set an env variable ",(0,i.jsx)(_.code,{children:"$SPARK_HOME"})," to the path of where spark is installed on your machine.\nOne important thing to note is that the ",(0,i.jsx)(_.code,{children:"hudi-spark-bundle"})," should also be present when using the ",(0,i.jsx)(_.code,{children:"hudi-cli-bundle"}),".",(0,i.jsx)(_.br,{}),"\n","To provide the locations of these bundle jars you can set them in your shell like so:\n",(0,i.jsx)(_.code,{children:"export CLI_BUNDLE_JAR="})," , ",(0,i.jsx)(_.code,{children:"export SPARK_BUNDLE_JAR="}),"."]}),"\n",(0,i.jsx)(_.p,{children:"For steps see below if you are not compiling the project and downloading the jars:"}),"\n",(0,i.jsxs)(_.ol,{children:["\n",(0,i.jsx)(_.li,{children:"Create an empty folder as a new directory"}),"\n",(0,i.jsx)(_.li,{children:"Copy the hudi-cli-bundle jars and hudi-spark*-bundle jars to this directory"}),"\n",(0,i.jsx)(_.li,{children:"Copy the following script and folder to this directory"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"packaging/hudi-cli-bundle/hudi-cli-with-bundle.sh\npackaging/hudi-cli-bundle/conf . the `conf` folder should be in this directory.\n"})}),"\n",(0,i.jsxs)(_.ol,{start:"4",children:["\n",(0,i.jsx)(_.li,{children:"Start Hudi CLI shell with environment variables set"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"export SPARK_HOME=\nexport CLI_BUNDLE_JAR=\nexport SPARK_BUNDLE_JAR=\n\n./hudi-cli-with-bundle.sh\n\n"})}),"\n",(0,i.jsx)(_.h3,{id:"base-path",children:"Base path"}),"\n",(0,i.jsxs)(_.p,{children:["A hudi table resides on DFS, in a location referred to as the ",(0,i.jsx)(_.code,{children:"basePath"})," and\nwe would need this location in order to connect to a Hudi table. Hudi library effectively manages this table internally, using ",(0,i.jsx)(_.code,{children:".hoodie"})," subfolder to track all metadata."]}),"\n",(0,i.jsx)(_.h3,{id:"using-hudi-cli-in-s3",children:"Using Hudi-cli in S3"}),"\n",(0,i.jsxs)(_.p,{children:["If you are using hudi that comes packaged with AWS EMR, you can find instructions to use hudi-cli ",(0,i.jsx)(_.a,{href:"https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hudi-cli.html",children:"here"}),".\nIf you are not using EMR, or would like to use latest hudi-cli from master, you can follow the below steps to access S3 dataset in your local environment (laptop)."]}),"\n",(0,i.jsx)(_.p,{children:"Build Hudi with corresponding Spark version, for eg, -Dspark3.1.x"}),"\n",(0,i.jsx)(_.p,{children:"Set the following environment variables."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"export AWS_REGION=us-east-2\nexport AWS_ACCESS_KEY_ID=\nexport AWS_SECRET_ACCESS_KEY=\nexport SPARK_HOME=\n"})}),"\n",(0,i.jsx)(_.p,{children:"Ensure you set the SPARK_HOME to your local spark home compatible to compiled hudi spark version above."}),"\n",(0,i.jsx)(_.p,{children:"Apart from these, we might need to add aws jars to class path so that accessing S3 is feasible from local.\nWe need two jars, namely, aws-java-sdk-bundle jar and hadoop-aws jar which you can find online.\nFor eg:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/3.2.0/hadoop-aws-3.2.0.jar -o /lib/spark-3.2.0-bin-hadoop3.2/jars/hadoop-aws-3.2.0.jar\nwget https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-bundle/1.11.375/aws-java-sdk-bundle-1.11.375.jar -o /lib/spark-3.2.0-bin-hadoop3.2/jars/aws-java-sdk-bundle-1.11.375.jar\n"})}),"\n",(0,i.jsx)(_.h4,{id:"note-these-aws-jar-versions-below-are-specific-to-spark-320",children:"Note: These AWS jar versions below are specific to Spark 3.2.0"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"export CLIENT_JAR=/lib/spark-3.2.0-bin-hadoop3.2/jars/aws-java-sdk-bundle-1.12.48.jar:/lib/spark-3.2.0-bin-hadoop3.2/jars/hadoop-aws-3.3.1.jar\n"})}),"\n",(0,i.jsx)(_.p,{children:"Once these are set, you are good to launch hudi-cli and access S3 dataset."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"./hudi-cli/hudi-cli.sh\n"})}),"\n",(0,i.jsx)(_.h3,{id:"using-hudi-cli-on-google-dataproc",children:"Using hudi-cli on Google Dataproc"}),"\n",(0,i.jsxs)(_.p,{children:[(0,i.jsx)(_.a,{href:"https://cloud.google.com/dataproc",children:"Dataproc"})," is Google's managed service for running Apache Hadoop, Apache Spark,\nApache Flink, Presto and many other frameworks, including Hudi. If you want to run the Hudi CLI on a Dataproc node\nwhich has not been launched with Hudi support enabled, you can use the steps below:"]}),"\n",(0,i.jsx)(_.p,{children:"These steps use Hudi version 0.13.0. If you want to use a different version you will have to edit the below commands\nappropriately:"}),"\n",(0,i.jsxs)(_.ol,{children:["\n",(0,i.jsx)(_.li,{children:"Once you've started the Dataproc cluster, you can ssh into it as follows:"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:'$ gcloud compute ssh --zone "YOUR_ZONE" "HOSTNAME_OF_MASTER_NODE" --project "YOUR_PROJECT"\n'})}),"\n",(0,i.jsxs)(_.ol,{start:"2",children:["\n",(0,i.jsx)(_.li,{children:"Download the Hudi CLI bundle"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"wget https://repo1.maven.org/maven2/org/apache/hudi/hudi-cli-bundle_2.12/0.13.0/hudi-cli-bundle_2.12-0.13.0.jar \n"})}),"\n",(0,i.jsxs)(_.ol,{start:"3",children:["\n",(0,i.jsx)(_.li,{children:"Download the Hudi Spark bundle"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"wget https://repo1.maven.org/maven2/org/apache/hudi/hudi-spark-bundle_2.12/0.13.0/hudi-spark-bundle_2.12-0.13.0.jar\n"})}),"\n",(0,i.jsxs)(_.ol,{start:"4",children:["\n",(0,i.jsx)(_.li,{children:"Download the shell script that launches Hudi CLI bundle"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"wget https://raw.githubusercontent.com/apache/hudi/release-0.13.0/packaging/hudi-cli-bundle/hudi-cli-with-bundle.sh\n"})}),"\n",(0,i.jsxs)(_.ol,{start:"5",children:["\n",(0,i.jsx)(_.li,{children:"Launch Hudi CLI bundle with appropriate environment variables as follows:"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"CLIENT_JAR=$DATAPROC_DIR/lib/gcs-connector.jar CLI_BUNDLE_JAR=hudi-cli-bundle_2.12-0.13.0.jar SPARK_BUNDLE_JAR=hudi-spark-bundle_2.12-0.13.0.jar ./hudi-cli-with-bundle.sh \n"})}),"\n",(0,i.jsxs)(_.ol,{start:"6",children:["\n",(0,i.jsxs)(_.li,{children:["\n",(0,i.jsxs)(_.p,{children:["hudi->connect --path gs://path_to_some_table",(0,i.jsx)(_.br,{}),"\n","Metadata for table some_table loaded"]}),"\n"]}),"\n",(0,i.jsxs)(_.li,{children:["\n",(0,i.jsxs)(_.p,{children:["hudi:some_table->commits show --limit 5",(0,i.jsx)(_.br,{}),"\n","This command should show the recent commits, if the above steps work correctly."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(_.h2,{id:"connect-to-a-kerberized-cluster",children:"Connect to a Kerberized cluster"}),"\n",(0,i.jsxs)(_.p,{children:["Before connecting to a Kerberized cluster, you can use ",(0,i.jsx)(_.strong,{children:"kerberos kinit"})," command. Following is the usage of this command."]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"hudi->help kerberos kinit\nNAME\n kerberos kinit - Perform Kerberos authentication\n\nSYNOPSIS\n kerberos kinit --krb5conf String [--principal String] [--keytab String]\n\nOPTIONS\n --krb5conf String\n Path to krb5.conf\n [Optional, default = /etc/krb5.conf]\n\n --principal String\n Kerberos principal\n [Mandatory]\n\n --keytab String\n Path to keytab\n [Mandatory]\n"})}),"\n",(0,i.jsx)(_.p,{children:"For example:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"hudi->kerberos kinit --principal user/host@DOMAIN --keytab /etc/security/keytabs/user.keytab\nPerform Kerberos authentication\nParameters:\n--krb5conf: /etc/krb5.conf\n--principal: user/host@DOMAIN\n--keytab: /etc/security/keytabs/user.keytab\nKerberos current user: user/host@DOMAIN (auth:KERBEROS)\nKerberos login user: user/host@DOMAIN (auth:KERBEROS)\nKerberos authentication success\n"})}),"\n",(0,i.jsx)(_.p,{children:'If you see "Kerberos authentication success" in the command output, it means Kerberos authentication has been successful.'}),"\n",(0,i.jsx)(_.h2,{id:"using-hudi-cli",children:"Using hudi-cli"}),"\n",(0,i.jsx)(_.p,{children:"To initialize a hudi table, use the following command."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"===================================================================\n* ___ ___ *\n* /\\__\\ ___ /\\ \\ ___ *\n* / / / /\\__\\ / \\ \\ /\\ \\ *\n* / /__/ / / / / /\\ \\ \\ \\ \\ \\ *\n* / \\ \\ ___ / / / / / \\ \\__\\ / \\__\\ *\n* / /\\ \\ /\\__\\ / /__/ ___ / /__/ \\ |__| / /\\/__/ *\n* \\/ \\ \\/ / / \\ \\ \\ /\\__\\ \\ \\ \\ / / / /\\/ / / *\n* \\ / / \\ \\ / / / \\ \\ / / / \\ /__/ *\n* / / / \\ \\/ / / \\ \\/ / / \\ \\__\\ *\n* / / / \\ / / \\ / / \\/__/ *\n* \\/__/ \\/__/ \\/__/ Apache Hudi CLI *\n* *\n===================================================================\n\nhudi->create --path /user/hive/warehouse/table1 --tableName hoodie_table_1 --tableType COPY_ON_WRITE\n.....\n"})}),"\n",(0,i.jsx)(_.p,{children:"To see the description of hudi table, use the command:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:hoodie_table_1->desc\n18/09/06 15:57:19 INFO timeline.HoodieActiveTimeline: Loaded instants []\n _________________________________________________________\n | Property | Value |\n |========================================================|\n | basePath | ... |\n | metaPath | ... |\n | fileSystem | hdfs |\n | hoodie.table.name | hoodie_table_1 |\n | hoodie.table.type | COPY_ON_WRITE |\n | hoodie.archivelog.folder| |\n"})}),"\n",(0,i.jsx)(_.p,{children:"Following is a sample command to connect to a Hudi table contains uber trips."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->connect --path /app/uber/trips\n\n16/10/05 23:20:37 INFO model.HoodieTableMetadata: All commits :HoodieCommits{commitList=[20161002045850, 20161002052915, 20161002055918, 20161002065317, 20161002075932, 20161002082904, 20161002085949, 20161002092936, 20161002105903, 20161002112938, 20161002123005, 20161002133002, 20161002155940, 20161002165924, 20161002172907, 20161002175905, 20161002190016, 20161002192954, 20161002195925, 20161002205935, 20161002215928, 20161002222938, 20161002225915, 20161002232906, 20161003003028, 20161003005958, 20161003012936, 20161003022924, 20161003025859, 20161003032854, 20161003042930, 20161003052911, 20161003055907, 20161003062946, 20161003065927, 20161003075924, 20161003082926, 20161003085925, 20161003092909, 20161003100010, 20161003102913, 20161003105850, 20161003112910, 20161003115851, 20161003122929, 20161003132931, 20161003142952, 20161003145856, 20161003152953, 20161003155912, 20161003162922, 20161003165852, 20161003172923, 20161003175923, 20161003195931, 20161003210118, 20161003212919, 20161003215928, 20161003223000, 20161003225858, 20161004003042, 20161004011345, 20161004015235, 20161004022234, 20161004063001, 20161004072402, 20161004074436, 20161004080224, 20161004082928, 20161004085857, 20161004105922, 20161004122927, 20161004142929, 20161004163026, 20161004175925, 20161004194411, 20161004203202, 20161004211210, 20161004214115, 20161004220437, 20161004223020, 20161004225321, 20161004231431, 20161004233643, 20161005010227, 20161005015927, 20161005022911, 20161005032958, 20161005035939, 20161005052904, 20161005070028, 20161005074429, 20161005081318, 20161005083455, 20161005085921, 20161005092901, 20161005095936, 20161005120158, 20161005123418, 20161005125911, 20161005133107, 20161005155908, 20161005163517, 20161005165855, 20161005180127, 20161005184226, 20161005191051, 20161005193234, 20161005203112, 20161005205920, 20161005212949, 20161005223034, 20161005225920]}\nMetadata for table trips loaded\n"})}),"\n",(0,i.jsx)(_.p,{children:"Once connected to the table, a lot of other commands become available. The shell has contextual autocomplete help (press TAB) and below is a list of all commands, few of which are reviewed in this section"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"hudi:trips->help\n* ! - Allows execution of operating system (OS) commands\n* // - Inline comment markers (start of line only)\n* ; - Inline comment markers (start of line only)\n* bootstrap index showmapping - Show bootstrap index mapping\n* bootstrap index showpartitions - Show bootstrap indexed partitions\n* bootstrap run - Run a bootstrap action for current Hudi table\n* clean showpartitions - Show partition level details of a clean\n* cleans refresh - Refresh table metadata\n* cleans run - run clean\n* cleans show - Show the cleans\n* clear - Clears the console\n* cls - Clears the console\n* clustering run - Run Clustering\n* clustering schedule - Schedule Clustering\n* clustering scheduleAndExecute - Run Clustering. Make a cluster plan first and execute that plan immediately\n* commit rollback - Rollback a commit\n* commits compare - Compare commits with another Hoodie table\n* commit show_write_stats - Show write stats of a commit\n* commit showfiles - Show file level details of a commit\n* commit showpartitions - Show partition level details of a commit\n* commits refresh - Refresh table metadata\n* commits show - Show the commits\n* commits showarchived - Show the archived commits\n* commits sync - Sync commits with another Hoodie table\n* compaction repair - Renames the files to make them consistent with the timeline as dictated by Hoodie metadata. Use when compaction unschedule fails partially.\n* compaction run - Run Compaction for given instant time\n* compaction schedule - Schedule Compaction\n* compaction scheduleAndExecute - Schedule compaction plan and execute this plan\n* compaction show - Shows compaction details for a specific compaction instant\n* compaction showarchived - Shows compaction details for a specific compaction instant\n* compactions show all - Shows all compactions that are in active timeline\n* compactions showarchived - Shows compaction details for specified time window\n* compaction unschedule - Unschedule Compaction\n* compaction unscheduleFileId - UnSchedule Compaction for a fileId\n* compaction validate - Validate Compaction\n* connect - Connect to a hoodie table\n* create - Create a hoodie table if not present\n* date - Displays the local date and time\n* desc - Describe Hoodie Table properties\n* downgrade table - Downgrades a table\n* exit - Exits the shell\n* export instants - Export Instants and their metadata from the Timeline\n* fetch table schema - Fetches latest table schema\n* hdfsparquetimport - Imports Parquet table to a hoodie table\n* help - List all commands usage\n* marker delete - Delete the marker\n* metadata create - Create the Metadata Table if it does not exist\n* metadata delete - Remove the Metadata Table\n* metadata init - Update the metadata table from commits since the creation\n* metadata list-files - Print a list of all files in a partition from the metadata\n* metadata list-partitions - List all partitions from metadata\n* metadata refresh - Refresh table metadata\n* metadata set - Set options for Metadata Table\n* metadata stats - Print stats about the metadata\n* metadata validate-files - Validate all files in all partitions from the metadata\n* quit - Exits the shell\n* refresh - Refresh table metadata\n* repair addpartitionmeta - Add partition metadata to a table, if not present\n* repair corrupted clean files - repair corrupted clean files\n* repair deduplicate - De-duplicate a partition path contains duplicates & produce repaired files to replace with\n* repair migrate-partition-meta - Migrate all partition meta file currently stored in text format to be stored in base file format. See HoodieTableConfig#PARTITION_METAFILE_USE_DATA_FORMAT.\n* repair overwrite-hoodie-props - Overwrite hoodie.properties with provided file. Risky operation. Proceed with caution!\n* savepoint create - Savepoint a commit\n* savepoint delete - Delete the savepoint\n* savepoint rollback - Savepoint a commit\n* savepoints refresh - Refresh table metadata\n* savepoints show - Show the savepoints\n* script - Parses the specified resource file and executes its commands\n* set - Set spark launcher env to cli\n* show archived commits - Read commits from archived files and show details\n* show archived commit stats - Read commits from archived files and show details\n* show env - Show spark launcher env by key\n* show envs all - Show spark launcher envs\n* show fsview all - Show entire file-system view\n* show fsview latest - Show latest file-system view\n* show logfile metadata - Read commit metadata from log files\n* show logfile records - Read records from log files\n* show rollback - Show details of a rollback instant\n* show rollbacks - List all rollback instants\n* stats filesizes - File Sizes. Display summary stats on sizes of files\n* stats wa - Write Amplification. Ratio of how many records were upserted to how many records were actually written\n* sync validate - Validate the sync by counting the number of records\n* system properties - Shows the shell's properties\n* table delete-configs - Delete the supplied table configs from the table.\n* table recover-configs - Recover table configs, from update/delete that failed midway.\n* table update-configs - Update the table configs with configs with provided file.\n* temp_delete - Delete view name\n* temp_query - query against created temp view\n* temp delete - Delete view name\n* temp query - query against created temp view\n* temps_show - Show all views name\n* temps show - Show all views name\n* upgrade table - Upgrades a table\n* utils loadClass - Load a class\n* version - Displays shell version\n\nhudi:trips->\n"})}),"\n",(0,i.jsx)(_.h3,{id:"inspecting-commits",children:"Inspecting Commits"}),"\n",(0,i.jsxs)(_.p,{children:["The task of upserting or inserting a batch of incoming records is known as a ",(0,i.jsx)(_.strong,{children:"commit"})," in Hudi. A commit provides basic atomicity guarantees such that only committed data is available for querying.\nEach commit has a monotonically increasing string/number called the ",(0,i.jsx)(_.strong,{children:"commit number"}),". Typically, this is the time at which we started the commit."]}),"\n",(0,i.jsx)(_.p,{children:"To view some basic information about the last 10 commits,"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:trips->commits show --sortBy "Total Bytes Written" --desc true --limit 10\n ________________________________________________________________________________________________________________________________________________________________________\n | CommitTime | Total Bytes Written| Total Files Added| Total Files Updated| Total Partitions Written| Total Records Written| Total Update Records Written| Total Errors|\n |=======================================================================================================================================================================|\n ....\n ....\n ....\n'})}),"\n",(0,i.jsx)(_.p,{children:"At the start of each write, Hudi also writes a .inflight commit to the .hoodie folder. You can use the timestamp there to estimate how long the commit has been inflight"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"$ hdfs dfs -ls /app/uber/trips/.hoodie/*.inflight\n-rw-r--r-- 3 vinoth supergroup 321984 2016-10-05 23:18 /app/uber/trips/.hoodie/20161005225920.inflight\n"})}),"\n",(0,i.jsx)(_.h3,{id:"drilling-down-to-a-specific-commit",children:"Drilling Down to a specific Commit"}),"\n",(0,i.jsx)(_.p,{children:"To understand how the writes spread across specific partiions,"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:trips->commit showpartitions --commit 20161005165855 --sortBy "Total Bytes Written" --desc true --limit 10\n __________________________________________________________________________________________________________________________________________\n | Partition Path| Total Files Added| Total Files Updated| Total Records Inserted| Total Records Updated| Total Bytes Written| Total Errors|\n |=========================================================================================================================================|\n ....\n ....\n'})}),"\n",(0,i.jsx)(_.p,{children:"If you need file level granularity , we can do the following"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:trips->commit showfiles --commit 20161005165855 --sortBy "Partition Path"\n ________________________________________________________________________________________________________________________________________________________\n | Partition Path| File ID | Previous Commit| Total Records Updated| Total Records Written| Total Bytes Written| Total Errors|\n |=======================================================================================================================================================|\n ....\n ....\n'})}),"\n",(0,i.jsx)(_.h3,{id:"filesystem-view",children:"FileSystem View"}),"\n",(0,i.jsx)(_.p,{children:"Hudi views each partition as a collection of file-groups with each file-group containing a list of file-slices in commit order (See concepts).\nThe below commands allow users to view the file-slices for a data-set."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:stock_ticks_mor->show fsview all\n ....\n _______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | Partition | FileId | Base-Instant | Data-File | Data-File Size| Num Delta Files| Total Delta File Size| Delta Files |\n |==============================================================================================================================================================================================================================================================================================================================================================================================================|\n | 2018/08/31| 111415c3-f26d-4639-86c8-f9956f245ac3| 20181002180759| hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/111415c3-f26d-4639-86c8-f9956f245ac3_0_20181002180759.parquet| 432.5 KB | 1 | 20.8 KB | [HoodieLogFile {hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/.111415c3-f26d-4639-86c8-f9956f245ac3_20181002180759.log.1}]|\n\n\n\nhudi:stock_ticks_mor->show fsview latest --partitionPath "2018/08/31"\n ......\n __________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | Partition | FileId | Base-Instant | Data-File | Data-File Size| Num Delta Files| Total Delta Size| Delta Size - compaction scheduled| Delta Size - compaction unscheduled| Delta To Base Ratio - compaction scheduled| Delta To Base Ratio - compaction unscheduled| Delta Files - compaction scheduled | Delta Files - compaction unscheduled|\n |=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================|\n | 2018/08/31| 111415c3-f26d-4639-86c8-f9956f245ac3| 20181002180759| hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/111415c3-f26d-4639-86c8-f9956f245ac3_0_20181002180759.parquet| 432.5 KB | 1 | 20.8 KB | 20.8 KB | 0.0 B | 0.0 B | 0.0 B | [HoodieLogFile {hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/.111415c3-f26d-4639-86c8-f9956f245ac3_20181002180759.log.1}]| [] |\n\n'})}),"\n",(0,i.jsx)(_.h3,{id:"statistics",children:"Statistics"}),"\n",(0,i.jsx)(_.p,{children:"Since Hudi directly manages file sizes for DFS table, it might be good to get an overall picture"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:trips->stats filesizes --partitionPath 2016/09/01 --sortBy "95th" --desc true --limit 10\n ________________________________________________________________________________________________\n | CommitTime | Min | 10th | 50th | avg | 95th | Max | NumFiles| StdDev |\n |===============================================================================================|\n | | 93.9 MB | 93.9 MB | 93.9 MB | 93.9 MB | 93.9 MB | 93.9 MB | 2 | 2.3 KB |\n ....\n ....\n'})}),"\n",(0,i.jsx)(_.p,{children:"In case of Hudi write taking much longer, it might be good to see the write amplification for any sudden increases"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->stats wa\n __________________________________________________________________________\n | CommitTime | Total Upserted| Total Written| Write Amplifiation Factor|\n |=========================================================================|\n ....\n ....\n"})}),"\n",(0,i.jsx)(_.h3,{id:"archived-commits",children:"Archived Commits"}),"\n",(0,i.jsx)(_.p,{children:"In order to limit the amount of growth of .commit files on DFS, Hudi archives older .commit files (with due respect to the cleaner policy) into a commits.archived file.\nThis is a sequence file that contains a mapping from commitNumber => json with raw information about the commit (same that is nicely rolled up above)."}),"\n",(0,i.jsx)(_.h3,{id:"compactions",children:"Compactions"}),"\n",(0,i.jsx)(_.p,{children:"To get an idea of the lag between compaction and writer applications, use the below command to list down all\npending compactions."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->compactions show all\n ___________________________________________________________________\n | Compaction Instant Time| State | Total FileIds to be Compacted|\n |==================================================================|\n | | REQUESTED| 35 |\n | | INFLIGHT | 27 |\n"})}),"\n",(0,i.jsx)(_.p,{children:"To inspect a specific compaction plan, use"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->compaction show --instant \n _________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | Partition Path| File Id | Base Instant | Data File Path | Total Delta Files| getMetrics |\n |================================================================================================================================================================================================================================================\n | 2018/07/17 | | | viewfs://ns-default/.../../UUID_.parquet | 1 | {TOTAL_LOG_FILES=1.0, TOTAL_IO_READ_MB=1230.0, TOTAL_LOG_FILES_SIZE=2.51255751E8, TOTAL_IO_WRITE_MB=991.0, TOTAL_IO_MB=2221.0}|\n\n"})}),"\n",(0,i.jsx)(_.p,{children:"To manually schedule or run a compaction, use the below command. This command uses spark launcher to perform compaction\noperations."}),"\n",(0,i.jsxs)(_.p,{children:[(0,i.jsx)(_.strong,{children:"NOTE:"})," Make sure no other application is scheduling compaction for this table concurrently\n{: .notice--info}"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->help compaction schedule\nKeyword: compaction schedule\nDescription: Schedule Compaction\n Keyword: sparkMemory\n Help: Spark executor memory\n Mandatory: false\n Default if specified: '__NULL__'\n Default if unspecified: '1G'\n\n* compaction schedule - Schedule Compaction\n"})}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->help compaction run\nKeyword: compaction run\nDescription: Run Compaction for given instant time\n Keyword: tableName\n Help: Table name\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: parallelism\n Help: Parallelism for hoodie compaction\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: schemaFilePath\n Help: Path for Avro schema file\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: sparkMemory\n Help: Spark executor memory\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: retry\n Help: Number of retries\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: compactionInstant\n Help: Base path for the target hoodie table\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n* compaction run - Run Compaction for given instant time\n"})}),"\n",(0,i.jsx)(_.h3,{id:"validate-compaction",children:"Validate Compaction"}),"\n",(0,i.jsx)(_.p,{children:"Validating a compaction plan : Check if all the files necessary for compactions are present and are valid"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:stock_ticks_mor->compaction validate --instant 20181005222611\n...\n\n COMPACTION PLAN VALID\n\n ___________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | File Id | Base Instant Time| Base Data File | Num Delta Files| Valid| Error|\n |==========================================================================================================================================================================================================================|\n | 05320e98-9a57-4c38-b809-a6beaaeb36bd| 20181005222445 | hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/05320e98-9a57-4c38-b809-a6beaaeb36bd_0_20181005222445.parquet| 1 | true | |\n\n\n\nhudi:stock_ticks_mor->compaction validate --instant 20181005222601\n\n COMPACTION PLAN INVALID\n\n _______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | File Id | Base Instant Time| Base Data File | Num Delta Files| Valid| Error |\n |=====================================================================================================================================================================================================================================================================================================|\n | 05320e98-9a57-4c38-b809-a6beaaeb36bd| 20181005222445 | hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/05320e98-9a57-4c38-b809-a6beaaeb36bd_0_20181005222445.parquet| 1 | false| All log files specified in compaction operation is not present. Missing .... |\n"})}),"\n",(0,i.jsxs)(_.p,{children:[(0,i.jsx)(_.strong,{children:"NOTE:"})," The following commands must be executed without any other writer/ingestion application running.\n{: .notice--warning}"]}),"\n",(0,i.jsx)(_.p,{children:"Sometimes, it becomes necessary to remove a fileId from a compaction-plan inorder to speed-up or unblock compaction\noperation. Any new log-files that happened on this file after the compaction got scheduled will be safely renamed\nso that are preserved. Hudi provides the following CLI to support it"}),"\n",(0,i.jsx)(_.h3,{id:"unscheduling-compaction",children:"Unscheduling Compaction"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->compaction unscheduleFileId --fileId \n....\nNo File renames needed to unschedule file from pending compaction. Operation successful.\n"})}),"\n",(0,i.jsx)(_.p,{children:"In other cases, an entire compaction plan needs to be reverted. This is supported by the following CLI"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->compaction unschedule --instant \n.....\nNo File renames needed to unschedule pending compaction. Operation successful.\n"})}),"\n",(0,i.jsx)(_.h3,{id:"repair-compaction",children:"Repair Compaction"}),"\n",(0,i.jsxs)(_.p,{children:["The above compaction unscheduling operations could sometimes fail partially (e",":g"," -> DFS temporarily unavailable). With\npartial failures, the compaction operation could become inconsistent with the state of file-slices. When you run\n",(0,i.jsx)(_.code,{children:"compaction validate"}),", you can notice invalid compaction operations if there is one. In these cases, the repair\ncommand comes to the rescue, it will rearrange the file-slices so that there is no loss and the file-slices are\nconsistent with the compaction plan"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:stock_ticks_mor->compaction repair --instant 20181005222611\n......\nCompaction successfully repaired\n.....\n"})}),"\n",(0,i.jsx)(_.h3,{id:"savepoint-and-restore",children:"Savepoint and Restore"}),"\n",(0,i.jsxs)(_.p,{children:['As the name suggest, "savepoint" saves the table as of the commit time, so that it lets you restore the table to this\nsavepoint at a later point in time if need be. You can read more about savepoints and restore ',(0,i.jsx)(_.a,{href:"disaster_recovery",children:"here"})]}),"\n",(0,i.jsx)(_.p,{children:"To trigger savepoint for a hudi table"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"connect --path /tmp/hudi_trips_cow/\ncommits show\nset --conf SPARK_HOME=\nsavepoint create --commit 20220128160245447 --sparkMaster local[2]\n"})}),"\n",(0,i.jsx)(_.p,{children:"To restore the table to one of the savepointed commit:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"connect --path /tmp/hudi_trips_cow/\ncommits show\nset --conf SPARK_HOME=\nsavepoints show\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 SavepointTime \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\n\u2551 20220128160245447 \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\nsavepoint rollback --savepoint 20220128160245447 --sparkMaster local[2]\n"})}),"\n",(0,i.jsx)(_.h3,{id:"upgrade-and-downgrade-table",children:"Upgrade and Downgrade Table"}),"\n",(0,i.jsx)(_.p,{children:"In case the user needs to downgrade the version of Hudi library used, the Hudi table needs to be manually downgraded\non the newer version of Hudi CLI before library downgrade. To downgrade a Hudi table through CLI, user needs to specify\nthe target Hudi table version as follows:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"connect --path \ndowngrade table --toVersion \n"})}),"\n",(0,i.jsx)(_.p,{children:"The following table shows the Hudi table versions corresponding to the Hudi release versions:"}),"\n",(0,i.jsxs)(_.table,{children:[(0,i.jsx)(_.thead,{children:(0,i.jsxs)(_.tr,{children:[(0,i.jsx)(_.th,{style:{textAlign:"left"},children:"Hudi Table Version"}),(0,i.jsx)(_.th,{style:{textAlign:"left"},children:"Hudi Release Version(s)"})]})}),(0,i.jsxs)(_.tbody,{children:[(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"FIVE"})," or ",(0,i.jsx)(_.code,{children:"5"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.12.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"FOUR"})," or ",(0,i.jsx)(_.code,{children:"4"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.11.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"THREE"})," or ",(0,i.jsx)(_.code,{children:"3"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.10.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"TWO"})," or ",(0,i.jsx)(_.code,{children:"2"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.9.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"ONE"})," or ",(0,i.jsx)(_.code,{children:"1"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.6.x - 0.8.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"ZERO"})," or ",(0,i.jsx)(_.code,{children:"0"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.5.x and below"})]})]})]}),"\n",(0,i.jsxs)(_.p,{children:["For example, to downgrade a table from version ",(0,i.jsx)(_.code,{children:"FIVE"}),"(",(0,i.jsx)(_.code,{children:"5"}),") (current version) to ",(0,i.jsx)(_.code,{children:"TWO"}),"(",(0,i.jsx)(_.code,{children:"2"}),"), you should run (use proper Spark master based\non your environment)"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"downgrade table --toVersion TWO --sparkMaster local[2]\n"})}),"\n",(0,i.jsx)(_.p,{children:"or"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"downgrade table --toVersion 2 --sparkMaster local[2]\n"})}),"\n",(0,i.jsxs)(_.p,{children:["You can verify the table version by looking at the ",(0,i.jsx)(_.code,{children:"hoodie.table.version"})," property in ",(0,i.jsx)(_.code,{children:".hoodie/hoodie.properties"})," under\nthe table path:"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-properties",children:"hoodie.table.version=2\n"})}),"\n",(0,i.jsx)(_.p,{children:"Hudi CLI also provides the ability to manually upgrade a Hudi table. To upgrade a Hudi table through CLI:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"upgrade table --toVersion \n"})}),"\n",(0,i.jsxs)(_.admonition,{type:"note",children:[(0,i.jsxs)(_.p,{children:["Table upgrade is automatically handled by the Hudi write client in different deployment modes such as DeltaStreamer\nafter upgrading the Hudi library so that the user does not have to do manual upgrade. Such automatic table upgrade\nis the ",(0,i.jsx)(_.strong,{children:"recommended"})," way in general, instead of using ",(0,i.jsx)(_.code,{children:"upgrade"})," CLI command."]}),(0,i.jsx)(_.p,{children:'Table upgrade from table version ONE to TWO requires key generator related configs such as\n"hoodie.datasource.write.recordkey.field", which is only available when user configures the write job. So the table\nupgrade from version ONE to TWO through CLI is not supported, and user should rely on the automatic upgrade in the write\nclient instead.'})]}),"\n",(0,i.jsx)(_.p,{children:"You may also run the upgrade command without specifying the target version. In such a case, the latest table version\ncorresponding to the library release version is used:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"upgrade table\n"})}),"\n",(0,i.jsx)(_.h3,{id:"change-hudi-table-type",children:"Change Hudi Table Type"}),"\n",(0,i.jsx)(_.p,{children:"There are cases we want to change the hudi table type. For example, change COW table to MOR for more efficient and\nlower latency ingestion; change MOR to COW for better read performance and compatibility with downstream engines.\nSo we offer the table command to perform this modification conveniently."}),"\n",(0,i.jsxs)(_.p,{children:["Changing ",(0,i.jsx)(_.strong,{children:"COW to MOR"}),", we can simply modify the ",(0,i.jsx)(_.code,{children:"hoodie.table.type"})," in ",(0,i.jsx)(_.code,{children:"hoodie.properties"})," to MERGE_ON_READ."]}),"\n",(0,i.jsxs)(_.p,{children:["While changing ",(0,i.jsx)(_.strong,{children:"MOR to COW"}),", we must make sure all the log files are compacted before modifying the table type,\nor it will cause data loss."]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"connect --path \ntable change-table-type \n"})}),"\n",(0,i.jsxs)(_.p,{children:["The parameter ",(0,i.jsx)(_.code,{children:"target_table_type"})," candidates are below:"]}),"\n",(0,i.jsxs)(_.table,{children:[(0,i.jsx)(_.thead,{children:(0,i.jsxs)(_.tr,{children:[(0,i.jsx)(_.th,{style:{textAlign:"left"},children:"target table type"}),(0,i.jsx)(_.th,{style:{textAlign:"left"},children:"comment"})]})}),(0,i.jsxs)(_.tbody,{children:[(0,i.jsxs)(_.tr,{children:[(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"MOR"}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"Change COW table to MERGE_ON_READ."})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"COW"}),(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:["Change MOR table to COPY_ON_WRITE. ",(0,i.jsx)("br",{}),"By default, changing to COW will ",(0,i.jsx)(_.strong,{children:"execute all pending compactions"})," and ",(0,i.jsx)(_.strong,{children:"perform a full compaction"})," if any log file left. Set ",(0,i.jsx)(_.code,{children:"--enable-compaction=false"})," will disable the default compaction. ",(0,i.jsx)("br",{}),"There are params can be set for the compaction operation:",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--parallelism"}),": Default ",(0,i.jsx)(_.code,{children:"3"}),". Parallelism for hoodie compaction",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--sparkMaster"}),": Default ",(0,i.jsx)(_.code,{children:"local"}),". Spark Master",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--sparkMemory"}),": Default ",(0,i.jsx)(_.code,{children:"4G"}),". Spark executor memory",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--retry"}),": Default ",(0,i.jsx)(_.code,{children:"1"}),". Number of retries",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--propsFilePath"}),": Default ",(0,i.jsx)(_.code,{children:" "}),". path to properties file on localfs or dfs with configurations for hoodie client for compacting",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--hoodieConfigs"}),": Default ",(0,i.jsx)(_.code,{children:" "}),". Any configuration that can be set in the properties file can be passed here in the form of an array"]})]})]})]}),"\n",(0,i.jsx)(_.p,{children:"Example below is changing MOR table to COW:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"connect --path /var/dataset/test_table_mor2cow\ndesc\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 Property \u2502 Value \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\n\u2551 basePath \u2502 /var/dataset/test_table_mor2cow \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 metaPath \u2502 /var/dataset/test_table_mor2cow/.hoodie \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 fileSystem \u2502 file \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.name \u2502 test_table \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.compaction.record.merger.strategy \u2502 eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.metadata.partitions \u2502 files \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.type \u2502 MERGE_ON_READ \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.metadata.partitions.inflight \u2502 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.archivelog.folder \u2502 archived \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.timeline.layout.version \u2502 1 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.checksum \u2502 2702201862 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.compaction.payload.type \u2502 HOODIE_AVRO \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.version \u2502 6 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.datasource.write.drop.partition.columns \u2502 false \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n\ntable change-table-type COW\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 Property \u2502 Old Value \u2502 New Value \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\n\u2551 hoodie.archivelog.folder \u2502 archived \u2502 archived \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.compaction.payload.type \u2502 HOODIE_AVRO \u2502 HOODIE_AVRO \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.compaction.record.merger.strategy \u2502 eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 \u2502 eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.datasource.write.drop.partition.columns \u2502 false \u2502 false \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.checksum \u2502 2702201862 \u2502 2702201862 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.metadata.partitions \u2502 files \u2502 files \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.metadata.partitions.inflight \u2502 \u2502 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.name \u2502 test_table \u2502 test_table \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.type \u2502 MERGE_ON_READ \u2502 COPY_ON_WRITE \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.version \u2502 6 \u2502 6 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.timeline.layout.version \u2502 1 \u2502 1 \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})})]})}function d(e={}){const{wrapper:_}={...(0,a.R)(),...e.components};return _?(0,i.jsx)(_,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},28453:(e,_,n)=>{n.d(_,{R:()=>o,x:()=>s});var t=n(96540);const i={},a=t.createContext(i);function o(e){const _=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(_):{..._,...e}}),[_,e])}function s(e){let _;return _=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(a.Provider,{value:_},e.children)}}}]); \ No newline at end of file diff --git a/content/cn/assets/js/1a20bc57.4eb3f9ea.js b/content/cn/assets/js/1a20bc57.4eb3f9ea.js new file mode 100644 index 0000000000000..b2a35e111a2c0 --- /dev/null +++ b/content/cn/assets/js/1a20bc57.4eb3f9ea.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[59114],{46768:(e,_,n)=>{n.r(_),n.d(_,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>t,toc:()=>r});const t=JSON.parse('{"id":"cli","title":"CLI","description":"Local set up","source":"@site/docs/cli.md","sourceDirName":".","slug":"/cli","permalink":"/cn/docs/next/cli","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/cli.md","tags":[],"version":"current","frontMatter":{"title":"CLI","keywords":["hudi","cli"],"last_modified_at":"2021-08-18T19:59:57.000Z"},"sidebar":"docs","previous":{"title":"SQL Procedures","permalink":"/cn/docs/next/procedures"},"next":{"title":"Metrics","permalink":"/cn/docs/next/metrics"}}');var i=n(74848),a=n(28453);const o={title:"CLI",keywords:["hudi","cli"],last_modified_at:new Date("2021-08-18T19:59:57.000Z")},s=void 0,l={},r=[{value:"Local set up",id:"local-set-up",level:3},{value:"Hudi CLI Bundle setup",id:"hudi-cli-bundle-setup",level:3},{value:"Base path",id:"base-path",level:3},{value:"Using Hudi-cli in S3",id:"using-hudi-cli-in-s3",level:3},{value:"Note: These AWS jar versions below are specific to Spark 3.2.0",id:"note-these-aws-jar-versions-below-are-specific-to-spark-320",level:4},{value:"Using hudi-cli on Google Dataproc",id:"using-hudi-cli-on-google-dataproc",level:3},{value:"Connect to a Kerberized cluster",id:"connect-to-a-kerberized-cluster",level:2},{value:"Using hudi-cli",id:"using-hudi-cli",level:2},{value:"Inspecting Commits",id:"inspecting-commits",level:3},{value:"Drilling Down to a specific Commit",id:"drilling-down-to-a-specific-commit",level:3},{value:"FileSystem View",id:"filesystem-view",level:3},{value:"Statistics",id:"statistics",level:3},{value:"Archived Commits",id:"archived-commits",level:3},{value:"Compactions",id:"compactions",level:3},{value:"Validate Compaction",id:"validate-compaction",level:3},{value:"Unscheduling Compaction",id:"unscheduling-compaction",level:3},{value:"Repair Compaction",id:"repair-compaction",level:3},{value:"Savepoint and Restore",id:"savepoint-and-restore",level:3},{value:"Upgrade and Downgrade Table",id:"upgrade-and-downgrade-table",level:3},{value:"Change Hudi Table Type",id:"change-hudi-table-type",level:3},{value:"Related Resources",id:"related-resources",level:2}];function c(e){const _={a:"a",admonition:"admonition",br:"br",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(_.h3,{id:"local-set-up",children:"Local set up"}),"\n",(0,i.jsxs)(_.p,{children:["Once hudi has been built, the shell can be fired by via ",(0,i.jsx)(_.code,{children:"cd hudi-cli && ./hudi-cli.sh"}),"."]}),"\n",(0,i.jsx)(_.h3,{id:"hudi-cli-bundle-setup",children:"Hudi CLI Bundle setup"}),"\n",(0,i.jsxs)(_.p,{children:["In release ",(0,i.jsx)(_.code,{children:"0.13.0"})," we have now added another way of launching the ",(0,i.jsx)(_.code,{children:"hudi cli"}),", which is using the ",(0,i.jsx)(_.code,{children:"hudi-cli-bundle"}),"."]}),"\n",(0,i.jsxs)(_.p,{children:["There are a couple of requirements when using this approach such as having ",(0,i.jsx)(_.code,{children:"spark"})," installed locally on your machine.\nIt is required to use a spark distribution with hadoop dependencies packaged such as ",(0,i.jsx)(_.code,{children:"spark-3.3.1-bin-hadoop2.tgz"})," from ",(0,i.jsx)(_.a,{href:"https://archive.apache.org/dist/spark/",children:"https://archive.apache.org/dist/spark/"}),".\nWe also recommend you set an env variable ",(0,i.jsx)(_.code,{children:"$SPARK_HOME"})," to the path of where spark is installed on your machine.\nOne important thing to note is that the ",(0,i.jsx)(_.code,{children:"hudi-spark-bundle"})," should also be present when using the ",(0,i.jsx)(_.code,{children:"hudi-cli-bundle"}),".",(0,i.jsx)(_.br,{}),"\n","To provide the locations of these bundle jars you can set them in your shell like so:\n",(0,i.jsx)(_.code,{children:"export CLI_BUNDLE_JAR="})," , ",(0,i.jsx)(_.code,{children:"export SPARK_BUNDLE_JAR="}),"."]}),"\n",(0,i.jsx)(_.p,{children:"For steps see below if you are not compiling the project and downloading the jars:"}),"\n",(0,i.jsxs)(_.ol,{children:["\n",(0,i.jsx)(_.li,{children:"Create an empty folder as a new directory"}),"\n",(0,i.jsx)(_.li,{children:"Copy the hudi-cli-bundle jars and hudi-spark*-bundle jars to this directory"}),"\n",(0,i.jsx)(_.li,{children:"Copy the following script and folder to this directory"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"packaging/hudi-cli-bundle/hudi-cli-with-bundle.sh\npackaging/hudi-cli-bundle/conf . the `conf` folder should be in this directory.\n"})}),"\n",(0,i.jsxs)(_.ol,{start:"4",children:["\n",(0,i.jsx)(_.li,{children:"Start Hudi CLI shell with environment variables set"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"export SPARK_HOME=\nexport CLI_BUNDLE_JAR=\nexport SPARK_BUNDLE_JAR=\n\n./hudi-cli-with-bundle.sh\n\n"})}),"\n",(0,i.jsx)(_.h3,{id:"base-path",children:"Base path"}),"\n",(0,i.jsxs)(_.p,{children:["A hudi table resides on DFS, in a location referred to as the ",(0,i.jsx)(_.code,{children:"basePath"})," and\nwe would need this location in order to connect to a Hudi table. Hudi library effectively manages this table internally, using ",(0,i.jsx)(_.code,{children:".hoodie"})," subfolder to track all metadata."]}),"\n",(0,i.jsx)(_.h3,{id:"using-hudi-cli-in-s3",children:"Using Hudi-cli in S3"}),"\n",(0,i.jsxs)(_.p,{children:["If you are using hudi that comes packaged with AWS EMR, you can find instructions to use hudi-cli ",(0,i.jsx)(_.a,{href:"https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hudi-cli.html",children:"here"}),".\nIf you are not using EMR, or would like to use latest hudi-cli from master, you can follow the below steps to access S3 dataset in your local environment (laptop)."]}),"\n",(0,i.jsx)(_.p,{children:"Build Hudi with corresponding Spark version, for eg, -Dspark3.1.x"}),"\n",(0,i.jsx)(_.p,{children:"Set the following environment variables."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"export AWS_REGION=us-east-2\nexport AWS_ACCESS_KEY_ID=\nexport AWS_SECRET_ACCESS_KEY=\nexport SPARK_HOME=\n"})}),"\n",(0,i.jsx)(_.p,{children:"Ensure you set the SPARK_HOME to your local spark home compatible to compiled hudi spark version above."}),"\n",(0,i.jsx)(_.p,{children:"Apart from these, we might need to add aws jars to class path so that accessing S3 is feasible from local.\nWe need two jars, namely, aws-java-sdk-bundle jar and hadoop-aws jar which you can find online.\nFor eg:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/3.2.0/hadoop-aws-3.2.0.jar -o /lib/spark-3.2.0-bin-hadoop3.2/jars/hadoop-aws-3.2.0.jar\nwget https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-bundle/1.11.375/aws-java-sdk-bundle-1.11.375.jar -o /lib/spark-3.2.0-bin-hadoop3.2/jars/aws-java-sdk-bundle-1.11.375.jar\n"})}),"\n",(0,i.jsx)(_.h4,{id:"note-these-aws-jar-versions-below-are-specific-to-spark-320",children:"Note: These AWS jar versions below are specific to Spark 3.2.0"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"export CLIENT_JAR=/lib/spark-3.2.0-bin-hadoop3.2/jars/aws-java-sdk-bundle-1.12.48.jar:/lib/spark-3.2.0-bin-hadoop3.2/jars/hadoop-aws-3.3.1.jar\n"})}),"\n",(0,i.jsx)(_.p,{children:"Once these are set, you are good to launch hudi-cli and access S3 dataset."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"./hudi-cli/hudi-cli.sh\n"})}),"\n",(0,i.jsx)(_.h3,{id:"using-hudi-cli-on-google-dataproc",children:"Using hudi-cli on Google Dataproc"}),"\n",(0,i.jsxs)(_.p,{children:[(0,i.jsx)(_.a,{href:"https://cloud.google.com/dataproc",children:"Dataproc"})," is Google's managed service for running Apache Hadoop, Apache Spark,\nApache Flink, Presto and many other frameworks, including Hudi. If you want to run the Hudi CLI on a Dataproc node\nwhich has not been launched with Hudi support enabled, you can use the steps below:"]}),"\n",(0,i.jsx)(_.p,{children:"These steps use Hudi version 0.13.0. If you want to use a different version you will have to edit the below commands\nappropriately:"}),"\n",(0,i.jsxs)(_.ol,{children:["\n",(0,i.jsx)(_.li,{children:"Once you've started the Dataproc cluster, you can ssh into it as follows:"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:'$ gcloud compute ssh --zone "YOUR_ZONE" "HOSTNAME_OF_MASTER_NODE" --project "YOUR_PROJECT"\n'})}),"\n",(0,i.jsxs)(_.ol,{start:"2",children:["\n",(0,i.jsx)(_.li,{children:"Download the Hudi CLI bundle"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"wget https://repo1.maven.org/maven2/org/apache/hudi/hudi-cli-bundle_2.12/0.13.0/hudi-cli-bundle_2.12-0.13.0.jar \n"})}),"\n",(0,i.jsxs)(_.ol,{start:"3",children:["\n",(0,i.jsx)(_.li,{children:"Download the Hudi Spark bundle"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"wget https://repo1.maven.org/maven2/org/apache/hudi/hudi-spark-bundle_2.12/0.13.0/hudi-spark-bundle_2.12-0.13.0.jar\n"})}),"\n",(0,i.jsxs)(_.ol,{start:"4",children:["\n",(0,i.jsx)(_.li,{children:"Download the shell script that launches Hudi CLI bundle"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"wget https://raw.githubusercontent.com/apache/hudi/release-0.13.0/packaging/hudi-cli-bundle/hudi-cli-with-bundle.sh\n"})}),"\n",(0,i.jsxs)(_.ol,{start:"5",children:["\n",(0,i.jsx)(_.li,{children:"Launch Hudi CLI bundle with appropriate environment variables as follows:"}),"\n"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{children:"CLIENT_JAR=$DATAPROC_DIR/lib/gcs-connector.jar CLI_BUNDLE_JAR=hudi-cli-bundle_2.12-0.13.0.jar SPARK_BUNDLE_JAR=hudi-spark-bundle_2.12-0.13.0.jar ./hudi-cli-with-bundle.sh \n"})}),"\n",(0,i.jsxs)(_.ol,{start:"6",children:["\n",(0,i.jsxs)(_.li,{children:["\n",(0,i.jsxs)(_.p,{children:["hudi->connect --path gs://path_to_some_table",(0,i.jsx)(_.br,{}),"\n","Metadata for table some_table loaded"]}),"\n"]}),"\n",(0,i.jsxs)(_.li,{children:["\n",(0,i.jsxs)(_.p,{children:["hudi:some_table->commits show --limit 5",(0,i.jsx)(_.br,{}),"\n","This command should show the recent commits, if the above steps work correctly."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(_.h2,{id:"connect-to-a-kerberized-cluster",children:"Connect to a Kerberized cluster"}),"\n",(0,i.jsxs)(_.p,{children:["Before connecting to a Kerberized cluster, you can use ",(0,i.jsx)(_.strong,{children:"kerberos kinit"})," command. Following is the usage of this command."]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"hudi->help kerberos kinit\nNAME\n kerberos kinit - Perform Kerberos authentication\n\nSYNOPSIS\n kerberos kinit --krb5conf String [--principal String] [--keytab String]\n\nOPTIONS\n --krb5conf String\n Path to krb5.conf\n [Optional, default = /etc/krb5.conf]\n\n --principal String\n Kerberos principal\n [Mandatory]\n\n --keytab String\n Path to keytab\n [Mandatory]\n"})}),"\n",(0,i.jsx)(_.p,{children:"For example:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"hudi->kerberos kinit --principal user/host@DOMAIN --keytab /etc/security/keytabs/user.keytab\nPerform Kerberos authentication\nParameters:\n--krb5conf: /etc/krb5.conf\n--principal: user/host@DOMAIN\n--keytab: /etc/security/keytabs/user.keytab\nKerberos current user: user/host@DOMAIN (auth:KERBEROS)\nKerberos login user: user/host@DOMAIN (auth:KERBEROS)\nKerberos authentication success\n"})}),"\n",(0,i.jsx)(_.p,{children:'If you see "Kerberos authentication success" in the command output, it means Kerberos authentication has been successful.'}),"\n",(0,i.jsx)(_.h2,{id:"using-hudi-cli",children:"Using hudi-cli"}),"\n",(0,i.jsx)(_.p,{children:"To initialize a hudi table, use the following command."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"===================================================================\n* ___ ___ *\n* /\\__\\ ___ /\\ \\ ___ *\n* / / / /\\__\\ / \\ \\ /\\ \\ *\n* / /__/ / / / / /\\ \\ \\ \\ \\ \\ *\n* / \\ \\ ___ / / / / / \\ \\__\\ / \\__\\ *\n* / /\\ \\ /\\__\\ / /__/ ___ / /__/ \\ |__| / /\\/__/ *\n* \\/ \\ \\/ / / \\ \\ \\ /\\__\\ \\ \\ \\ / / / /\\/ / / *\n* \\ / / \\ \\ / / / \\ \\ / / / \\ /__/ *\n* / / / \\ \\/ / / \\ \\/ / / \\ \\__\\ *\n* / / / \\ / / \\ / / \\/__/ *\n* \\/__/ \\/__/ \\/__/ Apache Hudi CLI *\n* *\n===================================================================\n\nhudi->create --path /user/hive/warehouse/table1 --tableName hoodie_table_1 --tableType COPY_ON_WRITE\n.....\n"})}),"\n",(0,i.jsx)(_.p,{children:"To see the description of hudi table, use the command:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:hoodie_table_1->desc\n18/09/06 15:57:19 INFO timeline.HoodieActiveTimeline: Loaded instants []\n _________________________________________________________\n | Property | Value |\n |========================================================|\n | basePath | ... |\n | metaPath | ... |\n | fileSystem | hdfs |\n | hoodie.table.name | hoodie_table_1 |\n | hoodie.table.type | COPY_ON_WRITE |\n | hoodie.archivelog.folder| |\n"})}),"\n",(0,i.jsx)(_.p,{children:"Following is a sample command to connect to a Hudi table contains uber trips."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->connect --path /app/uber/trips\n\n16/10/05 23:20:37 INFO model.HoodieTableMetadata: All commits :HoodieCommits{commitList=[20161002045850, 20161002052915, 20161002055918, 20161002065317, 20161002075932, 20161002082904, 20161002085949, 20161002092936, 20161002105903, 20161002112938, 20161002123005, 20161002133002, 20161002155940, 20161002165924, 20161002172907, 20161002175905, 20161002190016, 20161002192954, 20161002195925, 20161002205935, 20161002215928, 20161002222938, 20161002225915, 20161002232906, 20161003003028, 20161003005958, 20161003012936, 20161003022924, 20161003025859, 20161003032854, 20161003042930, 20161003052911, 20161003055907, 20161003062946, 20161003065927, 20161003075924, 20161003082926, 20161003085925, 20161003092909, 20161003100010, 20161003102913, 20161003105850, 20161003112910, 20161003115851, 20161003122929, 20161003132931, 20161003142952, 20161003145856, 20161003152953, 20161003155912, 20161003162922, 20161003165852, 20161003172923, 20161003175923, 20161003195931, 20161003210118, 20161003212919, 20161003215928, 20161003223000, 20161003225858, 20161004003042, 20161004011345, 20161004015235, 20161004022234, 20161004063001, 20161004072402, 20161004074436, 20161004080224, 20161004082928, 20161004085857, 20161004105922, 20161004122927, 20161004142929, 20161004163026, 20161004175925, 20161004194411, 20161004203202, 20161004211210, 20161004214115, 20161004220437, 20161004223020, 20161004225321, 20161004231431, 20161004233643, 20161005010227, 20161005015927, 20161005022911, 20161005032958, 20161005035939, 20161005052904, 20161005070028, 20161005074429, 20161005081318, 20161005083455, 20161005085921, 20161005092901, 20161005095936, 20161005120158, 20161005123418, 20161005125911, 20161005133107, 20161005155908, 20161005163517, 20161005165855, 20161005180127, 20161005184226, 20161005191051, 20161005193234, 20161005203112, 20161005205920, 20161005212949, 20161005223034, 20161005225920]}\nMetadata for table trips loaded\n"})}),"\n",(0,i.jsx)(_.p,{children:"Once connected to the table, a lot of other commands become available. The shell has contextual autocomplete help (press TAB) and below is a list of all commands, few of which are reviewed in this section"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"hudi:trips->help\n* ! - Allows execution of operating system (OS) commands\n* // - Inline comment markers (start of line only)\n* ; - Inline comment markers (start of line only)\n* bootstrap index showmapping - Show bootstrap index mapping\n* bootstrap index showpartitions - Show bootstrap indexed partitions\n* bootstrap run - Run a bootstrap action for current Hudi table\n* clean showpartitions - Show partition level details of a clean\n* cleans refresh - Refresh table metadata\n* cleans run - run clean\n* cleans show - Show the cleans\n* clear - Clears the console\n* cls - Clears the console\n* clustering run - Run Clustering\n* clustering schedule - Schedule Clustering\n* clustering scheduleAndExecute - Run Clustering. Make a cluster plan first and execute that plan immediately\n* commit rollback - Rollback a commit\n* commits compare - Compare commits with another Hoodie table\n* commit show_write_stats - Show write stats of a commit\n* commit showfiles - Show file level details of a commit\n* commit showpartitions - Show partition level details of a commit\n* commits refresh - Refresh table metadata\n* commits show - Show the commits\n* commits showarchived - Show the archived commits\n* commits sync - Sync commits with another Hoodie table\n* compaction repair - Renames the files to make them consistent with the timeline as dictated by Hoodie metadata. Use when compaction unschedule fails partially.\n* compaction run - Run Compaction for given instant time\n* compaction schedule - Schedule Compaction\n* compaction scheduleAndExecute - Schedule compaction plan and execute this plan\n* compaction show - Shows compaction details for a specific compaction instant\n* compaction showarchived - Shows compaction details for a specific compaction instant\n* compactions show all - Shows all compactions that are in active timeline\n* compactions showarchived - Shows compaction details for specified time window\n* compaction unschedule - Unschedule Compaction\n* compaction unscheduleFileId - UnSchedule Compaction for a fileId\n* compaction validate - Validate Compaction\n* connect - Connect to a hoodie table\n* create - Create a hoodie table if not present\n* date - Displays the local date and time\n* desc - Describe Hoodie Table properties\n* downgrade table - Downgrades a table\n* exit - Exits the shell\n* export instants - Export Instants and their metadata from the Timeline\n* fetch table schema - Fetches latest table schema\n* hdfsparquetimport - Imports Parquet table to a hoodie table\n* help - List all commands usage\n* marker delete - Delete the marker\n* metadata create - Create the Metadata Table if it does not exist\n* metadata delete - Remove the Metadata Table\n* metadata init - Update the metadata table from commits since the creation\n* metadata list-files - Print a list of all files in a partition from the metadata\n* metadata list-partitions - List all partitions from metadata\n* metadata refresh - Refresh table metadata\n* metadata set - Set options for Metadata Table\n* metadata stats - Print stats about the metadata\n* metadata validate-files - Validate all files in all partitions from the metadata\n* quit - Exits the shell\n* refresh - Refresh table metadata\n* repair addpartitionmeta - Add partition metadata to a table, if not present\n* repair corrupted clean files - repair corrupted clean files\n* repair deduplicate - De-duplicate a partition path contains duplicates & produce repaired files to replace with\n* repair migrate-partition-meta - Migrate all partition meta file currently stored in text format to be stored in base file format. See HoodieTableConfig#PARTITION_METAFILE_USE_DATA_FORMAT.\n* repair overwrite-hoodie-props - Overwrite hoodie.properties with provided file. Risky operation. Proceed with caution!\n* savepoint create - Savepoint a commit\n* savepoint delete - Delete the savepoint\n* savepoint rollback - Savepoint a commit\n* savepoints refresh - Refresh table metadata\n* savepoints show - Show the savepoints\n* script - Parses the specified resource file and executes its commands\n* set - Set spark launcher env to cli\n* show archived commits - Read commits from archived files and show details\n* show archived commit stats - Read commits from archived files and show details\n* show env - Show spark launcher env by key\n* show envs all - Show spark launcher envs\n* show fsview all - Show entire file-system view\n* show fsview latest - Show latest file-system view\n* show logfile metadata - Read commit metadata from log files\n* show logfile records - Read records from log files\n* show rollback - Show details of a rollback instant\n* show rollbacks - List all rollback instants\n* stats filesizes - File Sizes. Display summary stats on sizes of files\n* stats wa - Write Amplification. Ratio of how many records were upserted to how many records were actually written\n* sync validate - Validate the sync by counting the number of records\n* system properties - Shows the shell's properties\n* table delete-configs - Delete the supplied table configs from the table.\n* table recover-configs - Recover table configs, from update/delete that failed midway.\n* table update-configs - Update the table configs with configs with provided file.\n* temp_delete - Delete view name\n* temp_query - query against created temp view\n* temp delete - Delete view name\n* temp query - query against created temp view\n* temps_show - Show all views name\n* temps show - Show all views name\n* upgrade table - Upgrades a table\n* utils loadClass - Load a class\n* version - Displays shell version\n\nhudi:trips->\n"})}),"\n",(0,i.jsx)(_.h3,{id:"inspecting-commits",children:"Inspecting Commits"}),"\n",(0,i.jsxs)(_.p,{children:["The task of upserting or inserting a batch of incoming records is known as a ",(0,i.jsx)(_.strong,{children:"commit"})," in Hudi. A commit provides basic atomicity guarantees such that only committed data is available for querying.\nEach commit has a monotonically increasing string/number called the ",(0,i.jsx)(_.strong,{children:"commit number"}),". Typically, this is the time at which we started the commit."]}),"\n",(0,i.jsx)(_.p,{children:"To view some basic information about the last 10 commits,"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:trips->commits show --sortBy "Total Bytes Written" --desc true --limit 10\n ________________________________________________________________________________________________________________________________________________________________________\n | CommitTime | Total Bytes Written| Total Files Added| Total Files Updated| Total Partitions Written| Total Records Written| Total Update Records Written| Total Errors|\n |=======================================================================================================================================================================|\n ....\n ....\n ....\n'})}),"\n",(0,i.jsx)(_.p,{children:"At the start of each write, Hudi also writes a .inflight commit to the .hoodie folder. You can use the timestamp there to estimate how long the commit has been inflight"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"$ hdfs dfs -ls /app/uber/trips/.hoodie/*.inflight\n-rw-r--r-- 3 vinoth supergroup 321984 2016-10-05 23:18 /app/uber/trips/.hoodie/20161005225920.inflight\n"})}),"\n",(0,i.jsx)(_.h3,{id:"drilling-down-to-a-specific-commit",children:"Drilling Down to a specific Commit"}),"\n",(0,i.jsx)(_.p,{children:"To understand how the writes spread across specific partiions,"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:trips->commit showpartitions --commit 20161005165855 --sortBy "Total Bytes Written" --desc true --limit 10\n __________________________________________________________________________________________________________________________________________\n | Partition Path| Total Files Added| Total Files Updated| Total Records Inserted| Total Records Updated| Total Bytes Written| Total Errors|\n |=========================================================================================================================================|\n ....\n ....\n'})}),"\n",(0,i.jsx)(_.p,{children:"If you need file level granularity , we can do the following"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:trips->commit showfiles --commit 20161005165855 --sortBy "Partition Path"\n ________________________________________________________________________________________________________________________________________________________\n | Partition Path| File ID | Previous Commit| Total Records Updated| Total Records Written| Total Bytes Written| Total Errors|\n |=======================================================================================================================================================|\n ....\n ....\n'})}),"\n",(0,i.jsx)(_.h3,{id:"filesystem-view",children:"FileSystem View"}),"\n",(0,i.jsx)(_.p,{children:"Hudi views each partition as a collection of file-groups with each file-group containing a list of file-slices in commit order (See concepts).\nThe below commands allow users to view the file-slices for a data-set."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:stock_ticks_mor->show fsview all\n ....\n _______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | Partition | FileId | Base-Instant | Data-File | Data-File Size| Num Delta Files| Total Delta File Size| Delta Files |\n |==============================================================================================================================================================================================================================================================================================================================================================================================================|\n | 2018/08/31| 111415c3-f26d-4639-86c8-f9956f245ac3| 20181002180759| hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/111415c3-f26d-4639-86c8-f9956f245ac3_0_20181002180759.parquet| 432.5 KB | 1 | 20.8 KB | [HoodieLogFile {hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/.111415c3-f26d-4639-86c8-f9956f245ac3_20181002180759.log.1}]|\n\n\n\nhudi:stock_ticks_mor->show fsview latest --partitionPath "2018/08/31"\n ......\n __________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | Partition | FileId | Base-Instant | Data-File | Data-File Size| Num Delta Files| Total Delta Size| Delta Size - compaction scheduled| Delta Size - compaction unscheduled| Delta To Base Ratio - compaction scheduled| Delta To Base Ratio - compaction unscheduled| Delta Files - compaction scheduled | Delta Files - compaction unscheduled|\n |=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================|\n | 2018/08/31| 111415c3-f26d-4639-86c8-f9956f245ac3| 20181002180759| hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/111415c3-f26d-4639-86c8-f9956f245ac3_0_20181002180759.parquet| 432.5 KB | 1 | 20.8 KB | 20.8 KB | 0.0 B | 0.0 B | 0.0 B | [HoodieLogFile {hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/.111415c3-f26d-4639-86c8-f9956f245ac3_20181002180759.log.1}]| [] |\n\n'})}),"\n",(0,i.jsx)(_.h3,{id:"statistics",children:"Statistics"}),"\n",(0,i.jsx)(_.p,{children:"Since Hudi directly manages file sizes for DFS table, it might be good to get an overall picture"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:'hudi:trips->stats filesizes --partitionPath 2016/09/01 --sortBy "95th" --desc true --limit 10\n ________________________________________________________________________________________________\n | CommitTime | Min | 10th | 50th | avg | 95th | Max | NumFiles| StdDev |\n |===============================================================================================|\n | | 93.9 MB | 93.9 MB | 93.9 MB | 93.9 MB | 93.9 MB | 93.9 MB | 2 | 2.3 KB |\n ....\n ....\n'})}),"\n",(0,i.jsx)(_.p,{children:"In case of Hudi write taking much longer, it might be good to see the write amplification for any sudden increases"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->stats wa\n __________________________________________________________________________\n | CommitTime | Total Upserted| Total Written| Write Amplifiation Factor|\n |=========================================================================|\n ....\n ....\n"})}),"\n",(0,i.jsx)(_.h3,{id:"archived-commits",children:"Archived Commits"}),"\n",(0,i.jsx)(_.p,{children:"In order to limit the amount of growth of .commit files on DFS, Hudi archives older .commit files (with due respect to the cleaner policy) into a commits.archived file.\nThis is a sequence file that contains a mapping from commitNumber => json with raw information about the commit (same that is nicely rolled up above)."}),"\n",(0,i.jsx)(_.h3,{id:"compactions",children:"Compactions"}),"\n",(0,i.jsx)(_.p,{children:"To get an idea of the lag between compaction and writer applications, use the below command to list down all\npending compactions."}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->compactions show all\n ___________________________________________________________________\n | Compaction Instant Time| State | Total FileIds to be Compacted|\n |==================================================================|\n | | REQUESTED| 35 |\n | | INFLIGHT | 27 |\n"})}),"\n",(0,i.jsx)(_.p,{children:"To inspect a specific compaction plan, use"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->compaction show --instant \n _________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | Partition Path| File Id | Base Instant | Data File Path | Total Delta Files| getMetrics |\n |================================================================================================================================================================================================================================================\n | 2018/07/17 | | | viewfs://ns-default/.../../UUID_.parquet | 1 | {TOTAL_LOG_FILES=1.0, TOTAL_IO_READ_MB=1230.0, TOTAL_LOG_FILES_SIZE=2.51255751E8, TOTAL_IO_WRITE_MB=991.0, TOTAL_IO_MB=2221.0}|\n\n"})}),"\n",(0,i.jsx)(_.p,{children:"To manually schedule or run a compaction, use the below command. This command uses spark launcher to perform compaction\noperations."}),"\n",(0,i.jsxs)(_.p,{children:[(0,i.jsx)(_.strong,{children:"NOTE:"})," Make sure no other application is scheduling compaction for this table concurrently\n{: .notice--info}"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->help compaction schedule\nKeyword: compaction schedule\nDescription: Schedule Compaction\n Keyword: sparkMemory\n Help: Spark executor memory\n Mandatory: false\n Default if specified: '__NULL__'\n Default if unspecified: '1G'\n\n* compaction schedule - Schedule Compaction\n"})}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->help compaction run\nKeyword: compaction run\nDescription: Run Compaction for given instant time\n Keyword: tableName\n Help: Table name\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: parallelism\n Help: Parallelism for hoodie compaction\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: schemaFilePath\n Help: Path for Avro schema file\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: sparkMemory\n Help: Spark executor memory\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: retry\n Help: Number of retries\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n Keyword: compactionInstant\n Help: Base path for the target hoodie table\n Mandatory: true\n Default if specified: '__NULL__'\n Default if unspecified: '__NULL__'\n\n* compaction run - Run Compaction for given instant time\n"})}),"\n",(0,i.jsx)(_.h3,{id:"validate-compaction",children:"Validate Compaction"}),"\n",(0,i.jsx)(_.p,{children:"Validating a compaction plan : Check if all the files necessary for compactions are present and are valid"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:stock_ticks_mor->compaction validate --instant 20181005222611\n...\n\n COMPACTION PLAN VALID\n\n ___________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | File Id | Base Instant Time| Base Data File | Num Delta Files| Valid| Error|\n |==========================================================================================================================================================================================================================|\n | 05320e98-9a57-4c38-b809-a6beaaeb36bd| 20181005222445 | hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/05320e98-9a57-4c38-b809-a6beaaeb36bd_0_20181005222445.parquet| 1 | true | |\n\n\n\nhudi:stock_ticks_mor->compaction validate --instant 20181005222601\n\n COMPACTION PLAN INVALID\n\n _______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________\n | File Id | Base Instant Time| Base Data File | Num Delta Files| Valid| Error |\n |=====================================================================================================================================================================================================================================================================================================|\n | 05320e98-9a57-4c38-b809-a6beaaeb36bd| 20181005222445 | hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/05320e98-9a57-4c38-b809-a6beaaeb36bd_0_20181005222445.parquet| 1 | false| All log files specified in compaction operation is not present. Missing .... |\n"})}),"\n",(0,i.jsxs)(_.p,{children:[(0,i.jsx)(_.strong,{children:"NOTE:"})," The following commands must be executed without any other writer/ingestion application running.\n{: .notice--warning}"]}),"\n",(0,i.jsx)(_.p,{children:"Sometimes, it becomes necessary to remove a fileId from a compaction-plan inorder to speed-up or unblock compaction\noperation. Any new log-files that happened on this file after the compaction got scheduled will be safely renamed\nso that are preserved. Hudi provides the following CLI to support it"}),"\n",(0,i.jsx)(_.h3,{id:"unscheduling-compaction",children:"Unscheduling Compaction"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->compaction unscheduleFileId --fileId \n....\nNo File renames needed to unschedule file from pending compaction. Operation successful.\n"})}),"\n",(0,i.jsx)(_.p,{children:"In other cases, an entire compaction plan needs to be reverted. This is supported by the following CLI"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:trips->compaction unschedule --instant \n.....\nNo File renames needed to unschedule pending compaction. Operation successful.\n"})}),"\n",(0,i.jsx)(_.h3,{id:"repair-compaction",children:"Repair Compaction"}),"\n",(0,i.jsxs)(_.p,{children:["The above compaction unscheduling operations could sometimes fail partially (e",":g"," -> DFS temporarily unavailable). With\npartial failures, the compaction operation could become inconsistent with the state of file-slices. When you run\n",(0,i.jsx)(_.code,{children:"compaction validate"}),", you can notice invalid compaction operations if there is one. In these cases, the repair\ncommand comes to the rescue, it will rearrange the file-slices so that there is no loss and the file-slices are\nconsistent with the compaction plan"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"hudi:stock_ticks_mor->compaction repair --instant 20181005222611\n......\nCompaction successfully repaired\n.....\n"})}),"\n",(0,i.jsx)(_.h3,{id:"savepoint-and-restore",children:"Savepoint and Restore"}),"\n",(0,i.jsxs)(_.p,{children:['As the name suggest, "savepoint" saves the table as of the commit time, so that it lets you restore the table to this\nsavepoint at a later point in time if need be. You can read more about savepoints and restore ',(0,i.jsx)(_.a,{href:"disaster_recovery",children:"here"})]}),"\n",(0,i.jsx)(_.p,{children:"To trigger savepoint for a hudi table"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"connect --path /tmp/hudi_trips_cow/\ncommits show\nset --conf SPARK_HOME=\nsavepoint create --commit 20220128160245447 --sparkMaster local[2]\n"})}),"\n",(0,i.jsx)(_.p,{children:"To restore the table to one of the savepointed commit:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-java",children:"connect --path /tmp/hudi_trips_cow/\ncommits show\nset --conf SPARK_HOME=\nsavepoints show\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 SavepointTime \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\n\u2551 20220128160245447 \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\nsavepoint rollback --savepoint 20220128160245447 --sparkMaster local[2]\n"})}),"\n",(0,i.jsx)(_.h3,{id:"upgrade-and-downgrade-table",children:"Upgrade and Downgrade Table"}),"\n",(0,i.jsx)(_.p,{children:"In case the user needs to downgrade the version of Hudi library used, the Hudi table needs to be manually downgraded\non the newer version of Hudi CLI before library downgrade. To downgrade a Hudi table through CLI, user needs to specify\nthe target Hudi table version as follows:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"connect --path \ndowngrade table --toVersion \n"})}),"\n",(0,i.jsx)(_.p,{children:"The following table shows the Hudi table versions corresponding to the Hudi release versions:"}),"\n",(0,i.jsxs)(_.table,{children:[(0,i.jsx)(_.thead,{children:(0,i.jsxs)(_.tr,{children:[(0,i.jsx)(_.th,{style:{textAlign:"left"},children:"Hudi Table Version"}),(0,i.jsx)(_.th,{style:{textAlign:"left"},children:"Hudi Release Version(s)"})]})}),(0,i.jsxs)(_.tbody,{children:[(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"FIVE"})," or ",(0,i.jsx)(_.code,{children:"5"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.12.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"FOUR"})," or ",(0,i.jsx)(_.code,{children:"4"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.11.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"THREE"})," or ",(0,i.jsx)(_.code,{children:"3"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.10.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"TWO"})," or ",(0,i.jsx)(_.code,{children:"2"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.9.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"ONE"})," or ",(0,i.jsx)(_.code,{children:"1"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.6.x - 0.8.x"})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:[(0,i.jsx)(_.code,{children:"ZERO"})," or ",(0,i.jsx)(_.code,{children:"0"})]}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"0.5.x and below"})]})]})]}),"\n",(0,i.jsxs)(_.p,{children:["For example, to downgrade a table from version ",(0,i.jsx)(_.code,{children:"FIVE"}),"(",(0,i.jsx)(_.code,{children:"5"}),") (current version) to ",(0,i.jsx)(_.code,{children:"TWO"}),"(",(0,i.jsx)(_.code,{children:"2"}),"), you should run (use proper Spark master based\non your environment)"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"downgrade table --toVersion TWO --sparkMaster local[2]\n"})}),"\n",(0,i.jsx)(_.p,{children:"or"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"downgrade table --toVersion 2 --sparkMaster local[2]\n"})}),"\n",(0,i.jsxs)(_.p,{children:["You can verify the table version by looking at the ",(0,i.jsx)(_.code,{children:"hoodie.table.version"})," property in ",(0,i.jsx)(_.code,{children:".hoodie/hoodie.properties"})," under\nthe table path:"]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-properties",children:"hoodie.table.version=2\n"})}),"\n",(0,i.jsx)(_.p,{children:"Hudi CLI also provides the ability to manually upgrade a Hudi table. To upgrade a Hudi table through CLI:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"upgrade table --toVersion \n"})}),"\n",(0,i.jsxs)(_.admonition,{type:"note",children:[(0,i.jsxs)(_.p,{children:["Table upgrade is automatically handled by the Hudi write client in different deployment modes such as DeltaStreamer\nafter upgrading the Hudi library so that the user does not have to do manual upgrade. Such automatic table upgrade\nis the ",(0,i.jsx)(_.strong,{children:"recommended"})," way in general, instead of using ",(0,i.jsx)(_.code,{children:"upgrade"})," CLI command."]}),(0,i.jsx)(_.p,{children:'Table upgrade from table version ONE to TWO requires key generator related configs such as\n"hoodie.datasource.write.recordkey.field", which is only available when user configures the write job. So the table\nupgrade from version ONE to TWO through CLI is not supported, and user should rely on the automatic upgrade in the write\nclient instead.'})]}),"\n",(0,i.jsx)(_.p,{children:"You may also run the upgrade command without specifying the target version. In such a case, the latest table version\ncorresponding to the library release version is used:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"upgrade table\n"})}),"\n",(0,i.jsx)(_.h3,{id:"change-hudi-table-type",children:"Change Hudi Table Type"}),"\n",(0,i.jsx)(_.p,{children:"There are cases we want to change the hudi table type. For example, change COW table to MOR for more efficient and\nlower latency ingestion; change MOR to COW for better read performance and compatibility with downstream engines.\nSo we offer the table command to perform this modification conveniently."}),"\n",(0,i.jsxs)(_.p,{children:["Changing ",(0,i.jsx)(_.strong,{children:"COW to MOR"}),", we can simply modify the ",(0,i.jsx)(_.code,{children:"hoodie.table.type"})," in ",(0,i.jsx)(_.code,{children:"hoodie.properties"})," to MERGE_ON_READ."]}),"\n",(0,i.jsxs)(_.p,{children:["While changing ",(0,i.jsx)(_.strong,{children:"MOR to COW"}),", we must make sure all the log files are compacted before modifying the table type,\nor it will cause data loss."]}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"connect --path \ntable change-table-type \n"})}),"\n",(0,i.jsxs)(_.p,{children:["The parameter ",(0,i.jsx)(_.code,{children:"target_table_type"})," candidates are below:"]}),"\n",(0,i.jsxs)(_.table,{children:[(0,i.jsx)(_.thead,{children:(0,i.jsxs)(_.tr,{children:[(0,i.jsx)(_.th,{style:{textAlign:"left"},children:"target table type"}),(0,i.jsx)(_.th,{style:{textAlign:"left"},children:"comment"})]})}),(0,i.jsxs)(_.tbody,{children:[(0,i.jsxs)(_.tr,{children:[(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"MOR"}),(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"Change COW table to MERGE_ON_READ."})]}),(0,i.jsxs)(_.tr,{children:[(0,i.jsx)(_.td,{style:{textAlign:"left"},children:"COW"}),(0,i.jsxs)(_.td,{style:{textAlign:"left"},children:["Change MOR table to COPY_ON_WRITE. ",(0,i.jsx)("br",{}),"By default, changing to COW will ",(0,i.jsx)(_.strong,{children:"execute all pending compactions"})," and ",(0,i.jsx)(_.strong,{children:"perform a full compaction"})," if any log file left. Set ",(0,i.jsx)(_.code,{children:"--enable-compaction=false"})," will disable the default compaction. ",(0,i.jsx)("br",{}),"There are params can be set for the compaction operation:",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--parallelism"}),": Default ",(0,i.jsx)(_.code,{children:"3"}),". Parallelism for hoodie compaction",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--sparkMaster"}),": Default ",(0,i.jsx)(_.code,{children:"local"}),". Spark Master",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--sparkMemory"}),": Default ",(0,i.jsx)(_.code,{children:"4G"}),". Spark executor memory",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--retry"}),": Default ",(0,i.jsx)(_.code,{children:"1"}),". Number of retries",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--propsFilePath"}),": Default ",(0,i.jsx)(_.code,{children:" "}),". path to properties file on localfs or dfs with configurations for hoodie client for compacting",(0,i.jsx)("br",{}),(0,i.jsx)(_.code,{children:"--hoodieConfigs"}),": Default ",(0,i.jsx)(_.code,{children:" "}),". Any configuration that can be set in the properties file can be passed here in the form of an array"]})]})]})]}),"\n",(0,i.jsx)(_.p,{children:"Example below is changing MOR table to COW:"}),"\n",(0,i.jsx)(_.pre,{children:(0,i.jsx)(_.code,{className:"language-shell",children:"connect --path /var/dataset/test_table_mor2cow\ndesc\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 Property \u2502 Value \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\n\u2551 basePath \u2502 /var/dataset/test_table_mor2cow \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 metaPath \u2502 /var/dataset/test_table_mor2cow/.hoodie \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 fileSystem \u2502 file \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.name \u2502 test_table \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.compaction.record.merger.strategy \u2502 eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.metadata.partitions \u2502 files \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.type \u2502 MERGE_ON_READ \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.metadata.partitions.inflight \u2502 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.archivelog.folder \u2502 archived \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.timeline.layout.version \u2502 1 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.checksum \u2502 2702201862 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.compaction.payload.type \u2502 HOODIE_AVRO \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.version \u2502 6 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.datasource.write.drop.partition.columns \u2502 false \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n\ntable change-table-type COW\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 Property \u2502 Old Value \u2502 New Value \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\n\u2551 hoodie.archivelog.folder \u2502 archived \u2502 archived \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.compaction.payload.type \u2502 HOODIE_AVRO \u2502 HOODIE_AVRO \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.compaction.record.merger.strategy \u2502 eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 \u2502 eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.datasource.write.drop.partition.columns \u2502 false \u2502 false \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.checksum \u2502 2702201862 \u2502 2702201862 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.metadata.partitions \u2502 files \u2502 files \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.metadata.partitions.inflight \u2502 \u2502 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.name \u2502 test_table \u2502 test_table \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.type \u2502 MERGE_ON_READ \u2502 COPY_ON_WRITE \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.table.version \u2502 6 \u2502 6 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\n\u2551 hoodie.timeline.layout.version \u2502 1 \u2502 1 \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})}),"\n",(0,i.jsx)(_.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,i.jsx)("h3",{children:"Blogs"}),"\n",(0,i.jsxs)(_.ul,{children:["\n",(0,i.jsx)(_.li,{children:(0,i.jsx)(_.a,{href:"https://www.onehouse.ai/blog/getting-started-manage-your-hudi-tables-with-the-admin-hudi-cli-tool",children:"Getting Started: Manage your Hudi tables with the admin Hudi-CLI tool"})}),"\n"]})]})}function d(e={}){const{wrapper:_}={...(0,a.R)(),...e.components};return _?(0,i.jsx)(_,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},28453:(e,_,n)=>{n.d(_,{R:()=>o,x:()=>s});var t=n(96540);const i={},a=t.createContext(i);function o(e){const _=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(_):{..._,...e}}),[_,e])}function s(e){let _;return _=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(a.Provider,{value:_},e.children)}}}]); \ No newline at end of file diff --git a/content/cn/assets/js/2263a65b.8d8f2ab4.js b/content/cn/assets/js/2263a65b.48601d47.js similarity index 89% rename from content/cn/assets/js/2263a65b.8d8f2ab4.js rename to content/cn/assets/js/2263a65b.48601d47.js index 215b9ac0e0d5c..6e397d1d40f8a 100644 --- a/content/cn/assets/js/2263a65b.8d8f2ab4.js +++ b/content/cn/assets/js/2263a65b.48601d47.js @@ -1 +1 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[99502],{8946:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>s,contentTitle:()=>l,default:()=>u,frontMatter:()=>n,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"precommit_validator","title":"Data Quality","description":"Data quality refers to the overall accuracy, completeness, consistency, and validity of data. Ensuring data quality is vital for accurate analysis and reporting, as well as for compliance with regulations and maintaining trust in your organization\'s data infrastructure.","source":"@site/docs/precommit_validator.md","sourceDirName":".","slug":"/precommit_validator","permalink":"/cn/docs/next/precommit_validator","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/precommit_validator.md","tags":[],"version":"current","frontMatter":{"title":"Data Quality","keywords":["hudi","quality","expectations","pre-commit validator"]},"sidebar":"docs","previous":{"title":"Exporter","permalink":"/cn/docs/next/snapshot_exporter"},"next":{"title":"Post-commit Callback","permalink":"/cn/docs/next/platform_services_post_commit_callback"}}');var o=t(74848),r=t(28453);const n={title:"Data Quality",keywords:["hudi","quality","expectations","pre-commit validator"]},l=void 0,s={},d=[{value:"SQL Query Single Result",id:"sql-query-single-result",level:2},{value:"SQL Query Equality",id:"sql-query-equality",level:2},{value:"SQL Query Inequality",id:"sql-query-inequality",level:2},{value:"Extend Custom Validator",id:"extend-custom-validator",level:2},{value:"Additional Monitoring with Notifications",id:"additional-monitoring-with-notifications",level:2},{value:"Related Resources",id:"related-resources",level:2}];function c(e){const a={a:"a",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.p,{children:"Data quality refers to the overall accuracy, completeness, consistency, and validity of data. Ensuring data quality is vital for accurate analysis and reporting, as well as for compliance with regulations and maintaining trust in your organization's data infrastructure."}),"\n",(0,o.jsxs)(a.p,{children:["Hudi offers ",(0,o.jsx)(a.strong,{children:"Pre-Commit Validators"})," that allow you to ensure that your data meets certain data quality expectations as you are writing with Hudi Streamer or Spark Datasource writers."]}),"\n",(0,o.jsxs)(a.p,{children:["To configure pre-commit validators, use this setting ",(0,o.jsx)(a.code,{children:"hoodie.precommit.validators="}),"."]}),"\n",(0,o.jsx)(a.p,{children:"Example:"}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-scala",children:'spark.write.format("hudi")\n .option("hoodie.precommit.validators", "org.apache.hudi.client.validator.SqlQueryEqualityPreCommitValidator")\n'})}),"\n",(0,o.jsx)(a.p,{children:"Today you can use any of these validators and even have the flexibility to extend your own:"}),"\n",(0,o.jsx)(a.h2,{id:"sql-query-single-result",children:"SQL Query Single Result"}),"\n",(0,o.jsx)(a.p,{children:(0,o.jsx)(a.a,{href:"https://github.com/apache/hudi/blob/bf5a52e51bbeaa089995335a0a4c55884792e505/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/client/validator/SqlQuerySingleResultPreCommitValidator.java",children:"org.apache.hudi.client.validator.SqlQuerySingleResultPreCommitValidator"})}),"\n",(0,o.jsx)(a.p,{children:"The SQL Query Single Result validator can be used to validate that a query on the table results in a specific value. This validator allows you to run a SQL query and abort the commit if it does not match the expected output."}),"\n",(0,o.jsxs)(a.p,{children:["Multiple queries can be separated by ",(0,o.jsx)(a.code,{children:";"})," delimiter. Include the expected result as part of the query separated by ",(0,o.jsx)(a.code,{children:"#"}),"."]}),"\n",(0,o.jsxs)(a.p,{children:["Syntax: ",(0,o.jsx)(a.code,{children:"query1#result1;query2#result2"})]}),"\n",(0,o.jsx)(a.p,{children:"Example:"}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-scala",children:'// In this example, we set up a validator that expects there is no row with `col` column as `null`\n\nimport org.apache.hudi.config.HoodiePreCommitValidatorConfig._\n\ndf.write.format("hudi").mode(Overwrite).\n option("hoodie.table.name", tableName).\n option("hoodie.precommit.validators", "org.apache.hudi.client.validator.SqlQuerySingleResultPreCommitValidator").\n option("hoodie.precommit.validators.single.value.sql.queries", "select count(*) from where col is null#0").\n save(basePath)\n'})}),"\n",(0,o.jsx)(a.h2,{id:"sql-query-equality",children:"SQL Query Equality"}),"\n",(0,o.jsx)(a.p,{children:(0,o.jsx)(a.a,{href:"https://github.com/apache/hudi/blob/bf5a52e51bbeaa089995335a0a4c55884792e505/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/client/validator/SqlQueryEqualityPreCommitValidator.java",children:"org.apache.hudi.client.validator.SqlQueryEqualityPreCommitValidator"})}),"\n",(0,o.jsx)(a.p,{children:"The SQL Query Equality validator runs a query before ingesting the data, then runs the same query after ingesting the data and confirms that both outputs match. This allows you to validate for equality of rows before and after the commit."}),"\n",(0,o.jsx)(a.p,{children:"This validator is useful when you want to verify that your query does not change a specific subset of the data. Some examples:"}),"\n",(0,o.jsxs)(a.ul,{children:["\n",(0,o.jsx)(a.li,{children:"Validate that the number of null fields is the same before and after your query"}),"\n",(0,o.jsx)(a.li,{children:"Validate that there are no duplicate records after your query runs"}),"\n",(0,o.jsx)(a.li,{children:"Validate that you are only updating the data, and no inserts slip through"}),"\n"]}),"\n",(0,o.jsx)(a.p,{children:"Example:"}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-scala",children:'// In this example, we set up a validator that expects no change of null rows with the new commit\n\nimport org.apache.hudi.config.HoodiePreCommitValidatorConfig._\n\ndf.write.format("hudi").mode(Overwrite).\n option("hoodie.table.name", tableName).\n option("hoodie.precommit.validators", "org.apache.hudi.client.validator.SqlQueryEqualityPreCommitValidator").\n option("hoodie.precommit.validators.equality.sql.queries", "select count(*) from where col is null").\n save(basePath)\n'})}),"\n",(0,o.jsx)(a.h2,{id:"sql-query-inequality",children:"SQL Query Inequality"}),"\n",(0,o.jsx)(a.p,{children:(0,o.jsx)(a.a,{href:"https://github.com/apache/hudi/blob/bf5a52e51bbeaa089995335a0a4c55884792e505/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/client/validator/SqlQueryInequalityPreCommitValidator.java",children:"org.apache.hudi.client.validator.SqlQueryInequalityPreCommitValidator"})}),"\n",(0,o.jsx)(a.p,{children:"The SQL Query Inquality validator runs a query before ingesting the data, then runs the same query after ingesting the data and confirms that both outputs DO NOT match. This allows you to confirm changes in the rows before and after the commit."}),"\n",(0,o.jsx)(a.p,{children:"Example:"}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-scala",children:'// In this example, we set up a validator that expects a change of null rows with the new commit\n\nimport org.apache.hudi.config.HoodiePreCommitValidatorConfig._\n\ndf.write.format("hudi").mode(Overwrite).\n option("hoodie.table.name", tableName).\n option("hoodie.precommit.validators", "org.apache.hudi.client.validator.SqlQueryInequalityPreCommitValidator").\n option("hoodie.precommit.validators.inequality.sql.queries", "select count(*) from where col is null").\n save(basePath)\n'})}),"\n",(0,o.jsx)(a.h2,{id:"extend-custom-validator",children:"Extend Custom Validator"}),"\n",(0,o.jsxs)(a.p,{children:["Users can also provide their own implementations by extending the abstract class ",(0,o.jsx)(a.a,{href:"https://github.com/apache/hudi/blob/bf5a52e51bbeaa089995335a0a4c55884792e505/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/client/validator/SparkPreCommitValidator.java",children:"SparkPreCommitValidator"}),"\nand overriding this method"]}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-java",children:"void validateRecordsBeforeAndAfter(Dataset before, \n Dataset after, \n Set partitionsAffected)\n"})}),"\n",(0,o.jsx)(a.h2,{id:"additional-monitoring-with-notifications",children:"Additional Monitoring with Notifications"}),"\n",(0,o.jsxs)(a.p,{children:["Hudi offers a ",(0,o.jsx)(a.a,{href:"platform_services_post_commit_callback",children:"commit notification service"})," that can be configured to trigger notifications about write commits."]}),"\n",(0,o.jsx)(a.p,{children:"The commit notification service can be combined with pre-commit validators to send a notification when a commit fails a validation. This is possible by passing details about the validation as a custom value to the HTTP endpoint."}),"\n",(0,o.jsx)(a.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,o.jsx)("h3",{children:"Videos"}),"\n",(0,o.jsxs)(a.ul,{children:["\n",(0,o.jsx)(a.li,{children:(0,o.jsx)(a.a,{href:"https://www.youtube.com/watch?v=KNzs9dj_Btc",children:"Learn About Apache Hudi Pre Commit Validator with Hands on Lab"})}),"\n"]})]})}function u(e={}){const{wrapper:a}={...(0,r.R)(),...e.components};return a?(0,o.jsx)(a,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},28453:(e,a,t)=>{t.d(a,{R:()=>n,x:()=>l});var i=t(96540);const o={},r=i.createContext(o);function n(e){const a=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function l(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:n(e.components),i.createElement(r.Provider,{value:a},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[99502],{8946:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>s,contentTitle:()=>l,default:()=>u,frontMatter:()=>n,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"precommit_validator","title":"Data Quality","description":"Data quality refers to the overall accuracy, completeness, consistency, and validity of data. Ensuring data quality is vital for accurate analysis and reporting, as well as for compliance with regulations and maintaining trust in your organization\'s data infrastructure.","source":"@site/docs/precommit_validator.md","sourceDirName":".","slug":"/precommit_validator","permalink":"/cn/docs/next/precommit_validator","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/precommit_validator.md","tags":[],"version":"current","frontMatter":{"title":"Data Quality","keywords":["hudi","quality","expectations","pre-commit validator"]},"sidebar":"docs","previous":{"title":"Exporter","permalink":"/cn/docs/next/snapshot_exporter"},"next":{"title":"Post-commit Callback","permalink":"/cn/docs/next/platform_services_post_commit_callback"}}');var o=t(74848),r=t(28453);const n={title:"Data Quality",keywords:["hudi","quality","expectations","pre-commit validator"]},l=void 0,s={},d=[{value:"SQL Query Single Result",id:"sql-query-single-result",level:2},{value:"SQL Query Equality",id:"sql-query-equality",level:2},{value:"SQL Query Inequality",id:"sql-query-inequality",level:2},{value:"Extend Custom Validator",id:"extend-custom-validator",level:2},{value:"Additional Monitoring with Notifications",id:"additional-monitoring-with-notifications",level:2},{value:"Related Resources",id:"related-resources",level:2}];function c(e){const a={a:"a",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.p,{children:"Data quality refers to the overall accuracy, completeness, consistency, and validity of data. Ensuring data quality is vital for accurate analysis and reporting, as well as for compliance with regulations and maintaining trust in your organization's data infrastructure."}),"\n",(0,o.jsxs)(a.p,{children:["Hudi offers ",(0,o.jsx)(a.strong,{children:"Pre-Commit Validators"})," that allow you to ensure that your data meets certain data quality expectations as you are writing with Hudi Streamer or Spark Datasource writers."]}),"\n",(0,o.jsxs)(a.p,{children:["To configure pre-commit validators, use this setting ",(0,o.jsx)(a.code,{children:"hoodie.precommit.validators="}),"."]}),"\n",(0,o.jsx)(a.p,{children:"Example:"}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-scala",children:'spark.write.format("hudi")\n .option("hoodie.precommit.validators", "org.apache.hudi.client.validator.SqlQueryEqualityPreCommitValidator")\n'})}),"\n",(0,o.jsx)(a.p,{children:"Today you can use any of these validators and even have the flexibility to extend your own:"}),"\n",(0,o.jsx)(a.h2,{id:"sql-query-single-result",children:"SQL Query Single Result"}),"\n",(0,o.jsx)(a.p,{children:(0,o.jsx)(a.a,{href:"https://github.com/apache/hudi/blob/bf5a52e51bbeaa089995335a0a4c55884792e505/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/client/validator/SqlQuerySingleResultPreCommitValidator.java",children:"org.apache.hudi.client.validator.SqlQuerySingleResultPreCommitValidator"})}),"\n",(0,o.jsx)(a.p,{children:"The SQL Query Single Result validator can be used to validate that a query on the table results in a specific value. This validator allows you to run a SQL query and abort the commit if it does not match the expected output."}),"\n",(0,o.jsxs)(a.p,{children:["Multiple queries can be separated by ",(0,o.jsx)(a.code,{children:";"})," delimiter. Include the expected result as part of the query separated by ",(0,o.jsx)(a.code,{children:"#"}),"."]}),"\n",(0,o.jsxs)(a.p,{children:["Syntax: ",(0,o.jsx)(a.code,{children:"query1#result1;query2#result2"})]}),"\n",(0,o.jsx)(a.p,{children:"Example:"}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-scala",children:'// In this example, we set up a validator that expects there is no row with `col` column as `null`\n\nimport org.apache.hudi.config.HoodiePreCommitValidatorConfig._\n\ndf.write.format("hudi").mode(Overwrite).\n option("hoodie.table.name", tableName).\n option("hoodie.precommit.validators", "org.apache.hudi.client.validator.SqlQuerySingleResultPreCommitValidator").\n option("hoodie.precommit.validators.single.value.sql.queries", "select count(*) from where col is null#0").\n save(basePath)\n'})}),"\n",(0,o.jsx)(a.h2,{id:"sql-query-equality",children:"SQL Query Equality"}),"\n",(0,o.jsx)(a.p,{children:(0,o.jsx)(a.a,{href:"https://github.com/apache/hudi/blob/bf5a52e51bbeaa089995335a0a4c55884792e505/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/client/validator/SqlQueryEqualityPreCommitValidator.java",children:"org.apache.hudi.client.validator.SqlQueryEqualityPreCommitValidator"})}),"\n",(0,o.jsx)(a.p,{children:"The SQL Query Equality validator runs a query before ingesting the data, then runs the same query after ingesting the data and confirms that both outputs match. This allows you to validate for equality of rows before and after the commit."}),"\n",(0,o.jsx)(a.p,{children:"This validator is useful when you want to verify that your query does not change a specific subset of the data. Some examples:"}),"\n",(0,o.jsxs)(a.ul,{children:["\n",(0,o.jsx)(a.li,{children:"Validate that the number of null fields is the same before and after your query"}),"\n",(0,o.jsx)(a.li,{children:"Validate that there are no duplicate records after your query runs"}),"\n",(0,o.jsx)(a.li,{children:"Validate that you are only updating the data, and no inserts slip through"}),"\n"]}),"\n",(0,o.jsx)(a.p,{children:"Example:"}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-scala",children:'// In this example, we set up a validator that expects no change of null rows with the new commit\n\nimport org.apache.hudi.config.HoodiePreCommitValidatorConfig._\n\ndf.write.format("hudi").mode(Overwrite).\n option("hoodie.table.name", tableName).\n option("hoodie.precommit.validators", "org.apache.hudi.client.validator.SqlQueryEqualityPreCommitValidator").\n option("hoodie.precommit.validators.equality.sql.queries", "select count(*) from where col is null").\n save(basePath)\n'})}),"\n",(0,o.jsx)(a.h2,{id:"sql-query-inequality",children:"SQL Query Inequality"}),"\n",(0,o.jsx)(a.p,{children:(0,o.jsx)(a.a,{href:"https://github.com/apache/hudi/blob/bf5a52e51bbeaa089995335a0a4c55884792e505/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/client/validator/SqlQueryInequalityPreCommitValidator.java",children:"org.apache.hudi.client.validator.SqlQueryInequalityPreCommitValidator"})}),"\n",(0,o.jsx)(a.p,{children:"The SQL Query Inquality validator runs a query before ingesting the data, then runs the same query after ingesting the data and confirms that both outputs DO NOT match. This allows you to confirm changes in the rows before and after the commit."}),"\n",(0,o.jsx)(a.p,{children:"Example:"}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-scala",children:'// In this example, we set up a validator that expects a change of null rows with the new commit\n\nimport org.apache.hudi.config.HoodiePreCommitValidatorConfig._\n\ndf.write.format("hudi").mode(Overwrite).\n option("hoodie.table.name", tableName).\n option("hoodie.precommit.validators", "org.apache.hudi.client.validator.SqlQueryInequalityPreCommitValidator").\n option("hoodie.precommit.validators.inequality.sql.queries", "select count(*) from where col is null").\n save(basePath)\n'})}),"\n",(0,o.jsx)(a.h2,{id:"extend-custom-validator",children:"Extend Custom Validator"}),"\n",(0,o.jsxs)(a.p,{children:["Users can also provide their own implementations by extending the abstract class ",(0,o.jsx)(a.a,{href:"https://github.com/apache/hudi/blob/bf5a52e51bbeaa089995335a0a4c55884792e505/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/client/validator/SparkPreCommitValidator.java",children:"SparkPreCommitValidator"}),"\nand overriding this method"]}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-java",children:"void validateRecordsBeforeAndAfter(Dataset before, \n Dataset after, \n Set partitionsAffected)\n"})}),"\n",(0,o.jsx)(a.h2,{id:"additional-monitoring-with-notifications",children:"Additional Monitoring with Notifications"}),"\n",(0,o.jsxs)(a.p,{children:["Hudi offers a ",(0,o.jsx)(a.a,{href:"platform_services_post_commit_callback",children:"commit notification service"})," that can be configured to trigger notifications about write commits."]}),"\n",(0,o.jsx)(a.p,{children:"The commit notification service can be combined with pre-commit validators to send a notification when a commit fails a validation. This is possible by passing details about the validation as a custom value to the HTTP endpoint."}),"\n",(0,o.jsx)(a.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,o.jsx)("h3",{children:"Blogs"}),"\n",(0,o.jsxs)(a.ul,{children:["\n",(0,o.jsx)(a.li,{children:(0,o.jsx)(a.a,{href:"https://www.onehouse.ai/blog/apply-pre-commit-validation-for-data-quality-in-apache-hudi",children:"Apply Pre-Commit Validation for Data Quality in Apache Hudi"})}),"\n"]}),"\n",(0,o.jsx)("h3",{children:"Videos"}),"\n",(0,o.jsxs)(a.ul,{children:["\n",(0,o.jsx)(a.li,{children:(0,o.jsx)(a.a,{href:"https://www.youtube.com/watch?v=KNzs9dj_Btc",children:"Learn About Apache Hudi Pre Commit Validator with Hands on Lab"})}),"\n"]})]})}function u(e={}){const{wrapper:a}={...(0,r.R)(),...e.components};return a?(0,o.jsx)(a,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},28453:(e,a,t)=>{t.d(a,{R:()=>n,x:()=>l});var i=t(96540);const o={},r=i.createContext(o);function n(e){const a=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function l(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:n(e.components),i.createElement(r.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/content/cn/assets/js/491d56e0.0fac960c.js b/content/cn/assets/js/491d56e0.0fac960c.js deleted file mode 100644 index 7449f0d683d73..0000000000000 --- a/content/cn/assets/js/491d56e0.0fac960c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[72907],{48105:(e,r,i)=>{i.r(r),i.d(r,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"record_merger","title":"Record Mergers","description":"Hudi handles mutations to records and streaming data, as we briefly touched upon in timeline ordering section.","source":"@site/docs/record_merger.md","sourceDirName":".","slug":"/record_merger","permalink":"/cn/docs/next/record_merger","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/record_merger.md","tags":[],"version":"current","frontMatter":{"title":"Record Mergers","keywords":["hudi","merge","upsert","precombine"],"toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4},"sidebar":"docs","previous":{"title":"Key Generation","permalink":"/cn/docs/next/key_generation"},"next":{"title":"Table Metadata","permalink":"/cn/docs/next/metadata"}}');var o=i(74848),t=i(28453);const a={title:"Record Mergers",keywords:["hudi","merge","upsert","precombine"],toc:!0,toc_min_heading_level:2,toc_max_heading_level:4},s=void 0,d={},c=[{value:"COMMIT_TIME_ORDERING",id:"commit_time_ordering",level:3},{value:"EVENT_TIME_ORDERING",id:"event_time_ordering",level:3},{value:"CUSTOM",id:"custom",level:3},{value:"Record Merge Configs",id:"record-merge-configs",level:3},{value:"Record Payloads",id:"record-payloads",level:3},{value:"OverwriteWithLatestAvroPayload",id:"overwritewithlatestavropayload",level:4},{value:"DefaultHoodieRecordPayload",id:"defaulthoodierecordpayload",level:4},{value:"EventTimeAvroPayload",id:"eventtimeavropayload",level:4},{value:"OverwriteNonDefaultsWithLatestAvroPayload",id:"overwritenondefaultswithlatestavropayload",level:4},{value:"PartialUpdateAvroPayload",id:"partialupdateavropayload",level:4},{value:"Configs",id:"configs",level:4}];function l(e){const r={a:"a",admonition:"admonition",code:"code",em:"em",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(r.p,{children:["Hudi handles mutations to records and streaming data, as we briefly touched upon in ",(0,o.jsx)(r.a,{href:"timeline#ordering-of-actions",children:"timeline ordering"})," section.\nTo provide users full-fledged support for stream processing, Hudi goes all the way making the storage engine and the underlying storage format\nunderstand how to merge changes to the same record key, that may arrive even in different order at different times. With the rise of mobile applications\nand IoT, these scenarios have become the normal than an exception. For e.g. a social networking application uploading user events several hours after they happened,\nwhen the user connects to WiFi networks."]}),"\n",(0,o.jsx)(r.p,{children:"To achieve this, Hudi supports merge modes, which define how the base and log files are ordered in a file slice and further how different records with\nthe same record key within that file slice are merged consistently to produce the same deterministic results for snapshot queries, writers and table services. Specifically,\nthere are three merge modes supported as a table-level configuration, invoked in the following places."}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"(writing)"})," Combining multiple change records for the same record key while reading input data during writes. This is an optional optimization that\nreduces the number of records written to log files to improve query and write performance subsequently."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"(writing)"})," Merging final change record (partial/full update/delete) against existing record in storage for CoW tables."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"(compaction)"})," Compaction service merges all change records in log files against base files, respecting the merge mode."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"(query)"})," Merging change records in log files, after filtering/projections against base file for MoR table queries."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(r.p,{children:"Note that the merge mode should not be altered once the table is created to avoid inconsistent behavior due to compaction producing\ndifferent merge results when switching between the modes."}),"\n",(0,o.jsx)(r.h3,{id:"commit_time_ordering",children:"COMMIT_TIME_ORDERING"}),"\n",(0,o.jsx)(r.p,{children:"Here, we expect the input records to arrive in strict order such that arrival order is same as their\ndelta commit order on the table. Merging simply picks the record belonging to the latest write as the merged result. In relational data mode speak,\nthis provides overwrite semantics aligned with serializable writes on the timeline."}),"\n",(0,o.jsx)("figure",{children:(0,o.jsx)("img",{className:"docimage",src:i(38526).A,alt:"upsert_path.png"})}),"\n",(0,o.jsx)(r.p,{children:"In the example above, the writer process consumes a database change log, expected to be in strict order of a logical sequence number (lsn)\nthat denotes the ordering of the writes in the upstream database."}),"\n",(0,o.jsx)(r.h3,{id:"event_time_ordering",children:"EVENT_TIME_ORDERING"}),"\n",(0,o.jsxs)(r.p,{children:["This is the default merge mode. While commit time ordering provides a well-understood standard behavior, it's hardly sufficient. The commit time is unrelated to the actual\nordering of data that a user may care about and strict ordering of input in complex distributed systems is difficult to achieve.\nWith event time ordering, the merging picks the record with the highest value on a user specified ",(0,o.jsx)(r.em,{children:(0,o.jsx)(r.strong,{children:"ordering or precombine field"})})," as the merged result."]}),"\n",(0,o.jsx)("figure",{children:(0,o.jsx)("img",{className:"docimage",src:i(57159).A,alt:"upsert_path.png"})}),"\n",(0,o.jsxs)(r.p,{children:['In the example above, two microservices product change records about orders at different times, that can arrive out-of-order. As color coded,\nthis can lead to application-level inconsistent states in the table if simply merged in commit time order like a cancelled order being re-created or\na paid order moved back to just created state expecting payment again. Event time ordering helps by ignoring older state changes that arrive late and\navoiding order status from "jumping back" in time. Combined with ',(0,o.jsx)(r.a,{href:"concurrency_control#non-blocking-concurrency-control-mode",children:"non-blocking concurrency control"}),",\nthis provides a very powerful way for processing such data streams efficiently and correctly."]}),"\n",(0,o.jsx)(r.h3,{id:"custom",children:"CUSTOM"}),"\n",(0,o.jsx)(r.p,{children:'In some cases, even more control and customization may be needed. Extending the same example above, the two microservices could be updating two different\nset of columns "order_info" and "payment_info", along with order state. The merge logic is then expected to not only resolve the correct status, but merge\norder_info from the record in created state, into the record in cancelled state that already has payment_info fields populated with reasons payment failed.\nSuch reconciliation provide a simple denormalized data model for downstream consumption where queries (for e.g. fraud detection) can simply filter fields\nacross order_info and payment_info without costly self-join on each access.'}),"\n",(0,o.jsxs)(r.p,{children:["Hudi allows authoring of cross-language custom record mergers on top of a standard record merger API, that supports full and partial merges. The java APIs\nare sketched below at a high-level. It simply takes older/newer records in engine native formats and produces a merged record or returns empty to skip them entirely (e.g. soft deletes).\nRecord merger is configured using a ",(0,o.jsx)(r.code,{children:"hoodie.write.record.merge.strategy.id"})," write config whose value is an uuid, that is taken by the writer to persist in the table config, and is expected to be returned by ",(0,o.jsx)(r.code,{children:"getMergingStrategy()"}),"\nmethod below. Using this mechanism, Hudi can automatically deduce the record merger to use for the table across different language/engine runtimes."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-Java",children:"interface HoodieRecordMerger {\n\n Option> merge(HoodieRecord older, Schema oldSchema, \n HoodieRecord newer, Schema newSchema, \n TypedProperties props) {\n ...\n }\n\n Option> partialMerge(HoodieRecord older, Schema oldSchema, \n HoodieRecord newer, Schema newSchema, \n Schema readerSchema, TypedProperties props) {\n ...\n }\n \n HoodieRecordType getRecordType() {...}\n \n String getMergingStrategy(); {...}\n}\n"})}),"\n",(0,o.jsx)(r.h3,{id:"record-merge-configs",children:"Record Merge Configs"}),"\n",(0,o.jsx)(r.p,{children:"The record merge mode and optional record merge strategy ID and custom merge implementation classes can be specified using the below configs."}),"\n",(0,o.jsxs)(r.table,{children:[(0,o.jsx)(r.thead,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.th,{children:"Config Name"}),(0,o.jsx)(r.th,{children:"Default"}),(0,o.jsx)(r.th,{children:"Description"})]})}),(0,o.jsxs)(r.tbody,{children:[(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"hoodie.write.record.merge.mode"}),(0,o.jsx)(r.td,{children:"EVENT_TIME_ORDERING"}),(0,o.jsxs)(r.td,{children:["Determines the logic of merging different records with the same record key. Valid values: (1) ",(0,o.jsx)(r.code,{children:"COMMIT_TIME_ORDERING"}),": use commit time to merge records, i.e., the record from later commit overwrites the earlier record with the same key. (2) ",(0,o.jsx)(r.code,{children:"EVENT_TIME_ORDERING"})," (default): use event time as the ordering to merge records, i.e., the record with the larger event time overwrites the record with the smaller event time on the same key, regardless of commit time. The event time or preCombine field needs to be specified by the user. (3) ",(0,o.jsx)(r.code,{children:"CUSTOM"}),": use custom merging logic specified by the user.",(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Config Param: RECORD_MERGE_MODE"}),(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Since Version: 1.0.0"})]})]}),(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"hoodie.write.record.merge.strategy.id"}),(0,o.jsx)(r.td,{children:"N/A (Optional)"}),(0,o.jsxs)(r.td,{children:["ID of record merge strategy. When you specify this config, you also need to specify ",(0,o.jsx)(r.code,{children:"hoodie.write.record.merge.custom.implementation.classes"}),". Hudi picks the ",(0,o.jsx)(r.code,{children:"HoodieRecordMerger"})," implementation class from the list of classes in ",(0,o.jsx)(r.code,{children:"hoodie.write.record.merge.custom.implementation.classes"})," that has the specified merge strategy ID.",(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Config Param: RECORD_MERGE_STRATEGY_ID"}),(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Since Version: 0.13.0"})]})]}),(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"hoodie.write.record.merge.custom.implementation.classes"}),(0,o.jsx)(r.td,{children:"N/A (Optional)"}),(0,o.jsxs)(r.td,{children:["List of ",(0,o.jsx)(r.code,{children:"HoodieRecordMerger"})," implementations constituting Hudi's merging strategy based on the engine used. Hudi picks the ",(0,o.jsx)(r.code,{children:"HoodieRecordMerger"})," implementation class from this list based on the specified ",(0,o.jsx)(r.code,{children:"hoodie.write.record.merge.strategy.id"}),".",(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Config Param: RECORD_MERGE_IMPL_CLASSES"}),(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Since Version: 0.13.0"})]})]})]})]}),"\n",(0,o.jsx)(r.h3,{id:"record-payloads",children:"Record Payloads"}),"\n",(0,o.jsx)(r.admonition,{type:"caution",children:(0,o.jsx)(r.p,{children:"Going forward, we recommend users to migrate and use the record merger APIs and not write new payload implementations."})}),"\n",(0,o.jsx)(r.p,{children:"Record payload is an older abstraction/API for achieving similar record-level merge capabilities. While record payloads were very useful and popular,\nit had drawbacks like lower performance due to conversion of engine native record formats to Apache Avro for merging and lack of cross-language support.\nAs we shall see below, Hudi provides out-of-box support for different payloads for different use cases. Hudi implements fallback from\nrecord merger APIs to payload APIs internally, to provide backwards compatibility for existing payload implementations."}),"\n",(0,o.jsx)(r.h4,{id:"overwritewithlatestavropayload",children:"OverwriteWithLatestAvroPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.OverwriteWithLatestAvroPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["This is the default record payload implementation. It picks the record with the greatest value (determined by calling\n",(0,o.jsx)(r.code,{children:".compareTo()"})," on the value of precombine key) to break ties and simply picks the latest record while merging. This gives\nlatest-write-wins style semantics."]}),"\n",(0,o.jsx)(r.h4,{id:"defaulthoodierecordpayload",children:"DefaultHoodieRecordPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.DefaultHoodieRecordPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["While ",(0,o.jsx)(r.code,{children:"OverwriteWithLatestAvroPayload"})," precombines based on an ordering field and picks the latest record while merging,\n",(0,o.jsx)(r.code,{children:"DefaultHoodieRecordPayload"})," honors the ordering field for both precombinig and merging. Let's understand the difference with an example:"]}),"\n",(0,o.jsxs)(r.p,{children:["Let's say the ordering field is ",(0,o.jsx)(r.code,{children:"ts"})," and record key is ",(0,o.jsx)(r.code,{children:"id"})," and schema is:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:'{\n [\n {"name":"id","type":"string"},\n {"name":"ts","type":"long"},\n {"name":"name","type":"string"},\n {"name":"price","type":"string"}\n ]\n}\n'})}),"\n",(0,o.jsx)(r.p,{children:"Current record in storage:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 2 name_2 price_2\n"})}),"\n",(0,o.jsx)(r.p,{children:"Incoming record:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 1 name_1 price_1\n"})}),"\n",(0,o.jsxs)(r.p,{children:["Result data after merging using ",(0,o.jsx)(r.code,{children:"OverwriteWithLatestAvroPayload"})," (latest-write-wins):"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 1 name_1 price_1\n"})}),"\n",(0,o.jsxs)(r.p,{children:["Result data after merging using ",(0,o.jsx)(r.code,{children:"DefaultHoodieRecordPayload"})," (always honors ordering field):"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 2 name_2 price_2\n"})}),"\n",(0,o.jsx)(r.h4,{id:"eventtimeavropayload",children:"EventTimeAvroPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.EventTimeAvroPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["This is the default record payload for Flink based writing. Some use cases require merging records by event time and\nthus event time plays the role of an ordering field. This payload is particularly useful in the case of late-arriving data.\nFor such use cases, users need to set the ",(0,o.jsx)(r.a,{href:"/docs/configurations#RECORD_PAYLOAD",children:"payload event time field"})," configuration."]}),"\n",(0,o.jsx)(r.h4,{id:"overwritenondefaultswithlatestavropayload",children:"OverwriteNonDefaultsWithLatestAvroPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.OverwriteNonDefaultsWithLatestAvroPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["This payload is quite similar to ",(0,o.jsx)(r.code,{children:"OverwriteWithLatestAvroPayload"})," with slight difference while merging records. For\nprecombining, just like ",(0,o.jsx)(r.code,{children:"OverwriteWithLatestAvroPayload"}),", it picks the latest record for a key, based on an ordering\nfield. While merging, it overwrites the existing record on storage only for the specified ",(0,o.jsx)(r.strong,{children:"fields that don't equal\ndefault value"})," for that field."]}),"\n",(0,o.jsx)(r.h4,{id:"partialupdateavropayload",children:"PartialUpdateAvroPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.PartialUpdateAvroPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["This payload supports partial update. Typically, once the merge step resolves which record to pick, then the record on\nstorage is fully replaced by the resolved record. But, in some cases, the requirement is to update only certain fields\nand not replace the whole record. This is called partial update. ",(0,o.jsx)(r.code,{children:"PartialUpdateAvroPayload"})," provides out-of-box support\nfor such use cases. To illustrate the point, let us look at a simple example:"]}),"\n",(0,o.jsxs)(r.p,{children:["Let's say the ordering field is ",(0,o.jsx)(r.code,{children:"ts"})," and record key is ",(0,o.jsx)(r.code,{children:"id"})," and schema is:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:'{\n [\n {"name":"id","type":"string"},\n {"name":"ts","type":"long"},\n {"name":"name","type":"string"},\n {"name":"price","type":"string"}\n ]\n}\n'})}),"\n",(0,o.jsx)(r.p,{children:"Current record in storage:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 2 name_1 null\n"})}),"\n",(0,o.jsx)(r.p,{children:"Incoming record:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 1 null price_1\n"})}),"\n",(0,o.jsxs)(r.p,{children:["Result data after merging using ",(0,o.jsx)(r.code,{children:"PartialUpdateAvroPayload"}),":"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 2 name_1 price_1\n"})}),"\n",(0,o.jsx)(r.h4,{id:"configs",children:"Configs"}),"\n",(0,o.jsxs)(r.p,{children:["Payload class can be specified using the below configs. For more advanced configs refer ",(0,o.jsx)(r.a,{href:"https://hudi.apache.org/docs/configurations#RECORD_PAYLOAD",children:"here"})]}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.strong,{children:"Spark based configs:"})}),"\n",(0,o.jsxs)(r.table,{children:[(0,o.jsx)(r.thead,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.th,{children:"Config Name"}),(0,o.jsx)(r.th,{children:"Default"}),(0,o.jsx)(r.th,{children:"Description"})]})}),(0,o.jsx)(r.tbody,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"hoodie.datasource.write.payload.class"}),(0,o.jsx)(r.td,{children:"org.apache.hudi.common.model.OverwriteWithLatestAvroPayload (Optional)"}),(0,o.jsxs)(r.td,{children:["Payload class used. Override this, if you like to roll your own merge logic, when upserting/inserting. This will render any value set for PRECOMBINE_FIELD_OPT_VAL in-effective",(0,o.jsx)("br",{}),(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Config Param: WRITE_PAYLOAD_CLASS_NAME"})]})]})})]}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.strong,{children:"Flink based configs:"})}),"\n",(0,o.jsxs)(r.table,{children:[(0,o.jsx)(r.thead,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.th,{children:"Config Name"}),(0,o.jsx)(r.th,{children:"Default"}),(0,o.jsx)(r.th,{children:"Description"})]})}),(0,o.jsx)(r.tbody,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"payload.class"}),(0,o.jsx)(r.td,{children:"org.apache.hudi.common.model.EventTimeAvroPayload (Optional)"}),(0,o.jsxs)(r.td,{children:["Payload class used. Override this, if you like to roll your own merge logic, when upserting/inserting. This will render any value set for the option in-effective",(0,o.jsx)("br",{}),(0,o.jsx)("br",{})," ",(0,o.jsx)(r.code,{children:"Config Param: PAYLOAD_CLASS_NAME"})]})]})})]}),"\n",(0,o.jsxs)(r.p,{children:["There are also quite a few other implementations. Developers may be interested in looking at the hierarchy of ",(0,o.jsx)(r.code,{children:"HoodieRecordPayload"})," interface. For\nexample, ",(0,o.jsx)(r.a,{href:"https://github.com/apache/hudi/blob/e76dd102bcaf8aec5a932e7277ccdbfd73ce1a32/hudi-common/src/main/java/org/apache/hudi/common/model/debezium/MySqlDebeziumAvroPayload.java",children:(0,o.jsx)(r.code,{children:"MySqlDebeziumAvroPayload"})})," and ",(0,o.jsx)(r.a,{href:"https://github.com/apache/hudi/blob/e76dd102bcaf8aec5a932e7277ccdbfd73ce1a32/hudi-common/src/main/java/org/apache/hudi/common/model/debezium/PostgresDebeziumAvroPayload.java",children:(0,o.jsx)(r.code,{children:"PostgresDebeziumAvroPayload"})})," provides support for seamlessly applying changes\ncaptured via Debezium for MySQL and PostgresDB. ",(0,o.jsx)(r.a,{href:"https://github.com/apache/hudi/blob/e76dd102bcaf8aec5a932e7277ccdbfd73ce1a32/hudi-common/src/main/java/org/apache/hudi/common/model/AWSDmsAvroPayload.java",children:(0,o.jsx)(r.code,{children:"AWSDmsAvroPayload"})})," provides support for applying changes captured via Amazon Database Migration Service onto S3.\nFor full configurations, go ",(0,o.jsx)(r.a,{href:"/docs/configurations#RECORD_PAYLOAD",children:"here"})," and please check out ",(0,o.jsx)(r.a,{href:"faq_writing_tables/#can-i-implement-my-own-logic-for-how-input-records-are-merged-with-record-on-storage",children:"this FAQ"})," if you want to implement your own custom payloads."]})]})}function h(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},38526:(e,r,i)=>{i.d(r,{A:()=>n});const n=i.p+"assets/images/commit-time-ordering-merge-mode-e9b6af3dcdb508053202617218f3ffe6.png"},57159:(e,r,i)=>{i.d(r,{A:()=>n});const n=i.p+"assets/images/event-time-ordering-merge-mode-c8164e035840388bf4290fa81ac6262a.png"},28453:(e,r,i)=>{i.d(r,{R:()=>a,x:()=>s});var n=i(96540);const o={},t=n.createContext(o);function a(e){const r=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function s(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(t.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/content/cn/assets/js/491d56e0.76e97535.js b/content/cn/assets/js/491d56e0.76e97535.js new file mode 100644 index 0000000000000..561ad457fa1c2 --- /dev/null +++ b/content/cn/assets/js/491d56e0.76e97535.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[72907],{48105:(e,r,i)=>{i.r(r),i.d(r,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"record_merger","title":"Record Mergers","description":"Hudi handles mutations to records and streaming data, as we briefly touched upon in timeline ordering section.","source":"@site/docs/record_merger.md","sourceDirName":".","slug":"/record_merger","permalink":"/cn/docs/next/record_merger","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/record_merger.md","tags":[],"version":"current","frontMatter":{"title":"Record Mergers","keywords":["hudi","merge","upsert","precombine"],"toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4},"sidebar":"docs","previous":{"title":"Key Generation","permalink":"/cn/docs/next/key_generation"},"next":{"title":"Table Metadata","permalink":"/cn/docs/next/metadata"}}');var o=i(74848),t=i(28453);const a={title:"Record Mergers",keywords:["hudi","merge","upsert","precombine"],toc:!0,toc_min_heading_level:2,toc_max_heading_level:4},s=void 0,d={},c=[{value:"COMMIT_TIME_ORDERING",id:"commit_time_ordering",level:3},{value:"EVENT_TIME_ORDERING",id:"event_time_ordering",level:3},{value:"CUSTOM",id:"custom",level:3},{value:"Record Merge Configs",id:"record-merge-configs",level:3},{value:"Record Payloads",id:"record-payloads",level:3},{value:"OverwriteWithLatestAvroPayload",id:"overwritewithlatestavropayload",level:4},{value:"DefaultHoodieRecordPayload",id:"defaulthoodierecordpayload",level:4},{value:"EventTimeAvroPayload",id:"eventtimeavropayload",level:4},{value:"OverwriteNonDefaultsWithLatestAvroPayload",id:"overwritenondefaultswithlatestavropayload",level:4},{value:"PartialUpdateAvroPayload",id:"partialupdateavropayload",level:4},{value:"Configs",id:"configs",level:4},{value:"Related Resources",id:"related-resources",level:2}];function l(e){const r={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(r.p,{children:["Hudi handles mutations to records and streaming data, as we briefly touched upon in ",(0,o.jsx)(r.a,{href:"timeline#ordering-of-actions",children:"timeline ordering"})," section.\nTo provide users full-fledged support for stream processing, Hudi goes all the way making the storage engine and the underlying storage format\nunderstand how to merge changes to the same record key, that may arrive even in different order at different times. With the rise of mobile applications\nand IoT, these scenarios have become the normal than an exception. For e.g. a social networking application uploading user events several hours after they happened,\nwhen the user connects to WiFi networks."]}),"\n",(0,o.jsx)(r.p,{children:"To achieve this, Hudi supports merge modes, which define how the base and log files are ordered in a file slice and further how different records with\nthe same record key within that file slice are merged consistently to produce the same deterministic results for snapshot queries, writers and table services. Specifically,\nthere are three merge modes supported as a table-level configuration, invoked in the following places."}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"(writing)"})," Combining multiple change records for the same record key while reading input data during writes. This is an optional optimization that\nreduces the number of records written to log files to improve query and write performance subsequently."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"(writing)"})," Merging final change record (partial/full update/delete) against existing record in storage for CoW tables."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"(compaction)"})," Compaction service merges all change records in log files against base files, respecting the merge mode."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"(query)"})," Merging change records in log files, after filtering/projections against base file for MoR table queries."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(r.p,{children:"Note that the merge mode should not be altered once the table is created to avoid inconsistent behavior due to compaction producing\ndifferent merge results when switching between the modes."}),"\n",(0,o.jsx)(r.h3,{id:"commit_time_ordering",children:"COMMIT_TIME_ORDERING"}),"\n",(0,o.jsx)(r.p,{children:"Here, we expect the input records to arrive in strict order such that arrival order is same as their\ndelta commit order on the table. Merging simply picks the record belonging to the latest write as the merged result. In relational data mode speak,\nthis provides overwrite semantics aligned with serializable writes on the timeline."}),"\n",(0,o.jsx)("figure",{children:(0,o.jsx)("img",{className:"docimage",src:i(38526).A,alt:"upsert_path.png"})}),"\n",(0,o.jsx)(r.p,{children:"In the example above, the writer process consumes a database change log, expected to be in strict order of a logical sequence number (lsn)\nthat denotes the ordering of the writes in the upstream database."}),"\n",(0,o.jsx)(r.h3,{id:"event_time_ordering",children:"EVENT_TIME_ORDERING"}),"\n",(0,o.jsxs)(r.p,{children:["This is the default merge mode. While commit time ordering provides a well-understood standard behavior, it's hardly sufficient. The commit time is unrelated to the actual\nordering of data that a user may care about and strict ordering of input in complex distributed systems is difficult to achieve.\nWith event time ordering, the merging picks the record with the highest value on a user specified ",(0,o.jsx)(r.em,{children:(0,o.jsx)(r.strong,{children:"ordering or precombine field"})})," as the merged result."]}),"\n",(0,o.jsx)("figure",{children:(0,o.jsx)("img",{className:"docimage",src:i(57159).A,alt:"upsert_path.png"})}),"\n",(0,o.jsxs)(r.p,{children:['In the example above, two microservices product change records about orders at different times, that can arrive out-of-order. As color coded,\nthis can lead to application-level inconsistent states in the table if simply merged in commit time order like a cancelled order being re-created or\na paid order moved back to just created state expecting payment again. Event time ordering helps by ignoring older state changes that arrive late and\navoiding order status from "jumping back" in time. Combined with ',(0,o.jsx)(r.a,{href:"concurrency_control#non-blocking-concurrency-control-mode",children:"non-blocking concurrency control"}),",\nthis provides a very powerful way for processing such data streams efficiently and correctly."]}),"\n",(0,o.jsx)(r.h3,{id:"custom",children:"CUSTOM"}),"\n",(0,o.jsx)(r.p,{children:'In some cases, even more control and customization may be needed. Extending the same example above, the two microservices could be updating two different\nset of columns "order_info" and "payment_info", along with order state. The merge logic is then expected to not only resolve the correct status, but merge\norder_info from the record in created state, into the record in cancelled state that already has payment_info fields populated with reasons payment failed.\nSuch reconciliation provide a simple denormalized data model for downstream consumption where queries (for e.g. fraud detection) can simply filter fields\nacross order_info and payment_info without costly self-join on each access.'}),"\n",(0,o.jsxs)(r.p,{children:["Hudi allows authoring of cross-language custom record mergers on top of a standard record merger API, that supports full and partial merges. The java APIs\nare sketched below at a high-level. It simply takes older/newer records in engine native formats and produces a merged record or returns empty to skip them entirely (e.g. soft deletes).\nRecord merger is configured using a ",(0,o.jsx)(r.code,{children:"hoodie.write.record.merge.strategy.id"})," write config whose value is an uuid, that is taken by the writer to persist in the table config, and is expected to be returned by ",(0,o.jsx)(r.code,{children:"getMergingStrategy()"}),"\nmethod below. Using this mechanism, Hudi can automatically deduce the record merger to use for the table across different language/engine runtimes."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-Java",children:"interface HoodieRecordMerger {\n\n Option> merge(HoodieRecord older, Schema oldSchema, \n HoodieRecord newer, Schema newSchema, \n TypedProperties props) {\n ...\n }\n\n Option> partialMerge(HoodieRecord older, Schema oldSchema, \n HoodieRecord newer, Schema newSchema, \n Schema readerSchema, TypedProperties props) {\n ...\n }\n \n HoodieRecordType getRecordType() {...}\n \n String getMergingStrategy(); {...}\n}\n"})}),"\n",(0,o.jsx)(r.h3,{id:"record-merge-configs",children:"Record Merge Configs"}),"\n",(0,o.jsx)(r.p,{children:"The record merge mode and optional record merge strategy ID and custom merge implementation classes can be specified using the below configs."}),"\n",(0,o.jsxs)(r.table,{children:[(0,o.jsx)(r.thead,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.th,{children:"Config Name"}),(0,o.jsx)(r.th,{children:"Default"}),(0,o.jsx)(r.th,{children:"Description"})]})}),(0,o.jsxs)(r.tbody,{children:[(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"hoodie.write.record.merge.mode"}),(0,o.jsx)(r.td,{children:"EVENT_TIME_ORDERING"}),(0,o.jsxs)(r.td,{children:["Determines the logic of merging different records with the same record key. Valid values: (1) ",(0,o.jsx)(r.code,{children:"COMMIT_TIME_ORDERING"}),": use commit time to merge records, i.e., the record from later commit overwrites the earlier record with the same key. (2) ",(0,o.jsx)(r.code,{children:"EVENT_TIME_ORDERING"})," (default): use event time as the ordering to merge records, i.e., the record with the larger event time overwrites the record with the smaller event time on the same key, regardless of commit time. The event time or preCombine field needs to be specified by the user. (3) ",(0,o.jsx)(r.code,{children:"CUSTOM"}),": use custom merging logic specified by the user.",(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Config Param: RECORD_MERGE_MODE"}),(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Since Version: 1.0.0"})]})]}),(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"hoodie.write.record.merge.strategy.id"}),(0,o.jsx)(r.td,{children:"N/A (Optional)"}),(0,o.jsxs)(r.td,{children:["ID of record merge strategy. When you specify this config, you also need to specify ",(0,o.jsx)(r.code,{children:"hoodie.write.record.merge.custom.implementation.classes"}),". Hudi picks the ",(0,o.jsx)(r.code,{children:"HoodieRecordMerger"})," implementation class from the list of classes in ",(0,o.jsx)(r.code,{children:"hoodie.write.record.merge.custom.implementation.classes"})," that has the specified merge strategy ID.",(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Config Param: RECORD_MERGE_STRATEGY_ID"}),(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Since Version: 0.13.0"})]})]}),(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"hoodie.write.record.merge.custom.implementation.classes"}),(0,o.jsx)(r.td,{children:"N/A (Optional)"}),(0,o.jsxs)(r.td,{children:["List of ",(0,o.jsx)(r.code,{children:"HoodieRecordMerger"})," implementations constituting Hudi's merging strategy based on the engine used. Hudi picks the ",(0,o.jsx)(r.code,{children:"HoodieRecordMerger"})," implementation class from this list based on the specified ",(0,o.jsx)(r.code,{children:"hoodie.write.record.merge.strategy.id"}),".",(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Config Param: RECORD_MERGE_IMPL_CLASSES"}),(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Since Version: 0.13.0"})]})]})]})]}),"\n",(0,o.jsx)(r.h3,{id:"record-payloads",children:"Record Payloads"}),"\n",(0,o.jsx)(r.admonition,{type:"caution",children:(0,o.jsx)(r.p,{children:"Going forward, we recommend users to migrate and use the record merger APIs and not write new payload implementations."})}),"\n",(0,o.jsx)(r.p,{children:"Record payload is an older abstraction/API for achieving similar record-level merge capabilities. While record payloads were very useful and popular,\nit had drawbacks like lower performance due to conversion of engine native record formats to Apache Avro for merging and lack of cross-language support.\nAs we shall see below, Hudi provides out-of-box support for different payloads for different use cases. Hudi implements fallback from\nrecord merger APIs to payload APIs internally, to provide backwards compatibility for existing payload implementations."}),"\n",(0,o.jsx)(r.h4,{id:"overwritewithlatestavropayload",children:"OverwriteWithLatestAvroPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.OverwriteWithLatestAvroPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["This is the default record payload implementation. It picks the record with the greatest value (determined by calling\n",(0,o.jsx)(r.code,{children:".compareTo()"})," on the value of precombine key) to break ties and simply picks the latest record while merging. This gives\nlatest-write-wins style semantics."]}),"\n",(0,o.jsx)(r.h4,{id:"defaulthoodierecordpayload",children:"DefaultHoodieRecordPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.DefaultHoodieRecordPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["While ",(0,o.jsx)(r.code,{children:"OverwriteWithLatestAvroPayload"})," precombines based on an ordering field and picks the latest record while merging,\n",(0,o.jsx)(r.code,{children:"DefaultHoodieRecordPayload"})," honors the ordering field for both precombinig and merging. Let's understand the difference with an example:"]}),"\n",(0,o.jsxs)(r.p,{children:["Let's say the ordering field is ",(0,o.jsx)(r.code,{children:"ts"})," and record key is ",(0,o.jsx)(r.code,{children:"id"})," and schema is:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:'{\n [\n {"name":"id","type":"string"},\n {"name":"ts","type":"long"},\n {"name":"name","type":"string"},\n {"name":"price","type":"string"}\n ]\n}\n'})}),"\n",(0,o.jsx)(r.p,{children:"Current record in storage:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 2 name_2 price_2\n"})}),"\n",(0,o.jsx)(r.p,{children:"Incoming record:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 1 name_1 price_1\n"})}),"\n",(0,o.jsxs)(r.p,{children:["Result data after merging using ",(0,o.jsx)(r.code,{children:"OverwriteWithLatestAvroPayload"})," (latest-write-wins):"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 1 name_1 price_1\n"})}),"\n",(0,o.jsxs)(r.p,{children:["Result data after merging using ",(0,o.jsx)(r.code,{children:"DefaultHoodieRecordPayload"})," (always honors ordering field):"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 2 name_2 price_2\n"})}),"\n",(0,o.jsx)(r.h4,{id:"eventtimeavropayload",children:"EventTimeAvroPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.EventTimeAvroPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["This is the default record payload for Flink based writing. Some use cases require merging records by event time and\nthus event time plays the role of an ordering field. This payload is particularly useful in the case of late-arriving data.\nFor such use cases, users need to set the ",(0,o.jsx)(r.a,{href:"/docs/configurations#RECORD_PAYLOAD",children:"payload event time field"})," configuration."]}),"\n",(0,o.jsx)(r.h4,{id:"overwritenondefaultswithlatestavropayload",children:"OverwriteNonDefaultsWithLatestAvroPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.OverwriteNonDefaultsWithLatestAvroPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["This payload is quite similar to ",(0,o.jsx)(r.code,{children:"OverwriteWithLatestAvroPayload"})," with slight difference while merging records. For\nprecombining, just like ",(0,o.jsx)(r.code,{children:"OverwriteWithLatestAvroPayload"}),", it picks the latest record for a key, based on an ordering\nfield. While merging, it overwrites the existing record on storage only for the specified ",(0,o.jsx)(r.strong,{children:"fields that don't equal\ndefault value"})," for that field."]}),"\n",(0,o.jsx)(r.h4,{id:"partialupdateavropayload",children:"PartialUpdateAvroPayload"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-scala",children:"hoodie.datasource.write.payload.class=org.apache.hudi.common.model.PartialUpdateAvroPayload\n"})}),"\n",(0,o.jsxs)(r.p,{children:["This payload supports partial update. Typically, once the merge step resolves which record to pick, then the record on\nstorage is fully replaced by the resolved record. But, in some cases, the requirement is to update only certain fields\nand not replace the whole record. This is called partial update. ",(0,o.jsx)(r.code,{children:"PartialUpdateAvroPayload"})," provides out-of-box support\nfor such use cases. To illustrate the point, let us look at a simple example:"]}),"\n",(0,o.jsxs)(r.p,{children:["Let's say the ordering field is ",(0,o.jsx)(r.code,{children:"ts"})," and record key is ",(0,o.jsx)(r.code,{children:"id"})," and schema is:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:'{\n [\n {"name":"id","type":"string"},\n {"name":"ts","type":"long"},\n {"name":"name","type":"string"},\n {"name":"price","type":"string"}\n ]\n}\n'})}),"\n",(0,o.jsx)(r.p,{children:"Current record in storage:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 2 name_1 null\n"})}),"\n",(0,o.jsx)(r.p,{children:"Incoming record:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 1 null price_1\n"})}),"\n",(0,o.jsxs)(r.p,{children:["Result data after merging using ",(0,o.jsx)(r.code,{children:"PartialUpdateAvroPayload"}),":"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{children:" id ts name price\n 1 2 name_1 price_1\n"})}),"\n",(0,o.jsx)(r.h4,{id:"configs",children:"Configs"}),"\n",(0,o.jsxs)(r.p,{children:["Payload class can be specified using the below configs. For more advanced configs refer ",(0,o.jsx)(r.a,{href:"https://hudi.apache.org/docs/configurations#RECORD_PAYLOAD",children:"here"})]}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.strong,{children:"Spark based configs:"})}),"\n",(0,o.jsxs)(r.table,{children:[(0,o.jsx)(r.thead,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.th,{children:"Config Name"}),(0,o.jsx)(r.th,{children:"Default"}),(0,o.jsx)(r.th,{children:"Description"})]})}),(0,o.jsx)(r.tbody,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"hoodie.datasource.write.payload.class"}),(0,o.jsx)(r.td,{children:"org.apache.hudi.common.model.OverwriteWithLatestAvroPayload (Optional)"}),(0,o.jsxs)(r.td,{children:["Payload class used. Override this, if you like to roll your own merge logic, when upserting/inserting. This will render any value set for PRECOMBINE_FIELD_OPT_VAL in-effective",(0,o.jsx)("br",{}),(0,o.jsx)("br",{}),(0,o.jsx)(r.code,{children:"Config Param: WRITE_PAYLOAD_CLASS_NAME"})]})]})})]}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.strong,{children:"Flink based configs:"})}),"\n",(0,o.jsxs)(r.table,{children:[(0,o.jsx)(r.thead,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.th,{children:"Config Name"}),(0,o.jsx)(r.th,{children:"Default"}),(0,o.jsx)(r.th,{children:"Description"})]})}),(0,o.jsx)(r.tbody,{children:(0,o.jsxs)(r.tr,{children:[(0,o.jsx)(r.td,{children:"payload.class"}),(0,o.jsx)(r.td,{children:"org.apache.hudi.common.model.EventTimeAvroPayload (Optional)"}),(0,o.jsxs)(r.td,{children:["Payload class used. Override this, if you like to roll your own merge logic, when upserting/inserting. This will render any value set for the option in-effective",(0,o.jsx)("br",{}),(0,o.jsx)("br",{})," ",(0,o.jsx)(r.code,{children:"Config Param: PAYLOAD_CLASS_NAME"})]})]})})]}),"\n",(0,o.jsxs)(r.p,{children:["There are also quite a few other implementations. Developers may be interested in looking at the hierarchy of ",(0,o.jsx)(r.code,{children:"HoodieRecordPayload"})," interface. For\nexample, ",(0,o.jsx)(r.a,{href:"https://github.com/apache/hudi/blob/e76dd102bcaf8aec5a932e7277ccdbfd73ce1a32/hudi-common/src/main/java/org/apache/hudi/common/model/debezium/MySqlDebeziumAvroPayload.java",children:(0,o.jsx)(r.code,{children:"MySqlDebeziumAvroPayload"})})," and ",(0,o.jsx)(r.a,{href:"https://github.com/apache/hudi/blob/e76dd102bcaf8aec5a932e7277ccdbfd73ce1a32/hudi-common/src/main/java/org/apache/hudi/common/model/debezium/PostgresDebeziumAvroPayload.java",children:(0,o.jsx)(r.code,{children:"PostgresDebeziumAvroPayload"})})," provides support for seamlessly applying changes\ncaptured via Debezium for MySQL and PostgresDB. ",(0,o.jsx)(r.a,{href:"https://github.com/apache/hudi/blob/e76dd102bcaf8aec5a932e7277ccdbfd73ce1a32/hudi-common/src/main/java/org/apache/hudi/common/model/AWSDmsAvroPayload.java",children:(0,o.jsx)(r.code,{children:"AWSDmsAvroPayload"})})," provides support for applying changes captured via Amazon Database Migration Service onto S3.\nFor full configurations, go ",(0,o.jsx)(r.a,{href:"/docs/configurations#RECORD_PAYLOAD",children:"here"})," and please check out ",(0,o.jsx)(r.a,{href:"faq_writing_tables/#can-i-implement-my-own-logic-for-how-input-records-are-merged-with-record-on-storage",children:"this FAQ"})," if you want to implement your own custom payloads."]}),"\n",(0,o.jsx)(r.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,o.jsx)("h3",{children:"Blogs"}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsx)(r.li,{children:(0,o.jsx)(r.a,{href:"https://medium.com/@simpsons/how-to-define-your-own-merge-logic-with-apache-hudi-622ee5ccab1e",children:"How to define your own merge logic with Apache Hudi"})}),"\n"]})]})}function h(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},38526:(e,r,i)=>{i.d(r,{A:()=>n});const n=i.p+"assets/images/commit-time-ordering-merge-mode-e9b6af3dcdb508053202617218f3ffe6.png"},57159:(e,r,i)=>{i.d(r,{A:()=>n});const n=i.p+"assets/images/event-time-ordering-merge-mode-c8164e035840388bf4290fa81ac6262a.png"},28453:(e,r,i)=>{i.d(r,{R:()=>a,x:()=>s});var n=i(96540);const o={},t=n.createContext(o);function a(e){const r=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function s(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(t.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/content/cn/assets/js/5733876a.664154f3.js b/content/cn/assets/js/5733876a.664154f3.js deleted file mode 100644 index 0c43ba6000e18..0000000000000 --- a/content/cn/assets/js/5733876a.664154f3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[85973],{91855:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>m,frontMatter:()=>l,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"writing_tables_streaming_writes","title":"Streaming Writes","description":"Spark Streaming","source":"@site/docs/writing_tables_streaming_writes.md","sourceDirName":".","slug":"/writing_tables_streaming_writes","permalink":"/cn/docs/next/writing_tables_streaming_writes","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/writing_tables_streaming_writes.md","tags":[],"version":"current","frontMatter":{"title":"Streaming Writes","keywords":["hudi","spark","flink","streaming","processing"],"last_modified_at":"2024-03-13T19:59:57.000Z"},"sidebar":"docs","previous":{"title":"\u5199\u5165 Hudi \u6570\u636e\u96c6","permalink":"/cn/docs/next/writing_data"},"next":{"title":"SQL Queries","permalink":"/cn/docs/next/sql_queries"}}');var r=a(74848),i=a(28453),s=a(11470),o=a(19365);const l={title:"Streaming Writes",keywords:["hudi","spark","flink","streaming","processing"],last_modified_at:new Date("2024-03-13T19:59:57.000Z")},u=void 0,c={},d=[{value:"Spark Streaming",id:"spark-streaming",level:2}];function p(e){const t={code:"code",h2:"h2",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h2,{id:"spark-streaming",children:"Spark Streaming"}),"\n",(0,r.jsx)(t.p,{children:"You can write Hudi tables using spark's structured streaming."}),"\n",(0,r.jsxs)(s.A,{groupId:"programming-language",defaultValue:"python",values:[{label:"Scala",value:"scala"},{label:"Python",value:"python"}],children:[(0,r.jsx)(o.A,{value:"scala",children:(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-scala",children:'// spark-shell\n// prepare to stream write to new table\nimport org.apache.spark.sql.streaming.Trigger\n\nval streamingTableName = "hudi_trips_cow_streaming"\nval baseStreamingPath = "file:///tmp/hudi_trips_cow_streaming"\nval checkpointLocation = "file:///tmp/checkpoints/hudi_trips_cow_streaming"\n\n// create streaming df\nval df = spark.readStream.\n format("hudi").\n load(basePath)\n\n// write stream to new hudi table\ndf.writeStream.format("hudi").\n options(getQuickstartWriteConfigs).\n option("hoodie.datasource.write.precombine.field", "ts").\n option("hoodie.datasource.write.recordkey.field", "uuid").\n option("hoodie.datasource.write.partitionpath.field", "partitionpath").\n option("hoodie.table.name", streamingTableName).\n outputMode("append").\n option("path", baseStreamingPath).\n option("checkpointLocation", checkpointLocation).\n trigger(Trigger.Once()).\n start()\n\n'})})}),(0,r.jsx)(o.A,{value:"python",children:(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:"# pyspark\n# prepare to stream write to new table\nstreamingTableName = \"hudi_trips_cow_streaming\"\nbaseStreamingPath = \"file:///tmp/hudi_trips_cow_streaming\"\ncheckpointLocation = \"file:///tmp/checkpoints/hudi_trips_cow_streaming\"\n\nhudi_streaming_options = {\n 'hoodie.table.name': streamingTableName,\n 'hoodie.datasource.write.recordkey.field': 'uuid',\n 'hoodie.datasource.write.partitionpath.field': 'partitionpath',\n 'hoodie.datasource.write.table.name': streamingTableName,\n 'hoodie.datasource.write.operation': 'upsert',\n 'hoodie.datasource.write.precombine.field': 'ts',\n 'hoodie.upsert.shuffle.parallelism': 2,\n 'hoodie.insert.shuffle.parallelism': 2\n}\n\n# create streaming df\ndf = spark.readStream \n .format(\"hudi\") \n .load(basePath)\n\n# write stream to new hudi table\ndf.writeStream.format(\"hudi\") \n .options(**hudi_streaming_options) \n .outputMode(\"append\") \n .option(\"path\", baseStreamingPath) \n .option(\"checkpointLocation\", checkpointLocation) \n .trigger(once=True) \n .start()\n\n"})})})]})]})}function m(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},19365:(e,t,a)=>{a.d(t,{A:()=>s});a(96540);var n=a(34164);const r={tabItem:"tabItem_Ymn6"};var i=a(74848);function s(e){let{children:t,hidden:a,className:s}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,s),hidden:a,children:t})}},11470:(e,t,a)=>{a.d(t,{A:()=>y});var n=a(96540),r=a(34164),i=a(23104),s=a(56347),o=a(205),l=a(57485),u=a(31682),c=a(70679);function d(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function p(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:r}}=e;return{value:t,label:a,attributes:n,default:r}}))}(a);return function(e){const t=(0,u.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function h(e){let{queryString:t=!1,groupId:a}=e;const r=(0,s.W6)(),i=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,l.aZ)(i),(0,n.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(r.location.search);t.set(i,e),r.replace({...r.location,search:t.toString()})}),[i,r])]}function f(e){const{defaultValue:t,queryString:a=!1,groupId:r}=e,i=p(e),[s,l]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:i}))),[u,d]=h({queryString:a,groupId:r}),[f,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,i]=(0,c.Dv)(a);return[r,(0,n.useCallback)((e=>{a&&i.set(e)}),[a,i])]}({groupId:r}),b=(()=>{const e=u??f;return m({value:e,tabValues:i})?e:null})();(0,o.A)((()=>{b&&l(b)}),[b]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),g(e)}),[d,g,i]),tabValues:i}}var g=a(92303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var w=a(74848);function v(e){let{className:t,block:a,selectedValue:n,selectValue:s,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:u}=(0,i.a_)(),c=e=>{const t=e.currentTarget,a=l.indexOf(t),r=o[a].value;r!==n&&(u(t),s(r))},d=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=l.indexOf(e.currentTarget)+1;t=l[a]??l[0];break}case"ArrowLeft":{const a=l.indexOf(e.currentTarget)-1;t=l[a]??l[l.length-1];break}}t?.focus()};return(0,w.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t),children:o.map((e=>{let{value:t,label:a,attributes:i}=e;return(0,w.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>l.push(e),onKeyDown:d,onClick:c,...i,className:(0,r.A)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":n===t}),children:a??t},t)}))})}function _(e){let{lazy:t,children:a,selectedValue:i}=e;const s=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=s.find((e=>e.props.value===i));return e?(0,n.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,w.jsx)("div",{className:"margin-top--md",children:s.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==i})))})}function k(e){const t=f(e);return(0,w.jsxs)("div",{className:(0,r.A)("tabs-container",b.tabList),children:[(0,w.jsx)(v,{...t,...e}),(0,w.jsx)(_,{...t,...e})]})}function y(e){const t=(0,g.A)();return(0,w.jsx)(k,{...e,children:d(e.children)},String(t))}},28453:(e,t,a)=>{a.d(t,{R:()=>s,x:()=>o});var n=a(96540);const r={},i=n.createContext(r);function s(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/content/cn/assets/js/5733876a.a87a72dc.js b/content/cn/assets/js/5733876a.a87a72dc.js new file mode 100644 index 0000000000000..a9fd6ff2e82d0 --- /dev/null +++ b/content/cn/assets/js/5733876a.a87a72dc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[85973],{91855:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"writing_tables_streaming_writes","title":"Streaming Writes","description":"Spark Streaming","source":"@site/docs/writing_tables_streaming_writes.md","sourceDirName":".","slug":"/writing_tables_streaming_writes","permalink":"/cn/docs/next/writing_tables_streaming_writes","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/writing_tables_streaming_writes.md","tags":[],"version":"current","frontMatter":{"title":"Streaming Writes","keywords":["hudi","spark","flink","streaming","processing"],"last_modified_at":"2024-03-13T19:59:57.000Z"},"sidebar":"docs","previous":{"title":"\u5199\u5165 Hudi \u6570\u636e\u96c6","permalink":"/cn/docs/next/writing_data"},"next":{"title":"SQL Queries","permalink":"/cn/docs/next/sql_queries"}}');var a=n(74848),i=n(28453),s=n(11470),o=n(19365);const l={title:"Streaming Writes",keywords:["hudi","spark","flink","streaming","processing"],last_modified_at:new Date("2024-03-13T19:59:57.000Z")},u=void 0,c={},d=[{value:"Spark Streaming",id:"spark-streaming",level:2},{value:"Related Resources",id:"related-resources",level:2}];function p(e){const t={a:"a",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h2,{id:"spark-streaming",children:"Spark Streaming"}),"\n",(0,a.jsx)(t.p,{children:"You can write Hudi tables using spark's structured streaming."}),"\n",(0,a.jsxs)(s.A,{groupId:"programming-language",defaultValue:"python",values:[{label:"Scala",value:"scala"},{label:"Python",value:"python"}],children:[(0,a.jsx)(o.A,{value:"scala",children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-scala",children:'// spark-shell\n// prepare to stream write to new table\nimport org.apache.spark.sql.streaming.Trigger\n\nval streamingTableName = "hudi_trips_cow_streaming"\nval baseStreamingPath = "file:///tmp/hudi_trips_cow_streaming"\nval checkpointLocation = "file:///tmp/checkpoints/hudi_trips_cow_streaming"\n\n// create streaming df\nval df = spark.readStream.\n format("hudi").\n load(basePath)\n\n// write stream to new hudi table\ndf.writeStream.format("hudi").\n options(getQuickstartWriteConfigs).\n option("hoodie.datasource.write.precombine.field", "ts").\n option("hoodie.datasource.write.recordkey.field", "uuid").\n option("hoodie.datasource.write.partitionpath.field", "partitionpath").\n option("hoodie.table.name", streamingTableName).\n outputMode("append").\n option("path", baseStreamingPath).\n option("checkpointLocation", checkpointLocation).\n trigger(Trigger.Once()).\n start()\n\n'})})}),(0,a.jsx)(o.A,{value:"python",children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-python",children:"# pyspark\n# prepare to stream write to new table\nstreamingTableName = \"hudi_trips_cow_streaming\"\nbaseStreamingPath = \"file:///tmp/hudi_trips_cow_streaming\"\ncheckpointLocation = \"file:///tmp/checkpoints/hudi_trips_cow_streaming\"\n\nhudi_streaming_options = {\n 'hoodie.table.name': streamingTableName,\n 'hoodie.datasource.write.recordkey.field': 'uuid',\n 'hoodie.datasource.write.partitionpath.field': 'partitionpath',\n 'hoodie.datasource.write.table.name': streamingTableName,\n 'hoodie.datasource.write.operation': 'upsert',\n 'hoodie.datasource.write.precombine.field': 'ts',\n 'hoodie.upsert.shuffle.parallelism': 2,\n 'hoodie.insert.shuffle.parallelism': 2\n}\n\n# create streaming df\ndf = spark.readStream \n .format(\"hudi\") \n .load(basePath)\n\n# write stream to new hudi table\ndf.writeStream.format(\"hudi\") \n .options(**hudi_streaming_options) \n .outputMode(\"append\") \n .option(\"path\", baseStreamingPath) \n .option(\"checkpointLocation\", checkpointLocation) \n .trigger(once=True) \n .start()\n\n"})})})]}),"\n",(0,a.jsx)(t.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,a.jsx)("h3",{children:"Blogs"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://www.onehouse.ai/blog/intro-to-hudi-and-flink",children:"An Introduction to the Hudi and Flink Integration"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://medium.com/@simpsons/bulk-insert-sort-modes-with-apache-hudi-c781e77841bc",children:"Bulk Insert Sort Modes with Apache Hudi"})}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(p,{...e})}):p(e)}},19365:(e,t,n)=>{n.d(t,{A:()=>s});n(96540);var r=n(34164);const a={tabItem:"tabItem_Ymn6"};var i=n(74848);function s(e){let{children:t,hidden:n,className:s}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,s),hidden:n,children:t})}},11470:(e,t,n)=>{n.d(t,{A:()=>x});var r=n(96540),a=n(34164),i=n(23104),s=n(56347),o=n(205),l=n(57485),u=n(31682),c=n(70679);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}(n);return function(e){const t=(0,u.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function h(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const a=(0,s.W6)(),i=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,l.aZ)(i),(0,r.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(a.location.search);t.set(i,e),a.replace({...a.location,search:t.toString()})}),[i,a])]}function f(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,i=p(e),[s,l]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:i}))),[u,d]=m({queryString:n,groupId:a}),[f,g]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,i]=(0,c.Dv)(n);return[a,(0,r.useCallback)((e=>{n&&i.set(e)}),[n,i])]}({groupId:a}),b=(()=>{const e=u??f;return h({value:e,tabValues:i})?e:null})();(0,o.A)((()=>{b&&l(b)}),[b]);return{selectedValue:s,selectValue:(0,r.useCallback)((e=>{if(!h({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),g(e)}),[d,g,i]),tabValues:i}}var g=n(92303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var w=n(74848);function v(e){let{className:t,block:n,selectedValue:r,selectValue:s,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:u}=(0,i.a_)(),c=e=>{const t=e.currentTarget,n=l.indexOf(t),a=o[n].value;a!==r&&(u(t),s(a))},d=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const n=l.indexOf(e.currentTarget)+1;t=l[n]??l[0];break}case"ArrowLeft":{const n=l.indexOf(e.currentTarget)-1;t=l[n]??l[l.length-1];break}}t?.focus()};return(0,w.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":n},t),children:o.map((e=>{let{value:t,label:n,attributes:i}=e;return(0,w.jsx)("li",{role:"tab",tabIndex:r===t?0:-1,"aria-selected":r===t,ref:e=>l.push(e),onKeyDown:d,onClick:c,...i,className:(0,a.A)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":r===t}),children:n??t},t)}))})}function _(e){let{lazy:t,children:n,selectedValue:i}=e;const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=s.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,w.jsx)("div",{className:"margin-top--md",children:s.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==i})))})}function k(e){const t=f(e);return(0,w.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,w.jsx)(v,{...t,...e}),(0,w.jsx)(_,{...t,...e})]})}function x(e){const t=(0,g.A)();return(0,w.jsx)(k,{...e,children:d(e.children)},String(t))}},28453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>o});var r=n(96540);const a={},i=r.createContext(a);function s(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/content/cn/assets/js/5e1c183f.cea1b634.js b/content/cn/assets/js/5e1c183f.cea1b634.js new file mode 100644 index 0000000000000..a7e5b975c0f3e --- /dev/null +++ b/content/cn/assets/js/5e1c183f.cea1b634.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[70253],{34886:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"markers","title":"Marker Mechanism","description":"Purpose of Markers","source":"@site/docs/markers.md","sourceDirName":".","slug":"/markers","permalink":"/cn/docs/next/markers","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/markers.md","tags":[],"version":"current","frontMatter":{"title":"Marker Mechanism","toc":true},"sidebar":"docs","previous":{"title":"Auto Rollbacks","permalink":"/cn/docs/next/rollbacks"},"next":{"title":"File Sizing","permalink":"/cn/docs/next/file_sizing"}}');var a=t(74848),n=t(28453);const s={title:"Marker Mechanism",toc:!0},o=void 0,l={},c=[{value:"Purpose of Markers",id:"purpose-of-markers",level:2},{value:"Marker structure",id:"marker-structure",level:2},{value:"Marker Writing Options",id:"marker-writing-options",level:2},{value:"Direct Write Markers",id:"direct-write-markers",level:3},{value:"Timeline Server Markers (Default)",id:"timeline-server-markers-default",level:3},{value:"Marker Configuration Parameters",id:"marker-configuration-parameters",level:2},{value:"Related Resources",id:"related-resources",level:2}];function d(e){const r={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(r.h2,{id:"purpose-of-markers",children:"Purpose of Markers"}),"\n",(0,a.jsx)(r.p,{children:"A write operation can fail before it completes, leaving partial or corrupt data files on storage. Markers are used to track\nand cleanup any partial or failed write operations. As a write operation begins, a marker is created indicating\nthat a file write is in progress. When the write commit succeeds, the marker is deleted. If a write operation fails part\nway through, a marker is left behind which indicates that the file is incomplete. Two important operations that use markers include:"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"Removing duplicate/partial data files"}),":","\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsx)(r.li,{children:"In Spark, the Hudi write client delegates the data file writing to multiple executors. One executor can fail the task,\nleaving partial data files written, and Spark retries the task in this case until it succeeds."}),"\n",(0,a.jsx)(r.li,{children:"When speculative execution is enabled, there can also be multiple successful attempts at writing out the same data\ninto different files, only one of which is finally handed to the Spark driver process for committing.\nThe markers help efficiently identify the partial data files written, which contain duplicate data compared to the data\nfiles written by the successful trial later, and these duplicate data files are cleaned up when the commit is finalized."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"Rolling back failed commits"}),": If a write operation fails, the next write client will roll back the failed commit before proceeding with the new write. The rollback is done with the help of markers to identify the data files written as part of the failed commit."]}),"\n"]}),"\n",(0,a.jsx)(r.p,{children:"If we did not have markers to track the per-commit data files, we would have to list all files in the file system,\ncorrelate that with the files seen in timeline and then delete the ones that belong to partial write failures.\nAs you could imagine, this would be very costly in a very large installation of a datalake."}),"\n",(0,a.jsx)(r.h2,{id:"marker-structure",children:"Marker structure"}),"\n",(0,a.jsxs)(r.p,{children:["Each marker entry is composed of three parts, the data file name,\nthe marker extension (",(0,a.jsx)(r.code,{children:".marker"}),"), and the I/O operation created the file (",(0,a.jsx)(r.code,{children:"CREATE"})," - inserts, ",(0,a.jsx)(r.code,{children:"MERGE"})," - updates/deletes,\nor ",(0,a.jsx)(r.code,{children:"APPEND"})," - either). For example, the marker ",(0,a.jsx)(r.code,{children:"91245ce3-bb82-4f9f-969e-343364159174-0_140-579-0_20210820173605.parquet.marker.CREATE"})," indicates\nthat the corresponding data file is ",(0,a.jsx)(r.code,{children:"91245ce3-bb82-4f9f-969e-343364159174-0_140-579-0_20210820173605.parquet"})," and the I/O type is ",(0,a.jsx)(r.code,{children:"CREATE"}),"."]}),"\n",(0,a.jsx)(r.h2,{id:"marker-writing-options",children:"Marker Writing Options"}),"\n",(0,a.jsx)(r.p,{children:"There are two ways to write Markers:"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsx)(r.li,{children:"Directly writing markers to storage, which is a legacy configuration."}),"\n",(0,a.jsx)(r.li,{children:"Writing markers to the Timeline Server which batches marker requests before writing them to storage (Default). This option improves write performance of large files as described below."}),"\n"]}),"\n",(0,a.jsx)(r.h3,{id:"direct-write-markers",children:"Direct Write Markers"}),"\n",(0,a.jsxs)(r.p,{children:["Directly writing to storage creates a new marker file corresponding to each data file, with the marker filename as described above.\nThe marker file does not have any content, i.e., empty. Each marker file is written to storage in the same directory\nhierarchy, i.e., commit instant and partition path, under a temporary folder ",(0,a.jsx)(r.code,{children:".hoodie/.temp"})," under the base path of the Hudi table.\nFor example, the figure below shows one example of the marker files created and the corresponding data files when writing\ndata to the Hudi table. When getting or deleting all the marker file paths, the mechanism first lists all the paths\nunder the temporary folder, ",(0,a.jsx)(r.code,{children:".hoodie/.temp/"}),", and then does the operation."]}),"\n",(0,a.jsx)(r.p,{children:(0,a.jsx)(r.img,{alt:"An example of marker and data files in direct marker file mechanism",src:t(36995).A+"",width:"3440",height:"1444"})}),"\n",(0,a.jsxs)(r.p,{children:["While it's much efficient over scanning the entire table for uncommitted data files, as the number of data files to write\nincreases, so does the number of marker files to create. For large writes which need to write significant number of data\nfiles, e.g., 10K or more, this can create performance bottlenecks for cloud storage such as AWS S3. In AWS S3, each\nfile create and delete call triggers an HTTP request and there is ",(0,a.jsx)(r.a,{href:"https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html",children:"rate-limiting"}),"\non how many requests can be processed per second per prefix in a bucket. When the number of data files to write concurrently\nand the number of marker files is huge, the marker file operations could take up non-trivial time during the write operation,\nsometimes on the order of a few minutes or more."]}),"\n",(0,a.jsx)(r.h3,{id:"timeline-server-markers-default",children:"Timeline Server Markers (Default)"}),"\n",(0,a.jsx)(r.p,{children:"To address the performance bottleneck due to rate-limiting of AWS S3 explained above, we introduce a new marker mechanism\nleveraging the timeline server, which optimizes the marker-related latency for storage with non-trivial file I/O latency.\nIn the diagram below you can see the timeline-server-based marker mechanism delegates the marker creation and other marker-related\noperations from individual executors to the timeline server for centralized processing. The timeline server batches the\nmarker creation requests and writes the markers to a bounded set of files in the file system at configurable batch intervals (default 50ms).\nIn this way, the number of actual file operations and latency related to markers can be significantly reduced even with\na huge number of data files, leading to improved performance of large writes."}),"\n",(0,a.jsx)(r.p,{children:(0,a.jsx)(r.img,{alt:"Timeline-server-based marker mechanism",src:t(56542).A+"",width:"1200",height:"432"})}),"\n",(0,a.jsx)(r.p,{children:"Each marker creation request is handled asynchronously in the Javalin timeline server and queued before processing.\nFor every batch interval, the timeline server pulls the pending marker creation requests from the queue and\nwrites all markers to the next file in a round robin fashion. Inside the timeline server, such batch processing is\nmulti-threaded, designed and implemented to guarantee consistency and correctness. Both the batch interval and the batch\nconcurrency can be configured through the write options."}),"\n",(0,a.jsx)(r.p,{children:(0,a.jsx)(r.img,{alt:"Batched processing of marker creation requests",src:t(78660).A+"",width:"3184",height:"1168"})}),"\n",(0,a.jsx)(r.p,{children:"Note that the worker thread always checks whether the marker has already been created by comparing the marker name from\nthe request with the memory copy of all markers maintained at the timeline server. The underlying files storing the\nmarkers are only read upon the first marker request (lazy loading). The responses of requests are only sent back once the\nnew markers are flushed to the files, so that in the case of the timeline server failure, the timeline server can recover\nthe already created markers. These ensure consistency between storage and the in-memory copy, and improve the performance\nof processing marker requests."}),"\n",(0,a.jsxs)(r.p,{children:[(0,a.jsx)(r.strong,{children:"NOTE:"})," Timeline based markers are not yet supported for HDFS, however, users may barely notice performance challenges\nwith direct markers because the file system metadata is efficiently cached in memory and doesn't face the same rate-limiting as S3."]}),"\n",(0,a.jsx)(r.h2,{id:"marker-configuration-parameters",children:"Marker Configuration Parameters"}),"\n",(0,a.jsxs)(r.table,{children:[(0,a.jsx)(r.thead,{children:(0,a.jsxs)(r.tr,{children:[(0,a.jsx)(r.th,{children:"Property Name"}),(0,a.jsx)(r.th,{children:"Default"}),(0,a.jsx)(r.th,{style:{textAlign:"center"},children:"Meaning"})]})}),(0,a.jsxs)(r.tbody,{children:[(0,a.jsxs)(r.tr,{children:[(0,a.jsx)(r.td,{children:(0,a.jsx)(r.code,{children:"hoodie.write.markers.type"})}),(0,a.jsx)(r.td,{children:"timeline_server_based"}),(0,a.jsxs)(r.td,{style:{textAlign:"center"},children:["Marker type to use. Two modes are supported: (1) ",(0,a.jsx)(r.code,{children:"direct"}),": individual marker file corresponding to each data file is directly created by the executor; (2) ",(0,a.jsx)(r.code,{children:"timeline_server_based"}),": marker operations are all handled at the timeline service which serves as a proxy. New marker entries are batch processed and stored in a limited number of underlying files for efficiency."]})]}),(0,a.jsxs)(r.tr,{children:[(0,a.jsx)(r.td,{children:(0,a.jsx)(r.code,{children:"hoodie.markers.timeline_server_based.batch.num_threads"})}),(0,a.jsx)(r.td,{children:"20"}),(0,a.jsx)(r.td,{style:{textAlign:"center"},children:"Number of threads to use for batch processing marker creation requests at the timeline server."})]}),(0,a.jsxs)(r.tr,{children:[(0,a.jsx)(r.td,{children:(0,a.jsx)(r.code,{children:"hoodie.markers.timeline_server_based.batch.interval_ms"})}),(0,a.jsx)(r.td,{children:"50"}),(0,a.jsx)(r.td,{style:{textAlign:"center"},children:"The batch interval in milliseconds for marker creation batch processing."})]})]})]}),"\n",(0,a.jsx)(r.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,a.jsxs)(r.p,{children:[(0,a.jsx)("h3",{children:"Blogs"}),"\n",(0,a.jsx)(r.a,{href:"https://medium.com/@simpsons/timeline-server-in-apache-hudi-b5be25f85e47",children:"Timeline Server in Apache Hudi"})]})]})}function h(e={}){const{wrapper:r}={...(0,n.R)(),...e.components};return r?(0,a.jsx)(r,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},78660:(e,r,t)=>{t.d(r,{A:()=>i});const i=t.p+"assets/images/batched-marker-creation-e8455c544f3b11ceed810b663df59f7f.png"},36995:(e,r,t)=>{t.d(r,{A:()=>i});const i=t.p+"assets/images/direct-marker-file-mechanism-b97b82f80430598f1d6a9b96521bb1a0.png"},56542:(e,r,t)=>{t.d(r,{A:()=>i});const i=t.p+"assets/images/timeline-server-based-marker-mechanism-11d616800a7a241382c8a4ed647515a6.png"},28453:(e,r,t)=>{t.d(r,{R:()=>s,x:()=>o});var i=t(96540);const a={},n=i.createContext(a);function s(e){const r=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),i.createElement(n.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/content/cn/assets/js/5e1c183f.e764ea7f.js b/content/cn/assets/js/5e1c183f.e764ea7f.js deleted file mode 100644 index 204310b43968c..0000000000000 --- a/content/cn/assets/js/5e1c183f.e764ea7f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[70253],{34886:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"markers","title":"Marker Mechanism","description":"Purpose of Markers","source":"@site/docs/markers.md","sourceDirName":".","slug":"/markers","permalink":"/cn/docs/next/markers","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/markers.md","tags":[],"version":"current","frontMatter":{"title":"Marker Mechanism","toc":true},"sidebar":"docs","previous":{"title":"Auto Rollbacks","permalink":"/cn/docs/next/rollbacks"},"next":{"title":"File Sizing","permalink":"/cn/docs/next/file_sizing"}}');var a=t(74848),n=t(28453);const s={title:"Marker Mechanism",toc:!0},o=void 0,l={},c=[{value:"Purpose of Markers",id:"purpose-of-markers",level:2},{value:"Marker structure",id:"marker-structure",level:2},{value:"Marker Writing Options",id:"marker-writing-options",level:2},{value:"Direct Write Markers",id:"direct-write-markers",level:3},{value:"Timeline Server Markers (Default)",id:"timeline-server-markers-default",level:3},{value:"Marker Configuration Parameters",id:"marker-configuration-parameters",level:2}];function d(e){const r={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(r.h2,{id:"purpose-of-markers",children:"Purpose of Markers"}),"\n",(0,a.jsx)(r.p,{children:"A write operation can fail before it completes, leaving partial or corrupt data files on storage. Markers are used to track\nand cleanup any partial or failed write operations. As a write operation begins, a marker is created indicating\nthat a file write is in progress. When the write commit succeeds, the marker is deleted. If a write operation fails part\nway through, a marker is left behind which indicates that the file is incomplete. Two important operations that use markers include:"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"Removing duplicate/partial data files"}),":","\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsx)(r.li,{children:"In Spark, the Hudi write client delegates the data file writing to multiple executors. One executor can fail the task,\nleaving partial data files written, and Spark retries the task in this case until it succeeds."}),"\n",(0,a.jsx)(r.li,{children:"When speculative execution is enabled, there can also be multiple successful attempts at writing out the same data\ninto different files, only one of which is finally handed to the Spark driver process for committing.\nThe markers help efficiently identify the partial data files written, which contain duplicate data compared to the data\nfiles written by the successful trial later, and these duplicate data files are cleaned up when the commit is finalized."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"Rolling back failed commits"}),": If a write operation fails, the next write client will roll back the failed commit before proceeding with the new write. The rollback is done with the help of markers to identify the data files written as part of the failed commit."]}),"\n"]}),"\n",(0,a.jsx)(r.p,{children:"If we did not have markers to track the per-commit data files, we would have to list all files in the file system,\ncorrelate that with the files seen in timeline and then delete the ones that belong to partial write failures.\nAs you could imagine, this would be very costly in a very large installation of a datalake."}),"\n",(0,a.jsx)(r.h2,{id:"marker-structure",children:"Marker structure"}),"\n",(0,a.jsxs)(r.p,{children:["Each marker entry is composed of three parts, the data file name,\nthe marker extension (",(0,a.jsx)(r.code,{children:".marker"}),"), and the I/O operation created the file (",(0,a.jsx)(r.code,{children:"CREATE"})," - inserts, ",(0,a.jsx)(r.code,{children:"MERGE"})," - updates/deletes,\nor ",(0,a.jsx)(r.code,{children:"APPEND"})," - either). For example, the marker ",(0,a.jsx)(r.code,{children:"91245ce3-bb82-4f9f-969e-343364159174-0_140-579-0_20210820173605.parquet.marker.CREATE"})," indicates\nthat the corresponding data file is ",(0,a.jsx)(r.code,{children:"91245ce3-bb82-4f9f-969e-343364159174-0_140-579-0_20210820173605.parquet"})," and the I/O type is ",(0,a.jsx)(r.code,{children:"CREATE"}),"."]}),"\n",(0,a.jsx)(r.h2,{id:"marker-writing-options",children:"Marker Writing Options"}),"\n",(0,a.jsx)(r.p,{children:"There are two ways to write Markers:"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsx)(r.li,{children:"Directly writing markers to storage, which is a legacy configuration."}),"\n",(0,a.jsx)(r.li,{children:"Writing markers to the Timeline Server which batches marker requests before writing them to storage (Default). This option improves write performance of large files as described below."}),"\n"]}),"\n",(0,a.jsx)(r.h3,{id:"direct-write-markers",children:"Direct Write Markers"}),"\n",(0,a.jsxs)(r.p,{children:["Directly writing to storage creates a new marker file corresponding to each data file, with the marker filename as described above.\nThe marker file does not have any content, i.e., empty. Each marker file is written to storage in the same directory\nhierarchy, i.e., commit instant and partition path, under a temporary folder ",(0,a.jsx)(r.code,{children:".hoodie/.temp"})," under the base path of the Hudi table.\nFor example, the figure below shows one example of the marker files created and the corresponding data files when writing\ndata to the Hudi table. When getting or deleting all the marker file paths, the mechanism first lists all the paths\nunder the temporary folder, ",(0,a.jsx)(r.code,{children:".hoodie/.temp/"}),", and then does the operation."]}),"\n",(0,a.jsx)(r.p,{children:(0,a.jsx)(r.img,{alt:"An example of marker and data files in direct marker file mechanism",src:t(36995).A+"",width:"3440",height:"1444"})}),"\n",(0,a.jsxs)(r.p,{children:["While it's much efficient over scanning the entire table for uncommitted data files, as the number of data files to write\nincreases, so does the number of marker files to create. For large writes which need to write significant number of data\nfiles, e.g., 10K or more, this can create performance bottlenecks for cloud storage such as AWS S3. In AWS S3, each\nfile create and delete call triggers an HTTP request and there is ",(0,a.jsx)(r.a,{href:"https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html",children:"rate-limiting"}),"\non how many requests can be processed per second per prefix in a bucket. When the number of data files to write concurrently\nand the number of marker files is huge, the marker file operations could take up non-trivial time during the write operation,\nsometimes on the order of a few minutes or more."]}),"\n",(0,a.jsx)(r.h3,{id:"timeline-server-markers-default",children:"Timeline Server Markers (Default)"}),"\n",(0,a.jsx)(r.p,{children:"To address the performance bottleneck due to rate-limiting of AWS S3 explained above, we introduce a new marker mechanism\nleveraging the timeline server, which optimizes the marker-related latency for storage with non-trivial file I/O latency.\nIn the diagram below you can see the timeline-server-based marker mechanism delegates the marker creation and other marker-related\noperations from individual executors to the timeline server for centralized processing. The timeline server batches the\nmarker creation requests and writes the markers to a bounded set of files in the file system at configurable batch intervals (default 50ms).\nIn this way, the number of actual file operations and latency related to markers can be significantly reduced even with\na huge number of data files, leading to improved performance of large writes."}),"\n",(0,a.jsx)(r.p,{children:(0,a.jsx)(r.img,{alt:"Timeline-server-based marker mechanism",src:t(56542).A+"",width:"1200",height:"432"})}),"\n",(0,a.jsx)(r.p,{children:"Each marker creation request is handled asynchronously in the Javalin timeline server and queued before processing.\nFor every batch interval, the timeline server pulls the pending marker creation requests from the queue and\nwrites all markers to the next file in a round robin fashion. Inside the timeline server, such batch processing is\nmulti-threaded, designed and implemented to guarantee consistency and correctness. Both the batch interval and the batch\nconcurrency can be configured through the write options."}),"\n",(0,a.jsx)(r.p,{children:(0,a.jsx)(r.img,{alt:"Batched processing of marker creation requests",src:t(78660).A+"",width:"3184",height:"1168"})}),"\n",(0,a.jsx)(r.p,{children:"Note that the worker thread always checks whether the marker has already been created by comparing the marker name from\nthe request with the memory copy of all markers maintained at the timeline server. The underlying files storing the\nmarkers are only read upon the first marker request (lazy loading). The responses of requests are only sent back once the\nnew markers are flushed to the files, so that in the case of the timeline server failure, the timeline server can recover\nthe already created markers. These ensure consistency between storage and the in-memory copy, and improve the performance\nof processing marker requests."}),"\n",(0,a.jsxs)(r.p,{children:[(0,a.jsx)(r.strong,{children:"NOTE:"})," Timeline based markers are not yet supported for HDFS, however, users may barely notice performance challenges\nwith direct markers because the file system metadata is efficiently cached in memory and doesn't face the same rate-limiting as S3."]}),"\n",(0,a.jsx)(r.h2,{id:"marker-configuration-parameters",children:"Marker Configuration Parameters"}),"\n",(0,a.jsxs)(r.table,{children:[(0,a.jsx)(r.thead,{children:(0,a.jsxs)(r.tr,{children:[(0,a.jsx)(r.th,{children:"Property Name"}),(0,a.jsx)(r.th,{children:"Default"}),(0,a.jsx)(r.th,{style:{textAlign:"center"},children:"Meaning"})]})}),(0,a.jsxs)(r.tbody,{children:[(0,a.jsxs)(r.tr,{children:[(0,a.jsx)(r.td,{children:(0,a.jsx)(r.code,{children:"hoodie.write.markers.type"})}),(0,a.jsx)(r.td,{children:"timeline_server_based"}),(0,a.jsxs)(r.td,{style:{textAlign:"center"},children:["Marker type to use. Two modes are supported: (1) ",(0,a.jsx)(r.code,{children:"direct"}),": individual marker file corresponding to each data file is directly created by the executor; (2) ",(0,a.jsx)(r.code,{children:"timeline_server_based"}),": marker operations are all handled at the timeline service which serves as a proxy. New marker entries are batch processed and stored in a limited number of underlying files for efficiency."]})]}),(0,a.jsxs)(r.tr,{children:[(0,a.jsx)(r.td,{children:(0,a.jsx)(r.code,{children:"hoodie.markers.timeline_server_based.batch.num_threads"})}),(0,a.jsx)(r.td,{children:"20"}),(0,a.jsx)(r.td,{style:{textAlign:"center"},children:"Number of threads to use for batch processing marker creation requests at the timeline server."})]}),(0,a.jsxs)(r.tr,{children:[(0,a.jsx)(r.td,{children:(0,a.jsx)(r.code,{children:"hoodie.markers.timeline_server_based.batch.interval_ms"})}),(0,a.jsx)(r.td,{children:"50"}),(0,a.jsx)(r.td,{style:{textAlign:"center"},children:"The batch interval in milliseconds for marker creation batch processing."})]})]})]})]})}function h(e={}){const{wrapper:r}={...(0,n.R)(),...e.components};return r?(0,a.jsx)(r,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},78660:(e,r,t)=>{t.d(r,{A:()=>i});const i=t.p+"assets/images/batched-marker-creation-e8455c544f3b11ceed810b663df59f7f.png"},36995:(e,r,t)=>{t.d(r,{A:()=>i});const i=t.p+"assets/images/direct-marker-file-mechanism-b97b82f80430598f1d6a9b96521bb1a0.png"},56542:(e,r,t)=>{t.d(r,{A:()=>i});const i=t.p+"assets/images/timeline-server-based-marker-mechanism-11d616800a7a241382c8a4ed647515a6.png"},28453:(e,r,t)=>{t.d(r,{R:()=>s,x:()=>o});var i=t(96540);const a={},n=i.createContext(a);function s(e){const r=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),i.createElement(n.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/content/cn/assets/js/782eae4d.f1b675bb.js b/content/cn/assets/js/782eae4d.204a4d9a.js similarity index 95% rename from content/cn/assets/js/782eae4d.f1b675bb.js rename to content/cn/assets/js/782eae4d.204a4d9a.js index 4ff9ac385934f..76d43ba3a68f5 100644 --- a/content/cn/assets/js/782eae4d.f1b675bb.js +++ b/content/cn/assets/js/782eae4d.204a4d9a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[34543],{97568:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>o});const n=JSON.parse('{"id":"metadata","title":"Table Metadata","description":"Hudi tracks metadata about a table to remove bottlenecks in achieving great read/write performance, specifically on cloud storage.","source":"@site/docs/metadata.md","sourceDirName":".","slug":"/metadata","permalink":"/cn/docs/next/metadata","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/metadata.md","tags":[],"version":"current","frontMatter":{"title":"Table Metadata","keywords":["hudi","metadata","S3","GCS","file listings","statistics"]},"sidebar":"docs","previous":{"title":"Record Mergers","permalink":"/cn/docs/next/record_merger"},"next":{"title":"Indexes","permalink":"/cn/docs/next/indexes"}}');var i=a(74848),s=a(28453);const r={title:"Table Metadata",keywords:["hudi","metadata","S3","GCS","file listings","statistics"]},l=void 0,d={},o=[{value:"Metadata Table",id:"metadata-table",level:2},{value:"Types of table metadata",id:"types-of-table-metadata",level:2},{value:"Metadata Tracking on Writers",id:"metadata-tracking-on-writers",level:2},{value:"Leveraging metadata during queries",id:"leveraging-metadata-during-queries",level:2},{value:"files index",id:"files-index",level:3},{value:"column_stats index and data skipping",id:"column_stats-index-and-data-skipping",level:3},{value:"Concurrency Control for Metadata Table",id:"concurrency-control-for-metadata-table",level:2},{value:"Related Resources",id:"related-resources",level:2}];function c(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"Hudi tracks metadata about a table to remove bottlenecks in achieving great read/write performance, specifically on cloud storage."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Avoid list operations to obtain set of files in a table"}),": A fundamental need for any engine that wants to read or write Hudi tables is\nto know all the files/objects that are part of the table, by performing listing of table partitions/folders. Unlike many distributed file systems,\nsuch operation scales poorly on cloud storage taking few seconds or even many minutes on large tables. This is particularly amplified when tables\nare large and partitioned multiple levels deep. Hudi tracks the file listings so they are readily available for readers/writers without listing the folders\ncontaining the data files."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Expose columns statistics for better query planning and faster queries"}),": Query engines rely on techniques such as partitioning and data skipping\nto cut down on the amount of irrelevant data scanned for query planning and execution. During query planning phase, file footer statistics like column value ranges,\nnull counts are read from all data files to determine if a particular file needs to be read to satisfy the query. This approach is expensive since reading\nfooters from all files can increase cloud storage API costs and even be subject to throttling issues for larger tables. Hudi enables relevant query predicates to\nbe efficiently evaluated on operate on column statistics without incurring these costs."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"metadata-table",children:"Metadata Table"}),"\n",(0,i.jsxs)(t.p,{children:["Hudi employs a special ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.em,{children:"metadata table"})}),", within each table to provide these capabilities. The metadata table implemented as a single\ninternal Hudi Merge-On-Read table that hosts different types of table metadata in each partition. This is similar to common practices in databases where metadata\nis tracked using internal tables. This approach provides the following advantages."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Scalable"}),": The table metadata must scale to large sizes as well (see ",(0,i.jsx)(t.a,{href:"https://vldb.org/pvldb/vol14/p3083-edara.pdf",children:"Big Metadata paper"})," from Google).\nDifferent types of indexes should be easily integrated to support various use cases with consistent management of metadata. By implementing metadata using the\nsame storage format and engine used for data, Hudi is able to scale to even TBs of metadata with built-in table services for managing metadata."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Flexible"}),": The foundational framework for multi-modal indexing is built to enable and disable new indexes as needed. The\n",(0,i.jsx)(t.a,{href:"https://www.onehouse.ai/blog/asynchronous-indexing-using-hudi",children:"async indexing"})," protocol index building alongside regular writers without impacting the write latency."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"transactional updates"}),": Tables data, metadata and indexes must be upto-date and consistent with each other as writes happen or table services are performed. and table metadata must be always up-to-date and in sync with the data table.\nThe data and metadata table's timelines share a parent-child relationship, to ensure they are always in sync with each other. Furthermore, the MoR table storage helps absorb fast changes to metadata from streaming writes without requiring\nrewriting of all table metadata on each write."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Fast lookups"}),": By employing a SSTable like base file format (HFile) in the metadata table, query engines are able to efficiently perform lookup scans for only specific parts of\nmetadata needed. For e.g. query accessing only 10 out of 100 columns in a table can read stats about only the 10 columns it's interested in, during down planning time and costs.\nFurther, these metadata can also be served via a centralized/embedded timeline server which caches the metadata, further reducing the latency of the lookup from executors."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.img,{alt:"Metadata Table Mechanics",src:a(73633).A+"",width:"1280",height:"720"}),"\n",(0,i.jsx)("p",{align:"center",children:"Figure: Mechanics for Metadata Table in Hudi"})]}),"\n",(0,i.jsx)(t.h2,{id:"types-of-table-metadata",children:"Types of table metadata"}),"\n",(0,i.jsx)(t.p,{children:"Following are the different types of metadata currently supported."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.a,{href:"https://cwiki.apache.org/confluence/display/HUDI/RFC+-+15%3A+HUDI+File+Listing+Improvements",children:"files listings"})})}),":\nStored as ",(0,i.jsx)(t.em,{children:"files"})," partition in the metadata table. Contains file information such as file name, size, and active state\nfor each partition in the data table, along with list of all partitions in the table. Improves the files listing performance\nby avoiding direct storage calls such as ",(0,i.jsx)(t.em,{children:"exists, listStatus"})," and ",(0,i.jsx)(t.em,{children:"listFiles"})," on the data table."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/rfc/rfc-27/rfc-27.md",children:"column statistics"})})}),": Stored as ",(0,i.jsx)(t.em,{children:"column_stats"}),"\npartition in the metadata table. Contains the statistics for a set of tracked columns, such as min and max values, total values,\nnull counts, size, etc., for all data files and are used while serving queries with predicates matching interested\ncolumns. This is heavily used by techniques like ",(0,i.jsx)(t.a,{href:"https://www.onehouse.ai/blog/hudis-column-stats-index-and-data-skipping-feature-help-speed-up-queries-by-an-orders-of-magnitude",children:"data skipping"})," to speed up queries by orders of magnitude, by skipping\nirrelevant files."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:"Partition Statistics"})}),": Partition stats index aggregates statistics at the partition level for the columns tracked by\nthe column statistics for which it is enabled. This helps in efficient partition pruning by skipping entire folders very quickly,\neven without examining column statistics at the file level. The partition stats index is stored in ",(0,i.jsx)(t.em,{children:"partition_stats"})," partition in the metadata table.\nPartition stats index can be enabled using the following configs (note it is required to specify the columns for which stats should be aggregated)."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["To try out these features, refer to the ",(0,i.jsx)(t.a,{href:"sql_ddl#create-partition-stats-index",children:"SQL guide"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"metadata-tracking-on-writers",children:"Metadata Tracking on Writers"}),"\n",(0,i.jsxs)(t.p,{children:["Following are based basic configs that are needed to enable metadata tracking. For advanced configs please refer\n",(0,i.jsx)(t.a,{href:"configurations#Metadata-Configs",children:"here"}),"."]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Config Name"}),(0,i.jsx)(t.th,{children:"Default"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"hoodie.metadata.enable"}),(0,i.jsx)(t.td,{children:"true (Optional) Enabled on the write side"}),(0,i.jsxs)(t.td,{children:["Enable the internal metadata table serving file listings. For 0.10.1 and prior releases, metadata table is disabled by default and needs to be explicitly enabled.",(0,i.jsx)("br",{}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Config Param: ENABLE"}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Since Version: 0.7.0"})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"hoodie.metadata.index.column.stats.enable"}),(0,i.jsx)(t.td,{children:"false (Optional)"}),(0,i.jsxs)(t.td,{children:["Enable column statistics tracking of files under metadata table. When enabled, metadata table will have a partition to store the column ranges and will be used for pruning files during data skipping.",(0,i.jsx)("br",{}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Config Param: ENABLE_METADATA_INDEX_COLUMN_STATS"}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Since Version: 0.11.0"})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"hoodie.metadata.index.column.stats.columns"}),(0,i.jsx)(t.td,{children:"all columns in the table"}),(0,i.jsx)(t.td,{children:"Comma separated list of columns to track column statistics on."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"hoodie.metadata.index.partition.stats.enable"}),(0,i.jsx)(t.td,{children:"false (Optional)"}),(0,i.jsx)(t.td,{children:"Enable the partition stats tracking, on the same columns tracked by column stats metadata."})]})]})]}),"\n",(0,i.jsxs)(t.p,{children:["For Flink, following are the basic configs of interest to enable metadata tracking. Please refer\n",(0,i.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations#Flink-Options",children:"here"})," for advanced configs"]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Config Name"}),(0,i.jsx)(t.th,{children:"Default"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsx)(t.tbody,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"metadata.enabled"}),(0,i.jsx)(t.td,{children:"true (Optional)"}),(0,i.jsxs)(t.td,{children:["Enable the internal metadata table which serves table metadata like level file listings, default enabled",(0,i.jsx)("br",{}),(0,i.jsx)("br",{})," ",(0,i.jsx)(t.code,{children:"Config Param: METADATA_ENABLED"})]})]})})]}),"\n",(0,i.jsx)(t.admonition,{type:"note",children:(0,i.jsx)(t.p,{children:"If you turn off the metadata table after enabling, be sure to wait for a few commits so that the metadata table is fully\ncleaned up, before re-enabling the metadata table again."})}),"\n",(0,i.jsx)(t.h2,{id:"leveraging-metadata-during-queries",children:"Leveraging metadata during queries"}),"\n",(0,i.jsx)(t.h3,{id:"files-index",children:"files index"}),"\n",(0,i.jsxs)(t.p,{children:["Metadata based listing using ",(0,i.jsx)(t.em,{children:"files_index"})," can be leveraged on the read side by setting appropriate configs/session properties\nfrom different engines as shown below:"]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Readers"}),(0,i.jsx)(t.th,{children:"Config"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Spark DataSource, Spark SQL, Strucured Streaming"}),(0,i.jsx)(t.td,{children:"hoodie.metadata.enable"}),(0,i.jsxs)(t.td,{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," enables use of the spark file index implementation for Hudi, that speeds up listing of large tables.",(0,i.jsx)("br",{})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Flink DataStream, Flink SQL"}),(0,i.jsx)(t.td,{children:"metadata.enabled"}),(0,i.jsxs)(t.td,{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," from DDL uses the internal metadata table to serves table metadata like level file listings"]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Presto"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"https://prestodb.io/docs/current/connector/hudi.html",children:"hudi.metadata-table-enabled"})}),(0,i.jsxs)(t.td,{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," fetches the list of file names and sizes from Hudi\u2019s metadata table rather than storage."]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Trino"}),(0,i.jsx)(t.td,{children:"N/A"}),(0,i.jsxs)(t.td,{children:["Support for reading from the metadata table ",(0,i.jsx)(t.a,{href:"https://issues.apache.org/jira/browse/HUDI-7020",children:"has been dropped in Trino 419"}),"."]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Athena"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"https://docs.aws.amazon.com/athena/latest/ug/querying-hudi.html",children:"hudi.metadata-listing-enabled"})}),(0,i.jsxs)(t.td,{children:["When this table property is set to ",(0,i.jsx)(t.code,{children:"TRUE"})," enables the Hudi metadata table and the related file listing functionality"]})]})]})]}),"\n",(0,i.jsx)(t.h3,{id:"column_stats-index-and-data-skipping",children:"column_stats index and data skipping"}),"\n",(0,i.jsx)(t.p,{children:"Enabling metadata table and column stats index is a prerequisite to enabling data skipping capabilities. Following are the\ncorresponding configs across Spark and Flink readers."}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Readers"}),(0,i.jsx)(t.th,{children:"Config"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Spark DataSource, Spark SQL, Strucured Streaming"}),(0,i.jsx)(t.td,{children:(0,i.jsxs)("ul",{children:[(0,i.jsx)("li",{children:(0,i.jsx)(t.code,{children:"hoodie.metadata.enable"})}),(0,i.jsx)("li",{children:(0,i.jsx)(t.code,{children:"hoodie.enable.data.skipping"})})]})}),(0,i.jsx)(t.td,{children:(0,i.jsxs)("ul",{children:[(0,i.jsxs)("li",{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," enables use of the spark file index implementation for Hudi, that speeds up listing of large tables."]}),(0,i.jsxs)("li",{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," enables data-skipping allowing queries to leverage indexes to reduce the search space by skipping over files ",(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Config Param: ENABLE_DATA_SKIPPING"}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Since Version: 0.10.0"})," ",(0,i.jsx)("br",{})]})]})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Flink DataStream, Flink SQL"}),(0,i.jsx)(t.td,{children:(0,i.jsxs)("ul",{children:[(0,i.jsx)("li",{children:(0,i.jsx)(t.code,{children:"metadata.enabled"})}),(0,i.jsx)("li",{children:(0,i.jsx)(t.code,{children:"read.data.skipping.enabled"})})]})}),(0,i.jsx)(t.td,{children:(0,i.jsxs)("ul",{children:[(0,i.jsxs)("li",{children:[" When set to ",(0,i.jsx)(t.code,{children:"true"})," from DDL uses the internal metadata table to serves table metadata like level file listings"]}),(0,i.jsxs)("li",{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," enables data-skipping allowing queries to leverage indexes to reduce the search space byskipping over files"]})]})})]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"concurrency-control-for-metadata-table",children:"Concurrency Control for Metadata Table"}),"\n",(0,i.jsxs)(t.p,{children:["To ensure that metadata table stays up to date and table metadata is tracked safely across concurrent write and\ntable operations, there are some additional considerations. If async table services are enabled for the table (i.e. running a separate compaction (",(0,i.jsx)(t.code,{children:"HoodieCompactor"}),") or\nclustering (",(0,i.jsx)(t.code,{children:"HoodieClusteringJob"}),") job), even with just a single writer, lock providers\nmust be configured. Please refer to ",(0,i.jsx)(t.a,{href:"concurrency_control",children:"concurrency control"})," for more details."]}),"\n",(0,i.jsxs)(t.p,{children:["Before enabling metadata table for the first time, all writers on the same table must and table services must be stopped.\nIf your current deployment model is ",(0,i.jsx)(t.a,{href:"concurrency_control#full-on-multi-writer--async-table-services",children:"multi-writer"})," along with a lock\nprovider and other required configs set for every writer as follows, there is no additional configuration required. You\ncan bring up the writers sequentially after stopping the writers for enabling metadata table. Applying the proper\nconfigurations to only a subset of writers or table services is unsafe and can lead to loss of data. So, please ensure you enable\nmetadata table across all writers."]}),"\n",(0,i.jsx)(t.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,i.jsx)("h3",{children:"Blogs"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://medium.com/@simpsons/table-service-deployment-models-in-apache-hudi-9cfa5a44addf",children:"Table service deployment models in Apache Hudi"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://www.onehouse.ai/blog/introducing-multi-modal-index-for-the-lakehouse-in-apache-hudi",children:"Multi Modal Indexing for the Data Lakehouse"})}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},73633:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/metadata_table_anim-4d6225cef4c2e0937805288146eaf6ad.gif"},28453:(e,t,a)=>{a.d(t,{R:()=>r,x:()=>l});var n=a(96540);const i={},s=n.createContext(i);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[34543],{97568:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>o});const n=JSON.parse('{"id":"metadata","title":"Table Metadata","description":"Hudi tracks metadata about a table to remove bottlenecks in achieving great read/write performance, specifically on cloud storage.","source":"@site/docs/metadata.md","sourceDirName":".","slug":"/metadata","permalink":"/cn/docs/next/metadata","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/metadata.md","tags":[],"version":"current","frontMatter":{"title":"Table Metadata","keywords":["hudi","metadata","S3","GCS","file listings","statistics"]},"sidebar":"docs","previous":{"title":"Record Mergers","permalink":"/cn/docs/next/record_merger"},"next":{"title":"Indexes","permalink":"/cn/docs/next/indexes"}}');var i=a(74848),s=a(28453);const r={title:"Table Metadata",keywords:["hudi","metadata","S3","GCS","file listings","statistics"]},l=void 0,d={},o=[{value:"Metadata Table",id:"metadata-table",level:2},{value:"Types of table metadata",id:"types-of-table-metadata",level:2},{value:"Metadata Tracking on Writers",id:"metadata-tracking-on-writers",level:2},{value:"Leveraging metadata during queries",id:"leveraging-metadata-during-queries",level:2},{value:"files index",id:"files-index",level:3},{value:"column_stats index and data skipping",id:"column_stats-index-and-data-skipping",level:3},{value:"Concurrency Control for Metadata Table",id:"concurrency-control-for-metadata-table",level:2},{value:"Related Resources",id:"related-resources",level:2}];function c(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"Hudi tracks metadata about a table to remove bottlenecks in achieving great read/write performance, specifically on cloud storage."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Avoid list operations to obtain set of files in a table"}),": A fundamental need for any engine that wants to read or write Hudi tables is\nto know all the files/objects that are part of the table, by performing listing of table partitions/folders. Unlike many distributed file systems,\nsuch operation scales poorly on cloud storage taking few seconds or even many minutes on large tables. This is particularly amplified when tables\nare large and partitioned multiple levels deep. Hudi tracks the file listings so they are readily available for readers/writers without listing the folders\ncontaining the data files."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Expose columns statistics for better query planning and faster queries"}),": Query engines rely on techniques such as partitioning and data skipping\nto cut down on the amount of irrelevant data scanned for query planning and execution. During query planning phase, file footer statistics like column value ranges,\nnull counts are read from all data files to determine if a particular file needs to be read to satisfy the query. This approach is expensive since reading\nfooters from all files can increase cloud storage API costs and even be subject to throttling issues for larger tables. Hudi enables relevant query predicates to\nbe efficiently evaluated on operate on column statistics without incurring these costs."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"metadata-table",children:"Metadata Table"}),"\n",(0,i.jsxs)(t.p,{children:["Hudi employs a special ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.em,{children:"metadata table"})}),", within each table to provide these capabilities. The metadata table implemented as a single\ninternal Hudi Merge-On-Read table that hosts different types of table metadata in each partition. This is similar to common practices in databases where metadata\nis tracked using internal tables. This approach provides the following advantages."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Scalable"}),": The table metadata must scale to large sizes as well (see ",(0,i.jsx)(t.a,{href:"https://vldb.org/pvldb/vol14/p3083-edara.pdf",children:"Big Metadata paper"})," from Google).\nDifferent types of indexes should be easily integrated to support various use cases with consistent management of metadata. By implementing metadata using the\nsame storage format and engine used for data, Hudi is able to scale to even TBs of metadata with built-in table services for managing metadata."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Flexible"}),": The foundational framework for multi-modal indexing is built to enable and disable new indexes as needed. The\n",(0,i.jsx)(t.a,{href:"https://www.onehouse.ai/blog/asynchronous-indexing-using-hudi",children:"async indexing"})," protocol index building alongside regular writers without impacting the write latency."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"transactional updates"}),": Tables data, metadata and indexes must be upto-date and consistent with each other as writes happen or table services are performed. and table metadata must be always up-to-date and in sync with the data table.\nThe data and metadata table's timelines share a parent-child relationship, to ensure they are always in sync with each other. Furthermore, the MoR table storage helps absorb fast changes to metadata from streaming writes without requiring\nrewriting of all table metadata on each write."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Fast lookups"}),": By employing a SSTable like base file format (HFile) in the metadata table, query engines are able to efficiently perform lookup scans for only specific parts of\nmetadata needed. For e.g. query accessing only 10 out of 100 columns in a table can read stats about only the 10 columns it's interested in, during down planning time and costs.\nFurther, these metadata can also be served via a centralized/embedded timeline server which caches the metadata, further reducing the latency of the lookup from executors."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.img,{alt:"Metadata Table Mechanics",src:a(73633).A+"",width:"1280",height:"720"}),"\n",(0,i.jsx)("p",{align:"center",children:"Figure: Mechanics for Metadata Table in Hudi"})]}),"\n",(0,i.jsx)(t.h2,{id:"types-of-table-metadata",children:"Types of table metadata"}),"\n",(0,i.jsx)(t.p,{children:"Following are the different types of metadata currently supported."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.a,{href:"https://cwiki.apache.org/confluence/display/HUDI/RFC+-+15%3A+HUDI+File+Listing+Improvements",children:"files listings"})})}),":\nStored as ",(0,i.jsx)(t.em,{children:"files"})," partition in the metadata table. Contains file information such as file name, size, and active state\nfor each partition in the data table, along with list of all partitions in the table. Improves the files listing performance\nby avoiding direct storage calls such as ",(0,i.jsx)(t.em,{children:"exists, listStatus"})," and ",(0,i.jsx)(t.em,{children:"listFiles"})," on the data table."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/rfc/rfc-27/rfc-27.md",children:"column statistics"})})}),": Stored as ",(0,i.jsx)(t.em,{children:"column_stats"}),"\npartition in the metadata table. Contains the statistics for a set of tracked columns, such as min and max values, total values,\nnull counts, size, etc., for all data files and are used while serving queries with predicates matching interested\ncolumns. This is heavily used by techniques like ",(0,i.jsx)(t.a,{href:"https://www.onehouse.ai/blog/hudis-column-stats-index-and-data-skipping-feature-help-speed-up-queries-by-an-orders-of-magnitude",children:"data skipping"})," to speed up queries by orders of magnitude, by skipping\nirrelevant files."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:"Partition Statistics"})}),": Partition stats index aggregates statistics at the partition level for the columns tracked by\nthe column statistics for which it is enabled. This helps in efficient partition pruning by skipping entire folders very quickly,\neven without examining column statistics at the file level. The partition stats index is stored in ",(0,i.jsx)(t.em,{children:"partition_stats"})," partition in the metadata table.\nPartition stats index can be enabled using the following configs (note it is required to specify the columns for which stats should be aggregated)."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["To try out these features, refer to the ",(0,i.jsx)(t.a,{href:"sql_ddl#create-partition-stats-index",children:"SQL guide"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"metadata-tracking-on-writers",children:"Metadata Tracking on Writers"}),"\n",(0,i.jsxs)(t.p,{children:["Following are based basic configs that are needed to enable metadata tracking. For advanced configs please refer\n",(0,i.jsx)(t.a,{href:"configurations#Metadata-Configs",children:"here"}),"."]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Config Name"}),(0,i.jsx)(t.th,{children:"Default"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"hoodie.metadata.enable"}),(0,i.jsx)(t.td,{children:"true (Optional) Enabled on the write side"}),(0,i.jsxs)(t.td,{children:["Enable the internal metadata table serving file listings. For 0.10.1 and prior releases, metadata table is disabled by default and needs to be explicitly enabled.",(0,i.jsx)("br",{}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Config Param: ENABLE"}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Since Version: 0.7.0"})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"hoodie.metadata.index.column.stats.enable"}),(0,i.jsx)(t.td,{children:"false (Optional)"}),(0,i.jsxs)(t.td,{children:["Enable column statistics tracking of files under metadata table. When enabled, metadata table will have a partition to store the column ranges and will be used for pruning files during data skipping.",(0,i.jsx)("br",{}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Config Param: ENABLE_METADATA_INDEX_COLUMN_STATS"}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Since Version: 0.11.0"})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"hoodie.metadata.index.column.stats.columns"}),(0,i.jsx)(t.td,{children:"all columns in the table"}),(0,i.jsx)(t.td,{children:"Comma separated list of columns to track column statistics on."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"hoodie.metadata.index.partition.stats.enable"}),(0,i.jsx)(t.td,{children:"false (Optional)"}),(0,i.jsx)(t.td,{children:"Enable the partition stats tracking, on the same columns tracked by column stats metadata."})]})]})]}),"\n",(0,i.jsxs)(t.p,{children:["For Flink, following are the basic configs of interest to enable metadata tracking. Please refer\n",(0,i.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations#Flink-Options",children:"here"})," for advanced configs"]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Config Name"}),(0,i.jsx)(t.th,{children:"Default"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsx)(t.tbody,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"metadata.enabled"}),(0,i.jsx)(t.td,{children:"true (Optional)"}),(0,i.jsxs)(t.td,{children:["Enable the internal metadata table which serves table metadata like level file listings, default enabled",(0,i.jsx)("br",{}),(0,i.jsx)("br",{})," ",(0,i.jsx)(t.code,{children:"Config Param: METADATA_ENABLED"})]})]})})]}),"\n",(0,i.jsx)(t.admonition,{type:"note",children:(0,i.jsx)(t.p,{children:"If you turn off the metadata table after enabling, be sure to wait for a few commits so that the metadata table is fully\ncleaned up, before re-enabling the metadata table again."})}),"\n",(0,i.jsx)(t.h2,{id:"leveraging-metadata-during-queries",children:"Leveraging metadata during queries"}),"\n",(0,i.jsx)(t.h3,{id:"files-index",children:"files index"}),"\n",(0,i.jsxs)(t.p,{children:["Metadata based listing using ",(0,i.jsx)(t.em,{children:"files_index"})," can be leveraged on the read side by setting appropriate configs/session properties\nfrom different engines as shown below:"]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Readers"}),(0,i.jsx)(t.th,{children:"Config"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Spark DataSource, Spark SQL, Strucured Streaming"}),(0,i.jsx)(t.td,{children:"hoodie.metadata.enable"}),(0,i.jsxs)(t.td,{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," enables use of the spark file index implementation for Hudi, that speeds up listing of large tables.",(0,i.jsx)("br",{})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Flink DataStream, Flink SQL"}),(0,i.jsx)(t.td,{children:"metadata.enabled"}),(0,i.jsxs)(t.td,{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," from DDL uses the internal metadata table to serves table metadata like level file listings"]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Presto"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"https://prestodb.io/docs/current/connector/hudi.html",children:"hudi.metadata-table-enabled"})}),(0,i.jsxs)(t.td,{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," fetches the list of file names and sizes from Hudi\u2019s metadata table rather than storage."]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Trino"}),(0,i.jsx)(t.td,{children:"N/A"}),(0,i.jsxs)(t.td,{children:["Support for reading from the metadata table ",(0,i.jsx)(t.a,{href:"https://issues.apache.org/jira/browse/HUDI-7020",children:"has been dropped in Trino 419"}),"."]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Athena"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"https://docs.aws.amazon.com/athena/latest/ug/querying-hudi.html",children:"hudi.metadata-listing-enabled"})}),(0,i.jsxs)(t.td,{children:["When this table property is set to ",(0,i.jsx)(t.code,{children:"TRUE"})," enables the Hudi metadata table and the related file listing functionality"]})]})]})]}),"\n",(0,i.jsx)(t.h3,{id:"column_stats-index-and-data-skipping",children:"column_stats index and data skipping"}),"\n",(0,i.jsx)(t.p,{children:"Enabling metadata table and column stats index is a prerequisite to enabling data skipping capabilities. Following are the\ncorresponding configs across Spark and Flink readers."}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Readers"}),(0,i.jsx)(t.th,{children:"Config"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Spark DataSource, Spark SQL, Strucured Streaming"}),(0,i.jsx)(t.td,{children:(0,i.jsxs)("ul",{children:[(0,i.jsx)("li",{children:(0,i.jsx)(t.code,{children:"hoodie.metadata.enable"})}),(0,i.jsx)("li",{children:(0,i.jsx)(t.code,{children:"hoodie.enable.data.skipping"})})]})}),(0,i.jsx)(t.td,{children:(0,i.jsxs)("ul",{children:[(0,i.jsxs)("li",{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," enables use of the spark file index implementation for Hudi, that speeds up listing of large tables."]}),(0,i.jsxs)("li",{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," enables data-skipping allowing queries to leverage indexes to reduce the search space by skipping over files ",(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Config Param: ENABLE_DATA_SKIPPING"}),(0,i.jsx)("br",{}),(0,i.jsx)(t.code,{children:"Since Version: 0.10.0"})," ",(0,i.jsx)("br",{})]})]})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Flink DataStream, Flink SQL"}),(0,i.jsx)(t.td,{children:(0,i.jsxs)("ul",{children:[(0,i.jsx)("li",{children:(0,i.jsx)(t.code,{children:"metadata.enabled"})}),(0,i.jsx)("li",{children:(0,i.jsx)(t.code,{children:"read.data.skipping.enabled"})})]})}),(0,i.jsx)(t.td,{children:(0,i.jsxs)("ul",{children:[(0,i.jsxs)("li",{children:[" When set to ",(0,i.jsx)(t.code,{children:"true"})," from DDL uses the internal metadata table to serves table metadata like level file listings"]}),(0,i.jsxs)("li",{children:["When set to ",(0,i.jsx)(t.code,{children:"true"})," enables data-skipping allowing queries to leverage indexes to reduce the search space byskipping over files"]})]})})]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"concurrency-control-for-metadata-table",children:"Concurrency Control for Metadata Table"}),"\n",(0,i.jsxs)(t.p,{children:["To ensure that metadata table stays up to date and table metadata is tracked safely across concurrent write and\ntable operations, there are some additional considerations. If async table services are enabled for the table (i.e. running a separate compaction (",(0,i.jsx)(t.code,{children:"HoodieCompactor"}),") or\nclustering (",(0,i.jsx)(t.code,{children:"HoodieClusteringJob"}),") job), even with just a single writer, lock providers\nmust be configured. Please refer to ",(0,i.jsx)(t.a,{href:"concurrency_control",children:"concurrency control"})," for more details."]}),"\n",(0,i.jsxs)(t.p,{children:["Before enabling metadata table for the first time, all writers on the same table must and table services must be stopped.\nIf your current deployment model is ",(0,i.jsx)(t.a,{href:"concurrency_control#full-on-multi-writer--async-table-services",children:"multi-writer"})," along with a lock\nprovider and other required configs set for every writer as follows, there is no additional configuration required. You\ncan bring up the writers sequentially after stopping the writers for enabling metadata table. Applying the proper\nconfigurations to only a subset of writers or table services is unsafe and can lead to loss of data. So, please ensure you enable\nmetadata table across all writers."]}),"\n",(0,i.jsx)(t.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,i.jsx)("h3",{children:"Blogs"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://medium.com/@simpsons/table-service-deployment-models-in-apache-hudi-9cfa5a44addf",children:"Table service deployment models in Apache Hudi"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://www.onehouse.ai/blog/introducing-multi-modal-index-for-the-lakehouse-in-apache-hudi",children:"Multi Modal Indexing for the Data Lakehouse"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://www.onehouse.ai/blog/how-to-optimize-performance-for-your-open-data-lakehouse",children:"How to Optimize Performance for Your Open Data Lakehouse"})}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},73633:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/metadata_table_anim-4d6225cef4c2e0937805288146eaf6ad.gif"},28453:(e,t,a)=>{a.d(t,{R:()=>r,x:()=>l});var n=a(96540);const i={},s=n.createContext(i);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/content/cn/assets/js/b93a682d.465a8fc6.js b/content/cn/assets/js/b93a682d.16ed56a0.js similarity index 89% rename from content/cn/assets/js/b93a682d.465a8fc6.js rename to content/cn/assets/js/b93a682d.16ed56a0.js index f7bed1e086fba..e859912470784 100644 --- a/content/cn/assets/js/b93a682d.465a8fc6.js +++ b/content/cn/assets/js/b93a682d.16ed56a0.js @@ -1 +1 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[97476],{79280:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"cleaning","title":"Cleaning","description":"Background","source":"@site/docs/cleaning.md","sourceDirName":".","slug":"/cleaning","permalink":"/cn/docs/next/cleaning","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/cleaning.md","tags":[],"version":"current","frontMatter":{"title":"Cleaning","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4},"sidebar":"docs","previous":{"title":"Streaming Reads","permalink":"/cn/docs/next/reading_tables_streaming_reads"},"next":{"title":"Compaction","permalink":"/cn/docs/next/compaction"}}');var s=i(74848),o=i(28453);const t={title:"Cleaning",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4},r=void 0,l={},c=[{value:"Background",id:"background",level:2},{value:"Cleaning Retention Policies",id:"cleaning-retention-policies",level:3},{value:"Configs",id:"configs",level:3},{value:"Ways to trigger Cleaning",id:"ways-to-trigger-cleaning",level:3},{value:"Inline",id:"inline",level:4},{value:"Async",id:"async",level:4},{value:"Run independently",id:"run-independently",level:4},{value:"CLI",id:"cli",level:4},{value:"Related Resources",id:"related-resources",level:2}];function d(e){const n={a:"a",br:"br",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"background",children:"Background"}),"\n",(0,s.jsxs)(n.p,{children:["Cleaning is a table service employed by Hudi to reclaim space occupied by older versions of data and keep storage costs\nin check. Apache Hudi provides snapshot isolation between writers and readers by managing multiple versioned files with ",(0,s.jsx)(n.strong,{children:"MVCC"}),"\nconcurrency. These file versions provide history and enable time travel and rollbacks, but it is important to manage\nhow much history you keep to balance your costs. Cleaning service plays a crucial role in manging the tradeoff between\nretaining long history of data and the associated storage costs."]}),"\n",(0,s.jsxs)(n.p,{children:["Hudi enables ",(0,s.jsx)(n.a,{href:"/docs/configurations/#hoodiecleanautomatic",children:"Automatic Hudi cleaning"})," by default. Cleaning is invoked\nimmediately after each commit, to delete older file slices. It's recommended to leave this enabled to ensure metadata\nand data storage growth is bounded. Cleaner can also be scheduled after every few commits instead of after every commit by\nconfiguring ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations#hoodiecleanmaxcommits",children:"hoodie.clean.max.commits"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"cleaning-retention-policies",children:"Cleaning Retention Policies"}),"\n",(0,s.jsx)(n.p,{children:"When cleaning old files, you should be careful not to remove files that are being actively used by long running queries."}),"\n",(0,s.jsx)(n.p,{children:"For spark based:"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.cleaner.policy"}),(0,s.jsx)(n.td,{children:"KEEP_LATEST_COMMITS (Optional)"}),(0,s.jsxs)(n.td,{children:["org.apache.hudi.common.model.HoodieCleaningPolicy: Cleaning policy to be used. ",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: CLEANER_POLICY"})]})]})})]}),"\n",(0,s.jsxs)(n.p,{children:["The corresponding config for Flink based engine is ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanpolicy",children:(0,s.jsx)(n.code,{children:"clean.policy"})}),"."]}),"\n",(0,s.jsx)(n.p,{children:"Hudi cleaner currently supports the below cleaning policies to keep a certain number of commits or file versions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"KEEP_LATEST_COMMITS"}),": This is the default policy. This is a temporal cleaning policy that ensures the effect of\nhaving lookback into all the changes that happened in the last X commits. Suppose a writer is ingesting data\ninto a Hudi dataset every 30 minutes and the longest running query can take 5 hours to finish, then the user should\nretain atleast the last 10 commits. With such a configuration, we ensure that the oldest version of a file is kept on\ndisk for at least 5 hours, thereby preventing the longest running query from failing at any point in time. Incremental\ncleaning is also possible using this policy.\nNumber of commits to retain can be configured by ",(0,s.jsx)(n.a,{href:"https://analytics.google.com/analytics/web/#/p300324801/reports/intelligenthome",children:(0,s.jsx)(n.code,{children:"hoodie.cleaner.commits.retained"})}),".\nThe corresponding Flink related config is ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanretain_commits",children:(0,s.jsx)(n.code,{children:"clean.retain_commits"})}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"KEEP_LATEST_FILE_VERSIONS"}),": This policy has the effect of keeping N number of file versions irrespective of time.\nThis policy is useful when it is known how many MAX versions of the file does one want to keep at any given time.\nTo achieve the same behaviour as before of preventing long running queries from failing, one should do their calculations\nbased on data patterns. Alternatively, this policy is also useful if a user just wants to maintain 1 latest version of the file.\nNumber of file versions to retain can be configured by ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#hoodiecleanerfileversionsretained",children:(0,s.jsx)(n.code,{children:"hoodie.cleaner.fileversions.retained"})}),".\nThe corresponding Flink related config is ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanretain_file_versions",children:(0,s.jsx)(n.code,{children:"clean.retain_file_versions"})}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"KEEP_LATEST_BY_HOURS"}),": This policy clean up based on hours.It is simple and useful when knowing that you want to\nkeep files at any given time. Corresponding to commits with commit times older than the configured number of hours to\nbe retained are cleaned. Currently you can configure by parameter ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#hoodiecleanerhoursretained",children:(0,s.jsx)(n.code,{children:"hoodie.cleaner.hours.retained"})}),".\nThe corresponding Flink related config is ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanretain_hours",children:(0,s.jsx)(n.code,{children:"clean.retain_hours"})}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"configs",children:"Configs"}),"\n",(0,s.jsxs)(n.p,{children:["For details about all possible configurations and their default values see the ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/next/configurations/#Clean-Configs",children:"configuration docs"}),".\nFor Flink related configs refer ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/next/configurations/#FLINK_SQL",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"ways-to-trigger-cleaning",children:"Ways to trigger Cleaning"}),"\n",(0,s.jsx)(n.h4,{id:"inline",children:"Inline"}),"\n",(0,s.jsxs)(n.p,{children:["By default, in Spark based writing, cleaning is run inline after every commit using the default policy of ",(0,s.jsx)(n.code,{children:"KEEP_LATEST_COMMITS"}),". It's recommended\nto keep this enabled, to ensure metadata and data storage growth is bounded. To enable this, users do not have to set any configs. Following are the relevant basic configs."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.clean.automatic"}),(0,s.jsx)(n.td,{children:"true (Optional)"}),(0,s.jsxs)(n.td,{children:["When enabled, the cleaner table service is invoked immediately after each commit, to delete older file slices. It's recommended to enable this, to ensure metadata and data storage growth is bounded.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: AUTO_CLEAN"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.cleaner.commits.retained"}),(0,s.jsx)(n.td,{children:"10 (Optional)"}),(0,s.jsxs)(n.td,{children:["Number of commits to retain, without cleaning. This will be retained for num_of_commits * time_between_commits (scheduled). This also directly translates into how much data retention the table supports for incremental queries.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: CLEANER_COMMITS_RETAINED"})]})]})]})]}),"\n",(0,s.jsx)(n.h4,{id:"async",children:"Async"}),"\n",(0,s.jsxs)(n.p,{children:["In case you wish to run the cleaner service asynchronously along with writing, please enable the ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations#hoodiecleanasync",children:(0,s.jsx)(n.code,{children:"hoodie.clean.async"})})," as shown below:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:"hoodie.clean.automatic=true\nhoodie.clean.async=true\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For Flink based writing, this is the default mode of cleaning. Please refer to ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanasyncenabled",children:(0,s.jsx)(n.code,{children:"clean.async.enabled"})})," for details."]}),"\n",(0,s.jsx)(n.h4,{id:"run-independently",children:"Run independently"}),"\n",(0,s.jsx)(n.p,{children:"Hoodie Cleaner can also be run as a separate process. Following is the command for running the cleaner independently:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'spark-submit --master local \\\n --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n --class org.apache.hudi.utilities.HoodieCleaner `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` --help\n Usage:
[options]\n Options:\n --help, -h\n\n --hoodie-conf\n Any configuration that can be set in the properties file (using the CLI\n parameter "--props") can also be passed command line using this\n parameter. This can be repeated\n Default: []\n --props\n path to properties file on localfs or dfs, with configurations for\n hoodie client for cleaning\n --spark-master\n spark master to use.\n Default: local[2]\n * --target-base-path\n base path for the hoodie table to be cleaner.\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Some examples to run the cleaner.",(0,s.jsx)(n.br,{}),"\n","Keep the latest 10 commits"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"spark-submit --master local \\\n --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n --class org.apache.hudi.utilities.HoodieCleaner `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` \\\n --target-base-path /path/to/hoodie_table \\\n --hoodie-conf hoodie.cleaner.policy=KEEP_LATEST_COMMITS \\\n --hoodie-conf hoodie.cleaner.commits.retained=10 \\\n --hoodie-conf hoodie.cleaner.parallelism=200\n"})}),"\n",(0,s.jsx)(n.p,{children:"Keep the latest 3 file versions"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"spark-submit --master local \\\n --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n --class org.apache.hudi.utilities.HoodieCleaner `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` \\\n --hoodie-conf hoodie.cleaner.policy=KEEP_LATEST_FILE_VERSIONS \\\n --hoodie-conf hoodie.cleaner.fileversions.retained=3 \\\n --hoodie-conf hoodie.cleaner.parallelism=200\n"})}),"\n",(0,s.jsx)(n.p,{children:"Clean commits older than 24 hours"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"spark-submit --master local \\\n --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n --class org.apache.hudi.utilities.HoodieCleaner `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` \\\n --target-base-path /path/to/hoodie_table \\\n --hoodie-conf hoodie.cleaner.policy=KEEP_LATEST_BY_HOURS \\\n --hoodie-conf hoodie.cleaner.hours.retained=24 \\\n --hoodie-conf hoodie.cleaner.parallelism=200\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note: The parallelism takes the min value of number of partitions to clean and ",(0,s.jsx)(n.code,{children:"hoodie.cleaner.parallelism"}),"."]}),"\n",(0,s.jsx)(n.h4,{id:"cli",children:"CLI"}),"\n",(0,s.jsxs)(n.p,{children:["You can also use ",(0,s.jsx)(n.a,{href:"/docs/cli",children:"Hudi CLI"})," to run Hoodie Cleaner."]}),"\n",(0,s.jsx)(n.p,{children:"CLI provides the below commands for cleaner service:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"cleans show"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"clean showpartitions"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"cleans run"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example of cleaner keeping the latest 10 commits"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"cleans run --sparkMaster local --hoodieConfigs hoodie.cleaner.policy=KEEP_LATEST_COMMITS hoodie.cleaner.commits.retained=3 hoodie.cleaner.parallelism=200\n"})}),"\n",(0,s.jsxs)(n.p,{children:["You can find more details and the relevant code for these commands in ",(0,s.jsx)(n.a,{href:"https://github.com/apache/hudi/blob/master/hudi-cli/src/main/java/org/apache/hudi/cli/commands/CleansCommand.java",children:(0,s.jsx)(n.code,{children:"org.apache.hudi.cli.commands.CleansCommand"})})," class."]}),"\n",(0,s.jsx)(n.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,s.jsx)("h3",{children:"Videos"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://youtu.be/mUvRhJDoO3w",children:"Cleaner Service: Save up to 40% on data lake storage costs | Hudi Labs"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://www.youtube.com/watch?v=CEzgFtmVjx4",children:"Efficient Data Lake Management with Apache Hudi Cleaner: Benefits of Scheduling Data Cleaning #1"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://www.youtube.com/watch?v=RbBF9Ys2GqM",children:"Efficient Data Lake Management with Apache Hudi Cleaner: Benefits of Scheduling Data Cleaning #2"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>t,x:()=>r});var a=i(96540);const s={},o=a.createContext(s);function t(e){const n=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),a.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[97476],{79280:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"cleaning","title":"Cleaning","description":"Background","source":"@site/docs/cleaning.md","sourceDirName":".","slug":"/cleaning","permalink":"/cn/docs/next/cleaning","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/cleaning.md","tags":[],"version":"current","frontMatter":{"title":"Cleaning","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4},"sidebar":"docs","previous":{"title":"Streaming Reads","permalink":"/cn/docs/next/reading_tables_streaming_reads"},"next":{"title":"Compaction","permalink":"/cn/docs/next/compaction"}}');var s=i(74848),o=i(28453);const t={title:"Cleaning",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4},l=void 0,r={},c=[{value:"Background",id:"background",level:2},{value:"Cleaning Retention Policies",id:"cleaning-retention-policies",level:3},{value:"Configs",id:"configs",level:3},{value:"Ways to trigger Cleaning",id:"ways-to-trigger-cleaning",level:3},{value:"Inline",id:"inline",level:4},{value:"Async",id:"async",level:4},{value:"Run independently",id:"run-independently",level:4},{value:"CLI",id:"cli",level:4},{value:"Related Resources",id:"related-resources",level:2}];function d(e){const n={a:"a",br:"br",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"background",children:"Background"}),"\n",(0,s.jsxs)(n.p,{children:["Cleaning is a table service employed by Hudi to reclaim space occupied by older versions of data and keep storage costs\nin check. Apache Hudi provides snapshot isolation between writers and readers by managing multiple versioned files with ",(0,s.jsx)(n.strong,{children:"MVCC"}),"\nconcurrency. These file versions provide history and enable time travel and rollbacks, but it is important to manage\nhow much history you keep to balance your costs. Cleaning service plays a crucial role in manging the tradeoff between\nretaining long history of data and the associated storage costs."]}),"\n",(0,s.jsxs)(n.p,{children:["Hudi enables ",(0,s.jsx)(n.a,{href:"/docs/configurations/#hoodiecleanautomatic",children:"Automatic Hudi cleaning"})," by default. Cleaning is invoked\nimmediately after each commit, to delete older file slices. It's recommended to leave this enabled to ensure metadata\nand data storage growth is bounded. Cleaner can also be scheduled after every few commits instead of after every commit by\nconfiguring ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations#hoodiecleanmaxcommits",children:"hoodie.clean.max.commits"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"cleaning-retention-policies",children:"Cleaning Retention Policies"}),"\n",(0,s.jsx)(n.p,{children:"When cleaning old files, you should be careful not to remove files that are being actively used by long running queries."}),"\n",(0,s.jsx)(n.p,{children:"For spark based:"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.cleaner.policy"}),(0,s.jsx)(n.td,{children:"KEEP_LATEST_COMMITS (Optional)"}),(0,s.jsxs)(n.td,{children:["org.apache.hudi.common.model.HoodieCleaningPolicy: Cleaning policy to be used. ",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: CLEANER_POLICY"})]})]})})]}),"\n",(0,s.jsxs)(n.p,{children:["The corresponding config for Flink based engine is ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanpolicy",children:(0,s.jsx)(n.code,{children:"clean.policy"})}),"."]}),"\n",(0,s.jsx)(n.p,{children:"Hudi cleaner currently supports the below cleaning policies to keep a certain number of commits or file versions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"KEEP_LATEST_COMMITS"}),": This is the default policy. This is a temporal cleaning policy that ensures the effect of\nhaving lookback into all the changes that happened in the last X commits. Suppose a writer is ingesting data\ninto a Hudi dataset every 30 minutes and the longest running query can take 5 hours to finish, then the user should\nretain atleast the last 10 commits. With such a configuration, we ensure that the oldest version of a file is kept on\ndisk for at least 5 hours, thereby preventing the longest running query from failing at any point in time. Incremental\ncleaning is also possible using this policy.\nNumber of commits to retain can be configured by ",(0,s.jsx)(n.a,{href:"https://analytics.google.com/analytics/web/#/p300324801/reports/intelligenthome",children:(0,s.jsx)(n.code,{children:"hoodie.cleaner.commits.retained"})}),".\nThe corresponding Flink related config is ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanretain_commits",children:(0,s.jsx)(n.code,{children:"clean.retain_commits"})}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"KEEP_LATEST_FILE_VERSIONS"}),": This policy has the effect of keeping N number of file versions irrespective of time.\nThis policy is useful when it is known how many MAX versions of the file does one want to keep at any given time.\nTo achieve the same behaviour as before of preventing long running queries from failing, one should do their calculations\nbased on data patterns. Alternatively, this policy is also useful if a user just wants to maintain 1 latest version of the file.\nNumber of file versions to retain can be configured by ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#hoodiecleanerfileversionsretained",children:(0,s.jsx)(n.code,{children:"hoodie.cleaner.fileversions.retained"})}),".\nThe corresponding Flink related config is ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanretain_file_versions",children:(0,s.jsx)(n.code,{children:"clean.retain_file_versions"})}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"KEEP_LATEST_BY_HOURS"}),": This policy clean up based on hours.It is simple and useful when knowing that you want to\nkeep files at any given time. Corresponding to commits with commit times older than the configured number of hours to\nbe retained are cleaned. Currently you can configure by parameter ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#hoodiecleanerhoursretained",children:(0,s.jsx)(n.code,{children:"hoodie.cleaner.hours.retained"})}),".\nThe corresponding Flink related config is ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanretain_hours",children:(0,s.jsx)(n.code,{children:"clean.retain_hours"})}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"configs",children:"Configs"}),"\n",(0,s.jsxs)(n.p,{children:["For details about all possible configurations and their default values see the ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/next/configurations/#Clean-Configs",children:"configuration docs"}),".\nFor Flink related configs refer ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/next/configurations/#FLINK_SQL",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"ways-to-trigger-cleaning",children:"Ways to trigger Cleaning"}),"\n",(0,s.jsx)(n.h4,{id:"inline",children:"Inline"}),"\n",(0,s.jsxs)(n.p,{children:["By default, in Spark based writing, cleaning is run inline after every commit using the default policy of ",(0,s.jsx)(n.code,{children:"KEEP_LATEST_COMMITS"}),". It's recommended\nto keep this enabled, to ensure metadata and data storage growth is bounded. To enable this, users do not have to set any configs. Following are the relevant basic configs."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.clean.automatic"}),(0,s.jsx)(n.td,{children:"true (Optional)"}),(0,s.jsxs)(n.td,{children:["When enabled, the cleaner table service is invoked immediately after each commit, to delete older file slices. It's recommended to enable this, to ensure metadata and data storage growth is bounded.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: AUTO_CLEAN"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.cleaner.commits.retained"}),(0,s.jsx)(n.td,{children:"10 (Optional)"}),(0,s.jsxs)(n.td,{children:["Number of commits to retain, without cleaning. This will be retained for num_of_commits * time_between_commits (scheduled). This also directly translates into how much data retention the table supports for incremental queries.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: CLEANER_COMMITS_RETAINED"})]})]})]})]}),"\n",(0,s.jsx)(n.h4,{id:"async",children:"Async"}),"\n",(0,s.jsxs)(n.p,{children:["In case you wish to run the cleaner service asynchronously along with writing, please enable the ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations#hoodiecleanasync",children:(0,s.jsx)(n.code,{children:"hoodie.clean.async"})})," as shown below:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:"hoodie.clean.automatic=true\nhoodie.clean.async=true\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For Flink based writing, this is the default mode of cleaning. Please refer to ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/configurations/#cleanasyncenabled",children:(0,s.jsx)(n.code,{children:"clean.async.enabled"})})," for details."]}),"\n",(0,s.jsx)(n.h4,{id:"run-independently",children:"Run independently"}),"\n",(0,s.jsx)(n.p,{children:"Hoodie Cleaner can also be run as a separate process. Following is the command for running the cleaner independently:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'spark-submit --master local \\\n --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n --class org.apache.hudi.utilities.HoodieCleaner `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` --help\n Usage:
[options]\n Options:\n --help, -h\n\n --hoodie-conf\n Any configuration that can be set in the properties file (using the CLI\n parameter "--props") can also be passed command line using this\n parameter. This can be repeated\n Default: []\n --props\n path to properties file on localfs or dfs, with configurations for\n hoodie client for cleaning\n --spark-master\n spark master to use.\n Default: local[2]\n * --target-base-path\n base path for the hoodie table to be cleaner.\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Some examples to run the cleaner.",(0,s.jsx)(n.br,{}),"\n","Keep the latest 10 commits"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"spark-submit --master local \\\n --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n --class org.apache.hudi.utilities.HoodieCleaner `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` \\\n --target-base-path /path/to/hoodie_table \\\n --hoodie-conf hoodie.cleaner.policy=KEEP_LATEST_COMMITS \\\n --hoodie-conf hoodie.cleaner.commits.retained=10 \\\n --hoodie-conf hoodie.cleaner.parallelism=200\n"})}),"\n",(0,s.jsx)(n.p,{children:"Keep the latest 3 file versions"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"spark-submit --master local \\\n --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n --class org.apache.hudi.utilities.HoodieCleaner `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` \\\n --hoodie-conf hoodie.cleaner.policy=KEEP_LATEST_FILE_VERSIONS \\\n --hoodie-conf hoodie.cleaner.fileversions.retained=3 \\\n --hoodie-conf hoodie.cleaner.parallelism=200\n"})}),"\n",(0,s.jsx)(n.p,{children:"Clean commits older than 24 hours"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"spark-submit --master local \\\n --packages org.apache.hudi:hudi-utilities-slim-bundle_2.12:1.0.0,org.apache.hudi:hudi-spark3.5-bundle_2.12:1.0.0 \\\n --class org.apache.hudi.utilities.HoodieCleaner `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` \\\n --target-base-path /path/to/hoodie_table \\\n --hoodie-conf hoodie.cleaner.policy=KEEP_LATEST_BY_HOURS \\\n --hoodie-conf hoodie.cleaner.hours.retained=24 \\\n --hoodie-conf hoodie.cleaner.parallelism=200\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note: The parallelism takes the min value of number of partitions to clean and ",(0,s.jsx)(n.code,{children:"hoodie.cleaner.parallelism"}),"."]}),"\n",(0,s.jsx)(n.h4,{id:"cli",children:"CLI"}),"\n",(0,s.jsxs)(n.p,{children:["You can also use ",(0,s.jsx)(n.a,{href:"/docs/cli",children:"Hudi CLI"})," to run Hoodie Cleaner."]}),"\n",(0,s.jsx)(n.p,{children:"CLI provides the below commands for cleaner service:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"cleans show"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"clean showpartitions"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"cleans run"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example of cleaner keeping the latest 10 commits"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"cleans run --sparkMaster local --hoodieConfigs hoodie.cleaner.policy=KEEP_LATEST_COMMITS hoodie.cleaner.commits.retained=3 hoodie.cleaner.parallelism=200\n"})}),"\n",(0,s.jsxs)(n.p,{children:["You can find more details and the relevant code for these commands in ",(0,s.jsx)(n.a,{href:"https://github.com/apache/hudi/blob/master/hudi-cli/src/main/java/org/apache/hudi/cli/commands/CleansCommand.java",children:(0,s.jsx)(n.code,{children:"org.apache.hudi.cli.commands.CleansCommand"})})," class."]}),"\n",(0,s.jsx)(n.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,s.jsx)("h3",{children:"Blogs"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://medium.com/@simpsons/cleaner-and-archival-in-apache-hudi-9e15b08b2933",children:"Cleaner and Archival in Apache Hudi"})}),"\n"]}),"\n",(0,s.jsx)("h3",{children:"Videos"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://youtu.be/mUvRhJDoO3w",children:"Cleaner Service: Save up to 40% on data lake storage costs | Hudi Labs"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://www.youtube.com/watch?v=CEzgFtmVjx4",children:"Efficient Data Lake Management with Apache Hudi Cleaner: Benefits of Scheduling Data Cleaning #1"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://www.youtube.com/watch?v=RbBF9Ys2GqM",children:"Efficient Data Lake Management with Apache Hudi Cleaner: Benefits of Scheduling Data Cleaning #2"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>t,x:()=>l});var a=i(96540);const s={},o=a.createContext(s);function t(e){const n=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),a.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/content/cn/assets/js/ba47c136.861eff42.js b/content/cn/assets/js/ba47c136.14210e60.js similarity index 96% rename from content/cn/assets/js/ba47c136.861eff42.js rename to content/cn/assets/js/ba47c136.14210e60.js index 51deeb53bab31..1c15a90579951 100644 --- a/content/cn/assets/js/ba47c136.861eff42.js +++ b/content/cn/assets/js/ba47c136.14210e60.js @@ -1 +1 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[97424],{90430:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>o,contentTitle:()=>a,default:()=>c,frontMatter:()=>d,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"key_generation","title":"Key Generation","description":"Hudi needs some way to point to records in the table, so that base/log files can be merged efficiently for updates/deletes,","source":"@site/docs/key_generation.md","sourceDirName":".","slug":"/key_generation","permalink":"/cn/docs/next/key_generation","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/key_generation.md","tags":[],"version":"current","frontMatter":{"title":"Key Generation","summary":"In this page, we describe key generation in Hudi.","toc":true,"last_modified_at":null},"sidebar":"docs","previous":{"title":"Table & Query Types","permalink":"/cn/docs/next/table_types"},"next":{"title":"Record Mergers","permalink":"/cn/docs/next/record_merger"}}');var n=i(74848),s=i(28453);const d={title:"Key Generation",summary:"In this page, we describe key generation in Hudi.",toc:!0,last_modified_at:null},a=void 0,o={},l=[{value:"Key Generators",id:"key-generators",level:2},{value:"SIMPLE",id:"simple",level:3},{value:"COMPLEX",id:"complex",level:3},{value:"NON_PARTITION",id:"non_partition",level:3},{value:"CUSTOM",id:"custom",level:3},{value:"TIMESTAMP",id:"timestamp",level:3},{value:"Timestamp is GMT",id:"timestamp-is-gmt",level:4},{value:"Timestamp is DATE_STRING",id:"timestamp-is-date_string",level:4},{value:"Scalar examples",id:"scalar-examples",level:4},{value:"ISO8601WithMsZ with Single Input format",id:"iso8601withmsz-with-single-input-format",level:4},{value:"ISO8601WithMsZ with Multiple Input formats",id:"iso8601withmsz-with-multiple-input-formats",level:4},{value:"ISO8601NoMs with offset using multiple input formats",id:"iso8601noms-with-offset-using-multiple-input-formats",level:4},{value:"Input as short date string and expect date in date format",id:"input-as-short-date-string-and-expect-date-in-date-format",level:4},{value:"Related Resources",id:"related-resources",level:2}];function h(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"Hudi needs some way to point to records in the table, so that base/log files can be merged efficiently for updates/deletes,\nindex entries can reference these rows and records can move around within the table from clustering without side effects.\nIn fact, most databases adopt similar techniques. Every record in Hudi is uniquely identified a pair of record key and an optional\npartition path that can limit the scope of the key's uniqueness (non-global indexing). For tables with a global index, records are\nidentified by just the record key such that uniqueness is applied across partitions."}),"\n",(0,n.jsxs)(t.p,{children:["Using keys, Hudi can impose partition/table level uniqueness integrity constraint as well as enable fast updates and deletes on records. Record keys are materialized in a\nspecial ",(0,n.jsx)(t.code,{children:"_hoodie_record_key"})," field in the table, to ensure key uniqueness is maintained even when the record generation is changed\nduring the table's lifetime. Without materialization, there are no guarantees that the past data written for a new key is unique across the table."]}),"\n",(0,n.jsx)(t.p,{children:"Hudi offers many ways to generate record keys from the input data during writes."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["For Java client/Spark/Flink writers, Hudi provides built-in key generator classes (described below) as well as an ",(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-common/src/main/java/org/apache/hudi/keygen/KeyGenerator.java",children:"interface"}),"\nto write custom implementations."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["SQL engines offer options to pass in key fields and use ",(0,n.jsx)(t.code,{children:"PARTITIONED BY"})," clauses to control partitioning."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"By default, Hudi auto-generates keys for INSERT, BULK_INSERT write operations, that are efficient\nfor compute, storage and read to meet the uniqueness requirements of the primary key. Auto generated keys are highly\ncompressible compared to UUIDs costing about $0.023 per GB in cloud storage and 3-10x computationally lighter to generate\nthan base64/uuid encoded keys."}),"\n",(0,n.jsx)(t.h2,{id:"key-generators",children:"Key Generators"}),"\n",(0,n.jsx)(t.p,{children:"Hudi provides several key generators out of the box for JVM users can use based on their need, while having a pluggable\ninterface for users to implement and use their own."}),"\n",(0,n.jsx)(t.p,{children:"Before diving into different types of key generators, let\u2019s go over some of the common configs relevant to key generators."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Default"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.recordkey.field"}),(0,n.jsx)(t.td,{children:"N/A (Optional)"}),(0,n.jsxs)(t.td,{children:["Record key field. Value to be used as the ",(0,n.jsx)(t.code,{children:"recordKey"})," component of ",(0,n.jsx)(t.code,{children:"HoodieKey"}),". ",(0,n.jsxs)("ul",{children:[(0,n.jsxs)("li",{children:["When configured, actual value will be obtained by invoking .toString() on the field value. Nested fields can be specified using the dot notation eg: ",(0,n.jsx)(t.code,{children:"a.b.c"}),". "]}),(0,n.jsx)("li",{children:"When not configured record key will be automatically generated by Hudi. This feature is handy for use cases like log ingestion that do not have a naturally present record key."})]})," ",(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: RECORDKEY_FIELD_NAME"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.partitionpath.field"}),(0,n.jsx)(t.td,{children:"N/A (Optional)"}),(0,n.jsxs)(t.td,{children:["Partition path field. Value to be used at the partitionPath component of HoodieKey. This needs to be specified if a partitioned table is desired. Actual value obtained by invoking .toString()",(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: PARTITIONPATH_FIELD_NAME"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.keygenerator.type"}),(0,n.jsx)(t.td,{children:"SIMPLE"}),(0,n.jsxs)(t.td,{children:["String representing key generator type ",(0,n.jsx)("br",{}),(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: KEYGENERATOR_TYPE"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.keygenerator.class"}),(0,n.jsx)(t.td,{children:"N/A (Optional)"}),(0,n.jsxs)(t.td,{children:["Key generator class, that implements ",(0,n.jsx)(t.code,{children:"org.apache.hudi.keygen.KeyGenerator"})," extract a key out of incoming records. ",(0,n.jsxs)("ul",{children:[(0,n.jsx)("li",{children:"When set, the configured value takes precedence to be in effect and automatic inference is not triggered."}),(0,n.jsxs)("li",{children:["When not configured, if ",(0,n.jsx)(t.code,{children:"hoodie.datasource.write.keygenerator.type"})," is set, the configured value is used else automatic inference is triggered."]}),(0,n.jsx)("li",{children:"In case of auto generated record keys, if neither the key generator class nor type are configured, Hudi will also auto infer the partitioning. for eg, if partition field is not configured, hudi will assume its non-partitioned. "})]})," ",(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: KEYGENERATOR_CLASS_NAME"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.hive_style_partitioning"}),(0,n.jsx)(t.td,{children:"false (Optional)"}),(0,n.jsxs)(t.td,{children:["Flag to indicate whether to use Hive style partitioning. If set true, the names of partition folders follow = format. By default false (the names of partition folders are only partition values)",(0,n.jsx)("br",{}),(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: HIVE_STYLE_PARTITIONING_ENABLE"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.partitionpath.urlencode"}),(0,n.jsx)(t.td,{children:"false (Optional)"}),(0,n.jsxs)(t.td,{children:["Should we url encode the partition path value, before creating the folder structure.",(0,n.jsx)("br",{}),(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: URL_ENCODE_PARTITIONING"})]})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["For all advanced configs refer ",(0,n.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations#KEY_GENERATOR",children:"here"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"simple",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/SimpleKeyGenerator.java",children:"SIMPLE"})}),"\n",(0,n.jsx)(t.p,{children:"This is the most commonly used option. Record key is generated from two fields from the schema, one for record key and one for partition path. Values are interpreted as is from dataframe and converted to string."}),"\n",(0,n.jsx)(t.h3,{id:"complex",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/ComplexKeyGenerator.java",children:"COMPLEX"})}),"\n",(0,n.jsxs)(t.p,{children:["Both record key and partition paths comprise one or more than one field by name(combination of multiple fields). Fields\nare expected to be comma separated in the config value. For example ",(0,n.jsx)(t.code,{children:'"Hoodie.datasource.write.recordkey.field" : \u201ccol1,col4\u201d'})]}),"\n",(0,n.jsx)(t.h3,{id:"non_partition",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/NonpartitionedKeyGenerator.java",children:"NON_PARTITION"})}),"\n",(0,n.jsx)(t.p,{children:"If your hudi dataset is not partitioned, you could use this \u201cNonpartitionedKeyGenerator\u201d which will return an empty\npartition for all records. In other words, all records go to the same partition (which is empty \u201c\u201d)"}),"\n",(0,n.jsx)(t.h3,{id:"custom",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/CustomKeyGenerator.java",children:"CUSTOM"})}),"\n",(0,n.jsx)(t.p,{children:"This is a generic implementation of KeyGenerator where users are able to leverage the benefits of SimpleKeyGenerator,\nComplexKeyGenerator and TimestampBasedKeyGenerator all at the same time. One can configure record key and partition\npaths as a single field or a combination of fields."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"hoodie.datasource.write.recordkey.field\nhoodie.datasource.write.partitionpath.field\nhoodie.datasource.write.keygenerator.class=org.apache.hudi.keygen.CustomKeyGenerator\n"})}),"\n",(0,n.jsxs)(t.p,{children:["This keyGenerator is particularly useful if you want to define\ncomplex partition paths involving regular fields and timestamp based fields. It expects value for prop ",(0,n.jsx)(t.code,{children:'"hoodie.datasource.write.partitionpath.field"'}),'\nin a specific format. The format should be "field1',":PartitionKeyType1",",field2",":PartitionKeyType2",'..."']}),"\n",(0,n.jsxs)(t.p,{children:["The complete partition path is created as\n",(0,n.jsx)(t.code,{children:"/ "}),"\nand so on. Each partition key type could either be SIMPLE or TIMESTAMP."]}),"\n",(0,n.jsxs)(t.p,{children:["Example config value: ",(0,n.jsx)(t.code,{children:"\u201cfield_3:simple,field_5:timestamp\u201d"})]}),"\n",(0,n.jsx)(t.p,{children:"RecordKey config value is either single field incase of SimpleKeyGenerator or a comma separate field names if referring to ComplexKeyGenerator.\nExample:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"hoodie.datasource.write.recordkey.field=field1,field2\n"})}),"\n",(0,n.jsxs)(t.p,{children:["This will create your record key in the format ",(0,n.jsx)(t.code,{children:"field1:value1,field2:value2"})," and so on, otherwise you can specify only one field in case of simple record keys. ",(0,n.jsx)(t.code,{children:"CustomKeyGenerator"})," class defines an enum ",(0,n.jsx)(t.code,{children:"PartitionKeyType"})," for configuring partition paths. It can take two possible values - SIMPLE and TIMESTAMP.\nThe value for ",(0,n.jsx)(t.code,{children:"hoodie.datasource.write.partitionpath.field"})," property in case of partitioned tables needs to be provided in the format ",(0,n.jsx)(t.code,{children:"field1:PartitionKeyType1,field2:PartitionKeyType2"})," and so on. For example, if you want to create partition path using 2 fields ",(0,n.jsx)(t.code,{children:"country"})," and ",(0,n.jsx)(t.code,{children:"date"})," where the latter has timestamp based values and needs to be customised in a given format, you can specify the following"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"hoodie.datasource.write.partitionpath.field=country:SIMPLE,date:TIMESTAMP\n"})}),"\n",(0,n.jsxs)(t.p,{children:["This will create the partition path in the format ",(0,n.jsx)(t.code,{children:"/"})," or ",(0,n.jsx)(t.code,{children:"country=/date="})," depending on whether you want hive style partitioning or not."]}),"\n",(0,n.jsx)(t.h3,{id:"timestamp",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/TimestampBasedKeyGenerator.java",children:"TIMESTAMP"})}),"\n",(0,n.jsx)(t.p,{children:"This key generator relies on timestamps for the partition field. The field values are interpreted as timestamps\nand not just converted to string while generating partition path value for records. Record key is same as before where it is chosen by\nfield name. Users are expected to set few more configs to use this KeyGenerator."}),"\n",(0,n.jsx)(t.p,{children:"Configs to be set:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Default"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.keygen.timebased.timestamp.type"}),(0,n.jsxs)(t.td,{children:["N/A ",(0,n.jsx)(t.strong,{children:"(Required)"})]}),(0,n.jsx)(t.td,{children:"Required only when the key generator is TimestampBasedKeyGenerator. One of the timestamp types supported(UNIX_TIMESTAMP, DATE_STRING, MIXED, EPOCHMILLISECONDS, SCALAR)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.keygen.timebased.output.dateformat"}),(0,n.jsx)(t.td,{children:'"" (Optional)'}),(0,n.jsxs)(t.td,{children:["Output date format such as ",(0,n.jsx)(t.code,{children:"yyyy-MM-dd'T'HH:mm:ss.SSSZ"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.keygen.timebased.timezone"}),(0,n.jsx)(t.td,{children:'"UTC" (Optional)'}),(0,n.jsxs)(t.td,{children:["Timezone of both input and output timestamp if they are the same, such as ",(0,n.jsx)(t.code,{children:"UTC"}),". Please use ",(0,n.jsx)(t.code,{children:"hoodie.keygen.timebased.input.timezone"})," and ",(0,n.jsx)(t.code,{children:"hoodie.keygen.timebased.output.timezone"})," instead if the input and output timezones are different."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.keygen.timebased.input.dateformat"}),(0,n.jsx)(t.td,{children:'"" (Optional)'}),(0,n.jsxs)(t.td,{children:["Input date format such as ",(0,n.jsx)(t.code,{children:"yyyy-MM-dd'T'HH:mm:ss.SSSZ"}),"."]})]})]})]}),"\n",(0,n.jsx)(t.p,{children:"Let's go over some example values for TimestampBasedKeyGenerator."}),"\n",(0,n.jsx)(t.h4,{id:"timestamp-is-gmt",children:"Timestamp is GMT"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"EPOCHMILLISECONDS"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyy-MM-dd hh"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timezone"})}),(0,n.jsx)(t.td,{children:'"GMT+8:00"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["Input Field value: \u201c1578283932000L\u201d ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c2020-01-06 12\u201d"]}),"\n",(0,n.jsxs)(t.p,{children:["If input field value is null for some rows. ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c1970-01-01 08\u201d"]}),"\n",(0,n.jsx)(t.h4,{id:"timestamp-is-date_string",children:"Timestamp is DATE_STRING"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyy-MM-dd hh"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timezone"})}),(0,n.jsx)(t.td,{children:'"GMT+8:00"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:['"yyyy-MM-dd hh:mm',":ss",'"']})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["Input field value: \u201c2020-01-06 12:12:12\u201d ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c2020-01-06 12\u201d"]}),"\n",(0,n.jsxs)(t.p,{children:["If input field value is null for some rows. ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c1970-01-01 12:00:00\u201d"]}),"\n",(0,n.jsx)("br",{}),"\n",(0,n.jsx)(t.h4,{id:"scalar-examples",children:"Scalar examples"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"SCALAR"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyy-MM-dd hh"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timezone"})}),(0,n.jsx)(t.td,{children:'"GMT"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.scalar.time.unit"})}),(0,n.jsx)(t.td,{children:'"days"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["Input field value: \u201c20000L\u201d ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c2024-10-04 12\u201d"]}),"\n",(0,n.jsxs)(t.p,{children:["If input field value is null. ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c1970-01-02 12\u201d"]}),"\n",(0,n.jsx)(t.h4,{id:"iso8601withmsz-with-single-input-format",children:"ISO8601WithMsZ with Single Input format"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:["\"yyyy-MM-dd'T'HH:mm",":ss",'.SSSZ"']})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat.list.delimiter.regex"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.timezone"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyyMMddHH"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.timezone"})}),(0,n.jsx)(t.td,{children:'"GMT"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:['Input field value: "2020-04-01T13:01:33.428Z" ',(0,n.jsx)("br",{}),'\nPartition path generated from key generator: "2020040113"']}),"\n",(0,n.jsx)(t.h4,{id:"iso8601withmsz-with-multiple-input-formats",children:"ISO8601WithMsZ with Multiple Input formats"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:["\"yyyy-MM-dd'T'HH:mm",":ssZ",",yyyy-MM-dd'T'HH:mm",":ss",'.SSSZ"']})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat.list.delimiter.regex"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.timezone"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyyMMddHH"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.timezone"})}),(0,n.jsx)(t.td,{children:'"UTC"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:['Input field value: "2020-04-01T13:01:33.428Z" ',(0,n.jsx)("br",{}),'\nPartition path generated from key generator: "2020040113"']}),"\n",(0,n.jsx)(t.h4,{id:"iso8601noms-with-offset-using-multiple-input-formats",children:"ISO8601NoMs with offset using multiple input formats"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:["\"yyyy-MM-dd'T'HH:mm",":ssZ",",yyyy-MM-dd'T'HH:mm",":ss",'.SSSZ"']})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat.list.delimiter.regex"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.timezone"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyyMMddHH"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.timezone"})}),(0,n.jsx)(t.td,{children:'"UTC"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:['Input field value: "2020-04-01T13:01:33-',(0,n.jsx)(t.strong,{children:"05:00"}),'" ',(0,n.jsx)("br",{}),'\nPartition path generated from key generator: "2020040118"']}),"\n",(0,n.jsx)(t.h4,{id:"input-as-short-date-string-and-expect-date-in-date-format",children:"Input as short date string and expect date in date format"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:["\"yyyy-MM-dd'T'HH:mm",":ssZ",",yyyy-MM-dd'T'HH:mm",":ss",'.SSSZ,yyyyMMdd"']})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat.list.delimiter.regex"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.timezone"})}),(0,n.jsx)(t.td,{children:'"UTC"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"MM/dd/yyyy"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.timezone"})}),(0,n.jsx)(t.td,{children:'"UTC"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:['Input field value: "20200401" ',(0,n.jsx)("br",{}),'\nPartition path generated from key generator: "04/01/2020"']}),"\n",(0,n.jsx)(t.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://www.onehouse.ai/blog/hudi-metafields-demystified",children:"Hudi metafields demystified"})}),"\n"]})]})}function c(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},28453:(e,t,i)=>{i.d(t,{R:()=>d,x:()=>a});var r=i(96540);const n={},s=r.createContext(n);function d(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[97424],{90430:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>o,contentTitle:()=>a,default:()=>c,frontMatter:()=>d,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"key_generation","title":"Key Generation","description":"Hudi needs some way to point to records in the table, so that base/log files can be merged efficiently for updates/deletes,","source":"@site/docs/key_generation.md","sourceDirName":".","slug":"/key_generation","permalink":"/cn/docs/next/key_generation","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/key_generation.md","tags":[],"version":"current","frontMatter":{"title":"Key Generation","summary":"In this page, we describe key generation in Hudi.","toc":true,"last_modified_at":null},"sidebar":"docs","previous":{"title":"Table & Query Types","permalink":"/cn/docs/next/table_types"},"next":{"title":"Record Mergers","permalink":"/cn/docs/next/record_merger"}}');var n=i(74848),s=i(28453);const d={title:"Key Generation",summary:"In this page, we describe key generation in Hudi.",toc:!0,last_modified_at:null},a=void 0,o={},l=[{value:"Key Generators",id:"key-generators",level:2},{value:"SIMPLE",id:"simple",level:3},{value:"COMPLEX",id:"complex",level:3},{value:"NON_PARTITION",id:"non_partition",level:3},{value:"CUSTOM",id:"custom",level:3},{value:"TIMESTAMP",id:"timestamp",level:3},{value:"Timestamp is GMT",id:"timestamp-is-gmt",level:4},{value:"Timestamp is DATE_STRING",id:"timestamp-is-date_string",level:4},{value:"Scalar examples",id:"scalar-examples",level:4},{value:"ISO8601WithMsZ with Single Input format",id:"iso8601withmsz-with-single-input-format",level:4},{value:"ISO8601WithMsZ with Multiple Input formats",id:"iso8601withmsz-with-multiple-input-formats",level:4},{value:"ISO8601NoMs with offset using multiple input formats",id:"iso8601noms-with-offset-using-multiple-input-formats",level:4},{value:"Input as short date string and expect date in date format",id:"input-as-short-date-string-and-expect-date-in-date-format",level:4},{value:"Related Resources",id:"related-resources",level:2}];function h(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"Hudi needs some way to point to records in the table, so that base/log files can be merged efficiently for updates/deletes,\nindex entries can reference these rows and records can move around within the table from clustering without side effects.\nIn fact, most databases adopt similar techniques. Every record in Hudi is uniquely identified a pair of record key and an optional\npartition path that can limit the scope of the key's uniqueness (non-global indexing). For tables with a global index, records are\nidentified by just the record key such that uniqueness is applied across partitions."}),"\n",(0,n.jsxs)(t.p,{children:["Using keys, Hudi can impose partition/table level uniqueness integrity constraint as well as enable fast updates and deletes on records. Record keys are materialized in a\nspecial ",(0,n.jsx)(t.code,{children:"_hoodie_record_key"})," field in the table, to ensure key uniqueness is maintained even when the record generation is changed\nduring the table's lifetime. Without materialization, there are no guarantees that the past data written for a new key is unique across the table."]}),"\n",(0,n.jsx)(t.p,{children:"Hudi offers many ways to generate record keys from the input data during writes."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["For Java client/Spark/Flink writers, Hudi provides built-in key generator classes (described below) as well as an ",(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-common/src/main/java/org/apache/hudi/keygen/KeyGenerator.java",children:"interface"}),"\nto write custom implementations."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["SQL engines offer options to pass in key fields and use ",(0,n.jsx)(t.code,{children:"PARTITIONED BY"})," clauses to control partitioning."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"By default, Hudi auto-generates keys for INSERT, BULK_INSERT write operations, that are efficient\nfor compute, storage and read to meet the uniqueness requirements of the primary key. Auto generated keys are highly\ncompressible compared to UUIDs costing about $0.023 per GB in cloud storage and 3-10x computationally lighter to generate\nthan base64/uuid encoded keys."}),"\n",(0,n.jsx)(t.h2,{id:"key-generators",children:"Key Generators"}),"\n",(0,n.jsx)(t.p,{children:"Hudi provides several key generators out of the box for JVM users can use based on their need, while having a pluggable\ninterface for users to implement and use their own."}),"\n",(0,n.jsx)(t.p,{children:"Before diving into different types of key generators, let\u2019s go over some of the common configs relevant to key generators."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Default"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.recordkey.field"}),(0,n.jsx)(t.td,{children:"N/A (Optional)"}),(0,n.jsxs)(t.td,{children:["Record key field. Value to be used as the ",(0,n.jsx)(t.code,{children:"recordKey"})," component of ",(0,n.jsx)(t.code,{children:"HoodieKey"}),". ",(0,n.jsxs)("ul",{children:[(0,n.jsxs)("li",{children:["When configured, actual value will be obtained by invoking .toString() on the field value. Nested fields can be specified using the dot notation eg: ",(0,n.jsx)(t.code,{children:"a.b.c"}),". "]}),(0,n.jsx)("li",{children:"When not configured record key will be automatically generated by Hudi. This feature is handy for use cases like log ingestion that do not have a naturally present record key."})]})," ",(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: RECORDKEY_FIELD_NAME"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.partitionpath.field"}),(0,n.jsx)(t.td,{children:"N/A (Optional)"}),(0,n.jsxs)(t.td,{children:["Partition path field. Value to be used at the partitionPath component of HoodieKey. This needs to be specified if a partitioned table is desired. Actual value obtained by invoking .toString()",(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: PARTITIONPATH_FIELD_NAME"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.keygenerator.type"}),(0,n.jsx)(t.td,{children:"SIMPLE"}),(0,n.jsxs)(t.td,{children:["String representing key generator type ",(0,n.jsx)("br",{}),(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: KEYGENERATOR_TYPE"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.keygenerator.class"}),(0,n.jsx)(t.td,{children:"N/A (Optional)"}),(0,n.jsxs)(t.td,{children:["Key generator class, that implements ",(0,n.jsx)(t.code,{children:"org.apache.hudi.keygen.KeyGenerator"})," extract a key out of incoming records. ",(0,n.jsxs)("ul",{children:[(0,n.jsx)("li",{children:"When set, the configured value takes precedence to be in effect and automatic inference is not triggered."}),(0,n.jsxs)("li",{children:["When not configured, if ",(0,n.jsx)(t.code,{children:"hoodie.datasource.write.keygenerator.type"})," is set, the configured value is used else automatic inference is triggered."]}),(0,n.jsx)("li",{children:"In case of auto generated record keys, if neither the key generator class nor type are configured, Hudi will also auto infer the partitioning. for eg, if partition field is not configured, hudi will assume its non-partitioned. "})]})," ",(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: KEYGENERATOR_CLASS_NAME"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.hive_style_partitioning"}),(0,n.jsx)(t.td,{children:"false (Optional)"}),(0,n.jsxs)(t.td,{children:["Flag to indicate whether to use Hive style partitioning. If set true, the names of partition folders follow = format. By default false (the names of partition folders are only partition values)",(0,n.jsx)("br",{}),(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: HIVE_STYLE_PARTITIONING_ENABLE"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.datasource.write.partitionpath.urlencode"}),(0,n.jsx)(t.td,{children:"false (Optional)"}),(0,n.jsxs)(t.td,{children:["Should we url encode the partition path value, before creating the folder structure.",(0,n.jsx)("br",{}),(0,n.jsx)("br",{}),(0,n.jsx)(t.code,{children:"Config Param: URL_ENCODE_PARTITIONING"})]})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["For all advanced configs refer ",(0,n.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations#KEY_GENERATOR",children:"here"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"simple",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/SimpleKeyGenerator.java",children:"SIMPLE"})}),"\n",(0,n.jsx)(t.p,{children:"This is the most commonly used option. Record key is generated from two fields from the schema, one for record key and one for partition path. Values are interpreted as is from dataframe and converted to string."}),"\n",(0,n.jsx)(t.h3,{id:"complex",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/ComplexKeyGenerator.java",children:"COMPLEX"})}),"\n",(0,n.jsxs)(t.p,{children:["Both record key and partition paths comprise one or more than one field by name(combination of multiple fields). Fields\nare expected to be comma separated in the config value. For example ",(0,n.jsx)(t.code,{children:'"Hoodie.datasource.write.recordkey.field" : \u201ccol1,col4\u201d'})]}),"\n",(0,n.jsx)(t.h3,{id:"non_partition",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/NonpartitionedKeyGenerator.java",children:"NON_PARTITION"})}),"\n",(0,n.jsx)(t.p,{children:"If your hudi dataset is not partitioned, you could use this \u201cNonpartitionedKeyGenerator\u201d which will return an empty\npartition for all records. In other words, all records go to the same partition (which is empty \u201c\u201d)"}),"\n",(0,n.jsx)(t.h3,{id:"custom",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/CustomKeyGenerator.java",children:"CUSTOM"})}),"\n",(0,n.jsx)(t.p,{children:"This is a generic implementation of KeyGenerator where users are able to leverage the benefits of SimpleKeyGenerator,\nComplexKeyGenerator and TimestampBasedKeyGenerator all at the same time. One can configure record key and partition\npaths as a single field or a combination of fields."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"hoodie.datasource.write.recordkey.field\nhoodie.datasource.write.partitionpath.field\nhoodie.datasource.write.keygenerator.class=org.apache.hudi.keygen.CustomKeyGenerator\n"})}),"\n",(0,n.jsxs)(t.p,{children:["This keyGenerator is particularly useful if you want to define\ncomplex partition paths involving regular fields and timestamp based fields. It expects value for prop ",(0,n.jsx)(t.code,{children:'"hoodie.datasource.write.partitionpath.field"'}),'\nin a specific format. The format should be "field1',":PartitionKeyType1",",field2",":PartitionKeyType2",'..."']}),"\n",(0,n.jsxs)(t.p,{children:["The complete partition path is created as\n",(0,n.jsx)(t.code,{children:"/ "}),"\nand so on. Each partition key type could either be SIMPLE or TIMESTAMP."]}),"\n",(0,n.jsxs)(t.p,{children:["Example config value: ",(0,n.jsx)(t.code,{children:"\u201cfield_3:simple,field_5:timestamp\u201d"})]}),"\n",(0,n.jsx)(t.p,{children:"RecordKey config value is either single field incase of SimpleKeyGenerator or a comma separate field names if referring to ComplexKeyGenerator.\nExample:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"hoodie.datasource.write.recordkey.field=field1,field2\n"})}),"\n",(0,n.jsxs)(t.p,{children:["This will create your record key in the format ",(0,n.jsx)(t.code,{children:"field1:value1,field2:value2"})," and so on, otherwise you can specify only one field in case of simple record keys. ",(0,n.jsx)(t.code,{children:"CustomKeyGenerator"})," class defines an enum ",(0,n.jsx)(t.code,{children:"PartitionKeyType"})," for configuring partition paths. It can take two possible values - SIMPLE and TIMESTAMP.\nThe value for ",(0,n.jsx)(t.code,{children:"hoodie.datasource.write.partitionpath.field"})," property in case of partitioned tables needs to be provided in the format ",(0,n.jsx)(t.code,{children:"field1:PartitionKeyType1,field2:PartitionKeyType2"})," and so on. For example, if you want to create partition path using 2 fields ",(0,n.jsx)(t.code,{children:"country"})," and ",(0,n.jsx)(t.code,{children:"date"})," where the latter has timestamp based values and needs to be customised in a given format, you can specify the following"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"hoodie.datasource.write.partitionpath.field=country:SIMPLE,date:TIMESTAMP\n"})}),"\n",(0,n.jsxs)(t.p,{children:["This will create the partition path in the format ",(0,n.jsx)(t.code,{children:"/"})," or ",(0,n.jsx)(t.code,{children:"country=/date="})," depending on whether you want hive style partitioning or not."]}),"\n",(0,n.jsx)(t.h3,{id:"timestamp",children:(0,n.jsx)(t.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/TimestampBasedKeyGenerator.java",children:"TIMESTAMP"})}),"\n",(0,n.jsx)(t.p,{children:"This key generator relies on timestamps for the partition field. The field values are interpreted as timestamps\nand not just converted to string while generating partition path value for records. Record key is same as before where it is chosen by\nfield name. Users are expected to set few more configs to use this KeyGenerator."}),"\n",(0,n.jsx)(t.p,{children:"Configs to be set:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Default"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.keygen.timebased.timestamp.type"}),(0,n.jsxs)(t.td,{children:["N/A ",(0,n.jsx)(t.strong,{children:"(Required)"})]}),(0,n.jsx)(t.td,{children:"Required only when the key generator is TimestampBasedKeyGenerator. One of the timestamp types supported(UNIX_TIMESTAMP, DATE_STRING, MIXED, EPOCHMILLISECONDS, SCALAR)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.keygen.timebased.output.dateformat"}),(0,n.jsx)(t.td,{children:'"" (Optional)'}),(0,n.jsxs)(t.td,{children:["Output date format such as ",(0,n.jsx)(t.code,{children:"yyyy-MM-dd'T'HH:mm:ss.SSSZ"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.keygen.timebased.timezone"}),(0,n.jsx)(t.td,{children:'"UTC" (Optional)'}),(0,n.jsxs)(t.td,{children:["Timezone of both input and output timestamp if they are the same, such as ",(0,n.jsx)(t.code,{children:"UTC"}),". Please use ",(0,n.jsx)(t.code,{children:"hoodie.keygen.timebased.input.timezone"})," and ",(0,n.jsx)(t.code,{children:"hoodie.keygen.timebased.output.timezone"})," instead if the input and output timezones are different."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hoodie.keygen.timebased.input.dateformat"}),(0,n.jsx)(t.td,{children:'"" (Optional)'}),(0,n.jsxs)(t.td,{children:["Input date format such as ",(0,n.jsx)(t.code,{children:"yyyy-MM-dd'T'HH:mm:ss.SSSZ"}),"."]})]})]})]}),"\n",(0,n.jsx)(t.p,{children:"Let's go over some example values for TimestampBasedKeyGenerator."}),"\n",(0,n.jsx)(t.h4,{id:"timestamp-is-gmt",children:"Timestamp is GMT"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"EPOCHMILLISECONDS"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyy-MM-dd hh"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timezone"})}),(0,n.jsx)(t.td,{children:'"GMT+8:00"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["Input Field value: \u201c1578283932000L\u201d ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c2020-01-06 12\u201d"]}),"\n",(0,n.jsxs)(t.p,{children:["If input field value is null for some rows. ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c1970-01-01 08\u201d"]}),"\n",(0,n.jsx)(t.h4,{id:"timestamp-is-date_string",children:"Timestamp is DATE_STRING"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyy-MM-dd hh"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timezone"})}),(0,n.jsx)(t.td,{children:'"GMT+8:00"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:['"yyyy-MM-dd hh:mm',":ss",'"']})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["Input field value: \u201c2020-01-06 12:12:12\u201d ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c2020-01-06 12\u201d"]}),"\n",(0,n.jsxs)(t.p,{children:["If input field value is null for some rows. ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c1970-01-01 12:00:00\u201d"]}),"\n",(0,n.jsx)("br",{}),"\n",(0,n.jsx)(t.h4,{id:"scalar-examples",children:"Scalar examples"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"SCALAR"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyy-MM-dd hh"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timezone"})}),(0,n.jsx)(t.td,{children:'"GMT"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.scalar.time.unit"})}),(0,n.jsx)(t.td,{children:'"days"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["Input field value: \u201c20000L\u201d ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c2024-10-04 12\u201d"]}),"\n",(0,n.jsxs)(t.p,{children:["If input field value is null. ",(0,n.jsx)("br",{}),"\nPartition path generated from key generator: \u201c1970-01-02 12\u201d"]}),"\n",(0,n.jsx)(t.h4,{id:"iso8601withmsz-with-single-input-format",children:"ISO8601WithMsZ with Single Input format"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:["\"yyyy-MM-dd'T'HH:mm",":ss",'.SSSZ"']})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat.list.delimiter.regex"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.timezone"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyyMMddHH"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.timezone"})}),(0,n.jsx)(t.td,{children:'"GMT"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:['Input field value: "2020-04-01T13:01:33.428Z" ',(0,n.jsx)("br",{}),'\nPartition path generated from key generator: "2020040113"']}),"\n",(0,n.jsx)(t.h4,{id:"iso8601withmsz-with-multiple-input-formats",children:"ISO8601WithMsZ with Multiple Input formats"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:["\"yyyy-MM-dd'T'HH:mm",":ssZ",",yyyy-MM-dd'T'HH:mm",":ss",'.SSSZ"']})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat.list.delimiter.regex"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.timezone"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyyMMddHH"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.timezone"})}),(0,n.jsx)(t.td,{children:'"UTC"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:['Input field value: "2020-04-01T13:01:33.428Z" ',(0,n.jsx)("br",{}),'\nPartition path generated from key generator: "2020040113"']}),"\n",(0,n.jsx)(t.h4,{id:"iso8601noms-with-offset-using-multiple-input-formats",children:"ISO8601NoMs with offset using multiple input formats"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:["\"yyyy-MM-dd'T'HH:mm",":ssZ",",yyyy-MM-dd'T'HH:mm",":ss",'.SSSZ"']})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat.list.delimiter.regex"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.timezone"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"yyyyMMddHH"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.timezone"})}),(0,n.jsx)(t.td,{children:'"UTC"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:['Input field value: "2020-04-01T13:01:33-',(0,n.jsx)(t.strong,{children:"05:00"}),'" ',(0,n.jsx)("br",{}),'\nPartition path generated from key generator: "2020040118"']}),"\n",(0,n.jsx)(t.h4,{id:"input-as-short-date-string-and-expect-date-in-date-format",children:"Input as short date string and expect date in date format"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Config Name"}),(0,n.jsx)(t.th,{children:"Value"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.timestamp.type"})}),(0,n.jsx)(t.td,{children:'"DATE_STRING"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat"})}),(0,n.jsxs)(t.td,{children:["\"yyyy-MM-dd'T'HH:mm",":ssZ",",yyyy-MM-dd'T'HH:mm",":ss",'.SSSZ,yyyyMMdd"']})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.dateformat.list.delimiter.regex"})}),(0,n.jsx)(t.td,{children:'""'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.input.timezone"})}),(0,n.jsx)(t.td,{children:'"UTC"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.dateformat"})}),(0,n.jsx)(t.td,{children:'"MM/dd/yyyy"'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"hoodie.streamer.keygen.timebased.output.timezone"})}),(0,n.jsx)(t.td,{children:'"UTC"'})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:['Input field value: "20200401" ',(0,n.jsx)("br",{}),'\nPartition path generated from key generator: "04/01/2020"']}),"\n",(0,n.jsx)(t.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,n.jsx)("h3",{children:"Blogs"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://www.onehouse.ai/blog/hudi-metafields-demystified",children:"Hudi metafields demystified"})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://medium.com/@simpsons/primary-key-and-partition-generators-with-apache-hudi-f0e4d71d9d26",children:"Primary key and Partition Generators with Apache Hudi"})}),"\n"]})]})}function c(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},28453:(e,t,i)=>{i.d(t,{R:()=>d,x:()=>a});var r=i(96540);const n={},s=r.createContext(n);function d(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/content/cn/assets/js/ea8366f8.6958b19b.js b/content/cn/assets/js/ea8366f8.4813ce1f.js similarity index 98% rename from content/cn/assets/js/ea8366f8.6958b19b.js rename to content/cn/assets/js/ea8366f8.4813ce1f.js index 15500f724e657..95d8a52a2dcb5 100644 --- a/content/cn/assets/js/ea8366f8.6958b19b.js +++ b/content/cn/assets/js/ea8366f8.4813ce1f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[23700],{49188:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"concurrency_control","title":"Concurrency Control","description":"Concurrency control defines how different writers/readers/table services coordinate access to a Hudi table. Hudi ensures atomic writes, by way of publishing commits atomically to the timeline,","source":"@site/docs/concurrency_control.md","sourceDirName":".","slug":"/concurrency_control","permalink":"/cn/docs/next/concurrency_control","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/concurrency_control.md","tags":[],"version":"current","frontMatter":{"title":"Concurrency Control","summary":"In this page, we will discuss how to perform concurrent writes to Hudi Tables.","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4,"last_modified_at":"2021-03-19T19:59:57.000Z"},"sidebar":"docs","previous":{"title":"Indexes","permalink":"/cn/docs/next/indexes"},"next":{"title":"Schema Evolution","permalink":"/cn/docs/next/schema_evolution"}}');var r=t(74848),o=t(28453);const s={title:"Concurrency Control",summary:"In this page, we will discuss how to perform concurrent writes to Hudi Tables.",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4,last_modified_at:new Date("2021-03-19T19:59:57.000Z")},a=void 0,c={},l=[{value:"Distributed Locking",id:"distributed-locking",level:2},{value:"Zookeeper based",id:"zookeeper-based",level:4},{value:"HiveMetastore based",id:"hivemetastore-based",level:4},{value:"Amazon DynamoDB based",id:"amazon-dynamodb-based",level:4},{value:"FileSystem based (not for production use)",id:"filesystem-based-not-for-production-use",level:4},{value:"Simple Single writer + table services",id:"simple-single-writer--table-services",level:2},{value:"Inline table services",id:"inline-table-services",level:3},{value:"Async table services",id:"async-table-services",level:3},{value:"Full-on Multi-writer + Async table services",id:"full-on-multi-writer--async-table-services",level:2},{value:"Multi Writer Guarantees",id:"multi-writer-guarantees",level:4},{value:"Non-Blocking Concurrency Control",id:"non-blocking-concurrency-control",level:2},{value:"Early conflict Detection",id:"early-conflict-detection",level:2},{value:"Enabling Multi Writing",id:"enabling-multi-writing",level:2},{value:"Multi Writing via Hudi Streamer",id:"multi-writing-via-hudi-streamer",level:3},{value:"Multi Writing via Spark Datasource Writer",id:"multi-writing-via-spark-datasource-writer",level:3},{value:"Disabling Multi Writing",id:"disabling-multi-writing",level:2},{value:"OCC Best Practices",id:"occ-best-practices",level:2},{value:"Caveats",id:"caveats",level:2},{value:"Related Resources",id:"related-resources",level:2}];function d(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",mdxAdmonitionTitle:"mdxAdmonitionTitle",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(i.p,{children:["Concurrency control defines how different writers/readers/table services coordinate access to a Hudi table. Hudi ensures atomic writes, by way of publishing commits atomically to the timeline,\nstamped with an instant time that denotes the time at which the action is deemed to have occurred. Unlike general purpose file version control, Hudi draws clear distinction between\nwriter processes that issue ",(0,r.jsx)(i.a,{href:"write_operations",children:"write operations"})," and table services that (re)write data/metadata to optimize/perform bookkeeping and\nreaders (that execute queries and read data)."]}),"\n",(0,r.jsx)(i.p,{children:"Hudi provides"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Snapshot isolation"})," between all three types of processes, meaning they all operate on a consistent snapshot of the table."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Optimistic concurrency control (OCC)"})," between writers to provide standard relational database semantics."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Multiversion Concurrency Control (MVCC)"})," based concurrency control between writers and table-services and between different table services."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Non-blocking Concurrency Control (NBCC)"})," between writers, to provide streaming semantics and avoiding live-locks/starvation between writers."]}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"In this section, we will discuss the different concurrency controls supported by Hudi and how they are leveraged to provide flexible deployment models for single and multiple writer scenarios.\nWe\u2019ll also describe ways to ingest data into a Hudi Table from multiple writers using different writers, like Hudi Streamer, Hudi datasource, Spark Structured Streaming and Spark SQL."}),"\n",(0,r.jsxs)(i.admonition,{type:"note",children:[(0,r.jsx)(i.p,{children:"If there is only one process performing writing AND async/inline table services on the table, you can\navoid the overhead of a distributed lock requirement by configuring the in process lock provider."}),(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-properties",children:"hoodie.write.lock.provider=org.apache.hudi.client.transaction.lock.InProcessLockProvider\n"})})]}),"\n",(0,r.jsx)(i.h2,{id:"distributed-locking",children:"Distributed Locking"}),"\n",(0,r.jsxs)(i.p,{children:["A pre-requisite for distributed co-ordination in Hudi, like many other distributed database systems is a distributed lock provider, that different processes can use to plan, schedule and\nexecute actions on the Hudi timeline in a concurrent fashion. Locks are also used to ",(0,r.jsx)(i.a,{href:"timeline#truetime-generation",children:"generate TrueTime"}),", as discussed before."]}),"\n",(0,r.jsx)(i.p,{children:"External locking is typically used in conjunction with optimistic concurrency control\nbecause it provides a way to prevent conflicts that might occur when two or more transactions (commits in our case) attempt to modify the same resource concurrently.\nWhen a transaction attempts to modify a resource that is currently locked by another transaction, it must wait until the lock is released before proceeding."}),"\n",(0,r.jsx)(i.p,{children:"In case of multi-writing in Hudi, the locks are acquired on the Hudi table for a very short duration during specific phases (such as just before committing the writes or before scheduling table services) instead of locking for the entire span of time. This approach allows multiple writers to work on the same table simultaneously, increasing concurrency and avoids conflicts."}),"\n",(0,r.jsxs)(i.p,{children:["There are 4 different lock providers that require different configurations to be set. Please refer to comprehensive locking configs ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/next/configurations#LOCK",children:"here"}),"."]}),"\n",(0,r.jsx)(i.h4,{id:"zookeeper-based",children:"Zookeeper based"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.provider=org.apache.hudi.client.transaction.lock.ZookeeperBasedLockProvider\n"})}),"\n",(0,r.jsx)(i.p,{children:"Following are the basic configs required to setup this lock provider:"}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Config Name"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.zookeeper.base_path"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["The base path on Zookeeper under which to create lock related ZNodes. This should be same for all concurrent writers to the same table",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: ZK_BASE_PATH"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.zookeeper.port"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["Zookeeper port to connect to.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: ZK_PORT"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.zookeeper.url"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["Zookeeper URL to connect to.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: ZK_CONNECT_URL"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]})]})]}),"\n",(0,r.jsx)(i.h4,{id:"hivemetastore-based",children:"HiveMetastore based"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.provider=org.apache.hudi.hive.transaction.lock.HiveMetastoreBasedLockProvider\n"})}),"\n",(0,r.jsx)(i.p,{children:"Following are the basic configs required to setup this lock provider:"}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Config Name"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.hivemetastore.database"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["For Hive based lock provider, the Hive database to acquire lock against",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: HIVE_DATABASE_NAME"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.hivemetastore.table"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["For Hive based lock provider, the Hive table to acquire lock against",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: HIVE_TABLE_NAME"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]})]})]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.code,{children:"The HiveMetastore URI's are picked up from the hadoop configuration file loaded during runtime."})}),"\n",(0,r.jsx)(i.h4,{id:"amazon-dynamodb-based",children:"Amazon DynamoDB based"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.provider=org.apache.hudi.aws.transaction.lock.DynamoDBBasedLockProvider\n"})}),"\n",(0,r.jsxs)(i.p,{children:["Amazon DynamoDB based lock provides a simple way to support multi writing across different clusters. You can refer to the\n",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations#DynamoDB-based-Locks-Configurations",children:"DynamoDB based Locks Configurations"}),"\nsection for the details of each related configuration knob. Following are the basic configs required to setup this lock provider:"]}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Config Name"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"})]})}),(0,r.jsx)(i.tbody,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.dynamodb.endpoint_url"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["For DynamoDB based lock provider, the url endpoint used for Amazon DynamoDB service. Useful for development with a local dynamodb instance.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: DYNAMODB_ENDPOINT_URL"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.10.1"})]})]})})]}),"\n",(0,r.jsxs)(i.p,{children:["For advanced configs refer ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/next/configurations#DynamoDB-based-Locks-Configurations",children:"here"})]}),"\n",(0,r.jsxs)(i.p,{children:["When using the DynamoDB-based lock provider, the name of the DynamoDB table acting as the lock table for Hudi is\nspecified by the config ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.table"}),". This DynamoDB table is automatically created by Hudi, so you\ndon't have to create the table yourself. If you want to use an existing DynamoDB table, make sure that an attribute with\nthe name ",(0,r.jsx)(i.code,{children:"key"})," is present in the table. The ",(0,r.jsx)(i.code,{children:"key"})," attribute should be the partition key of the DynamoDB table. The\nconfig ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.partition_key"})," specifies the value to put for the ",(0,r.jsx)(i.code,{children:"key"})," attribute (not the attribute\nname), which is used for the lock on the same table. By default, ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.partition_key"})," is set to\nthe table name, so that multiple writers writing to the same table share the same lock. If you customize the name, make\nsure it's the same across multiple writers."]}),"\n",(0,r.jsx)(i.p,{children:"Also, to set up the credentials for accessing AWS resources, customers can pass the following props to Hudi jobs:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.aws.access.key\nhoodie.aws.secret.key\nhoodie.aws.session.token\n"})}),"\n",(0,r.jsxs)(i.p,{children:["If not configured, Hudi falls back to use ",(0,r.jsx)(i.a,{href:"https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/DefaultAWSCredentialsProviderChain.html",children:"DefaultAWSCredentialsProviderChain"}),"."]}),"\n",(0,r.jsx)(i.p,{children:"IAM policy for your service instance will need to add the following permissions:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-json",children:'{\n "Sid":"DynamoDBLocksTable",\n "Effect": "Allow",\n "Action": [\n "dynamodb:CreateTable",\n "dynamodb:DeleteItem",\n "dynamodb:DescribeTable",\n "dynamodb:GetItem",\n "dynamodb:PutItem",\n "dynamodb:Scan",\n "dynamodb:UpdateItem"\n ],\n "Resource": "arn:${Partition}:dynamodb:${Region}:${Account}:table/${TableName}"\n}\n'})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.code,{children:"TableName"})," : same as ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.partition_key"})]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.code,{children:"Region"}),": same as ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.region"})]}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"AWS SDK dependencies are not bundled with Hudi from v0.10.x and will need to be added to your classpath.\nAdd the following Maven packages (check the latest versions at time of install):"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"com.amazonaws:dynamodb-lock-client\ncom.amazonaws:aws-java-sdk-dynamodb\ncom.amazonaws:aws-java-sdk-core\n"})}),"\n",(0,r.jsx)(i.h4,{id:"filesystem-based-not-for-production-use",children:"FileSystem based (not for production use)"}),"\n",(0,r.jsx)(i.p,{children:"FileSystem based lock provider supports multiple writers cross different jobs/applications based on atomic create/delete operations of the underlying filesystem."}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.provider=org.apache.hudi.client.transaction.lock.FileSystemBasedLockProvider\n"})}),"\n",(0,r.jsxs)(i.p,{children:["When using the FileSystem based lock provider, by default, the lock file will store into ",(0,r.jsx)(i.code,{children:"hoodie.base.path"}),"+",(0,r.jsx)(i.code,{children:"/.hoodie/lock"}),". You may use a custom folder to store the lock file by specifying ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.filesystem.path"}),"."]}),"\n",(0,r.jsxs)(i.p,{children:["In case the lock cannot release during job crash, you can set ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.filesystem.expire"})," (lock will never expire by default) to a desired expire time in minutes. You may also delete lock file manually in such situation."]}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsx)(i.p,{children:"FileSystem based lock provider is not supported with cloud storage like S3 or GCS."})}),"\n",(0,r.jsx)(i.h2,{id:"simple-single-writer--table-services",children:"Simple Single writer + table services"}),"\n",(0,r.jsx)(i.p,{children:"Data lakehouse pipelines tend to be predominantly single writer, with the most common need for distributed co-ordination on a table coming from table management. For e.g. a Apache Flink\njob producing fast writes into a table, requiring regular file-size management or cleaning. Hudi's storage engine and platform tools provide a lot of support for such common scenarios."}),"\n",(0,r.jsx)(i.h3,{id:"inline-table-services",children:"Inline table services"}),"\n",(0,r.jsx)(i.p,{children:"This is the simplest form of concurrency, meaning there is no concurrency at all in the write processes. In this model, Hudi eliminates the need for concurrency control and maximizes throughput by supporting these table services out-of-box and running inline after every write to the table. Execution plans are idempotent, persisted to the timeline and auto-recover from failures. For most simple use-cases, this means just writing is sufficient to get a well-managed table that needs no concurrency control."}),"\n",(0,r.jsxs)(i.p,{children:["There is no actual concurrent writing in this model. ",(0,r.jsx)(i.strong,{children:"MVCC"})," is leveraged to provide snapshot isolation guarantees between ingestion writer and multiple readers and also between multiple table service writers and readers. Writes to the table either from ingestion or from table services produce versioned data that are available to readers only after the writes are committed. Until then, readers can access only the previous version of the data."]}),"\n",(0,r.jsx)(i.p,{children:"A single writer with all table services such as cleaning, clustering, compaction, etc can be configured to be inline (such as Hudi Streamer sync-once mode and Spark Datasource with default configs) without any additional configs."}),"\n",(0,r.jsx)(i.h3,{id:"async-table-services",children:"Async table services"}),"\n",(0,r.jsxs)(i.p,{children:["Hudi provides the option of running the table services in an async fashion, where most of the heavy lifting (e.g actually rewriting the columnar data by compaction service) is done asynchronously. In this model, the async deployment eliminates any repeated wasteful retries and optimizes the table using clustering techniques while a single writer consumes the writes to the table without having to be blocked by such table services. This model avoids the need for taking an ",(0,r.jsx)(i.a,{href:"#external-locking-and-lock-providers",children:"external lock"})," to control concurrency and avoids the need to separately orchestrate and monitor offline table services jobs.."]}),"\n",(0,r.jsxs)(i.p,{children:["A single writer along with async table services runs in the same process. For example, you can have a Hudi Streamer in continuous mode write to a MOR table using async compaction; you can use Spark Streaming (where ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/compaction",children:"compaction"})," is async by default), and you can use Flink streaming or your own job setup and enable async table services inside the same writer."]}),"\n",(0,r.jsxs)(i.p,{children:["Hudi leverages ",(0,r.jsx)(i.strong,{children:"MVCC"})," in this model to support running any number of table service jobs concurrently, without any concurrency conflict. This is made possible by ensuring Hudi 's ingestion writer and async table services coordinate among themselves to ensure no conflicts and avoid race conditions. The same single write guarantees described in Model A above can be achieved in this model as well.\nWith this model users don't need to spin up different spark jobs and manage the orchestration among it. For larger deployments, this model can ease the operational burden significantly while getting the table services running without blocking the writers."]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Single Writer Guarantees"})}),"\n",(0,r.jsxs)(i.p,{children:["In this model, the following are the guarantees on ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/write_operations/",children:"write operations"})," to expect:"]}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"UPSERT Guarantee"}),": The target table will NEVER show duplicates."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"INSERT Guarantee"}),": The target table wilL NEVER have duplicates if dedup: ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations#hoodiedatasourcewriteinsertdropduplicates",children:(0,r.jsx)(i.code,{children:"hoodie.datasource.write.insert.drop.duplicates"})})," & ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations/#hoodiecombinebeforeinsert",children:(0,r.jsx)(i.code,{children:"hoodie.combine.before.insert"})}),", is enabled."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"BULK_INSERT Guarantee"}),": The target table will NEVER have duplicates if dedup: ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations#hoodiedatasourcewriteinsertdropduplicates",children:(0,r.jsx)(i.code,{children:"hoodie.datasource.write.insert.drop.duplicates"})})," & ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations/#hoodiecombinebeforeinsert",children:(0,r.jsx)(i.code,{children:"hoodie.combine.before.insert"})}),", is enabled."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"INCREMENTAL QUERY Guarantee"}),": Data consumption and checkpoints are NEVER out of order."]}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"full-on-multi-writer--async-table-services",children:"Full-on Multi-writer + Async table services"}),"\n",(0,r.jsxs)(i.p,{children:["Hudi has introduced a new concurrency mode ",(0,r.jsx)(i.code,{children:"NON_BLOCKING_CONCURRENCY_CONTROL"}),", where unlike OCC, multiple writers can\noperate on the table with non-blocking conflict resolution. The writers can write into the same file group with the\nconflicts resolved automatically by the query reader and the compactor. The new concurrency mode is currently\navailable for preview in version 1.0.0-beta only. You can read more about it under section ",(0,r.jsx)(i.a,{href:"#model-c-multi-writer",children:"Model C: Multi-writer"}),"."]}),"\n",(0,r.jsx)(i.p,{children:"It is not always possible to serialize all write operations to a table (such as UPSERT, INSERT or DELETE) into the same write process and therefore, multi-writing capability may be required.\nIn multi-writing, disparate distributed processes run in parallel or overlapping time windows to write to the same table. In such cases, an external locking mechanism is a must to safely\ncoordinate concurrent accesses. Here are few different scenarios that would all fall under multi-writing:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Multiple ingestion writers to the same table",":For"," instance, two Spark Datasource writers working on different sets of partitions form a source kafka topic."]}),"\n",(0,r.jsx)(i.li,{children:"Multiple ingestion writers to the same table, including one writer with async table services: For example, a Hudi Streamer with async compaction for regular ingestion & a Spark Datasource writer for backfilling."}),"\n",(0,r.jsx)(i.li,{children:"A single ingestion writer and a separate compaction (HoodieCompactor) or clustering (HoodieClusteringJob) job apart from the ingestion writer: This is considered as multi-writing as they are not running in the same process."}),"\n"]}),"\n",(0,r.jsxs)(i.p,{children:["Hudi's concurrency model intelligently differentiates actual writing to the table from table services that manage or optimize the table. Hudi offers similar ",(0,r.jsx)(i.strong,{children:"optimistic concurrency control across multiple writers"}),", but ",(0,r.jsx)(i.strong,{children:"table services can still execute completely lock-free and async"})," as long as they run in the same process as one of the writers.\nFor multi-writing, Hudi leverages file level optimistic concurrency control(OCC). For example, when two writers write to non overlapping files, both writes are allowed to succeed. However, when the writes from different writers overlap (touch the same set of files), only one of them will succeed. Please note that this feature is currently experimental and requires external lock providers to acquire locks briefly at critical sections during the write. More on lock providers below."]}),"\n",(0,r.jsx)(i.h4,{id:"multi-writer-guarantees",children:"Multi Writer Guarantees"}),"\n",(0,r.jsx)(i.p,{children:"With multiple writers using OCC, these are the write guarantees to expect:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"UPSERT Guarantee"}),": The target table will NEVER show duplicates."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"INSERT Guarantee"}),": The target table MIGHT have duplicates even if dedup is enabled."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"BULK_INSERT Guarantee"}),": The target table MIGHT have duplicates even if dedup is enabled."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"INCREMENTAL PULL Guarantee"}),": Data consumption and checkpoints are NEVER out of order. If there are inflight commits\n(due to multi-writing), incremental queries will not expose the completed commits following the inflight commits."]}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"non-blocking-concurrency-control",children:"Non-Blocking Concurrency Control"}),"\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.code,{children:"NON_BLOCKING_CONCURRENCY_CONTROL"}),", offers the same set of guarantees as mentioned in the case of OCC but without\nexplicit locks for serializing the writes. Lock is only needed for writing the commit metadata to the Hudi timeline. The\ncompletion time for the commits reflects the serialization order and file slicing is done based on completion time.\nMultiple writers can operate on the table with non-blocking conflict resolution. The writers can write into the same\nfile group with the conflicts resolved automatically by the query reader and the compactor. The new concurrency mode is\ncurrently available for preview in version 1.0.0-beta only with the caveat that conflict resolution is not supported yet\nbetween clustering and ingestion. It works for compaction and ingestion, and we can see an example of that with Flink\nwriters ",(0,r.jsx)(i.a,{href:"sql_dml#non-blocking-concurrency-control-experimental",children:"here"}),"."]}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.code,{children:"NON_BLOCKING_CONCURRENCY_CONTROL"})," between ingestion writer and table service writer is not yet supported for clustering.\nPlease use ",(0,r.jsx)(i.code,{children:"OPTIMISTIC_CONCURRENCY_CONTROL"})," for clustering."]})}),"\n",(0,r.jsx)(i.h2,{id:"early-conflict-detection",children:"Early conflict Detection"}),"\n",(0,r.jsx)(i.p,{children:"Multi writing using OCC allows multiple writers to concurrently write and atomically commit to the Hudi table if there is no overlapping data file to be written, to guarantee data consistency, integrity and correctness. Prior to 0.13.0 release, as the OCC (optimistic concurrency control) name suggests, each writer will optimistically proceed with ingestion and towards the end, just before committing will go about conflict resolution flow to deduce overlapping writes and abort one if need be. But this could result in lot of compute waste, since the aborted commit will have to retry from beginning. With 0.13.0, Hudi introduced early conflict deduction leveraging markers in hudi to deduce the conflicts eagerly and abort early in the write lifecyle instead of doing it in the end. For large scale deployments, this might avoid wasting lot o compute resources if there could be overlapping concurrent writers."}),"\n",(0,r.jsxs)(i.p,{children:["To improve the concurrency control, the ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/releases/release-0.13.0#early-conflict-detection-for-multi-writer",children:"0.13.0 release"})," introduced a new feature, early conflict detection in OCC, to detect the conflict during the data writing phase and abort the writing early on once a conflict is detected, using Hudi's marker mechanism. Hudi can now stop a conflicting writer much earlier because of the early conflict detection and release computing resources necessary to cluster, improving resource utilization."]}),"\n",(0,r.jsxs)(i.p,{children:["By default, this feature is turned off. To try this out, a user needs to set ",(0,r.jsx)(i.code,{children:"hoodie.write.concurrency.early.conflict.detection.enable"})," to true, when using OCC for concurrency control (Refer ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/next/configurations#Write-Configurations-advanced-configs",children:"configs"})," page for all relevant configs)."]}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsxs)(i.p,{children:["Early conflict Detection in OCC is an ",(0,r.jsx)(i.strong,{children:"EXPERIMENTAL"})," feature"]})}),"\n",(0,r.jsx)(i.h2,{id:"enabling-multi-writing",children:"Enabling Multi Writing"}),"\n",(0,r.jsx)(i.p,{children:"The following properties are needed to be set appropriately to turn on optimistic concurrency control to achieve multi writing."}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.concurrency.mode=optimistic_concurrency_control\nhoodie.write.lock.provider=\nhoodie.cleaner.policy.failed.writes=LAZY\n"})}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Config Name"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.concurrency.mode"}),(0,r.jsx)(i.td,{children:"SINGLE_WRITER (Optional)"}),(0,r.jsxs)(i.td,{children:[(0,r.jsx)("u",{children:(0,r.jsx)(i.a,{href:"https://github.com/apache/hudi/blob/00ece7bce0a4a8d0019721a28049723821e01842/hudi-common/src/main/java/org/apache/hudi/common/model/WriteConcurrencyMode.java",children:"Concurrency modes"})})," for write operations.",(0,r.jsx)("br",{}),"Possible values:",(0,r.jsx)("br",{}),(0,r.jsxs)("ul",{children:[(0,r.jsxs)("li",{children:[(0,r.jsx)(i.code,{children:"SINGLE_WRITER"}),": Only one active writer to the table. Maximizes throughput."]}),(0,r.jsxs)("li",{children:[(0,r.jsx)(i.code,{children:"OPTIMISTIC_CONCURRENCY_CONTROL"}),": Multiple writers can operate on the table with lazy conflict resolution using locks. This means that only one writer succeeds if multiple writers write to the same file group."]}),(0,r.jsxs)("li",{children:[(0,r.jsx)(i.code,{children:"NON_BLOCKING_CONCURRENCY_CONTROL"}),": Multiple writers can operate on the table with non-blocking conflict resolution. The writers can write into the same file group with the conflicts resolved automatically by the query reader and the compactor."]})]}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: WRITE_CONCURRENCY_MODE"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.provider"}),(0,r.jsx)(i.td,{children:"org.apache.hudi.client.transaction.lock.ZookeeperBasedLockProvider (Optional)"}),(0,r.jsxs)(i.td,{children:["Lock provider class name, user can provide their own implementation of LockProvider which should be subclass of org.apache.hudi.common.lock.LockProvider",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: LOCK_PROVIDER_CLASS_NAME"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.cleaner.policy.failed.writes"}),(0,r.jsx)(i.td,{children:"EAGER (Optional)"}),(0,r.jsxs)(i.td,{children:["org.apache.hudi.common.model.HoodieFailedWritesCleaningPolicy: Policy that controls how to clean up failed writes. Hudi will delete any files written by failed writes to re-claim space. EAGER(default): Clean failed writes inline after every write operation. LAZY: Clean failed writes lazily after heartbeat timeout when the cleaning service runs. This policy is required when multi-writers are enabled. NEVER: Never clean failed writes.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: FAILED_WRITES_CLEANER_POLICY"})]})]})]})]}),"\n",(0,r.jsx)(i.h3,{id:"multi-writing-via-hudi-streamer",children:"Multi Writing via Hudi Streamer"}),"\n",(0,r.jsxs)(i.p,{children:["The ",(0,r.jsx)(i.code,{children:"HoodieStreamer"})," utility (part of hudi-utilities-slim-bundle) provides ways to ingest from different sources such as DFS or Kafka, with the following capabilities."]}),"\n",(0,r.jsx)(i.p,{children:"Using optimistic_concurrency_control via Hudi Streamer requires adding the above configs to the properties file that can be passed to the\njob. For example below, adding the configs to kafka-source.properties file and passing them to Hudi Streamer will enable optimistic concurrency.\nA Hudi Streamer job can then be triggered as follows:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-java",children:'[hoodie]$ spark-submit \\\n --jars "packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar,packaging/hudi-spark-bundle/target/hudi-spark3.5-bundle_2.12-1.0.0.jar" \\\n --class org.apache.hudi.utilities.streamer.HoodieStreamer `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` \\\n --props file://${PWD}/hudi-utilities/src/test/resources/streamer-config/kafka-source.properties \\\n --schemaprovider-class org.apache.hudi.utilities.schema.SchemaRegistryProvider \\\n --source-class org.apache.hudi.utilities.sources.AvroKafkaSource \\\n --source-ordering-field impresssiontime \\\n --target-base-path file:\\/\\/\\/tmp/hudi-streamer-op \\ \n --target-table tableName \\\n --op BULK_INSERT\n'})}),"\n",(0,r.jsx)(i.h3,{id:"multi-writing-via-spark-datasource-writer",children:"Multi Writing via Spark Datasource Writer"}),"\n",(0,r.jsxs)(i.p,{children:["The ",(0,r.jsx)(i.code,{children:"hudi-spark"})," module offers the DataSource API to write (and read) a Spark DataFrame into a Hudi table."]}),"\n",(0,r.jsx)(i.p,{children:"Following is an example of how to use optimistic_concurrency_control via spark datasource"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-java",children:'inputDF.write.format("hudi")\n .options(getQuickstartWriteConfigs)\n .option("hoodie.datasource.write.precombine.field", "ts")\n .option("hoodie.cleaner.policy.failed.writes", "LAZY")\n .option("hoodie.write.concurrency.mode", "optimistic_concurrency_control")\n .option("hoodie.write.lock.zookeeper.url", "zookeeper")\n .option("hoodie.write.lock.zookeeper.port", "2181")\n .option("hoodie.write.lock.zookeeper.base_path", "/test")\n .option("hoodie.datasource.write.recordkey.field", "uuid")\n .option("hoodie.datasource.write.partitionpath.field", "partitionpath")\n .option("hoodie.table.name", tableName)\n .mode(Overwrite)\n .save(basePath)\n'})}),"\n",(0,r.jsx)(i.h2,{id:"disabling-multi-writing",children:"Disabling Multi Writing"}),"\n",(0,r.jsx)(i.p,{children:"Remove the following settings that were used to enable multi-writer or override with default values."}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.concurrency.mode=single_writer\nhoodie.cleaner.policy.failed.writes=EAGER\n"})}),"\n",(0,r.jsx)(i.h2,{id:"occ-best-practices",children:"OCC Best Practices"}),"\n",(0,r.jsx)(i.p,{children:"Concurrent Writing to Hudi tables requires acquiring a lock with one of the lock providers mentioned above. Due to several reasons you might want to configure retries to allow your application to acquire the lock."}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsx)(i.li,{children:"Network connectivity or excessive load on servers increasing time for lock acquisition resulting in timeouts"}),"\n",(0,r.jsx)(i.li,{children:"Running a large number of concurrent jobs that are writing to the same hudi table can result in contention during lock acquisition can cause timeouts"}),"\n",(0,r.jsx)(i.li,{children:"In some scenarios of conflict resolution, Hudi commit operations might take upto 10's of seconds while the lock is being held. This can result in timeouts for other jobs waiting to acquire a lock."}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"Set the correct native lock provider client retries."}),"\n",(0,r.jsxs)(i.admonition,{type:"note",children:[(0,r.jsx)(i.mdxAdmonitionTitle,{}),(0,r.jsx)(i.p,{children:"Please note that sometimes these settings are set on the server once and all clients inherit the same configs. Please check your settings before enabling optimistic concurrency."})]}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.wait_time_ms\nhoodie.write.lock.num_retries\n"})}),"\n",(0,r.jsx)(i.p,{children:"Set the correct hudi client retries for Zookeeper & HiveMetastore. This is useful in cases when native client retry settings cannot be changed. Please note that these retries will happen in addition to any native client retries that you may have set."}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.client.wait_time_ms\nhoodie.write.lock.client.num_retries\n"})}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.em,{children:"Setting the right values for these depends on a case by case basis; some defaults have been provided for general cases."})}),"\n",(0,r.jsx)(i.h2,{id:"caveats",children:"Caveats"}),"\n",(0,r.jsxs)(i.p,{children:["If you are using the ",(0,r.jsx)(i.code,{children:"WriteClient"})," API, please note that multiple writes to the table need to be initiated from 2 different instances of the write client.\nIt is ",(0,r.jsx)(i.strong,{children:"NOT"})," recommended to use the same instance of the write client to perform multi writing."]}),"\n",(0,r.jsx)(i.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,r.jsx)("h3",{children:"Videos"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://youtu.be/JP0orl9_0yQ",children:"Hands on Lab with using DynamoDB as lock table for Apache Hudi Data Lakes"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/blog/2024/12/06/non-blocking-concurrency-control",children:"Non Blocking Concurrency Control Flink Demo"})}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},28453:(e,i,t)=>{t.d(i,{R:()=>s,x:()=>a});var n=t(96540);const r={},o=n.createContext(r);function s(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[23700],{49188:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"concurrency_control","title":"Concurrency Control","description":"Concurrency control defines how different writers/readers/table services coordinate access to a Hudi table. Hudi ensures atomic writes, by way of publishing commits atomically to the timeline,","source":"@site/docs/concurrency_control.md","sourceDirName":".","slug":"/concurrency_control","permalink":"/cn/docs/next/concurrency_control","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/concurrency_control.md","tags":[],"version":"current","frontMatter":{"title":"Concurrency Control","summary":"In this page, we will discuss how to perform concurrent writes to Hudi Tables.","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4,"last_modified_at":"2021-03-19T19:59:57.000Z"},"sidebar":"docs","previous":{"title":"Indexes","permalink":"/cn/docs/next/indexes"},"next":{"title":"Schema Evolution","permalink":"/cn/docs/next/schema_evolution"}}');var r=t(74848),o=t(28453);const s={title:"Concurrency Control",summary:"In this page, we will discuss how to perform concurrent writes to Hudi Tables.",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4,last_modified_at:new Date("2021-03-19T19:59:57.000Z")},a=void 0,c={},l=[{value:"Distributed Locking",id:"distributed-locking",level:2},{value:"Zookeeper based",id:"zookeeper-based",level:4},{value:"HiveMetastore based",id:"hivemetastore-based",level:4},{value:"Amazon DynamoDB based",id:"amazon-dynamodb-based",level:4},{value:"FileSystem based (not for production use)",id:"filesystem-based-not-for-production-use",level:4},{value:"Simple Single writer + table services",id:"simple-single-writer--table-services",level:2},{value:"Inline table services",id:"inline-table-services",level:3},{value:"Async table services",id:"async-table-services",level:3},{value:"Full-on Multi-writer + Async table services",id:"full-on-multi-writer--async-table-services",level:2},{value:"Multi Writer Guarantees",id:"multi-writer-guarantees",level:4},{value:"Non-Blocking Concurrency Control",id:"non-blocking-concurrency-control",level:2},{value:"Early conflict Detection",id:"early-conflict-detection",level:2},{value:"Enabling Multi Writing",id:"enabling-multi-writing",level:2},{value:"Multi Writing via Hudi Streamer",id:"multi-writing-via-hudi-streamer",level:3},{value:"Multi Writing via Spark Datasource Writer",id:"multi-writing-via-spark-datasource-writer",level:3},{value:"Disabling Multi Writing",id:"disabling-multi-writing",level:2},{value:"OCC Best Practices",id:"occ-best-practices",level:2},{value:"Caveats",id:"caveats",level:2},{value:"Related Resources",id:"related-resources",level:2}];function d(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",mdxAdmonitionTitle:"mdxAdmonitionTitle",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(i.p,{children:["Concurrency control defines how different writers/readers/table services coordinate access to a Hudi table. Hudi ensures atomic writes, by way of publishing commits atomically to the timeline,\nstamped with an instant time that denotes the time at which the action is deemed to have occurred. Unlike general purpose file version control, Hudi draws clear distinction between\nwriter processes that issue ",(0,r.jsx)(i.a,{href:"write_operations",children:"write operations"})," and table services that (re)write data/metadata to optimize/perform bookkeeping and\nreaders (that execute queries and read data)."]}),"\n",(0,r.jsx)(i.p,{children:"Hudi provides"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Snapshot isolation"})," between all three types of processes, meaning they all operate on a consistent snapshot of the table."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Optimistic concurrency control (OCC)"})," between writers to provide standard relational database semantics."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Multiversion Concurrency Control (MVCC)"})," based concurrency control between writers and table-services and between different table services."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Non-blocking Concurrency Control (NBCC)"})," between writers, to provide streaming semantics and avoiding live-locks/starvation between writers."]}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"In this section, we will discuss the different concurrency controls supported by Hudi and how they are leveraged to provide flexible deployment models for single and multiple writer scenarios.\nWe\u2019ll also describe ways to ingest data into a Hudi Table from multiple writers using different writers, like Hudi Streamer, Hudi datasource, Spark Structured Streaming and Spark SQL."}),"\n",(0,r.jsxs)(i.admonition,{type:"note",children:[(0,r.jsx)(i.p,{children:"If there is only one process performing writing AND async/inline table services on the table, you can\navoid the overhead of a distributed lock requirement by configuring the in process lock provider."}),(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-properties",children:"hoodie.write.lock.provider=org.apache.hudi.client.transaction.lock.InProcessLockProvider\n"})})]}),"\n",(0,r.jsx)(i.h2,{id:"distributed-locking",children:"Distributed Locking"}),"\n",(0,r.jsxs)(i.p,{children:["A pre-requisite for distributed co-ordination in Hudi, like many other distributed database systems is a distributed lock provider, that different processes can use to plan, schedule and\nexecute actions on the Hudi timeline in a concurrent fashion. Locks are also used to ",(0,r.jsx)(i.a,{href:"timeline#truetime-generation",children:"generate TrueTime"}),", as discussed before."]}),"\n",(0,r.jsx)(i.p,{children:"External locking is typically used in conjunction with optimistic concurrency control\nbecause it provides a way to prevent conflicts that might occur when two or more transactions (commits in our case) attempt to modify the same resource concurrently.\nWhen a transaction attempts to modify a resource that is currently locked by another transaction, it must wait until the lock is released before proceeding."}),"\n",(0,r.jsx)(i.p,{children:"In case of multi-writing in Hudi, the locks are acquired on the Hudi table for a very short duration during specific phases (such as just before committing the writes or before scheduling table services) instead of locking for the entire span of time. This approach allows multiple writers to work on the same table simultaneously, increasing concurrency and avoids conflicts."}),"\n",(0,r.jsxs)(i.p,{children:["There are 4 different lock providers that require different configurations to be set. Please refer to comprehensive locking configs ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/next/configurations#LOCK",children:"here"}),"."]}),"\n",(0,r.jsx)(i.h4,{id:"zookeeper-based",children:"Zookeeper based"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.provider=org.apache.hudi.client.transaction.lock.ZookeeperBasedLockProvider\n"})}),"\n",(0,r.jsx)(i.p,{children:"Following are the basic configs required to setup this lock provider:"}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Config Name"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.zookeeper.base_path"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["The base path on Zookeeper under which to create lock related ZNodes. This should be same for all concurrent writers to the same table",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: ZK_BASE_PATH"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.zookeeper.port"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["Zookeeper port to connect to.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: ZK_PORT"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.zookeeper.url"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["Zookeeper URL to connect to.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: ZK_CONNECT_URL"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]})]})]}),"\n",(0,r.jsx)(i.h4,{id:"hivemetastore-based",children:"HiveMetastore based"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.provider=org.apache.hudi.hive.transaction.lock.HiveMetastoreBasedLockProvider\n"})}),"\n",(0,r.jsx)(i.p,{children:"Following are the basic configs required to setup this lock provider:"}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Config Name"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.hivemetastore.database"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["For Hive based lock provider, the Hive database to acquire lock against",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: HIVE_DATABASE_NAME"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.hivemetastore.table"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["For Hive based lock provider, the Hive table to acquire lock against",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: HIVE_TABLE_NAME"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]})]})]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.code,{children:"The HiveMetastore URI's are picked up from the hadoop configuration file loaded during runtime."})}),"\n",(0,r.jsx)(i.h4,{id:"amazon-dynamodb-based",children:"Amazon DynamoDB based"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.provider=org.apache.hudi.aws.transaction.lock.DynamoDBBasedLockProvider\n"})}),"\n",(0,r.jsxs)(i.p,{children:["Amazon DynamoDB based lock provides a simple way to support multi writing across different clusters. You can refer to the\n",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations#DynamoDB-based-Locks-Configurations",children:"DynamoDB based Locks Configurations"}),"\nsection for the details of each related configuration knob. Following are the basic configs required to setup this lock provider:"]}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Config Name"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"})]})}),(0,r.jsx)(i.tbody,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.dynamodb.endpoint_url"}),(0,r.jsxs)(i.td,{children:["N/A ",(0,r.jsx)(i.strong,{children:"(Required)"})]}),(0,r.jsxs)(i.td,{children:["For DynamoDB based lock provider, the url endpoint used for Amazon DynamoDB service. Useful for development with a local dynamodb instance.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: DYNAMODB_ENDPOINT_URL"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.10.1"})]})]})})]}),"\n",(0,r.jsxs)(i.p,{children:["For advanced configs refer ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/next/configurations#DynamoDB-based-Locks-Configurations",children:"here"})]}),"\n",(0,r.jsxs)(i.p,{children:["When using the DynamoDB-based lock provider, the name of the DynamoDB table acting as the lock table for Hudi is\nspecified by the config ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.table"}),". This DynamoDB table is automatically created by Hudi, so you\ndon't have to create the table yourself. If you want to use an existing DynamoDB table, make sure that an attribute with\nthe name ",(0,r.jsx)(i.code,{children:"key"})," is present in the table. The ",(0,r.jsx)(i.code,{children:"key"})," attribute should be the partition key of the DynamoDB table. The\nconfig ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.partition_key"})," specifies the value to put for the ",(0,r.jsx)(i.code,{children:"key"})," attribute (not the attribute\nname), which is used for the lock on the same table. By default, ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.partition_key"})," is set to\nthe table name, so that multiple writers writing to the same table share the same lock. If you customize the name, make\nsure it's the same across multiple writers."]}),"\n",(0,r.jsx)(i.p,{children:"Also, to set up the credentials for accessing AWS resources, customers can pass the following props to Hudi jobs:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.aws.access.key\nhoodie.aws.secret.key\nhoodie.aws.session.token\n"})}),"\n",(0,r.jsxs)(i.p,{children:["If not configured, Hudi falls back to use ",(0,r.jsx)(i.a,{href:"https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/DefaultAWSCredentialsProviderChain.html",children:"DefaultAWSCredentialsProviderChain"}),"."]}),"\n",(0,r.jsx)(i.p,{children:"IAM policy for your service instance will need to add the following permissions:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-json",children:'{\n "Sid":"DynamoDBLocksTable",\n "Effect": "Allow",\n "Action": [\n "dynamodb:CreateTable",\n "dynamodb:DeleteItem",\n "dynamodb:DescribeTable",\n "dynamodb:GetItem",\n "dynamodb:PutItem",\n "dynamodb:Scan",\n "dynamodb:UpdateItem"\n ],\n "Resource": "arn:${Partition}:dynamodb:${Region}:${Account}:table/${TableName}"\n}\n'})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.code,{children:"TableName"})," : same as ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.partition_key"})]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.code,{children:"Region"}),": same as ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.dynamodb.region"})]}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"AWS SDK dependencies are not bundled with Hudi from v0.10.x and will need to be added to your classpath.\nAdd the following Maven packages (check the latest versions at time of install):"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"com.amazonaws:dynamodb-lock-client\ncom.amazonaws:aws-java-sdk-dynamodb\ncom.amazonaws:aws-java-sdk-core\n"})}),"\n",(0,r.jsx)(i.h4,{id:"filesystem-based-not-for-production-use",children:"FileSystem based (not for production use)"}),"\n",(0,r.jsx)(i.p,{children:"FileSystem based lock provider supports multiple writers cross different jobs/applications based on atomic create/delete operations of the underlying filesystem."}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.provider=org.apache.hudi.client.transaction.lock.FileSystemBasedLockProvider\n"})}),"\n",(0,r.jsxs)(i.p,{children:["When using the FileSystem based lock provider, by default, the lock file will store into ",(0,r.jsx)(i.code,{children:"hoodie.base.path"}),"+",(0,r.jsx)(i.code,{children:"/.hoodie/lock"}),". You may use a custom folder to store the lock file by specifying ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.filesystem.path"}),"."]}),"\n",(0,r.jsxs)(i.p,{children:["In case the lock cannot release during job crash, you can set ",(0,r.jsx)(i.code,{children:"hoodie.write.lock.filesystem.expire"})," (lock will never expire by default) to a desired expire time in minutes. You may also delete lock file manually in such situation."]}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsx)(i.p,{children:"FileSystem based lock provider is not supported with cloud storage like S3 or GCS."})}),"\n",(0,r.jsx)(i.h2,{id:"simple-single-writer--table-services",children:"Simple Single writer + table services"}),"\n",(0,r.jsx)(i.p,{children:"Data lakehouse pipelines tend to be predominantly single writer, with the most common need for distributed co-ordination on a table coming from table management. For e.g. a Apache Flink\njob producing fast writes into a table, requiring regular file-size management or cleaning. Hudi's storage engine and platform tools provide a lot of support for such common scenarios."}),"\n",(0,r.jsx)(i.h3,{id:"inline-table-services",children:"Inline table services"}),"\n",(0,r.jsx)(i.p,{children:"This is the simplest form of concurrency, meaning there is no concurrency at all in the write processes. In this model, Hudi eliminates the need for concurrency control and maximizes throughput by supporting these table services out-of-box and running inline after every write to the table. Execution plans are idempotent, persisted to the timeline and auto-recover from failures. For most simple use-cases, this means just writing is sufficient to get a well-managed table that needs no concurrency control."}),"\n",(0,r.jsxs)(i.p,{children:["There is no actual concurrent writing in this model. ",(0,r.jsx)(i.strong,{children:"MVCC"})," is leveraged to provide snapshot isolation guarantees between ingestion writer and multiple readers and also between multiple table service writers and readers. Writes to the table either from ingestion or from table services produce versioned data that are available to readers only after the writes are committed. Until then, readers can access only the previous version of the data."]}),"\n",(0,r.jsx)(i.p,{children:"A single writer with all table services such as cleaning, clustering, compaction, etc can be configured to be inline (such as Hudi Streamer sync-once mode and Spark Datasource with default configs) without any additional configs."}),"\n",(0,r.jsx)(i.h3,{id:"async-table-services",children:"Async table services"}),"\n",(0,r.jsxs)(i.p,{children:["Hudi provides the option of running the table services in an async fashion, where most of the heavy lifting (e.g actually rewriting the columnar data by compaction service) is done asynchronously. In this model, the async deployment eliminates any repeated wasteful retries and optimizes the table using clustering techniques while a single writer consumes the writes to the table without having to be blocked by such table services. This model avoids the need for taking an ",(0,r.jsx)(i.a,{href:"#external-locking-and-lock-providers",children:"external lock"})," to control concurrency and avoids the need to separately orchestrate and monitor offline table services jobs.."]}),"\n",(0,r.jsxs)(i.p,{children:["A single writer along with async table services runs in the same process. For example, you can have a Hudi Streamer in continuous mode write to a MOR table using async compaction; you can use Spark Streaming (where ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/compaction",children:"compaction"})," is async by default), and you can use Flink streaming or your own job setup and enable async table services inside the same writer."]}),"\n",(0,r.jsxs)(i.p,{children:["Hudi leverages ",(0,r.jsx)(i.strong,{children:"MVCC"})," in this model to support running any number of table service jobs concurrently, without any concurrency conflict. This is made possible by ensuring Hudi 's ingestion writer and async table services coordinate among themselves to ensure no conflicts and avoid race conditions. The same single write guarantees described in Model A above can be achieved in this model as well.\nWith this model users don't need to spin up different spark jobs and manage the orchestration among it. For larger deployments, this model can ease the operational burden significantly while getting the table services running without blocking the writers."]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Single Writer Guarantees"})}),"\n",(0,r.jsxs)(i.p,{children:["In this model, the following are the guarantees on ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/write_operations/",children:"write operations"})," to expect:"]}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"UPSERT Guarantee"}),": The target table will NEVER show duplicates."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"INSERT Guarantee"}),": The target table wilL NEVER have duplicates if dedup: ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations#hoodiedatasourcewriteinsertdropduplicates",children:(0,r.jsx)(i.code,{children:"hoodie.datasource.write.insert.drop.duplicates"})})," & ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations/#hoodiecombinebeforeinsert",children:(0,r.jsx)(i.code,{children:"hoodie.combine.before.insert"})}),", is enabled."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"BULK_INSERT Guarantee"}),": The target table will NEVER have duplicates if dedup: ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations#hoodiedatasourcewriteinsertdropduplicates",children:(0,r.jsx)(i.code,{children:"hoodie.datasource.write.insert.drop.duplicates"})})," & ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/configurations/#hoodiecombinebeforeinsert",children:(0,r.jsx)(i.code,{children:"hoodie.combine.before.insert"})}),", is enabled."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"INCREMENTAL QUERY Guarantee"}),": Data consumption and checkpoints are NEVER out of order."]}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"full-on-multi-writer--async-table-services",children:"Full-on Multi-writer + Async table services"}),"\n",(0,r.jsxs)(i.p,{children:["Hudi has introduced a new concurrency mode ",(0,r.jsx)(i.code,{children:"NON_BLOCKING_CONCURRENCY_CONTROL"}),", where unlike OCC, multiple writers can\noperate on the table with non-blocking conflict resolution. The writers can write into the same file group with the\nconflicts resolved automatically by the query reader and the compactor. The new concurrency mode is currently\navailable for preview in version 1.0.0-beta only. You can read more about it under section ",(0,r.jsx)(i.a,{href:"#model-c-multi-writer",children:"Model C: Multi-writer"}),"."]}),"\n",(0,r.jsx)(i.p,{children:"It is not always possible to serialize all write operations to a table (such as UPSERT, INSERT or DELETE) into the same write process and therefore, multi-writing capability may be required.\nIn multi-writing, disparate distributed processes run in parallel or overlapping time windows to write to the same table. In such cases, an external locking mechanism is a must to safely\ncoordinate concurrent accesses. Here are few different scenarios that would all fall under multi-writing:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Multiple ingestion writers to the same table",":For"," instance, two Spark Datasource writers working on different sets of partitions form a source kafka topic."]}),"\n",(0,r.jsx)(i.li,{children:"Multiple ingestion writers to the same table, including one writer with async table services: For example, a Hudi Streamer with async compaction for regular ingestion & a Spark Datasource writer for backfilling."}),"\n",(0,r.jsx)(i.li,{children:"A single ingestion writer and a separate compaction (HoodieCompactor) or clustering (HoodieClusteringJob) job apart from the ingestion writer: This is considered as multi-writing as they are not running in the same process."}),"\n"]}),"\n",(0,r.jsxs)(i.p,{children:["Hudi's concurrency model intelligently differentiates actual writing to the table from table services that manage or optimize the table. Hudi offers similar ",(0,r.jsx)(i.strong,{children:"optimistic concurrency control across multiple writers"}),", but ",(0,r.jsx)(i.strong,{children:"table services can still execute completely lock-free and async"})," as long as they run in the same process as one of the writers.\nFor multi-writing, Hudi leverages file level optimistic concurrency control(OCC). For example, when two writers write to non overlapping files, both writes are allowed to succeed. However, when the writes from different writers overlap (touch the same set of files), only one of them will succeed. Please note that this feature is currently experimental and requires external lock providers to acquire locks briefly at critical sections during the write. More on lock providers below."]}),"\n",(0,r.jsx)(i.h4,{id:"multi-writer-guarantees",children:"Multi Writer Guarantees"}),"\n",(0,r.jsx)(i.p,{children:"With multiple writers using OCC, these are the write guarantees to expect:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"UPSERT Guarantee"}),": The target table will NEVER show duplicates."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"INSERT Guarantee"}),": The target table MIGHT have duplicates even if dedup is enabled."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"BULK_INSERT Guarantee"}),": The target table MIGHT have duplicates even if dedup is enabled."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.em,{children:"INCREMENTAL PULL Guarantee"}),": Data consumption and checkpoints are NEVER out of order. If there are inflight commits\n(due to multi-writing), incremental queries will not expose the completed commits following the inflight commits."]}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"non-blocking-concurrency-control",children:"Non-Blocking Concurrency Control"}),"\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.code,{children:"NON_BLOCKING_CONCURRENCY_CONTROL"}),", offers the same set of guarantees as mentioned in the case of OCC but without\nexplicit locks for serializing the writes. Lock is only needed for writing the commit metadata to the Hudi timeline. The\ncompletion time for the commits reflects the serialization order and file slicing is done based on completion time.\nMultiple writers can operate on the table with non-blocking conflict resolution. The writers can write into the same\nfile group with the conflicts resolved automatically by the query reader and the compactor. The new concurrency mode is\ncurrently available for preview in version 1.0.0-beta only with the caveat that conflict resolution is not supported yet\nbetween clustering and ingestion. It works for compaction and ingestion, and we can see an example of that with Flink\nwriters ",(0,r.jsx)(i.a,{href:"sql_dml#non-blocking-concurrency-control-experimental",children:"here"}),"."]}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.code,{children:"NON_BLOCKING_CONCURRENCY_CONTROL"})," between ingestion writer and table service writer is not yet supported for clustering.\nPlease use ",(0,r.jsx)(i.code,{children:"OPTIMISTIC_CONCURRENCY_CONTROL"})," for clustering."]})}),"\n",(0,r.jsx)(i.h2,{id:"early-conflict-detection",children:"Early conflict Detection"}),"\n",(0,r.jsx)(i.p,{children:"Multi writing using OCC allows multiple writers to concurrently write and atomically commit to the Hudi table if there is no overlapping data file to be written, to guarantee data consistency, integrity and correctness. Prior to 0.13.0 release, as the OCC (optimistic concurrency control) name suggests, each writer will optimistically proceed with ingestion and towards the end, just before committing will go about conflict resolution flow to deduce overlapping writes and abort one if need be. But this could result in lot of compute waste, since the aborted commit will have to retry from beginning. With 0.13.0, Hudi introduced early conflict deduction leveraging markers in hudi to deduce the conflicts eagerly and abort early in the write lifecyle instead of doing it in the end. For large scale deployments, this might avoid wasting lot o compute resources if there could be overlapping concurrent writers."}),"\n",(0,r.jsxs)(i.p,{children:["To improve the concurrency control, the ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/releases/release-0.13.0#early-conflict-detection-for-multi-writer",children:"0.13.0 release"})," introduced a new feature, early conflict detection in OCC, to detect the conflict during the data writing phase and abort the writing early on once a conflict is detected, using Hudi's marker mechanism. Hudi can now stop a conflicting writer much earlier because of the early conflict detection and release computing resources necessary to cluster, improving resource utilization."]}),"\n",(0,r.jsxs)(i.p,{children:["By default, this feature is turned off. To try this out, a user needs to set ",(0,r.jsx)(i.code,{children:"hoodie.write.concurrency.early.conflict.detection.enable"})," to true, when using OCC for concurrency control (Refer ",(0,r.jsx)(i.a,{href:"https://hudi.apache.org/docs/next/configurations#Write-Configurations-advanced-configs",children:"configs"})," page for all relevant configs)."]}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsxs)(i.p,{children:["Early conflict Detection in OCC is an ",(0,r.jsx)(i.strong,{children:"EXPERIMENTAL"})," feature"]})}),"\n",(0,r.jsx)(i.h2,{id:"enabling-multi-writing",children:"Enabling Multi Writing"}),"\n",(0,r.jsx)(i.p,{children:"The following properties are needed to be set appropriately to turn on optimistic concurrency control to achieve multi writing."}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.concurrency.mode=optimistic_concurrency_control\nhoodie.write.lock.provider=\nhoodie.cleaner.policy.failed.writes=LAZY\n"})}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Config Name"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.concurrency.mode"}),(0,r.jsx)(i.td,{children:"SINGLE_WRITER (Optional)"}),(0,r.jsxs)(i.td,{children:[(0,r.jsx)("u",{children:(0,r.jsx)(i.a,{href:"https://github.com/apache/hudi/blob/00ece7bce0a4a8d0019721a28049723821e01842/hudi-common/src/main/java/org/apache/hudi/common/model/WriteConcurrencyMode.java",children:"Concurrency modes"})})," for write operations.",(0,r.jsx)("br",{}),"Possible values:",(0,r.jsx)("br",{}),(0,r.jsxs)("ul",{children:[(0,r.jsxs)("li",{children:[(0,r.jsx)(i.code,{children:"SINGLE_WRITER"}),": Only one active writer to the table. Maximizes throughput."]}),(0,r.jsxs)("li",{children:[(0,r.jsx)(i.code,{children:"OPTIMISTIC_CONCURRENCY_CONTROL"}),": Multiple writers can operate on the table with lazy conflict resolution using locks. This means that only one writer succeeds if multiple writers write to the same file group."]}),(0,r.jsxs)("li",{children:[(0,r.jsx)(i.code,{children:"NON_BLOCKING_CONCURRENCY_CONTROL"}),": Multiple writers can operate on the table with non-blocking conflict resolution. The writers can write into the same file group with the conflicts resolved automatically by the query reader and the compactor."]})]}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: WRITE_CONCURRENCY_MODE"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.write.lock.provider"}),(0,r.jsx)(i.td,{children:"org.apache.hudi.client.transaction.lock.ZookeeperBasedLockProvider (Optional)"}),(0,r.jsxs)(i.td,{children:["Lock provider class name, user can provide their own implementation of LockProvider which should be subclass of org.apache.hudi.common.lock.LockProvider",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: LOCK_PROVIDER_CLASS_NAME"}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Since Version: 0.8.0"})]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"hoodie.cleaner.policy.failed.writes"}),(0,r.jsx)(i.td,{children:"EAGER (Optional)"}),(0,r.jsxs)(i.td,{children:["org.apache.hudi.common.model.HoodieFailedWritesCleaningPolicy: Policy that controls how to clean up failed writes. Hudi will delete any files written by failed writes to re-claim space. EAGER(default): Clean failed writes inline after every write operation. LAZY: Clean failed writes lazily after heartbeat timeout when the cleaning service runs. This policy is required when multi-writers are enabled. NEVER: Never clean failed writes.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)(i.code,{children:"Config Param: FAILED_WRITES_CLEANER_POLICY"})]})]})]})]}),"\n",(0,r.jsx)(i.h3,{id:"multi-writing-via-hudi-streamer",children:"Multi Writing via Hudi Streamer"}),"\n",(0,r.jsxs)(i.p,{children:["The ",(0,r.jsx)(i.code,{children:"HoodieStreamer"})," utility (part of hudi-utilities-slim-bundle) provides ways to ingest from different sources such as DFS or Kafka, with the following capabilities."]}),"\n",(0,r.jsx)(i.p,{children:"Using optimistic_concurrency_control via Hudi Streamer requires adding the above configs to the properties file that can be passed to the\njob. For example below, adding the configs to kafka-source.properties file and passing them to Hudi Streamer will enable optimistic concurrency.\nA Hudi Streamer job can then be triggered as follows:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-java",children:'[hoodie]$ spark-submit \\\n --jars "packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.0.0.jar,packaging/hudi-spark-bundle/target/hudi-spark3.5-bundle_2.12-1.0.0.jar" \\\n --class org.apache.hudi.utilities.streamer.HoodieStreamer `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` \\\n --props file://${PWD}/hudi-utilities/src/test/resources/streamer-config/kafka-source.properties \\\n --schemaprovider-class org.apache.hudi.utilities.schema.SchemaRegistryProvider \\\n --source-class org.apache.hudi.utilities.sources.AvroKafkaSource \\\n --source-ordering-field impresssiontime \\\n --target-base-path file:\\/\\/\\/tmp/hudi-streamer-op \\ \n --target-table tableName \\\n --op BULK_INSERT\n'})}),"\n",(0,r.jsx)(i.h3,{id:"multi-writing-via-spark-datasource-writer",children:"Multi Writing via Spark Datasource Writer"}),"\n",(0,r.jsxs)(i.p,{children:["The ",(0,r.jsx)(i.code,{children:"hudi-spark"})," module offers the DataSource API to write (and read) a Spark DataFrame into a Hudi table."]}),"\n",(0,r.jsx)(i.p,{children:"Following is an example of how to use optimistic_concurrency_control via spark datasource"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-java",children:'inputDF.write.format("hudi")\n .options(getQuickstartWriteConfigs)\n .option("hoodie.datasource.write.precombine.field", "ts")\n .option("hoodie.cleaner.policy.failed.writes", "LAZY")\n .option("hoodie.write.concurrency.mode", "optimistic_concurrency_control")\n .option("hoodie.write.lock.zookeeper.url", "zookeeper")\n .option("hoodie.write.lock.zookeeper.port", "2181")\n .option("hoodie.write.lock.zookeeper.base_path", "/test")\n .option("hoodie.datasource.write.recordkey.field", "uuid")\n .option("hoodie.datasource.write.partitionpath.field", "partitionpath")\n .option("hoodie.table.name", tableName)\n .mode(Overwrite)\n .save(basePath)\n'})}),"\n",(0,r.jsx)(i.h2,{id:"disabling-multi-writing",children:"Disabling Multi Writing"}),"\n",(0,r.jsx)(i.p,{children:"Remove the following settings that were used to enable multi-writer or override with default values."}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.concurrency.mode=single_writer\nhoodie.cleaner.policy.failed.writes=EAGER\n"})}),"\n",(0,r.jsx)(i.h2,{id:"occ-best-practices",children:"OCC Best Practices"}),"\n",(0,r.jsx)(i.p,{children:"Concurrent Writing to Hudi tables requires acquiring a lock with one of the lock providers mentioned above. Due to several reasons you might want to configure retries to allow your application to acquire the lock."}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsx)(i.li,{children:"Network connectivity or excessive load on servers increasing time for lock acquisition resulting in timeouts"}),"\n",(0,r.jsx)(i.li,{children:"Running a large number of concurrent jobs that are writing to the same hudi table can result in contention during lock acquisition can cause timeouts"}),"\n",(0,r.jsx)(i.li,{children:"In some scenarios of conflict resolution, Hudi commit operations might take upto 10's of seconds while the lock is being held. This can result in timeouts for other jobs waiting to acquire a lock."}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"Set the correct native lock provider client retries."}),"\n",(0,r.jsxs)(i.admonition,{type:"note",children:[(0,r.jsx)(i.mdxAdmonitionTitle,{}),(0,r.jsx)(i.p,{children:"Please note that sometimes these settings are set on the server once and all clients inherit the same configs. Please check your settings before enabling optimistic concurrency."})]}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.wait_time_ms\nhoodie.write.lock.num_retries\n"})}),"\n",(0,r.jsx)(i.p,{children:"Set the correct hudi client retries for Zookeeper & HiveMetastore. This is useful in cases when native client retry settings cannot be changed. Please note that these retries will happen in addition to any native client retries that you may have set."}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"hoodie.write.lock.client.wait_time_ms\nhoodie.write.lock.client.num_retries\n"})}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.em,{children:"Setting the right values for these depends on a case by case basis; some defaults have been provided for general cases."})}),"\n",(0,r.jsx)(i.h2,{id:"caveats",children:"Caveats"}),"\n",(0,r.jsxs)(i.p,{children:["If you are using the ",(0,r.jsx)(i.code,{children:"WriteClient"})," API, please note that multiple writes to the table need to be initiated from 2 different instances of the write client.\nIt is ",(0,r.jsx)(i.strong,{children:"NOT"})," recommended to use the same instance of the write client to perform multi writing."]}),"\n",(0,r.jsx)(i.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,r.jsx)("h3",{children:"Blogs"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://www.onehouse.ai/blog/lakehouse-concurrency-control-are-we-too-optimistic",children:"Data Lakehouse Concurrency Control"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://medium.com/@simpsons/multi-writer-support-with-apache-hudi-e1b75dca29e6",children:"Multi-writer support with Apache Hudi"})}),"\n"]}),"\n",(0,r.jsx)("h3",{children:"Videos"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://youtu.be/JP0orl9_0yQ",children:"Hands on Lab with using DynamoDB as lock table for Apache Hudi Data Lakes"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/blog/2024/12/06/non-blocking-concurrency-control",children:"Non Blocking Concurrency Control Flink Demo"})}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},28453:(e,i,t)=>{t.d(i,{R:()=>s,x:()=>a});var n=t(96540);const r={},o=n.createContext(r);function s(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/content/cn/assets/js/effd3c61.85a7e3a7.js b/content/cn/assets/js/effd3c61.85a7e3a7.js new file mode 100644 index 0000000000000..7ae83720034cd --- /dev/null +++ b/content/cn/assets/js/effd3c61.85a7e3a7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[8889],{6989:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"timeline","title":"Timeline","description":"Changes to table state (writes, table services, schema changes, etc) are recorded as actions_** in the Hudi timeline_. The Hudi timeline is a log of all actions performed","source":"@site/docs/timeline.md","sourceDirName":".","slug":"/timeline","permalink":"/cn/docs/next/timeline","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/timeline.md","tags":[],"version":"current","frontMatter":{"title":"Timeline","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4},"sidebar":"docs","previous":{"title":"Apache Hudi Stack","permalink":"/cn/docs/next/hudi_stack"},"next":{"title":"Storage Layouts","permalink":"/cn/docs/next/storage_layouts"}}');var s=i(74848),a=i(28453);const r={title:"Timeline",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4},o=void 0,l={},c=[{value:"Action Types",id:"action-types",level:3},{value:"State Transitions",id:"state-transitions",level:3},{value:"TrueTime Generation",id:"truetime-generation",level:3},{value:"Ordering of Actions",id:"ordering-of-actions",level:3},{value:"Timeline Components",id:"timeline-components",level:3},{value:"Active Timeline",id:"active-timeline",level:4},{value:"LSM Timeline History",id:"lsm-timeline-history",level:4},{value:"Timeline Archival Configs",id:"timeline-archival-configs",level:3},{value:"Spark configs",id:"spark-configs",level:4},{value:"Flink Options",id:"flink-options",level:4},{value:"Related Resources",id:"related-resources",level:2}];function d(e){const t={a:"a",br:"br",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["Changes to table state (writes, table services, schema changes, etc) are recorded as ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"actions"})})," in the Hudi ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"timeline"})}),". The Hudi timeline is a log of all actions performed\non the table at different ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"instants"})})," (points in time). It is a key component of Hudi's architecture, acting as a source of truth for the state of the table. All instant times\nused on the timeline follow ",(0,s.jsx)(t.a,{href:"https://research.google/pubs/spanner-truetime-and-the-cap-theorem/",children:"TrueTime"})," semantics, and are monotonically increasing globally across various\nprocesses involved. See TrueTime section below for more details."]}),"\n",(0,s.jsx)(t.p,{children:"Each action has the following attributes associated with it."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"requested instant"})," : Instant time representing when the action was requested on the timeline and acts as the transaction id. An immutable plan for the action should be generated before the action is requested."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"completed instant"})," : Instant time representing when the action was completed on the timeline. All relevant changes to table data/metadata should be made before the action is completed."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"state"})," : state of the action. valid states are ",(0,s.jsx)(t.code,{children:"REQUESTED"}),", ",(0,s.jsx)(t.code,{children:"INFLIGHT"})," and ",(0,s.jsx)(t.code,{children:"COMPLETED"})," during an action's lifecycle."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"type"})," : the kind of action performed. See below for full list of actions."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"Timeline actions",src:i(57050).A+"",width:"817",height:"424"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: Actions in the timeline"})]}),"\n",(0,s.jsx)(t.h3,{id:"action-types",children:"Action Types"}),"\n",(0,s.jsx)(t.p,{children:"Following are the valid action types."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"COMMIT"})," - Write operation denoting an atomic write of a batch of records into a base files in the table."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"DELTA_COMMIT"})," - Write operation denoting an atomic write of a batch of records into merge-on-read type table, where some/all of the data could be just written to delta logs."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"REPLACE_COMMIT"})," - Write operation that atomically replaces a set of file groups in the table with another. Used for implementing batch write operations like ",(0,s.jsx)(t.em,{children:"insert_overwrite"}),", ",(0,s.jsx)(t.em,{children:"delete_partition"})," etc, as well as table services\nlike clustering."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"CLEANS"})," - Table service that removes older file slices that are no longer needed from the table, by deleting those files."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"COMPACTION"})," - Table service to reconcile differential data between base and delta files, by merging delta files into base files."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"LOGCOMPACTION"})," - Table service to merge multiple small log files into a bigger log file in the same file slice."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"CLUSTERING"})," - Table service to rewrite existing file groups with optimized sort order or storage layouts, as new file groups in the table."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"INDEXING"})," - Table service to build an index of a requested type on a column of the table, consistent with the state of the table at the completed instant in face of ongoing writes."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"ROLLBACK"})," - Indicates that an unsuccessful write operation was rolled back, removing any partial/uncommitted files produced during such a write from storage."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"SAVEPOINT"}),' - Marks certain file slices as "saved", such that cleaner will not delete them. It helps restore the table to a point on the timeline, in case of disaster/data recovery scenarios or perform time-travel queries as of those instants.']}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"RESTORE"})," - Restores a table to a given savepoint on the timeline, in case of disaster/data recovery scenarios."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["In some cases, action types in the completed state may be different from requested/inflight states, but still tracked by the same requested instant. For e.g. ",(0,s.jsx)(t.em,{children:"CLUSTERING"})," as in requested/inflight state,\nbecomes ",(0,s.jsx)(t.em,{children:"REPLACE_COMMIT"})," in completed state. Compactions complete as ",(0,s.jsx)(t.em,{children:"COMMIT"})," action on the timeline producing new base files. In general, multiple write operations from the storage engine\nmay map to the same action on the timeline."]}),"\n",(0,s.jsx)(t.h3,{id:"state-transitions",children:"State Transitions"}),"\n",(0,s.jsxs)(t.p,{children:["Actions go through state transitions on the timeline, with each transition recorded by a file of the pattern ",(0,s.jsx)(t.code,{children:".."}),"(for other states) or\n",(0,s.jsx)(t.code,{children:"_."})," (for COMPLETED state). Hudi guarantees that the state transitions are atomic and timeline consistent based on the instant time.\nAtomicity is achieved by relying on the atomic operations on the underlying storage (e.g. PUT calls to S3/Cloud Storage)."]}),"\n",(0,s.jsx)(t.p,{children:"Valid state transitions are as follows:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"[ ] -> REQUESTED"})," - Denotes an action has been scheduled, but has not initiated by any process yet.\nNote that the process requesting the action can be different from the process that will perform/complete the action."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"REQUESTED -> INFLIGHT"})," - Denotes that the action is currently being performed by some process."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"INFLIGHT -> REQUESTED"})," or ",(0,s.jsx)(t.code,{children:"INFLIGHT -> INFLIGHT"})," - A process can safely fail many times while performing the action."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"INFLIGHT -> COMPLETED"})," - Denotes that the action has been completed successfully."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["The current state of an action on the timeline is the highest state recorded for that action on the timeline, with states ordered as ",(0,s.jsx)(t.code,{children:"REQUESTED < INFLIGHT < COMPLETED"}),"."]}),"\n",(0,s.jsx)(t.h3,{id:"truetime-generation",children:"TrueTime Generation"}),"\n",(0,s.jsxs)(t.p,{children:["Time in distributed systems has been studied literally for ",(0,s.jsx)(t.a,{href:"https://lamport.azurewebsites.net/pubs/chandy.pdf",children:"decades"}),". Google Spanner\u2019s\n",(0,s.jsx)(t.a,{href:"https://research.google/pubs/spanner-truetime-and-the-cap-theorem/",children:"TrueTime"})," API addresses the challenges of managing time in distributed systems by providing a globally\nsynchronized clock with bounded uncertainty. Traditional systems struggle with clock drift and lack of a consistent timeline, but TrueTime ensures that all nodes operate with\na common notion of time, defined by a strict interval of uncertainty. This enables Spanner to achieve external consistency in distributed transactions, allowing it to assign\ntimestamps with confidence that no other operation in the past or future will conflict, solving age-old issues of clock synchronization and causality. Several OLTP databases\nlike Spanner, ",(0,s.jsx)(t.a,{href:"https://www.cockroachlabs.com/blog/living-without-atomic-clocks/",children:"CockroachDB"})," rely on TrueTime."]}),"\n",(0,s.jsx)(t.p,{children:"Hudi uses these semantics for instant times on the timeline, to provide unique monotonically increasing instant values. TrueTime can be generated by a single shared time generator\nprocess or by having each process generate its own time and waiting for time >= maximum expected clock drift across all processes within a distributed lock. Locking ensures only one\nprocess is generating time at a time and waiting ensures enough time passes such that any new time generated is guaranteed to be greater than the previous time."}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"Timeline actions",src:i(94200).A+"",width:"704",height:"511"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: TrueTime generation for processes A & B"})]}),"\n",(0,s.jsxs)(t.p,{children:["The figure above shows how time generated by process A and B are monotonically increasing, even though process B has a lower local clock than A at the start, by waiting for uncertainty window of x ms to pass.",(0,s.jsx)(t.br,{}),"\n","In fact, given Hudi targets transaction durations > 1 second, we can afford to operate with a much higher uncertainty bound (> 100ms) guaranteeing extremely high fidelity time generation."]}),"\n",(0,s.jsx)(t.h3,{id:"ordering-of-actions",children:"Ordering of Actions"}),"\n",(0,s.jsx)(t.p,{children:"Thus, actions appear on the timeline as an interval starting at the requested instant and ending at the completed instant. Such actions can be ordered by completion time to"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Commit time ordering"})," : To obtain serializable execution order of writes performed consistent with typical relational databases, the actions can be ordered by completed instant."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Event time ordering"}),": Data lakehouses ultimately deal with streams of data (CDC, events, slowly changing data etc), where ordering is dependent on business fields in\nthe data. In such cases, actions can be ordered by commit time, while the records themselves are further merged in order of a specified event time field."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Hudi relies on ordering of requested instants of certain actions against completed instants of other actions, to implement non-blocking table service operations or concurrent streaming model\nwrites with event time ordering."}),"\n",(0,s.jsx)(t.h3,{id:"timeline-components",children:"Timeline Components"}),"\n",(0,s.jsx)(t.h4,{id:"active-timeline",children:"Active Timeline"}),"\n",(0,s.jsxs)(t.p,{children:["Hudi implements the timeline as a Log Structured Merge (",(0,s.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Log-structured_merge-tree",children:"LSM"}),") tree under the ",(0,s.jsx)(t.code,{children:".hoodie/timeline"})," directory. Unlike typical LSM implementations,\nthe memory component and the write-ahead-log are at once replaced by ",(0,s.jsx)(t.a,{href:"https://avro.apache.org/",children:"avro"})," serialized files containing individual actions (",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"active timeline"})}),") for high durability and inter-process co-ordination.\nAll actions on the Hudi table are created in the active timeline a new entry and periodically actions are archived from the active timeline to the LSM structure (timeline history).\nAs the name suggests active timeline is consulted all the time to build a consistent view of data and archiving completed actions ensures reads on the timeline does not incur unnecessary latencies\nas timeline grows. The key invariant around such archiving is that any side effects from completed/pending actions (e.g. uncommitted files) are removed from storage, before archiving them."]}),"\n",(0,s.jsx)(t.h4,{id:"lsm-timeline-history",children:"LSM Timeline History"}),"\n",(0,s.jsxs)(t.p,{children:["As mentioned above, active timeline has limited log history to be fast, while archived timeline is expensive to access\nduring reads or writes, especially with high write throughput. To overcome this limitation, Hudi introduced the LSM (\nlog-structured merge) tree based timeline. Completed actions, their plans and completion metadata are stored in a more\nscalable LSM tree based archived timeline organized in an ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"history"})})," storage folder under the ",(0,s.jsx)(t.code,{children:".hoodie/timeline"})," metadata\npath. It consists of Apache Parquet files with action instant data and bookkeeping metadata files, in the following\nmanner."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"/.hoodie/timeline/history/ \t\t\t\t\t\n\u251c\u2500\u2500 _version_ \t\t\t\t\t <-- stores the manifest version that is current\n\u251c\u2500\u2500 manifest_1 <-- manifests store list of files in timeline\n\u251c\u2500\u2500 manifest_2 <-- compactions, cleaning, writes produce new manifest files\n\u251c\u2500\u2500 ... \n\u251c\u2500\u2500 manifest_ <-- there can be many manifest files at any given time\n\u251c\u2500\u2500 __.parquet <-- files storing actual action details\n"})}),"\n",(0,s.jsx)(t.p,{children:"One can read more about the details of LSM timeline in Hudi 1.0 specs. To understand it better, here is an example."}),"\n",(0,s.jsx)("figure",{children:(0,s.jsx)("img",{className:"docimage",src:i(91140).A,alt:"lsm_tree.png"})}),"\n",(0,s.jsxs)(t.p,{children:["In the above figure, each level is a tree sorted by instant times. We can see that for a bunch of commits the metadata\nis stored in a parquet file. As and when more commits are accumulated, they get compacted and pushed down to lower level\nof the tree. Each new operation to the timeline yields a new snapshot version. The advantage of such a structure is that\nwe can keep the top level in memory if needed, and still load the remaining levels efficiently from the disk if we need to walk\nback longer history. The LSM timeline compaction frequency is controlled by",(0,s.jsx)(t.code,{children:"hoodie.timeline.compaction.batch.size"})," i.e.\nfor every ",(0,s.jsx)(t.em,{children:"N"})," parquet files in the current level, they are merged and flush as a compacted file in the next level."]}),"\n",(0,s.jsx)(t.h3,{id:"timeline-archival-configs",children:"Timeline Archival Configs"}),"\n",(0,s.jsx)(t.p,{children:"Basic configurations that control archival."}),"\n",(0,s.jsx)(t.h4,{id:"spark-configs",children:"Spark configs"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.keep.max.commits"}),(0,s.jsx)(t.td,{children:"30 (Optional)"}),(0,s.jsx)(t.td,{children:"Archiving service moves older entries from timeline into an archived log after each write, to keep the metadata overhead constant, even as the table size grows. This config controls the maximum number of instants to retain in the active timeline."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.keep.min.commits"}),(0,s.jsx)(t.td,{children:"20 (Optional)"}),(0,s.jsx)(t.td,{children:"Similar to hoodie.keep.max.commits, but controls the minimum number of instants to retain in the active timeline."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.timeline.compaction.batch.size"}),(0,s.jsx)(t.td,{children:"10 (Optional)"}),(0,s.jsx)(t.td,{children:"Controls the number of parquet files to compact in a single compaction run at the current level of the LSM tree."})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["For more advanced configs refer ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations#Archival-Configs-advanced-configs",children:"here"}),"."]}),"\n",(0,s.jsx)(t.h4,{id:"flink-options",children:"Flink Options"}),"\n",(0,s.jsx)(t.p,{children:"Flink jobs using the SQL can be configured through the options in WITH clause. The actual datasource level configs are listed below."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"archive.max_commits"}),(0,s.jsx)(t.td,{children:"50 (Optional)"}),(0,s.jsxs)(t.td,{children:["Max number of commits to keep before archiving older commits into a sequential log, default 50",(0,s.jsx)("br",{}),(0,s.jsx)("br",{})," ",(0,s.jsx)(t.code,{children:"Config Param: ARCHIVE_MAX_COMMITS"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"archive.min_commits"}),(0,s.jsx)(t.td,{children:"40 (Optional)"}),(0,s.jsxs)(t.td,{children:["Min number of commits to keep before archiving older commits into a sequential log, default 40",(0,s.jsx)("br",{}),(0,s.jsx)("br",{})," ",(0,s.jsx)(t.code,{children:"Config Param: ARCHIVE_MIN_COMMITS"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.timeline.compaction.batch.size"}),(0,s.jsx)(t.td,{children:"10 (Optional)"}),(0,s.jsx)(t.td,{children:"Controls the number of parquet files to compact in a single compaction run at the current level of the LSM tree."})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["Refer ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations#Flink-Options",children:"here"})," for more details."]}),"\n",(0,s.jsx)(t.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,s.jsx)("h3",{children:"Blogs"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://medium.com/@simpsons/hoodie-timeline-foundational-pillar-for-acid-transactions-be871399cbae",children:"Apache Hudi Timeline: Foundational pillar for ACID transactions"})}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},91140:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/lsm_tree-0a069798a1196c1c71330abcb7ff3581.png"},57050:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/hudi-timeline-actions-e56d0d9fad5645d9910f2591ad7775de.png"},94200:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/hudi-timeline-truetime-4cb47da19e5344580d5ebdcdce3d6cf2.png"},28453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>o});var n=i(96540);const s={},a=n.createContext(s);function r(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/content/cn/assets/js/effd3c61.98a3fd62.js b/content/cn/assets/js/effd3c61.98a3fd62.js deleted file mode 100644 index 23e2c90e0edba..0000000000000 --- a/content/cn/assets/js/effd3c61.98a3fd62.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[8889],{6989:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"timeline","title":"Timeline","description":"Changes to table state (writes, table services, schema changes, etc) are recorded as actions_** in the Hudi timeline_. The Hudi timeline is a log of all actions performed","source":"@site/docs/timeline.md","sourceDirName":".","slug":"/timeline","permalink":"/cn/docs/next/timeline","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/timeline.md","tags":[],"version":"current","frontMatter":{"title":"Timeline","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4},"sidebar":"docs","previous":{"title":"Apache Hudi Stack","permalink":"/cn/docs/next/hudi_stack"},"next":{"title":"Storage Layouts","permalink":"/cn/docs/next/storage_layouts"}}');var s=i(74848),a=i(28453);const r={title:"Timeline",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4},o=void 0,l={},c=[{value:"Action Types",id:"action-types",level:3},{value:"State Transitions",id:"state-transitions",level:3},{value:"TrueTime Generation",id:"truetime-generation",level:3},{value:"Ordering of Actions",id:"ordering-of-actions",level:3},{value:"Timeline Components",id:"timeline-components",level:3},{value:"Active Timeline",id:"active-timeline",level:4},{value:"LSM Timeline History",id:"lsm-timeline-history",level:4},{value:"Timeline Archival Configs",id:"timeline-archival-configs",level:3},{value:"Spark configs",id:"spark-configs",level:4},{value:"Flink Options",id:"flink-options",level:4}];function d(e){const t={a:"a",br:"br",code:"code",em:"em",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["Changes to table state (writes, table services, schema changes, etc) are recorded as ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"actions"})})," in the Hudi ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"timeline"})}),". The Hudi timeline is a log of all actions performed\non the table at different ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"instants"})})," (points in time). It is a key component of Hudi's architecture, acting as a source of truth for the state of the table. All instant times\nused on the timeline follow ",(0,s.jsx)(t.a,{href:"https://research.google/pubs/spanner-truetime-and-the-cap-theorem/",children:"TrueTime"})," semantics, and are monotonically increasing globally across various\nprocesses involved. See TrueTime section below for more details."]}),"\n",(0,s.jsx)(t.p,{children:"Each action has the following attributes associated with it."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"requested instant"})," : Instant time representing when the action was requested on the timeline and acts as the transaction id. An immutable plan for the action should be generated before the action is requested."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"completed instant"})," : Instant time representing when the action was completed on the timeline. All relevant changes to table data/metadata should be made before the action is completed."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"state"})," : state of the action. valid states are ",(0,s.jsx)(t.code,{children:"REQUESTED"}),", ",(0,s.jsx)(t.code,{children:"INFLIGHT"})," and ",(0,s.jsx)(t.code,{children:"COMPLETED"})," during an action's lifecycle."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"type"})," : the kind of action performed. See below for full list of actions."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"Timeline actions",src:i(57050).A+"",width:"817",height:"424"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: Actions in the timeline"})]}),"\n",(0,s.jsx)(t.h3,{id:"action-types",children:"Action Types"}),"\n",(0,s.jsx)(t.p,{children:"Following are the valid action types."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"COMMIT"})," - Write operation denoting an atomic write of a batch of records into a base files in the table."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"DELTA_COMMIT"})," - Write operation denoting an atomic write of a batch of records into merge-on-read type table, where some/all of the data could be just written to delta logs."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"REPLACE_COMMIT"})," - Write operation that atomically replaces a set of file groups in the table with another. Used for implementing batch write operations like ",(0,s.jsx)(t.em,{children:"insert_overwrite"}),", ",(0,s.jsx)(t.em,{children:"delete_partition"})," etc, as well as table services\nlike clustering."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"CLEANS"})," - Table service that removes older file slices that are no longer needed from the table, by deleting those files."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"COMPACTION"})," - Table service to reconcile differential data between base and delta files, by merging delta files into base files."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"LOGCOMPACTION"})," - Table service to merge multiple small log files into a bigger log file in the same file slice."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"CLUSTERING"})," - Table service to rewrite existing file groups with optimized sort order or storage layouts, as new file groups in the table."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"INDEXING"})," - Table service to build an index of a requested type on a column of the table, consistent with the state of the table at the completed instant in face of ongoing writes."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"ROLLBACK"})," - Indicates that an unsuccessful write operation was rolled back, removing any partial/uncommitted files produced during such a write from storage."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"SAVEPOINT"}),' - Marks certain file slices as "saved", such that cleaner will not delete them. It helps restore the table to a point on the timeline, in case of disaster/data recovery scenarios or perform time-travel queries as of those instants.']}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"RESTORE"})," - Restores a table to a given savepoint on the timeline, in case of disaster/data recovery scenarios."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["In some cases, action types in the completed state may be different from requested/inflight states, but still tracked by the same requested instant. For e.g. ",(0,s.jsx)(t.em,{children:"CLUSTERING"})," as in requested/inflight state,\nbecomes ",(0,s.jsx)(t.em,{children:"REPLACE_COMMIT"})," in completed state. Compactions complete as ",(0,s.jsx)(t.em,{children:"COMMIT"})," action on the timeline producing new base files. In general, multiple write operations from the storage engine\nmay map to the same action on the timeline."]}),"\n",(0,s.jsx)(t.h3,{id:"state-transitions",children:"State Transitions"}),"\n",(0,s.jsxs)(t.p,{children:["Actions go through state transitions on the timeline, with each transition recorded by a file of the pattern ",(0,s.jsx)(t.code,{children:".."}),"(for other states) or\n",(0,s.jsx)(t.code,{children:"_."})," (for COMPLETED state). Hudi guarantees that the state transitions are atomic and timeline consistent based on the instant time.\nAtomicity is achieved by relying on the atomic operations on the underlying storage (e.g. PUT calls to S3/Cloud Storage)."]}),"\n",(0,s.jsx)(t.p,{children:"Valid state transitions are as follows:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"[ ] -> REQUESTED"})," - Denotes an action has been scheduled, but has not initiated by any process yet.\nNote that the process requesting the action can be different from the process that will perform/complete the action."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"REQUESTED -> INFLIGHT"})," - Denotes that the action is currently being performed by some process."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"INFLIGHT -> REQUESTED"})," or ",(0,s.jsx)(t.code,{children:"INFLIGHT -> INFLIGHT"})," - A process can safely fail many times while performing the action."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"INFLIGHT -> COMPLETED"})," - Denotes that the action has been completed successfully."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["The current state of an action on the timeline is the highest state recorded for that action on the timeline, with states ordered as ",(0,s.jsx)(t.code,{children:"REQUESTED < INFLIGHT < COMPLETED"}),"."]}),"\n",(0,s.jsx)(t.h3,{id:"truetime-generation",children:"TrueTime Generation"}),"\n",(0,s.jsxs)(t.p,{children:["Time in distributed systems has been studied literally for ",(0,s.jsx)(t.a,{href:"https://lamport.azurewebsites.net/pubs/chandy.pdf",children:"decades"}),". Google Spanner\u2019s\n",(0,s.jsx)(t.a,{href:"https://research.google/pubs/spanner-truetime-and-the-cap-theorem/",children:"TrueTime"})," API addresses the challenges of managing time in distributed systems by providing a globally\nsynchronized clock with bounded uncertainty. Traditional systems struggle with clock drift and lack of a consistent timeline, but TrueTime ensures that all nodes operate with\na common notion of time, defined by a strict interval of uncertainty. This enables Spanner to achieve external consistency in distributed transactions, allowing it to assign\ntimestamps with confidence that no other operation in the past or future will conflict, solving age-old issues of clock synchronization and causality. Several OLTP databases\nlike Spanner, ",(0,s.jsx)(t.a,{href:"https://www.cockroachlabs.com/blog/living-without-atomic-clocks/",children:"CockroachDB"})," rely on TrueTime."]}),"\n",(0,s.jsx)(t.p,{children:"Hudi uses these semantics for instant times on the timeline, to provide unique monotonically increasing instant values. TrueTime can be generated by a single shared time generator\nprocess or by having each process generate its own time and waiting for time >= maximum expected clock drift across all processes within a distributed lock. Locking ensures only one\nprocess is generating time at a time and waiting ensures enough time passes such that any new time generated is guaranteed to be greater than the previous time."}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"Timeline actions",src:i(94200).A+"",width:"704",height:"511"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: TrueTime generation for processes A & B"})]}),"\n",(0,s.jsxs)(t.p,{children:["The figure above shows how time generated by process A and B are monotonically increasing, even though process B has a lower local clock than A at the start, by waiting for uncertainty window of x ms to pass.",(0,s.jsx)(t.br,{}),"\n","In fact, given Hudi targets transaction durations > 1 second, we can afford to operate with a much higher uncertainty bound (> 100ms) guaranteeing extremely high fidelity time generation."]}),"\n",(0,s.jsx)(t.h3,{id:"ordering-of-actions",children:"Ordering of Actions"}),"\n",(0,s.jsx)(t.p,{children:"Thus, actions appear on the timeline as an interval starting at the requested instant and ending at the completed instant. Such actions can be ordered by completion time to"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Commit time ordering"})," : To obtain serializable execution order of writes performed consistent with typical relational databases, the actions can be ordered by completed instant."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Event time ordering"}),": Data lakehouses ultimately deal with streams of data (CDC, events, slowly changing data etc), where ordering is dependent on business fields in\nthe data. In such cases, actions can be ordered by commit time, while the records themselves are further merged in order of a specified event time field."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Hudi relies on ordering of requested instants of certain actions against completed instants of other actions, to implement non-blocking table service operations or concurrent streaming model\nwrites with event time ordering."}),"\n",(0,s.jsx)(t.h3,{id:"timeline-components",children:"Timeline Components"}),"\n",(0,s.jsx)(t.h4,{id:"active-timeline",children:"Active Timeline"}),"\n",(0,s.jsxs)(t.p,{children:["Hudi implements the timeline as a Log Structured Merge (",(0,s.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Log-structured_merge-tree",children:"LSM"}),") tree under the ",(0,s.jsx)(t.code,{children:".hoodie/timeline"})," directory. Unlike typical LSM implementations,\nthe memory component and the write-ahead-log are at once replaced by ",(0,s.jsx)(t.a,{href:"https://avro.apache.org/",children:"avro"})," serialized files containing individual actions (",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"active timeline"})}),") for high durability and inter-process co-ordination.\nAll actions on the Hudi table are created in the active timeline a new entry and periodically actions are archived from the active timeline to the LSM structure (timeline history).\nAs the name suggests active timeline is consulted all the time to build a consistent view of data and archiving completed actions ensures reads on the timeline does not incur unnecessary latencies\nas timeline grows. The key invariant around such archiving is that any side effects from completed/pending actions (e.g. uncommitted files) are removed from storage, before archiving them."]}),"\n",(0,s.jsx)(t.h4,{id:"lsm-timeline-history",children:"LSM Timeline History"}),"\n",(0,s.jsxs)(t.p,{children:["As mentioned above, active timeline has limited log history to be fast, while archived timeline is expensive to access\nduring reads or writes, especially with high write throughput. To overcome this limitation, Hudi introduced the LSM (\nlog-structured merge) tree based timeline. Completed actions, their plans and completion metadata are stored in a more\nscalable LSM tree based archived timeline organized in an ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"history"})})," storage folder under the ",(0,s.jsx)(t.code,{children:".hoodie/timeline"})," metadata\npath. It consists of Apache Parquet files with action instant data and bookkeeping metadata files, in the following\nmanner."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"/.hoodie/timeline/history/ \t\t\t\t\t\n\u251c\u2500\u2500 _version_ \t\t\t\t\t <-- stores the manifest version that is current\n\u251c\u2500\u2500 manifest_1 <-- manifests store list of files in timeline\n\u251c\u2500\u2500 manifest_2 <-- compactions, cleaning, writes produce new manifest files\n\u251c\u2500\u2500 ... \n\u251c\u2500\u2500 manifest_ <-- there can be many manifest files at any given time\n\u251c\u2500\u2500 __.parquet <-- files storing actual action details\n"})}),"\n",(0,s.jsx)(t.p,{children:"One can read more about the details of LSM timeline in Hudi 1.0 specs. To understand it better, here is an example."}),"\n",(0,s.jsx)("figure",{children:(0,s.jsx)("img",{className:"docimage",src:i(91140).A,alt:"lsm_tree.png"})}),"\n",(0,s.jsxs)(t.p,{children:["In the above figure, each level is a tree sorted by instant times. We can see that for a bunch of commits the metadata\nis stored in a parquet file. As and when more commits are accumulated, they get compacted and pushed down to lower level\nof the tree. Each new operation to the timeline yields a new snapshot version. The advantage of such a structure is that\nwe can keep the top level in memory if needed, and still load the remaining levels efficiently from the disk if we need to walk\nback longer history. The LSM timeline compaction frequency is controlled by",(0,s.jsx)(t.code,{children:"hoodie.timeline.compaction.batch.size"})," i.e.\nfor every ",(0,s.jsx)(t.em,{children:"N"})," parquet files in the current level, they are merged and flush as a compacted file in the next level."]}),"\n",(0,s.jsx)(t.h3,{id:"timeline-archival-configs",children:"Timeline Archival Configs"}),"\n",(0,s.jsx)(t.p,{children:"Basic configurations that control archival."}),"\n",(0,s.jsx)(t.h4,{id:"spark-configs",children:"Spark configs"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.keep.max.commits"}),(0,s.jsx)(t.td,{children:"30 (Optional)"}),(0,s.jsx)(t.td,{children:"Archiving service moves older entries from timeline into an archived log after each write, to keep the metadata overhead constant, even as the table size grows. This config controls the maximum number of instants to retain in the active timeline."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.keep.min.commits"}),(0,s.jsx)(t.td,{children:"20 (Optional)"}),(0,s.jsx)(t.td,{children:"Similar to hoodie.keep.max.commits, but controls the minimum number of instants to retain in the active timeline."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.timeline.compaction.batch.size"}),(0,s.jsx)(t.td,{children:"10 (Optional)"}),(0,s.jsx)(t.td,{children:"Controls the number of parquet files to compact in a single compaction run at the current level of the LSM tree."})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["For more advanced configs refer ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations#Archival-Configs-advanced-configs",children:"here"}),"."]}),"\n",(0,s.jsx)(t.h4,{id:"flink-options",children:"Flink Options"}),"\n",(0,s.jsx)(t.p,{children:"Flink jobs using the SQL can be configured through the options in WITH clause. The actual datasource level configs are listed below."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Config Name"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"archive.max_commits"}),(0,s.jsx)(t.td,{children:"50 (Optional)"}),(0,s.jsxs)(t.td,{children:["Max number of commits to keep before archiving older commits into a sequential log, default 50",(0,s.jsx)("br",{}),(0,s.jsx)("br",{})," ",(0,s.jsx)(t.code,{children:"Config Param: ARCHIVE_MAX_COMMITS"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"archive.min_commits"}),(0,s.jsx)(t.td,{children:"40 (Optional)"}),(0,s.jsxs)(t.td,{children:["Min number of commits to keep before archiving older commits into a sequential log, default 40",(0,s.jsx)("br",{}),(0,s.jsx)("br",{})," ",(0,s.jsx)(t.code,{children:"Config Param: ARCHIVE_MIN_COMMITS"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"hoodie.timeline.compaction.batch.size"}),(0,s.jsx)(t.td,{children:"10 (Optional)"}),(0,s.jsx)(t.td,{children:"Controls the number of parquet files to compact in a single compaction run at the current level of the LSM tree."})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["Refer ",(0,s.jsx)(t.a,{href:"https://hudi.apache.org/docs/next/configurations#Flink-Options",children:"here"})," for more details."]})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},91140:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/lsm_tree-0a069798a1196c1c71330abcb7ff3581.png"},57050:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/hudi-timeline-actions-e56d0d9fad5645d9910f2591ad7775de.png"},94200:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/hudi-timeline-truetime-4cb47da19e5344580d5ebdcdce3d6cf2.png"},28453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>o});var n=i(96540);const s={},a=n.createContext(s);function r(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/content/cn/assets/js/f67021ea.0365bd67.js b/content/cn/assets/js/f67021ea.028e87dd.js similarity index 94% rename from content/cn/assets/js/f67021ea.0365bd67.js rename to content/cn/assets/js/f67021ea.028e87dd.js index 5461ad1ef867a..cdd5a03549fd3 100644 --- a/content/cn/assets/js/f67021ea.0365bd67.js +++ b/content/cn/assets/js/f67021ea.028e87dd.js @@ -1 +1 @@ -"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[17987],{26947:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"indexes","title":"Indexes","description":"In databases, indexes are auxiliary data structures maintained to quickly locate records needed, without reading unnecessary data","source":"@site/docs/indexes.md","sourceDirName":".","slug":"/indexes","permalink":"/cn/docs/next/indexes","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/indexes.md","tags":[],"version":"current","frontMatter":{"title":"Indexes","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4},"sidebar":"docs","previous":{"title":"Table Metadata","permalink":"/cn/docs/next/metadata"},"next":{"title":"Concurrency Control","permalink":"/cn/docs/next/concurrency_control"}}');var s=i(74848),a=i(28453);const o={title:"Indexes",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4},r=void 0,d={},l=[{value:"Mapping keys to file groups",id:"mapping-keys-to-file-groups",level:2},{value:"Need for indexing",id:"need-for-indexing",level:2},{value:"Multi-modal Indexing",id:"multi-modal-indexing",level:2},{value:"Bloom Filters",id:"bloom-filters",level:3},{value:"Record Indexes",id:"record-indexes",level:3},{value:"Expression Index",id:"expression-index",level:3},{value:"Secondary Index",id:"secondary-index",level:3},{value:"Additional writer-side indexes",id:"additional-writer-side-indexes",level:2},{value:"Global and Non-Global Indexes",id:"global-and-non-global-indexes",level:3},{value:"Configs",id:"configs",level:3},{value:"Spark based configs",id:"spark-based-configs",level:4},{value:"Flink based configs",id:"flink-based-configs",level:4},{value:"Picking Indexing Strategies",id:"picking-indexing-strategies",level:3},{value:"Workload 1: Late arriving updates to fact tables",id:"workload-1-late-arriving-updates-to-fact-tables",level:4},{value:"Workload 2: De-Duplication in event tables",id:"workload-2-de-duplication-in-event-tables",level:4},{value:"Workload 3: Random updates/deletes to a dimension table",id:"workload-3-random-updatesdeletes-to-a-dimension-table",level:4},{value:"Related Resources",id:"related-resources",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["In databases, indexes are auxiliary data structures maintained to quickly locate records needed, without reading unnecessary data\nfrom storage. Given that Hudi\u2019s design has been heavily optimized for handling mutable change streams, with different\nwrite patterns, Hudi considers ",(0,s.jsx)(n.a,{href:"#indexing",children:"indexing"})," as an integral part of its design and has uniquely supported\n",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/blog/2020/11/11/hudi-indexing-mechanisms/",children:"indexing capabilities"})," from its inception, to speed\nup writes on the ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/blog/2024/07/11/what-is-a-data-lakehouse/",children:"data lakehouse"}),", while still providing\ncolumnar query performance."]}),"\n",(0,s.jsx)(n.h2,{id:"mapping-keys-to-file-groups",children:"Mapping keys to file groups"}),"\n",(0,s.jsx)(n.p,{children:"The most foundational index mechanism in Hudi tracks a mapping from a given key (record key + optionally partition path) consistently to a file id. Other types of indexes like secondary indexes,\nbuild on this foundation. This mapping between record key and file group/file id rarely changes once the first version of a record has been written to a file group.\nOnly clustering or cross-partition updates that are implemented as deletes + inserts remap the record key to a different file group. Even then, a given record key is associated with exactly one\nfile group at any completed instant on the timeline."}),"\n",(0,s.jsx)(n.h2,{id:"need-for-indexing",children:"Need for indexing"}),"\n",(0,s.jsxs)(n.p,{children:["For ",(0,s.jsx)(n.a,{href:"table_types#copy-on-write-table",children:"Copy-On-Write tables"}),", indexing enables fast upsert/delete operations, by avoiding the need to join against the entire dataset to determine which files to rewrite.\nFor ",(0,s.jsx)(n.a,{href:"table_types#merge-on-read-table",children:"Merge-On-Read tables"}),", indexing allows Hudi to bound the amount of change records any given base file needs to be merged against. Specifically, a given base file needs to merged\nonly against updates for records that are part of that base file."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Fact table",src:i(82301).A+"",width:"3994",height:"1704"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: Comparison of merge cost for updates (dark blue blocks) against base files (light blue blocks)"})]}),"\n",(0,s.jsx)(n.p,{children:"In contrast,"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Designs without an indexing component (e.g: ",(0,s.jsx)(n.a,{href:"https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions",children:"Apache Hive/Apache Iceberg"}),") end up having to merge all the base files against all incoming updates/delete records\n(10-100x more ",(0,s.jsx)(n.a,{href:"table_types#comparison",children:"read amplification"}),")."]}),"\n",(0,s.jsx)(n.li,{children:"Designs that implement heavily write-optimized OLTP data structures like LSM trees do not require an indexing component. But they perform poorly scan heavy workloads\nagainst cloud storage making them unsuitable for serving analytical queries."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Hudi shines by achieving both great write performance and read performance, at the extra storage costs of an index, which can however unlock a lot more, as we explore below."}),"\n",(0,s.jsx)(n.h2,{id:"multi-modal-indexing",children:"Multi-modal Indexing"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://www.onehouse.ai/blog/introducing-multi-modal-index-for-the-lakehouse-in-apache-hudi",children:"Multi-modal indexing"}),",\nintroduced in ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/releases/release-0.11.0/#multi-modal-index",children:"0.11.0 Hudi release"}),",\nis a re-imagination of what a general purpose indexing subsystem should look like for the lake. Multi-modal indexing is\nimplemented by enhancing the metadata table with the flexibility to extend to new index types as new partitions,\nalong with an ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/metadata_indexing/#setup-async-indexing",children:"asynchronous index"})," building"]}),"\n",(0,s.jsxs)(n.p,{children:["Hudi supports a multi-modal index by augmenting the metadata table with the capability to incorporate new types of indexes, complemented by an\nasynchronous mechanism for ",(0,s.jsx)(n.a,{href:"metadata_indexing",children:"index construction"}),". This enhancement supports a range of indexes within\nthe ",(0,s.jsx)(n.a,{href:"metadata#metadata-table",children:"metadata table"}),", significantly improving the efficiency of both writing to and reading from the table."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Indexes",src:i(4390).A+"",width:"1124",height:"639"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: Indexes in Hudi"})]}),"\n",(0,s.jsx)(n.h3,{id:"bloom-filters",children:"Bloom Filters"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://github.com/apache/hudi/blob/46f41d186c6c84a6af2c54a907ff2736b6013e15/rfc/rfc-37/rfc-37.md",children:"Bloom filter"})," indexes as ",(0,s.jsx)(n.em,{children:"bloom_filter"})," partition in the metadata table.\nThis index employs range-based pruning on the minimum and maximum values of the record keys and bloom-filter-based lookups to tag incoming records. For large tables, this\ninvolves reading the footers of all matching data files for bloom filters, which can be expensive in the case of random\nupdates across the entire dataset. This index stores bloom filters of all data files centrally to avoid scanning the\nfooters directly from all data files."]}),"\n",(0,s.jsx)(n.h3,{id:"record-indexes",children:"Record Indexes"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://cwiki.apache.org/confluence/display/HUDI/RFC-08++Record+level+indexing+mechanisms+for+Hudi+datasets",children:"Record indexes"})," as ",(0,s.jsx)(n.em,{children:"record_index"})," partition in the metadata table.\nContains the mapping of the record key to location. Record index is a global index, enforcing key uniqueness across all partitions in the table. This index aids in locating records faster than\nother existing indexes and can provide a speedup orders of magnitude faster in large deployments where index lookup dominates write latencies. To accommodate very high scales, it utilizes hash-based\nsharding of the key space. Additionally, when it comes to reading data, the index allows for point lookups significantly speeding up index mapping retrieval process."]}),"\n",(0,s.jsx)(n.h3,{id:"expression-index",children:"Expression Index"}),"\n",(0,s.jsxs)(n.p,{children:["An ",(0,s.jsx)(n.a,{href:"https://github.com/apache/hudi/blob/3789840be3d041cbcfc6b24786740210e4e6d6ac/rfc/rfc-63/rfc-63.md",children:"expression index"})," is an index on a function of a column. If a query has a predicate on a function of a column, the expression index can\nbe used to speed up the query. Expression index is stored in ",(0,s.jsx)(n.em,{children:"expr_index_"})," prefixed partitions (one for each\nexpression index) under metadata table. Expression index can be created using SQL syntax. Please checkout SQL DDL\ndocs ",(0,s.jsx)(n.a,{href:"sql_ddl#create-expression-index",children:"here"})," for more details."]}),"\n",(0,s.jsx)(n.h3,{id:"secondary-index",children:"Secondary Index"}),"\n",(0,s.jsxs)(n.p,{children:["Secondary indexes allow users to create indexes on columns that are not part of record key columns in Hudi tables (for\nrecord key fields, Hudi supports ",(0,s.jsx)(n.a,{href:"/blog/2023/11/01/record-level-index",children:"Record-level Index"}),". Secondary indexes\ncan be used to speed up queries with predicate on columns other than record key columns."]}),"\n",(0,s.jsx)(n.p,{children:"Following are configurations that control enabling index building and maintenance on the writer."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.metadata.index.bloom.filter.enable"}),(0,s.jsx)(n.td,{children:"false (Optional)"}),(0,s.jsxs)(n.td,{children:["Enable indexing bloom filters of user data files under metadata table. When enabled, metadata table will have a partition to store the bloom filter index and will be used during the index lookups.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: ENABLE_METADATA_INDEX_BLOOM_FILTER"}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Since Version: 0.11.0"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.metadata.record.index.enable"}),(0,s.jsx)(n.td,{children:"false (Optional)"}),(0,s.jsxs)(n.td,{children:["Create the record Index within the metadata table",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: RECORD_INDEX_ENABLE_PROP"}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Since Version: 0.14.0"}),". This is a pre-requisite for secondary indexes or expression indexes on them."]})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"additional-writer-side-indexes",children:"Additional writer-side indexes"}),"\n",(0,s.jsx)(n.p,{children:"All the indexes discussed above are available both readers/writers using integration with metadata table. There are also indexing mechanisms\nimplemented by the storage engine, by efficiently reading/joining/processing incoming input records against information stored in base/log\nfiles themselves (e.g. bloom filters stored in parquet file footers) or intelligent data layout (e.g. bucket index)."}),"\n",(0,s.jsxs)(n.p,{children:["Currently, Hudi supports the following index types. Default is SIMPLE on Spark engine, and INMEMORY on Flink and Java\nengines. Writers can pick one of these options using ",(0,s.jsx)(n.code,{children:"hoodie.index.type"})," config option."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"SIMPLE (default for Spark engines)"}),": This is the standard index type for the Spark engine. It executes an efficient join of incoming records with keys retrieved from the table stored on disk. It requires keys to be partition-level unique so it can function correctly."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"RECORD_INDEX"})," : Use the record index from section above as the writer side index."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"BLOOM"}),": Uses bloom filters generated from record keys, with the option to further narrow down candidate files based on the ranges of the record keys. It requires keys to be partition-level unique so it can function correctly."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"GLOBAL_BLOOM"}),": Utilizes bloom filters created from record keys, and may also refine the selection of candidate files by using the ranges of record keys. It requires keys to be table/global-level unique so it can function correctly."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"GLOBAL_SIMPLE"}),": Performs a lean join of the incoming records against keys extracted from the table on storage. It requires keys to be table/global-level unique so it can function correctly."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"HBASE"}),": Mangages the index mapping through an external table in Apache HBase."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"INMEMORY (default for Flink and Java)"}),": Uses in-memory hashmap in Spark and Java engine and Flink in-memory state in Flink for indexing."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"BUCKET"}),": Utilizes bucket hashing to identify the file group that houses the records, which proves to be particularly advantageous on a large scale. To select the type of bucket engine\u2014that is, the method by which buckets are created\u2014use the ",(0,s.jsx)(n.code,{children:"hoodie.index.bucket.engine"})," configuration option."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"SIMPLE(default)"}),": This index employs a fixed number of buckets for file groups within each partition, which do not have the capacity to decrease or increase in size. It is applicable to both COW and MOR tables. Due to the unchangeable number of buckets and the design principle of mapping each bucket to a single file group, this indexing method may not be ideal for partitions with significant data skew."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"CONSISTENT_HASHING"}),": This index accommodates a dynamic number of buckets, with the capability for bucket resizing to ensure each bucket is sized appropriately. This addresses the issue of data skew in partitions with a high volume of data by allowing these partitions to be dynamically resized. As a result, partitions can have multiple reasonably sized buckets, unlike the fixed bucket count per partition seen in the SIMPLE bucket engine type. This feature is exclusively compatible with MOR tables."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Bring your own implementation:"})," You can extend this ",(0,s.jsx)(n.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/index/HoodieIndex.java",children:"public API"}),"\nand supply a subclass of ",(0,s.jsx)(n.code,{children:"SparkHoodieIndex"})," (for Apache Spark writers) using ",(0,s.jsx)(n.code,{children:"hoodie.index.class"})," to implement custom indexing."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"global-and-non-global-indexes",children:"Global and Non-Global Indexes"}),"\n",(0,s.jsxs)(n.p,{children:["Another key aspect worth understanding is the difference between global and non-global indexes. Both bloom and simple index have\nglobal options - ",(0,s.jsx)(n.code,{children:"hoodie.index.type=GLOBAL_BLOOM"})," and ",(0,s.jsx)(n.code,{children:"hoodie.index.type=GLOBAL_SIMPLE"})," - respectively. Record index and\nHBase index are by nature a global index."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Global index:"})," Global indexes enforce uniqueness of keys across all partitions of a table i.e guarantees that exactly\none record exists in the table for a given record key. Global indexes offer stronger guarantees, but the update/delete\ncost can still grow with size of the table ",(0,s.jsx)(n.code,{children:"O(size of table)"}),", since the record could belong to any partition in storage.\nIn case of non-global index, lookup involves file groups only for the matching partitions from the incoming records and\nso its not impacted by the total size of the table. These global indexes(GLOBAL_SIMPLE or GLOBAL_BLOOM), might be\nacceptable for decent sized tables, but for large tables, a newly added index (0.14.0) called Record Level Index (RLI),\ncan offer pretty good index lookup performance compared to other global indexes(GLOBAL_SIMPLE or GLOBAL_BLOOM) or\nHbase and also avoids the operational overhead of maintaining external systems."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Non Global index:"})," On the other hand, the default index implementations enforce this constraint only within a specific partition.\nAs one might imagine, non global indexes depends on the writer to provide the same consistent partition path for a given record key during update/delete,\nbut can deliver much better performance since the index lookup operation becomes ",(0,s.jsx)(n.code,{children:"O(number of records updated/deleted)"})," and\nscales well with write volume."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"configs",children:"Configs"}),"\n",(0,s.jsx)(n.h4,{id:"spark-based-configs",children:"Spark based configs"}),"\n",(0,s.jsxs)(n.p,{children:["For Spark DataSource, Spark SQL, DeltaStreamer and Structured Streaming following are the key configs that control\nindexing behavior. Please refer to ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/next/configurations#Common-Index-Configs-advanced-configs",children:"Advanced Configs"}),"\nfor more details. All these, support the index types mentioned ",(0,s.jsx)(n.a,{href:"#index-types-in-hudi",children:"above"}),"."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.index.type"}),(0,s.jsxs)(n.td,{children:["N/A ",(0,s.jsx)(n.strong,{children:"(Required)"})]}),(0,s.jsxs)(n.td,{children:["org.apache.hudi.index.HoodieIndex$IndexType: Determines how input records are indexed, i.e., looked up based on the key for the location in the existing table. Default is SIMPLE on Spark engine, and INMEMORY on Flink and Java engines. Possible Values: ",(0,s.jsx)("br",{})," ",(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:"BLOOM"}),(0,s.jsx)("li",{children:"GLOBAL_BLOOM"}),(0,s.jsx)("li",{children:"SIMPLE"}),(0,s.jsx)("li",{children:"GLOBAL_SIMPLE"}),(0,s.jsx)("li",{children:"HBASE"}),(0,s.jsx)("li",{children:"INMEMORY"}),(0,s.jsx)("li",{children:"FLINK_STATE"}),(0,s.jsx)("li",{children:"BUCKET"}),(0,s.jsx)("li",{children:"RECORD_INDEX"})]}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: INDEX_TYPE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.index.bucket.engine"}),(0,s.jsx)(n.td,{children:"SIMPLE (Optional)"}),(0,s.jsxs)(n.td,{children:["org.apache.hudi.index.HoodieIndex$BucketIndexEngineType: Determines the type of bucketing or hashing to use when ",(0,s.jsx)(n.code,{children:"hoodie.index.type"})," is set to ",(0,s.jsx)(n.code,{children:"BUCKET"}),". Possible Values: ",(0,s.jsx)("br",{})," ",(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:"SIMPLE"}),(0,s.jsx)("li",{children:"CONSISTENT_HASHING"})]})," ",(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: BUCKET_INDEX_ENGINE_TYPE"}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Since Version: 0.11.0"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.index.class"}),(0,s.jsx)(n.td,{children:"(Optional)"}),(0,s.jsxs)(n.td,{children:["Full path of user-defined index class and must be a subclass of HoodieIndex class. It will take precedence over the hoodie.index.type configuration if specified",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: INDEX_CLASS_NAME"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.bloom.index.update.partition.path"}),(0,s.jsx)(n.td,{children:"true (Optional)"}),(0,s.jsxs)(n.td,{children:["Only applies if index type is GLOBAL_BLOOM. When set to true, an update including the partition path of a record that already exists will result in inserting the incoming record into the new partition and deleting the original record in the old partition. When set to false, the original record will only be updated in the old partition, ignoring the new incoming partition if there is a mis-match between partition value for an incoming record with whats in storage.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: BLOOM_INDEX_UPDATE_PARTITION_PATH_ENABLE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.record.index.update.partition.path"}),(0,s.jsx)(n.td,{children:"false (Optional)"}),(0,s.jsxs)(n.td,{children:["Similar to Key: 'hoodie.bloom.index.update.partition.path' , Only applies if index type is RECORD_INDEX. When set to true, an update including the partition path of a record that already exists will result in inserting the incoming record into the new partition and deleting the original record in the old partition. When set to false, the original record will only be updated in the old partition, ignoring the new incoming partition if there is a mis-match between partition value for an incoming record with whats in storage. ",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: RECORD_INDEX_UPDATE_PARTITION_PATH_ENABLE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.simple.index.update.partition.path"}),(0,s.jsx)(n.td,{children:"true (Optional)"}),(0,s.jsxs)(n.td,{children:["Similar to Key: 'hoodie.bloom.index.update.partition.path' , Only applies if index type is GLOBAL_SIMPLE. When set to true, an update including the partition path of a record that already exists will result in inserting the incoming record into the new partition and deleting the original record in the old partition. When set to false, the original record will only be updated in the old partition, ignoring the new incoming partition if there is a mis-match between partition value for an incoming record with whats in storage. ",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: SIMPLE_INDEX_UPDATE_PARTITION_PATH_ENABLE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.hbase.index.update.partition.path"}),(0,s.jsx)(n.td,{children:"false (Optional)"}),(0,s.jsxs)(n.td,{children:["Only applies if index type is HBASE. When an already existing record is upserted to a new partition compared to whats in storage, this config when set, will delete old record in old partition and will insert it as new record in new partition.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: UPDATE_PARTITION_PATH_ENABLE"})]})]})]})]}),"\n",(0,s.jsx)(n.h4,{id:"flink-based-configs",children:"Flink based configs"}),"\n",(0,s.jsxs)(n.p,{children:["For Flink DataStream and Flink SQL only support Bucket Index and internal Flink state store backed in memory index.\nFollowing are the basic configs that control the indexing behavior. Please refer ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/next/configurations#Flink-Options-advanced-configs",children:"here"}),"\nfor advanced configs."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"index.type"}),(0,s.jsx)(n.td,{children:"FLINK_STATE (Optional)"}),(0,s.jsxs)(n.td,{children:["Index type of Flink write job, default is using state backed index. Possible values:",(0,s.jsx)("br",{})," ",(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:"FLINK_STATE"}),(0,s.jsx)("li",{children:"BUCKET"})]}),(0,s.jsx)("br",{})," ",(0,s.jsx)(n.code,{children:"Config Param: INDEX_TYPE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.index.bucket.engine"}),(0,s.jsx)(n.td,{children:"SIMPLE (Optional)"}),(0,s.jsxs)(n.td,{children:["org.apache.hudi.index.HoodieIndex$BucketIndexEngineType: Determines the type of bucketing or hashing to use when ",(0,s.jsx)(n.code,{children:"hoodie.index.type"})," is set to ",(0,s.jsx)(n.code,{children:"BUCKET"}),". Possible Values: ",(0,s.jsx)("br",{})," ",(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:"SIMPLE"}),(0,s.jsx)("li",{children:"CONSISTENT_HASHING"})]})]})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"picking-indexing-strategies",children:"Picking Indexing Strategies"}),"\n",(0,s.jsx)(n.p,{children:"Since data comes in at different volumes, velocity and has different access patterns, different indexes could be used for different workload types.\nLet\u2019s walk through some typical workload types and see how to leverage the right Hudi index for such use-cases.\nThis is based on our experience and you should diligently decide if the same strategies are best for your workloads."}),"\n",(0,s.jsx)(n.h4,{id:"workload-1-late-arriving-updates-to-fact-tables",children:"Workload 1: Late arriving updates to fact tables"}),"\n",(0,s.jsx)(n.p,{children:"Many companies store large volumes of transactional data in NoSQL data stores. For eg, trip tables in case of ride-sharing, buying and selling of shares,\norders in an e-commerce site. These tables are usually ever growing with random updates on most recent data with long tail updates going to older data, either\ndue to transactions settling at a later date/data corrections. In other words, most updates go into the latest partitions with few updates going to older ones."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Fact table",src:i(50042).A+"",width:"3191",height:"1327"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: Typical update pattern for Fact tables"})]}),"\n",(0,s.jsxs)(n.p,{children:["For such workloads, the ",(0,s.jsx)(n.code,{children:"BLOOM"})," index performs well, since index look-up will prune a lot of data files based on a well-sized bloom filter.\nAdditionally, if the keys can be constructed such that they have a certain ordering, the number of files to be compared is further reduced by range pruning.\nHudi constructs an interval tree with all the file key ranges and efficiently filters out the files that don't match any key ranges in the updates/deleted records."]}),"\n",(0,s.jsxs)(n.p,{children:["In order to efficiently compare incoming record keys against bloom filters i.e with minimal number of bloom filter reads and uniform distribution of work across\nthe executors, Hudi leverages caching of input records and employs a custom partitioner that can iron out data skews using statistics. At times, if the bloom filter\nfalse positive ratio is high, it could increase the amount of data shuffled to perform the lookup. Hudi supports dynamic bloom filters\n(enabled using ",(0,s.jsx)(n.code,{children:"hoodie.bloom.index.filter.type=DYNAMIC_V0"}),"), which adjusts its size based on the number of records stored in a given file to deliver the\nconfigured false positive ratio."]}),"\n",(0,s.jsx)(n.h4,{id:"workload-2-de-duplication-in-event-tables",children:"Workload 2: De-Duplication in event tables"}),"\n",(0,s.jsx)(n.p,{children:'Event Streaming is everywhere. Events coming from Apache Kafka or similar message bus are typically 10-100x the size of fact tables and often treat "time" (event\'s arrival time/processing\ntime) as a first class citizen. For eg, IoT event stream, click stream data, ad impressions etc. Inserts and updates only span the last few partitions as these are mostly append only data.\nGiven duplicate events can be introduced anywhere in the end-end pipeline, de-duplication before storing on the data lake is a common requirement.'}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Event table",src:i(39506).A+"",width:"6218",height:"2609"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure showing the spread of updates for Event table."})]}),"\n",(0,s.jsxs)(n.p,{children:["In general, this is a very challenging problem to solve at lower cost. Although, we could even employ a key value store to perform this de-duplication with HBASE index, the index storage\ncosts would grow linear with number of events and thus can be prohibitively expensive. In fact, ",(0,s.jsx)(n.code,{children:"BLOOM"})," index with range pruning is the optimal solution here. One can leverage the fact\nthat time is often a first class citizen and construct a key such as ",(0,s.jsx)(n.code,{children:"event_ts + event_id"})," such that the inserted records have monotonically increasing keys. This yields great returns\nby pruning large amounts of files even within the latest table partitions."]}),"\n",(0,s.jsx)(n.h4,{id:"workload-3-random-updatesdeletes-to-a-dimension-table",children:"Workload 3: Random updates/deletes to a dimension table"}),"\n",(0,s.jsx)(n.p,{children:"These types of tables usually contain high dimensional data and hold reference data e.g user profile, merchant information. These are high fidelity tables where the updates are often small but also spread\nacross a lot of partitions and data files ranging across the dataset from old to new. Often times, these tables are also un-partitioned, since there is also not a good way to partition these tables."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Dimensions table",src:i(17429).A+"",width:"13365",height:"5602"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure showing the spread of updates for Dimensions table."})]}),"\n",(0,s.jsxs)(n.p,{children:["As discussed before, the ",(0,s.jsx)(n.code,{children:"BLOOM"})," index may not yield benefits if a good number of files cannot be pruned out by comparing ranges/filters. In such a random write workload, updates end up touching\nmost files within in the table and thus bloom filters will typically indicate a true positive for all files based on some incoming update. Consequently, we would end up comparing ranges/filter, only\nto finally check the incoming updates against all files. The ",(0,s.jsx)(n.code,{children:"SIMPLE"})," Index will be a better fit as it does not do any upfront pruning based, but directly joins with interested fields from every data file.\n",(0,s.jsx)(n.code,{children:"HBASE"})," index can be employed, if the operational overhead is acceptable and would provide much better lookup times for these tables."]}),"\n",(0,s.jsxs)(n.p,{children:["When using a global index, users should also consider setting ",(0,s.jsx)(n.code,{children:"hoodie.bloom.index.update.partition.path=true"})," or ",(0,s.jsx)(n.code,{children:"hoodie.simple.index.update.partition.path=true"})," to deal with cases where the\npartition path value could change due to an update e.g users table partitioned by home city; user relocates to a different city. These tables are also excellent candidates for the Merge-On-Read table type."]}),"\n",(0,s.jsx)(n.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,s.jsx)("h3",{children:"Videos"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://youtu.be/XlRvMFJ7g9c",children:"Global Bloom Index: Remove duplicates & guarantee uniquness - Hudi Labs"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://www.onehouse.ai/blog/introducing-multi-modal-index-for-the-lakehouse-in-apache-hudi",children:"Multi-Modal Index for the Lakehouse in Apache Hudi"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},17429:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/dimension-c1a4d25a9b59f1ae577b2159336b2a4e.png"},39506:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/event_bus-0066b1fff4c3b67ef966404738e53e59.png"},50042:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/nosql-bc8be272a92982296f05780fb60394ff.png"},82301:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/with_without_index-c0808363df23ac1aba63bc81a68b6c8c.png"},4390:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/hudi-stack-indexes-589506d411b969d14a9087633253a391.png"},28453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>r});var t=i(96540);const s={},a=t.createContext(s);function o(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkhudi=self.webpackChunkhudi||[]).push([[17987],{26947:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"indexes","title":"Indexes","description":"In databases, indexes are auxiliary data structures maintained to quickly locate records needed, without reading unnecessary data","source":"@site/docs/indexes.md","sourceDirName":".","slug":"/indexes","permalink":"/cn/docs/next/indexes","draft":false,"unlisted":false,"editUrl":"https://github.com/apache/hudi/tree/asf-site/website/docs/indexes.md","tags":[],"version":"current","frontMatter":{"title":"Indexes","toc":true,"toc_min_heading_level":2,"toc_max_heading_level":4},"sidebar":"docs","previous":{"title":"Table Metadata","permalink":"/cn/docs/next/metadata"},"next":{"title":"Concurrency Control","permalink":"/cn/docs/next/concurrency_control"}}');var s=i(74848),a=i(28453);const o={title:"Indexes",toc:!0,toc_min_heading_level:2,toc_max_heading_level:4},r=void 0,d={},l=[{value:"Mapping keys to file groups",id:"mapping-keys-to-file-groups",level:2},{value:"Need for indexing",id:"need-for-indexing",level:2},{value:"Multi-modal Indexing",id:"multi-modal-indexing",level:2},{value:"Bloom Filters",id:"bloom-filters",level:3},{value:"Record Indexes",id:"record-indexes",level:3},{value:"Expression Index",id:"expression-index",level:3},{value:"Secondary Index",id:"secondary-index",level:3},{value:"Additional writer-side indexes",id:"additional-writer-side-indexes",level:2},{value:"Global and Non-Global Indexes",id:"global-and-non-global-indexes",level:3},{value:"Configs",id:"configs",level:3},{value:"Spark based configs",id:"spark-based-configs",level:4},{value:"Flink based configs",id:"flink-based-configs",level:4},{value:"Picking Indexing Strategies",id:"picking-indexing-strategies",level:3},{value:"Workload 1: Late arriving updates to fact tables",id:"workload-1-late-arriving-updates-to-fact-tables",level:4},{value:"Workload 2: De-Duplication in event tables",id:"workload-2-de-duplication-in-event-tables",level:4},{value:"Workload 3: Random updates/deletes to a dimension table",id:"workload-3-random-updatesdeletes-to-a-dimension-table",level:4},{value:"Related Resources",id:"related-resources",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["In databases, indexes are auxiliary data structures maintained to quickly locate records needed, without reading unnecessary data\nfrom storage. Given that Hudi\u2019s design has been heavily optimized for handling mutable change streams, with different\nwrite patterns, Hudi considers ",(0,s.jsx)(n.a,{href:"#indexing",children:"indexing"})," as an integral part of its design and has uniquely supported\n",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/blog/2020/11/11/hudi-indexing-mechanisms/",children:"indexing capabilities"})," from its inception, to speed\nup writes on the ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/blog/2024/07/11/what-is-a-data-lakehouse/",children:"data lakehouse"}),", while still providing\ncolumnar query performance."]}),"\n",(0,s.jsx)(n.h2,{id:"mapping-keys-to-file-groups",children:"Mapping keys to file groups"}),"\n",(0,s.jsx)(n.p,{children:"The most foundational index mechanism in Hudi tracks a mapping from a given key (record key + optionally partition path) consistently to a file id. Other types of indexes like secondary indexes,\nbuild on this foundation. This mapping between record key and file group/file id rarely changes once the first version of a record has been written to a file group.\nOnly clustering or cross-partition updates that are implemented as deletes + inserts remap the record key to a different file group. Even then, a given record key is associated with exactly one\nfile group at any completed instant on the timeline."}),"\n",(0,s.jsx)(n.h2,{id:"need-for-indexing",children:"Need for indexing"}),"\n",(0,s.jsxs)(n.p,{children:["For ",(0,s.jsx)(n.a,{href:"table_types#copy-on-write-table",children:"Copy-On-Write tables"}),", indexing enables fast upsert/delete operations, by avoiding the need to join against the entire dataset to determine which files to rewrite.\nFor ",(0,s.jsx)(n.a,{href:"table_types#merge-on-read-table",children:"Merge-On-Read tables"}),", indexing allows Hudi to bound the amount of change records any given base file needs to be merged against. Specifically, a given base file needs to merged\nonly against updates for records that are part of that base file."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Fact table",src:i(82301).A+"",width:"3994",height:"1704"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: Comparison of merge cost for updates (dark blue blocks) against base files (light blue blocks)"})]}),"\n",(0,s.jsx)(n.p,{children:"In contrast,"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Designs without an indexing component (e.g: ",(0,s.jsx)(n.a,{href:"https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions",children:"Apache Hive/Apache Iceberg"}),") end up having to merge all the base files against all incoming updates/delete records\n(10-100x more ",(0,s.jsx)(n.a,{href:"table_types#comparison",children:"read amplification"}),")."]}),"\n",(0,s.jsx)(n.li,{children:"Designs that implement heavily write-optimized OLTP data structures like LSM trees do not require an indexing component. But they perform poorly scan heavy workloads\nagainst cloud storage making them unsuitable for serving analytical queries."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Hudi shines by achieving both great write performance and read performance, at the extra storage costs of an index, which can however unlock a lot more, as we explore below."}),"\n",(0,s.jsx)(n.h2,{id:"multi-modal-indexing",children:"Multi-modal Indexing"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://www.onehouse.ai/blog/introducing-multi-modal-index-for-the-lakehouse-in-apache-hudi",children:"Multi-modal indexing"}),",\nintroduced in ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/releases/release-0.11.0/#multi-modal-index",children:"0.11.0 Hudi release"}),",\nis a re-imagination of what a general purpose indexing subsystem should look like for the lake. Multi-modal indexing is\nimplemented by enhancing the metadata table with the flexibility to extend to new index types as new partitions,\nalong with an ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/metadata_indexing/#setup-async-indexing",children:"asynchronous index"})," building"]}),"\n",(0,s.jsxs)(n.p,{children:["Hudi supports a multi-modal index by augmenting the metadata table with the capability to incorporate new types of indexes, complemented by an\nasynchronous mechanism for ",(0,s.jsx)(n.a,{href:"metadata_indexing",children:"index construction"}),". This enhancement supports a range of indexes within\nthe ",(0,s.jsx)(n.a,{href:"metadata#metadata-table",children:"metadata table"}),", significantly improving the efficiency of both writing to and reading from the table."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Indexes",src:i(4390).A+"",width:"1124",height:"639"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: Indexes in Hudi"})]}),"\n",(0,s.jsx)(n.h3,{id:"bloom-filters",children:"Bloom Filters"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://github.com/apache/hudi/blob/46f41d186c6c84a6af2c54a907ff2736b6013e15/rfc/rfc-37/rfc-37.md",children:"Bloom filter"})," indexes as ",(0,s.jsx)(n.em,{children:"bloom_filter"})," partition in the metadata table.\nThis index employs range-based pruning on the minimum and maximum values of the record keys and bloom-filter-based lookups to tag incoming records. For large tables, this\ninvolves reading the footers of all matching data files for bloom filters, which can be expensive in the case of random\nupdates across the entire dataset. This index stores bloom filters of all data files centrally to avoid scanning the\nfooters directly from all data files."]}),"\n",(0,s.jsx)(n.h3,{id:"record-indexes",children:"Record Indexes"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://cwiki.apache.org/confluence/display/HUDI/RFC-08++Record+level+indexing+mechanisms+for+Hudi+datasets",children:"Record indexes"})," as ",(0,s.jsx)(n.em,{children:"record_index"})," partition in the metadata table.\nContains the mapping of the record key to location. Record index is a global index, enforcing key uniqueness across all partitions in the table. This index aids in locating records faster than\nother existing indexes and can provide a speedup orders of magnitude faster in large deployments where index lookup dominates write latencies. To accommodate very high scales, it utilizes hash-based\nsharding of the key space. Additionally, when it comes to reading data, the index allows for point lookups significantly speeding up index mapping retrieval process."]}),"\n",(0,s.jsx)(n.h3,{id:"expression-index",children:"Expression Index"}),"\n",(0,s.jsxs)(n.p,{children:["An ",(0,s.jsx)(n.a,{href:"https://github.com/apache/hudi/blob/3789840be3d041cbcfc6b24786740210e4e6d6ac/rfc/rfc-63/rfc-63.md",children:"expression index"})," is an index on a function of a column. If a query has a predicate on a function of a column, the expression index can\nbe used to speed up the query. Expression index is stored in ",(0,s.jsx)(n.em,{children:"expr_index_"})," prefixed partitions (one for each\nexpression index) under metadata table. Expression index can be created using SQL syntax. Please checkout SQL DDL\ndocs ",(0,s.jsx)(n.a,{href:"sql_ddl#create-expression-index",children:"here"})," for more details."]}),"\n",(0,s.jsx)(n.h3,{id:"secondary-index",children:"Secondary Index"}),"\n",(0,s.jsxs)(n.p,{children:["Secondary indexes allow users to create indexes on columns that are not part of record key columns in Hudi tables (for\nrecord key fields, Hudi supports ",(0,s.jsx)(n.a,{href:"/blog/2023/11/01/record-level-index",children:"Record-level Index"}),". Secondary indexes\ncan be used to speed up queries with predicate on columns other than record key columns."]}),"\n",(0,s.jsx)(n.p,{children:"Following are configurations that control enabling index building and maintenance on the writer."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.metadata.index.bloom.filter.enable"}),(0,s.jsx)(n.td,{children:"false (Optional)"}),(0,s.jsxs)(n.td,{children:["Enable indexing bloom filters of user data files under metadata table. When enabled, metadata table will have a partition to store the bloom filter index and will be used during the index lookups.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: ENABLE_METADATA_INDEX_BLOOM_FILTER"}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Since Version: 0.11.0"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.metadata.record.index.enable"}),(0,s.jsx)(n.td,{children:"false (Optional)"}),(0,s.jsxs)(n.td,{children:["Create the record Index within the metadata table",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: RECORD_INDEX_ENABLE_PROP"}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Since Version: 0.14.0"}),". This is a pre-requisite for secondary indexes or expression indexes on them."]})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"additional-writer-side-indexes",children:"Additional writer-side indexes"}),"\n",(0,s.jsx)(n.p,{children:"All the indexes discussed above are available both readers/writers using integration with metadata table. There are also indexing mechanisms\nimplemented by the storage engine, by efficiently reading/joining/processing incoming input records against information stored in base/log\nfiles themselves (e.g. bloom filters stored in parquet file footers) or intelligent data layout (e.g. bucket index)."}),"\n",(0,s.jsxs)(n.p,{children:["Currently, Hudi supports the following index types. Default is SIMPLE on Spark engine, and INMEMORY on Flink and Java\nengines. Writers can pick one of these options using ",(0,s.jsx)(n.code,{children:"hoodie.index.type"})," config option."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"SIMPLE (default for Spark engines)"}),": This is the standard index type for the Spark engine. It executes an efficient join of incoming records with keys retrieved from the table stored on disk. It requires keys to be partition-level unique so it can function correctly."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"RECORD_INDEX"})," : Use the record index from section above as the writer side index."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"BLOOM"}),": Uses bloom filters generated from record keys, with the option to further narrow down candidate files based on the ranges of the record keys. It requires keys to be partition-level unique so it can function correctly."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"GLOBAL_BLOOM"}),": Utilizes bloom filters created from record keys, and may also refine the selection of candidate files by using the ranges of record keys. It requires keys to be table/global-level unique so it can function correctly."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"GLOBAL_SIMPLE"}),": Performs a lean join of the incoming records against keys extracted from the table on storage. It requires keys to be table/global-level unique so it can function correctly."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"HBASE"}),": Mangages the index mapping through an external table in Apache HBase."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"INMEMORY (default for Flink and Java)"}),": Uses in-memory hashmap in Spark and Java engine and Flink in-memory state in Flink for indexing."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"BUCKET"}),": Utilizes bucket hashing to identify the file group that houses the records, which proves to be particularly advantageous on a large scale. To select the type of bucket engine\u2014that is, the method by which buckets are created\u2014use the ",(0,s.jsx)(n.code,{children:"hoodie.index.bucket.engine"})," configuration option."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"SIMPLE(default)"}),": This index employs a fixed number of buckets for file groups within each partition, which do not have the capacity to decrease or increase in size. It is applicable to both COW and MOR tables. Due to the unchangeable number of buckets and the design principle of mapping each bucket to a single file group, this indexing method may not be ideal for partitions with significant data skew."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"CONSISTENT_HASHING"}),": This index accommodates a dynamic number of buckets, with the capability for bucket resizing to ensure each bucket is sized appropriately. This addresses the issue of data skew in partitions with a high volume of data by allowing these partitions to be dynamically resized. As a result, partitions can have multiple reasonably sized buckets, unlike the fixed bucket count per partition seen in the SIMPLE bucket engine type. This feature is exclusively compatible with MOR tables."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Bring your own implementation:"})," You can extend this ",(0,s.jsx)(n.a,{href:"https://github.com/apache/hudi/blob/master/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/index/HoodieIndex.java",children:"public API"}),"\nand supply a subclass of ",(0,s.jsx)(n.code,{children:"SparkHoodieIndex"})," (for Apache Spark writers) using ",(0,s.jsx)(n.code,{children:"hoodie.index.class"})," to implement custom indexing."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"global-and-non-global-indexes",children:"Global and Non-Global Indexes"}),"\n",(0,s.jsxs)(n.p,{children:["Another key aspect worth understanding is the difference between global and non-global indexes. Both bloom and simple index have\nglobal options - ",(0,s.jsx)(n.code,{children:"hoodie.index.type=GLOBAL_BLOOM"})," and ",(0,s.jsx)(n.code,{children:"hoodie.index.type=GLOBAL_SIMPLE"})," - respectively. Record index and\nHBase index are by nature a global index."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Global index:"})," Global indexes enforce uniqueness of keys across all partitions of a table i.e guarantees that exactly\none record exists in the table for a given record key. Global indexes offer stronger guarantees, but the update/delete\ncost can still grow with size of the table ",(0,s.jsx)(n.code,{children:"O(size of table)"}),", since the record could belong to any partition in storage.\nIn case of non-global index, lookup involves file groups only for the matching partitions from the incoming records and\nso its not impacted by the total size of the table. These global indexes(GLOBAL_SIMPLE or GLOBAL_BLOOM), might be\nacceptable for decent sized tables, but for large tables, a newly added index (0.14.0) called Record Level Index (RLI),\ncan offer pretty good index lookup performance compared to other global indexes(GLOBAL_SIMPLE or GLOBAL_BLOOM) or\nHbase and also avoids the operational overhead of maintaining external systems."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Non Global index:"})," On the other hand, the default index implementations enforce this constraint only within a specific partition.\nAs one might imagine, non global indexes depends on the writer to provide the same consistent partition path for a given record key during update/delete,\nbut can deliver much better performance since the index lookup operation becomes ",(0,s.jsx)(n.code,{children:"O(number of records updated/deleted)"})," and\nscales well with write volume."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"configs",children:"Configs"}),"\n",(0,s.jsx)(n.h4,{id:"spark-based-configs",children:"Spark based configs"}),"\n",(0,s.jsxs)(n.p,{children:["For Spark DataSource, Spark SQL, DeltaStreamer and Structured Streaming following are the key configs that control\nindexing behavior. Please refer to ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/next/configurations#Common-Index-Configs-advanced-configs",children:"Advanced Configs"}),"\nfor more details. All these, support the index types mentioned ",(0,s.jsx)(n.a,{href:"#index-types-in-hudi",children:"above"}),"."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.index.type"}),(0,s.jsxs)(n.td,{children:["N/A ",(0,s.jsx)(n.strong,{children:"(Required)"})]}),(0,s.jsxs)(n.td,{children:["org.apache.hudi.index.HoodieIndex$IndexType: Determines how input records are indexed, i.e., looked up based on the key for the location in the existing table. Default is SIMPLE on Spark engine, and INMEMORY on Flink and Java engines. Possible Values: ",(0,s.jsx)("br",{})," ",(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:"BLOOM"}),(0,s.jsx)("li",{children:"GLOBAL_BLOOM"}),(0,s.jsx)("li",{children:"SIMPLE"}),(0,s.jsx)("li",{children:"GLOBAL_SIMPLE"}),(0,s.jsx)("li",{children:"HBASE"}),(0,s.jsx)("li",{children:"INMEMORY"}),(0,s.jsx)("li",{children:"FLINK_STATE"}),(0,s.jsx)("li",{children:"BUCKET"}),(0,s.jsx)("li",{children:"RECORD_INDEX"})]}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: INDEX_TYPE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.index.bucket.engine"}),(0,s.jsx)(n.td,{children:"SIMPLE (Optional)"}),(0,s.jsxs)(n.td,{children:["org.apache.hudi.index.HoodieIndex$BucketIndexEngineType: Determines the type of bucketing or hashing to use when ",(0,s.jsx)(n.code,{children:"hoodie.index.type"})," is set to ",(0,s.jsx)(n.code,{children:"BUCKET"}),". Possible Values: ",(0,s.jsx)("br",{})," ",(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:"SIMPLE"}),(0,s.jsx)("li",{children:"CONSISTENT_HASHING"})]})," ",(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: BUCKET_INDEX_ENGINE_TYPE"}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Since Version: 0.11.0"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.index.class"}),(0,s.jsx)(n.td,{children:"(Optional)"}),(0,s.jsxs)(n.td,{children:["Full path of user-defined index class and must be a subclass of HoodieIndex class. It will take precedence over the hoodie.index.type configuration if specified",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: INDEX_CLASS_NAME"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.bloom.index.update.partition.path"}),(0,s.jsx)(n.td,{children:"true (Optional)"}),(0,s.jsxs)(n.td,{children:["Only applies if index type is GLOBAL_BLOOM. When set to true, an update including the partition path of a record that already exists will result in inserting the incoming record into the new partition and deleting the original record in the old partition. When set to false, the original record will only be updated in the old partition, ignoring the new incoming partition if there is a mis-match between partition value for an incoming record with whats in storage.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: BLOOM_INDEX_UPDATE_PARTITION_PATH_ENABLE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.record.index.update.partition.path"}),(0,s.jsx)(n.td,{children:"false (Optional)"}),(0,s.jsxs)(n.td,{children:["Similar to Key: 'hoodie.bloom.index.update.partition.path' , Only applies if index type is RECORD_INDEX. When set to true, an update including the partition path of a record that already exists will result in inserting the incoming record into the new partition and deleting the original record in the old partition. When set to false, the original record will only be updated in the old partition, ignoring the new incoming partition if there is a mis-match between partition value for an incoming record with whats in storage. ",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: RECORD_INDEX_UPDATE_PARTITION_PATH_ENABLE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.simple.index.update.partition.path"}),(0,s.jsx)(n.td,{children:"true (Optional)"}),(0,s.jsxs)(n.td,{children:["Similar to Key: 'hoodie.bloom.index.update.partition.path' , Only applies if index type is GLOBAL_SIMPLE. When set to true, an update including the partition path of a record that already exists will result in inserting the incoming record into the new partition and deleting the original record in the old partition. When set to false, the original record will only be updated in the old partition, ignoring the new incoming partition if there is a mis-match between partition value for an incoming record with whats in storage. ",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: SIMPLE_INDEX_UPDATE_PARTITION_PATH_ENABLE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.hbase.index.update.partition.path"}),(0,s.jsx)(n.td,{children:"false (Optional)"}),(0,s.jsxs)(n.td,{children:["Only applies if index type is HBASE. When an already existing record is upserted to a new partition compared to whats in storage, this config when set, will delete old record in old partition and will insert it as new record in new partition.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.code,{children:"Config Param: UPDATE_PARTITION_PATH_ENABLE"})]})]})]})]}),"\n",(0,s.jsx)(n.h4,{id:"flink-based-configs",children:"Flink based configs"}),"\n",(0,s.jsxs)(n.p,{children:["For Flink DataStream and Flink SQL only support Bucket Index and internal Flink state store backed in memory index.\nFollowing are the basic configs that control the indexing behavior. Please refer ",(0,s.jsx)(n.a,{href:"https://hudi.apache.org/docs/next/configurations#Flink-Options-advanced-configs",children:"here"}),"\nfor advanced configs."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Config Name"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"index.type"}),(0,s.jsx)(n.td,{children:"FLINK_STATE (Optional)"}),(0,s.jsxs)(n.td,{children:["Index type of Flink write job, default is using state backed index. Possible values:",(0,s.jsx)("br",{})," ",(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:"FLINK_STATE"}),(0,s.jsx)("li",{children:"BUCKET"})]}),(0,s.jsx)("br",{})," ",(0,s.jsx)(n.code,{children:"Config Param: INDEX_TYPE"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"hoodie.index.bucket.engine"}),(0,s.jsx)(n.td,{children:"SIMPLE (Optional)"}),(0,s.jsxs)(n.td,{children:["org.apache.hudi.index.HoodieIndex$BucketIndexEngineType: Determines the type of bucketing or hashing to use when ",(0,s.jsx)(n.code,{children:"hoodie.index.type"})," is set to ",(0,s.jsx)(n.code,{children:"BUCKET"}),". Possible Values: ",(0,s.jsx)("br",{})," ",(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:"SIMPLE"}),(0,s.jsx)("li",{children:"CONSISTENT_HASHING"})]})]})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"picking-indexing-strategies",children:"Picking Indexing Strategies"}),"\n",(0,s.jsx)(n.p,{children:"Since data comes in at different volumes, velocity and has different access patterns, different indexes could be used for different workload types.\nLet\u2019s walk through some typical workload types and see how to leverage the right Hudi index for such use-cases.\nThis is based on our experience and you should diligently decide if the same strategies are best for your workloads."}),"\n",(0,s.jsx)(n.h4,{id:"workload-1-late-arriving-updates-to-fact-tables",children:"Workload 1: Late arriving updates to fact tables"}),"\n",(0,s.jsx)(n.p,{children:"Many companies store large volumes of transactional data in NoSQL data stores. For eg, trip tables in case of ride-sharing, buying and selling of shares,\norders in an e-commerce site. These tables are usually ever growing with random updates on most recent data with long tail updates going to older data, either\ndue to transactions settling at a later date/data corrections. In other words, most updates go into the latest partitions with few updates going to older ones."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Fact table",src:i(50042).A+"",width:"3191",height:"1327"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure: Typical update pattern for Fact tables"})]}),"\n",(0,s.jsxs)(n.p,{children:["For such workloads, the ",(0,s.jsx)(n.code,{children:"BLOOM"})," index performs well, since index look-up will prune a lot of data files based on a well-sized bloom filter.\nAdditionally, if the keys can be constructed such that they have a certain ordering, the number of files to be compared is further reduced by range pruning.\nHudi constructs an interval tree with all the file key ranges and efficiently filters out the files that don't match any key ranges in the updates/deleted records."]}),"\n",(0,s.jsxs)(n.p,{children:["In order to efficiently compare incoming record keys against bloom filters i.e with minimal number of bloom filter reads and uniform distribution of work across\nthe executors, Hudi leverages caching of input records and employs a custom partitioner that can iron out data skews using statistics. At times, if the bloom filter\nfalse positive ratio is high, it could increase the amount of data shuffled to perform the lookup. Hudi supports dynamic bloom filters\n(enabled using ",(0,s.jsx)(n.code,{children:"hoodie.bloom.index.filter.type=DYNAMIC_V0"}),"), which adjusts its size based on the number of records stored in a given file to deliver the\nconfigured false positive ratio."]}),"\n",(0,s.jsx)(n.h4,{id:"workload-2-de-duplication-in-event-tables",children:"Workload 2: De-Duplication in event tables"}),"\n",(0,s.jsx)(n.p,{children:'Event Streaming is everywhere. Events coming from Apache Kafka or similar message bus are typically 10-100x the size of fact tables and often treat "time" (event\'s arrival time/processing\ntime) as a first class citizen. For eg, IoT event stream, click stream data, ad impressions etc. Inserts and updates only span the last few partitions as these are mostly append only data.\nGiven duplicate events can be introduced anywhere in the end-end pipeline, de-duplication before storing on the data lake is a common requirement.'}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Event table",src:i(39506).A+"",width:"6218",height:"2609"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure showing the spread of updates for Event table."})]}),"\n",(0,s.jsxs)(n.p,{children:["In general, this is a very challenging problem to solve at lower cost. Although, we could even employ a key value store to perform this de-duplication with HBASE index, the index storage\ncosts would grow linear with number of events and thus can be prohibitively expensive. In fact, ",(0,s.jsx)(n.code,{children:"BLOOM"})," index with range pruning is the optimal solution here. One can leverage the fact\nthat time is often a first class citizen and construct a key such as ",(0,s.jsx)(n.code,{children:"event_ts + event_id"})," such that the inserted records have monotonically increasing keys. This yields great returns\nby pruning large amounts of files even within the latest table partitions."]}),"\n",(0,s.jsx)(n.h4,{id:"workload-3-random-updatesdeletes-to-a-dimension-table",children:"Workload 3: Random updates/deletes to a dimension table"}),"\n",(0,s.jsx)(n.p,{children:"These types of tables usually contain high dimensional data and hold reference data e.g user profile, merchant information. These are high fidelity tables where the updates are often small but also spread\nacross a lot of partitions and data files ranging across the dataset from old to new. Often times, these tables are also un-partitioned, since there is also not a good way to partition these tables."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Dimensions table",src:i(17429).A+"",width:"13365",height:"5602"}),"\n",(0,s.jsx)("p",{align:"center",children:"Figure showing the spread of updates for Dimensions table."})]}),"\n",(0,s.jsxs)(n.p,{children:["As discussed before, the ",(0,s.jsx)(n.code,{children:"BLOOM"})," index may not yield benefits if a good number of files cannot be pruned out by comparing ranges/filters. In such a random write workload, updates end up touching\nmost files within in the table and thus bloom filters will typically indicate a true positive for all files based on some incoming update. Consequently, we would end up comparing ranges/filter, only\nto finally check the incoming updates against all files. The ",(0,s.jsx)(n.code,{children:"SIMPLE"})," Index will be a better fit as it does not do any upfront pruning based, but directly joins with interested fields from every data file.\n",(0,s.jsx)(n.code,{children:"HBASE"})," index can be employed, if the operational overhead is acceptable and would provide much better lookup times for these tables."]}),"\n",(0,s.jsxs)(n.p,{children:["When using a global index, users should also consider setting ",(0,s.jsx)(n.code,{children:"hoodie.bloom.index.update.partition.path=true"})," or ",(0,s.jsx)(n.code,{children:"hoodie.simple.index.update.partition.path=true"})," to deal with cases where the\npartition path value could change due to an update e.g users table partitioned by home city; user relocates to a different city. These tables are also excellent candidates for the Merge-On-Read table type."]}),"\n",(0,s.jsx)(n.h2,{id:"related-resources",children:"Related Resources"}),"\n",(0,s.jsx)("h3",{children:"Blogs"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://medium.com/@simpsons/global-vs-non-global-index-in-apache-hudi-ac880b031cbc",children:"Global vs Non-global index in Apache Hudi"})}),"\n"]}),"\n",(0,s.jsx)("h3",{children:"Videos"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://youtu.be/XlRvMFJ7g9c",children:"Global Bloom Index: Remove duplicates & guarantee uniquness - Hudi Labs"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://www.onehouse.ai/blog/introducing-multi-modal-index-for-the-lakehouse-in-apache-hudi",children:"Multi-Modal Index for the Lakehouse in Apache Hudi"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},17429:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/dimension-c1a4d25a9b59f1ae577b2159336b2a4e.png"},39506:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/event_bus-0066b1fff4c3b67ef966404738e53e59.png"},50042:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/nosql-bc8be272a92982296f05780fb60394ff.png"},82301:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/with_without_index-c0808363df23ac1aba63bc81a68b6c8c.png"},4390:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/hudi-stack-indexes-589506d411b969d14a9087633253a391.png"},28453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>r});var t=i(96540);const s={},a=t.createContext(s);function o(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/content/cn/assets/js/runtime~main.9cfca5d2.js b/content/cn/assets/js/runtime~main.3c2ba45f.js similarity index 99% rename from content/cn/assets/js/runtime~main.9cfca5d2.js rename to content/cn/assets/js/runtime~main.3c2ba45f.js index 5a839f9b2740e..23588ebe7ea97 100644 --- a/content/cn/assets/js/runtime~main.9cfca5d2.js +++ b/content/cn/assets/js/runtime~main.3c2ba45f.js @@ -1 +1 @@ -(()=>{"use strict";var a,e,c,d,f,b={},t={};function r(a){var e=t[a];if(void 0!==e)return e.exports;var c=t[a]={exports:{}};return b[a].call(c.exports,c,c.exports,r),c.exports}r.m=b,a=[],r.O=(e,c,d,f)=>{if(!c){var b=1/0;for(i=0;i=f)&&Object.keys(r.O).every((a=>r.O[a](c[o])))?c.splice(o--,1):(t=!1,f0&&a[i-1][2]>f;i--)a[i]=a[i-1];a[i]=[c,d,f]},r.n=a=>{var e=a&&a.__esModule?()=>a.default:()=>a;return r.d(e,{a:e}),e},c=Object.getPrototypeOf?a=>Object.getPrototypeOf(a):a=>a.__proto__,r.t=function(a,d){if(1&d&&(a=this(a)),8&d)return a;if("object"==typeof a&&a){if(4&d&&a.__esModule)return a;if(16&d&&"function"==typeof a.then)return a}var f=Object.create(null);r.r(f);var b={};e=e||[null,c({}),c([]),c(c)];for(var t=2&d&&a;"object"==typeof t&&!~e.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((e=>b[e]=()=>a[e]));return b.default=()=>a,r.d(f,b),f},r.d=(a,e)=>{for(var c in e)r.o(e,c)&&!r.o(a,c)&&Object.defineProperty(a,c,{enumerable:!0,get:e[c]})},r.f={},r.e=a=>Promise.all(Object.keys(r.f).reduce(((e,c)=>(r.f[c](a,e),e)),[])),r.u=a=>"assets/js/"+({16:"0583dad8",25:"a33c645e",28:"0da1f28a",48:"a674d2f7",67:"56169fa6",129:"275b5c51",142:"9c707294",159:"af8190e8",192:"55840584",217:"b1f77b90",273:"991760df",292:"fcc9c1b0",323:"be9655ff",339:"1f92d8dd",354:"0b4da2f0",387:"19ac452e",437:"a168e2e0",569:"b4a99b76",614:"0a87a91b",878:"e9038c17",917:"71c6c219",924:"9699c87d",940:"0c459987",982:"5a8ef24f",1017:"2ade4e52",1107:"060b2af9",1119:"e3b4090c",1151:"83de9812",1190:"b0127f30",1211:"74fc40e3",1397:"515c7131",1422:"562c897e",1458:"d77e6b8f",1459:"a1c7d286",1517:"da868c82",1550:"8425e24c",1622:"0ae1dc96",1635:"73c8d421",1707:"eaa4e767",1715:"2f671d1e",1717:"89ad6a53",1763:"90afd727",1784:"89dd9b54",1841:"92bb01f4",1846:"9f349e0c",1857:"d032d8fc",1882:"c28fec2b",1928:"6e47a3c2",1949:"051e9a76",1955:"7fbadf7c",1957:"c12d6ad3",1983:"b93dc3c9",2016:"3c15683d",2053:"7a3be72c",2072:"7bec99d6",2106:"1e050fc5",2121:"fdb4abad",2200:"92b5ed46",2214:"32aa7863",2225:"9781112c",2256:"31863783",2298:"d2a01f74",2368:"717625a8",2385:"fb4f9065",2450:"3b3f1ad3",2472:"1b7e3feb",2540:"e8b490f7",2577:"b9e56da2",2640:"dba6e014",2652:"9ed88412",2663:"9d0312da",2679:"7e9327af",2696:"67f5e351",2700:"5e58268b",2732:"56173bd1",2739:"4c5bb0e3",2748:"7c87f31d",2759:"d28b7dcd",2772:"48f24bab",2791:"ba2305d7",2839:"00cd9d46",2854:"093ec6b1",2918:"9dc1ea4d",2932:"580eda40",2954:"6e7eafb1",3050:"200d970c",3075:"a80470ee",3104:"a4b2d8ca",3125:"32dcc326",3131:"d29911ee",3137:"4f7cd6bb",3144:"aed1d196",3151:"40ebd41e",3174:"f75eea2f",3179:"5c3bdea9",3303:"6be904db",3313:"a3e90044",3323:"b9073401",3337:"388a1337",3482:"f237aa38",3558:"538c7955",3693:"b783cafb",3722:"50cd3db4",3740:"dc1f5b39",3764:"394bb252",3843:"7c1ec31e",3940:"260d7fd0",3965:"d18b6106",3968:"50494a26",4040:"b4ced939",4060:"0bf991f2",4074:"817ed3cf",4133:"b18f8924",4205:"0c12eeea",4355:"1497bce1",4362:"30f46c87",4368:"25fe5fdb",4405:"1dcf0194",4425:"26d64354",4442:"ad9f509c",4467:"ff5a6f64",4530:"1cb4ff83",4574:"d9f219f0",4591:"405284b3",4602:"0be544c4",4629:"98bce106",4777:"43d0cc21",4790:"3b6474f3",4795:"f162832b",4863:"a0c4b68b",4890:"7c52b6f4",4919:"4929a6fa",4980:"006c64a3",5028:"f5c507c6",5029:"ca8c3af7",5065:"25ed107d",5137:"15fcb894",5168:"a3417ffc",5193:"d0ff2798",5195:"8c7f4a45",5268:"8be9b28c",5270:"6ff0c558",5289:"b3a451d2",5295:"bbc3d059",5322:"22b4f68c",5334:"86642e8b",5338:"0e11b6db",5397:"b9ef0c47",5594:"0c74166d",5622:"fb863cab",5631:"32ba6a4c",5633:"a804bb8e",5685:"f8763f0d",5721:"42bda306",5795:"37ae1bc8",5806:"1adb4ab6",5887:"b5960565",5888:"478a7123",5936:"4959f63e",5988:"c4d48ead",6045:"11faa303",6082:"ac2c8141",6090:"384f1d9f",6158:"0d706529",6171:"4fb8ea95",6203:"0ba05648",6225:"baed6a8a",6289:"59ba4d58",6350:"ce3c8465",6370:"36f2d01a",6371:"4658250f",6372:"5c865244",6467:"3faff22d",6482:"2a1db3a7",6542:"a49707a6",6552:"ae59a273",6559:"21b16c5b",6605:"d5ace2db",6636:"f6a1f09d",6677:"ea2cf37a",6697:"17ace3c3",6709:"debf2b54",6739:"01ceb854",6761:"507d925b",6791:"ae0384e2",6823:"4f684eef",6827:"cd9c899c",6845:"5ac9b8db",6897:"b52407fb",6944:"52f660a4",7033:"2aca441f",7035:"e841f655",7071:"6e78b29b",7100:"e7c12d1f",7125:"b744ccc8",7140:"3445e83e",7160:"eec9a679",7167:"bfd461a8",7233:"2a6ac43b",7277:"598dec22",7317:"b1b9fe16",7355:"96f48bd9",7414:"ec45592f",7444:"502758cc",7458:"8fdc7f76",7462:"f786ec4f",7517:"4abd5d51",7564:"faf188f1",7693:"d29a4f88",7715:"06a1e3b2",7724:"b3716f55",7734:"d6b46894",7773:"869d1599",7802:"deab0229",7844:"996feafe",7861:"f09bd126",7881:"28b030e0",7904:"9b8d6628",7907:"7ba20019",7945:"e0f7a560",7949:"95803b07",7953:"df4b657d",8003:"f85e4dd8",8070:"0480b142",8177:"38122bdb",8183:"c7a3e7d6",8192:"934057b1",8209:"01a85c17",8263:"e1d02585",8281:"14cab7b2",8289:"c286af15",8348:"09ff3d76",8354:"db9fbbab",8363:"24179e00",8367:"abd23114",8413:"cd17745a",8417:"bbced460",8583:"3c06fd15",8585:"497095d8",8606:"b6159c54",8619:"15c2f51a",8645:"212a125d",8651:"80bd773e",8668:"6598f23b",8688:"d7d5c50a",8762:"1cd42d14",8766:"7a11cfa3",8840:"e161c803",8874:"9c84f0d3",8888:"3a6a48c9",8889:"effd3c61",8892:"56ab6e97",8900:"eebb3a9f",8909:"48912a3b",8965:"b6e28713",9045:"7c9ee56f",9127:"29c12ff9",9151:"57c73c9c",9152:"17666b14",9189:"d4eb85a9",9195:"b2d2727d",9225:"7b3a4001",9228:"d336ca2e",9257:"0687df23",9333:"00766a8f",9351:"4c14260d",9426:"1a41dab5",9428:"cfb1206c",9432:"8cd4ff44",9446:"49b92117",9458:"762ed4b3",9471:"ebf12a38",9478:"c36198b5",9499:"953153ea",9516:"2fec12c7",9570:"8eea179e",9631:"79e67a34",9647:"5e95c892",9676:"48cf1cd0",9700:"56382a79",9702:"a0d28f55",9722:"c35662b8",9737:"0d37dd31",9790:"6a0b8fcc",9836:"2fd2285d",9856:"db607657",9860:"d6d00b14",9870:"36e3724e",9888:"c14217e6",9891:"8a5cd0c4",9896:"6b16b25a",9914:"06b7dbb6",9944:"9ee88b57",9986:"c782ecef",10030:"c2277200",10118:"f89af623",10181:"f7519df0",10198:"ce5d6b55",10238:"0eb44ec6",10285:"b69fdc1c",10354:"8c29db87",10384:"d592eee2",10472:"0ca8e4c5",10510:"bc663e84",10535:"79c374cf",10569:"6766f38b",10637:"6a326c1d",10640:"13dfa837",10642:"936cf648",10682:"a65658f0",10683:"d496317d",10708:"a83dbf38",10727:"f53cf472",10767:"931768b8",10789:"10fb8f29",10801:"f8d8c88e",10907:"b964b0d3",10920:"42746bb6",10954:"2b571547",10956:"726b1d2e",10978:"90db14b9",11e3:"9294d9ac",11002:"33727eb6",11111:"2750cc84",11238:"b051e9c6",11275:"2e961a80",11289:"82b971d3",11299:"ac338f84",11326:"f9cb0cea",11330:"9a744c23",11355:"6ed20719",11508:"039c7621",11624:"5090da06",11631:"d2a270f8",11682:"186775cb",11725:"51e360fd",11738:"4a7296a1",11745:"446810fe",11768:"1db5e20f",11775:"dba75126",11783:"968bfe93",11795:"43ff550e",11804:"b9168984",11842:"f630dd79",11855:"51e592eb",11869:"43c57b15",11905:"41b6dd58",11906:"757b41cf",11977:"608a85b6",12047:"d25544dd",12110:"8e6bc4eb",12123:"1a730a78",12134:"088c57bd",12144:"5617941b",12186:"3deb4153",12316:"77a5f3f8",12318:"9b28f794",12378:"2592f25d",12395:"a0fb693a",12431:"61c30610",12452:"f4a568da",12477:"ac9a039d",12513:"70570476",12535:"2ca30cc7",12542:"0bce5bfd",12613:"bb6acec0",12617:"89412d1c",12650:"880a76a4",12654:"98af85a1",12686:"f81e2128",12869:"236efcfc",12912:"e57d167d",12945:"bc561320",12995:"72ed5e19",13021:"9b078b3d",13060:"075d0b63",13063:"6695bce8",13124:"ef2299ac",13152:"4d01f822",13203:"a5fd3751",13236:"814487fc",13358:"86aca325",13374:"0c9b8a46",13375:"15be7f5e",13419:"05f125a2",13460:"5b6b8d73",13465:"f7887fd4",13525:"aeb9cb2b",13534:"a221d960",13562:"430c4f94",13580:"b7ffc82e",13698:"e32c93f6",13733:"e4126631",13762:"35ace877",13803:"5005f1cd",13918:"a586ac12",13943:"79c522c5",13970:"7dcf0740",13996:"bb5bef2a",14003:"fe0a5e13",14027:"4fe2812d",14042:"6c6eb236",14043:"2da40935",14059:"160c3f1b",14125:"c58d5881",14134:"88677a17",14136:"5ba7f3a0",14152:"0c792305",14163:"79f5ed7e",14168:"44c788da",14179:"0466f8a1",14224:"e78cae60",14257:"973a6c2e",14259:"4d62164b",14261:"881e0310",14264:"15b03510",14286:"816e216f",14340:"02704d8d",14363:"33732613",14381:"720024ad",14388:"4330e2c5",14399:"95a29cbe",14410:"262f048a",14435:"a2218d2d",14446:"7990d23a",14483:"11c5ad4e",14496:"0dc66419",14515:"b3880c0f",14536:"b812e3a7",14549:"13366fcd",14599:"04287605",14627:"6b0d4b59",14629:"c135661e",14683:"7cd7848a",14726:"cb290368",14750:"8049dc2a",14817:"cf066a97",14822:"da9a6aef",14844:"d58d42ac",14868:"9c9e6d14",14917:"b2f79aaf",14919:"68aea991",14943:"b634826e",14971:"ffce8ccf",15078:"6773b5f7",15079:"461201e5",15144:"e6691bac",15186:"809a1b46",15220:"e0719818",15235:"246d116d",15272:"ee5dc595",15292:"7bd6096e",15316:"a0583d0f",15387:"f9b192e6",15403:"bbbd3731",15473:"ad07d5ed",15528:"6bd26a95",15552:"1ff337bc",15607:"a309ba1a",15654:"c821ba53",15744:"55b3e6a2",15746:"03719399",15805:"65df1ffd",15875:"6d300ee1",15881:"4bf163bd",15896:"c26e381e",15917:"04d2875d",15947:"f05cb9af",16032:"7f5a2db2",16090:"4de90ec7",16100:"5685cb00",16209:"f0db470e",16378:"a2da2f5b",16560:"ebda94c9",16622:"3d8e248c",16641:"4ccf094c",16649:"2e0d7695",16660:"c01089d4",16685:"ff1ef8b0",16689:"682a1736",16745:"1b334a26",16775:"c5392341",16803:"751ccd8a",16885:"7c3644b1",16942:"426a3c0f",16999:"ec65a1d1",17033:"30e67995",17232:"bc36781c",17294:"82fc01c6",17332:"b4762a45",17368:"de821e02",17402:"b629aa71",17411:"496a5e3a",17441:"c5c8072f",17502:"dddd9631",17530:"8c212f85",17606:"c8aaf3b1",17626:"47f3a505",17681:"a2af438a",17697:"2122acab",17709:"89514438",17722:"de64262d",17727:"764a6545",17803:"4f311863",17818:"2d9024ae",17860:"7cfc22c1",17867:"9130943e",17899:"992c886e",17987:"f67021ea",17988:"a3255c75",18006:"059d2658",18033:"c1fa975f",18103:"7707ed5e",18115:"85902cb9",18142:"c58d3901",18187:"8e562778",18205:"e6cee3d7",18299:"59b5a3af",18351:"670426f7",18375:"a80e0e03",18401:"17896441",18438:"7eea383c",18445:"762cb2d4",18520:"905fdac9",18551:"9dc242cc",18616:"b3c2b735",18620:"1bdcf2af",18645:"e798c07e",18738:"3b375bfc",18757:"10b6d210",18940:"6cc2587c",18950:"d75d009b",18998:"7487c019",19040:"fcf2eafb",19042:"378587af",19052:"6e547e58",19070:"6f878c05",19108:"6f3d983d",19237:"e77e0240",19369:"a2cfe627",19387:"9228ff94",19396:"c61ed569",19428:"4b6ad6c1",19521:"7f5a4e86",19542:"3548485f",19578:"c58d7350",19659:"9c65fedd",19664:"76b52ed8",19686:"2bd614fb",19711:"0e4a3360",19774:"3c6c92ad",19798:"83c71362",19801:"a5052667",19851:"f36e33a7",19865:"7e53000f",19894:"ca2ec6d9",19999:"436f8775",20103:"430ee71a",20116:"fa230427",20154:"9e0a0edc",20160:"ecc82a52",20216:"83e7d916",20229:"5aae4c30",20286:"f60a8e85",20304:"13d37261",20358:"a55cf427",20361:"915fad0f",20405:"a170c4b2",20415:"839320c8",20428:"9de16aaf",20434:"39c0c867",20491:"4c056f0f",20535:"ca16b0fe",20541:"2925f13d",20596:"bcad8cf0",20639:"678bd7f6",20661:"72c396ee",20713:"ff781369",20812:"a827f20e",20892:"1d99c39c",20924:"92328698",20951:"5ef30e9e",21070:"e3b4fd8a",21121:"c1b7702d",21123:"b2a1bef3",21177:"574aa417",21191:"53798754",21273:"58f98693",21275:"e737da10",21292:"9eea3ae4",21303:"e4bea80c",21316:"266d37b9",21346:"b2c62a3d",21373:"50737734",21417:"9db9c0e0",21492:"f48374b5",21510:"70b56ba8",21524:"69f9ca18",21560:"6c888f35",21585:"d17a9646",21630:"aad02470",21635:"6224d640",21644:"7682eda6",21683:"b3f2f317",21729:"ea9d899a",21805:"1926d3d7",21874:"a54a9a31",21921:"a8a7f86a",22087:"ab4d9aa4",22124:"3ad1da61",22141:"625beb64",22170:"2231732a",22178:"49e3a5aa",22236:"60be01c6",22257:"e605a73c",22262:"a94ba305",22385:"9a5e9795",22447:"f93d9ca9",22499:"2923e8f3",22501:"ff15e2eb",22504:"61773850",22534:"6f37f43d",22579:"6e771e2a",22595:"ca5d6ba8",22640:"69375b61",22651:"6d250944",22702:"e0618342",22791:"a4289c8e",22809:"743819ce",22816:"70db0e3d",22911:"9a29e675",22916:"d49fdba3",22932:"0d5f3865",22969:"6a44fd90",22970:"97b786bd",22973:"70a32eac",23002:"1fd06df8",23039:"ad58910b",23041:"07da43c6",23081:"ef1c4348",23119:"39307ee6",23141:"a1c39b3f",23208:"b8dfc3a6",23332:"fe86f3f9",23388:"fa5f4abf",23438:"95d97af4",23475:"fdeab78a",23545:"d4f4b34a",23563:"f24f712d",23591:"53746e73",23600:"af9b00f1",23634:"59e9dc06",23637:"9c150758",23641:"35313843",23666:"cb16b650",23676:"d235b83f",23700:"ea8366f8",23805:"79757e7c",24033:"a268f692",24036:"54c79a13",24065:"5ef1cef9",24071:"a83d9791",24084:"4ed60a8a",24098:"81c34363",24126:"897856d4",24140:"5ce7213e",24143:"54482276",24172:"4b2ed2d0",24234:"3af3061a",24265:"7ebf6f1e",24292:"45a47a41",24301:"205ca674",24327:"bbb172c1",24340:"a4e075be",24366:"99d3870c",24377:"b5b376a0",24393:"9be81a8b",24475:"045bd6f5",24476:"6cf93e89",24607:"8a733352",24618:"174b58ca",24644:"9555b08a",24649:"e781e98e",24652:"ff00d8f9",24704:"3befffe2",24728:"91c64349",24826:"ed6ec893",24838:"1574adde",24853:"7cfd7c3a",24891:"f0709bee",24912:"8e01a36e",24919:"cf6129a8",24970:"231cac3a",24991:"1db9daab",25044:"9cd11b72",25101:"8bd2257d",25130:"b277530c",25173:"8a95094d",25186:"96046d19",25243:"f118f569",25285:"1da16fcf",25335:"537936fe",25397:"4083b748",25410:"e346ea56",25450:"143635a6",25452:"5ef8e026",25469:"2a44fc97",25531:"af5c68f9",25532:"20429fae",25539:"7fb09d55",25582:"65603bfa",25632:"71651e9e",25671:"dcc6ca2f",25731:"9c2460d0",25778:"d56bdeaf",25781:"ba115cad",25845:"d2c3f17d",25874:"17268e53",25987:"1645b95d",26003:"90c5833e",26009:"20f9256f",26079:"4f978fc9",26183:"fd6c914a",26184:"a937858f",26216:"4e3e1e17",26260:"477cc2f7",26305:"878dce9b",26333:"9579dcb9",26337:"65009e94",26352:"af138e2a",26610:"26008da6",26627:"8353278b",26632:"960d3eb8",26722:"1802ae9e",26744:"21e535c3",26797:"4681e75f",26812:"38cf2270",26882:"958a296c",26900:"b3749361",26986:"9d0e7fc1",27012:"aca5eee4",27020:"58714c61",27088:"1547c10f",27092:"220c1bc8",27094:"cb33cd4a",27115:"e37692b4",27123:"c4d1e829",27179:"cbec0238",27212:"ce710151",27367:"61417793",27369:"f52b34fb",27388:"f7e205e5",27394:"30ab0d34",27398:"a3983124",27444:"7a3be7e3",27473:"31ed8f07",27493:"9087a409",27684:"a95ad191",27785:"ce588038",27955:"2e7e1134",27995:"ee4b8f19",28081:"3ad90ad2",28086:"2cc67ca6",28111:"81c204e1",28166:"8120957a",28178:"9adef974",28204:"758b9bc9",28235:"20a81622",28252:"b8d3e47d",28294:"5a4f5a9d",28319:"ec410c33",28369:"bfc2a64d",28410:"89cbd1b8",28616:"b8d60920",28627:"54ad050e",28636:"334e3bb5",28679:"e1758f93",28687:"ab48a39f",28701:"c3856c66",28782:"fd5c5192",28793:"379ac6de",28834:"7ed2bc06",28920:"e7ef6e16",28941:"8c5b1685",29060:"9c7a2f87",29100:"1421c0d2",29117:"fd077c05",29148:"3b189bfd",29243:"d330b699",29370:"04daf44f",29408:"fbce6636",29421:"163a1bae",29452:"13171783",29457:"e4d4ec4e",29514:"05e733df",29523:"b2f58160",29526:"b45a54e9",29567:"760e2145",29653:"13f72d6c",29679:"6e0a413f",29690:"b1633424",29698:"a642dcef",29708:"80b93830",29733:"da10e58f",29795:"e6557239",29820:"16381f20",29829:"d973177d",29838:"8b18d68f",29845:"5d94dea0",29851:"97806055",29885:"e534ab35",29943:"225b6447",29950:"5de1c39a",29969:"332b14e0",30021:"8f6c1b4d",30035:"87546ad3",30154:"339988c0",30163:"adcd62ae",30167:"22bf7f69",30200:"b97a54f5",30239:"22e8ffbe",30262:"5320ed26",30303:"967ebe95",30314:"dfcaec69",30355:"4b678e99",30410:"90ffbe81",30490:"874dc058",30564:"407230da",30579:"1ee0a129",30583:"775c5b43",30585:"ceb04c72",30628:"6ee9522e",30746:"ebf8e597",30827:"5814834c",30831:"ced554c7",30842:"d8412727",30848:"677757ca",30934:"44c28e7f",31016:"416fb909",31022:"af819789",31039:"71d5b1f8",31125:"c3c8ddc4",31150:"0b62d7e7",31213:"df232fd5",31220:"b8ab477f",31255:"5c81ce12",31257:"67f1ea1e",31272:"fa366c46",31279:"2c3e7e92",31465:"cc564cf4",31541:"1668cad9",31544:"c602d51d",31567:"8c4bf82a",31700:"0b401b62",31705:"05957343",31720:"0a70c05a",31791:"04eab06f",31838:"de1c8a7d",31861:"a14af959",31862:"c791a767",31972:"4ef864ee",31996:"8dbbcff6",32005:"f0dc0726",32012:"9ba9284f",32039:"116b7e55",32183:"5110a7b7",32295:"4437b871",32335:"f9a4941d",32365:"fe345ee5",32374:"263a95fa",32384:"042ba1e2",32391:"e1407f5b",32472:"c08ba4cb",32492:"0e9894c7",32558:"40c3731f",32691:"798484e3",32728:"1b520177",32781:"a196e32c",32787:"5617aedc",32825:"fdddbf66",32847:"8590fd3e",32875:"65511420",32884:"69583d95",32949:"43764587",32960:"225cc45a",32993:"604cd7c5",33049:"97e51b1f",33065:"a172f6b1",33132:"12e68472",33192:"ee003a92",33202:"817d1a47",33234:"465994bd",33290:"7da68ccc",33307:"ff6c3941",33350:"2d0c5b52",33458:"c16e0158",33462:"0b81acdf",33517:"3ed70074",33540:"fe7ac0b7",33567:"6075be34",33572:"269d704a",33612:"3f933ca5",33621:"33241236",33638:"d294bdb0",33643:"da7149d8",33659:"81a6b262",33724:"755872dc",33804:"1b31aebb",33806:"07399e71",33825:"f8a443f2",33881:"a7690409",33889:"e9c7c2b7",33999:"49aa1a16",34071:"4fc571b0",34095:"04f8849a",34117:"a870955a",34127:"18b5779a",34156:"f5c63bac",34171:"0bc541b1",34179:"3f4396e6",34196:"13e6af21",34255:"e8a8dea2",34331:"164e61b9",34388:"79fbf53e",34447:"f3d3813b",34511:"c2356d7d",34520:"538371ec",34528:"b038a3ec",34543:"782eae4d",34549:"0735e5be",34621:"f30fab6f",34662:"ef071c32",34691:"02e54e09",34706:"47a1bde9",34750:"a5fea1bd",34761:"5d5e0832",34808:"2e6ef254",34810:"924dcf98",34812:"117121a9",34837:"10fcd509",34847:"dc7f8f8b",34877:"f7702246",34962:"075b4af0",35023:"907e7dc3",35139:"6fe5390f",35168:"fd058e1b",35288:"0f3b9f0c",35325:"d42065ad",35329:"a7827f50",35402:"976ab233",35523:"032e2c67",35532:"388d5845",35542:"75d5f1cf",35546:"5c44183c",35618:"97bb73fe",35733:"8fc868c2",35742:"aba21aa0",35766:"ff6f6072",35767:"3019fa66",35808:"c75a0418",35844:"864f74f0",35911:"bb1bce89",35932:"a3142532",35960:"dfa4e294",35983:"b5a599e0",36009:"04afe417",36055:"59be0e8d",36067:"ceff0062",36113:"28f38ec5",36144:"307d712e",36188:"b59f02fe",36192:"b60e28b6",36211:"5cfc9e58",36271:"f8a5caff",36302:"eafd7a74",36361:"4f9c79b6",36573:"9c812e08",36619:"2573355f",36640:"1084a32f",36672:"b6fb003b",36682:"17628665",36689:"77787075",36703:"4c7d084b",36747:"a3015275",36763:"c1a328a5",36790:"12935692",36851:"649faa0e",36890:"b46f5ba1",37109:"d73e6b67",37115:"0b4fcfba",37147:"97da4333",37191:"d786420c",37204:"8f3b27f1",37206:"43dcd746",37209:"e34cac0e",37287:"362ee1f8",37298:"167016d0",37329:"554882a9",37366:"6013ac2e",37378:"4a1368b8",37441:"9bbc9e48",37485:"6929f09d",37486:"ce46a18e",37489:"6a293d29",37578:"e17d733a",37617:"be2ede3f",37643:"a6aa9e1f",37646:"021d469a",37673:"e2657c7c",37678:"2045fade",37702:"f451cc4c",37737:"f5853975",37740:"2cfb265a",37799:"feab7dcb",37809:"5f87fd99",37827:"42545929",37839:"d5e29b01",37841:"9ad03801",37842:"cd060f40",37872:"88d0aec4",37979:"f6432a48",38001:"690cbdd8",38032:"b61f0370",38035:"63e00c6c",38055:"37b82514",38056:"baad6bf9",38238:"2e9f383c",38288:"d0e9d470",38370:"cf858c26",38416:"dcd7017c",38439:"9474fc0c",38451:"f0fb7623",38460:"fe3e0e89",38501:"0fae8f08",38520:"f9c05060",38600:"0f497157",38605:"6dc06ee1",38642:"47e85d0b",38767:"c4de5678",38816:"5ea125b2",38835:"6495713a",38839:"110e78c3",38888:"6f5eeb66",38891:"7c912802",38923:"17b935cf",38953:"8e72bb53",38974:"2c50796a",39014:"0db7476e",39058:"53317765",39088:"5560f355",39110:"cb9e1f3d",39138:"755ebe0d",39142:"b5f01515",39153:"0b8a4e62",39185:"06043210",39192:"09b62bf8",39197:"484cbf74",39202:"8b795044",39228:"a7a3cbc9",39230:"b992801d",39240:"90f157dc",39260:"47074836",39265:"b40642d4",39283:"b1043e58",39404:"aa0fa20f",39405:"cc6505da",39407:"995840bc",39423:"a615dd65",39444:"0f65ccfb",39472:"9e679a0b",39473:"6bf3751d",39487:"9d833fad",39494:"b326207c",39555:"4a80e27a",39569:"06a8eab3",39587:"7d0e1375",39608:"97ae1fff",39712:"8f64cb7a",39715:"a68f0e64",39773:"fb3759c3",39777:"320da59d",39781:"3c2d0811",39876:"a2c9e15c",39887:"9b0c8626",39901:"d76c455f",39908:"09a52b17",39973:"d4a2e930",40065:"5f469a3b",40124:"bc817d28",40132:"59533a49",40178:"0508dae2",40212:"a2d43843",40249:"05c63416",40369:"3c36ce76",40463:"0cd1a20c",40555:"11b8ce75",40606:"3e032765",40616:"12a5de9b",40651:"bf5126e1",40690:"dfc3c224",40694:"25dc0311",40697:"cc01a9d7",40733:"986db944",40755:"5bc29dc0",40758:"1a7b33c3",40780:"d5281bd1",40797:"d2110cc0",40827:"ddebc8bf",40847:"2662e92d",40879:"b1527e4b",40907:"321dafc4",40927:"881bebdd",40959:"ca0149b2",40999:"68c5632a",41030:"33d4a0d4",41120:"406d4ec1",41125:"0fa5c29b",41134:"ddb0149a",41135:"85ffab62",41159:"93340492",41178:"2a0d650e",41260:"6c9200cf",41361:"247909f7",41409:"803932cd",41455:"2bf5edd4",41461:"fd517388",41472:"06fce5b8",41491:"c3f88c36",41594:"da172daa",41637:"13e47f37",41640:"d407c2c6",41651:"e8e3bd30",41677:"9017a110",41695:"155a9bc0",41739:"b9edf71b",41750:"bc38a1dd",41867:"78f0e259",41871:"edcc5675",41872:"58b3152e",41892:"dc5506b6",41907:"b7a56be4",41944:"14828316",41954:"7c49023e",41993:"c67e4e1c",42021:"a2839a15",42068:"c413ce11",42187:"295cb0c0",42196:"671726ea",42207:"f1a4f0ee",42350:"6df57399",42368:"ffac4af0",42380:"99bce14a",42465:"b8212f90",42518:"34825c6d",42566:"2b505997",42576:"b184a577",42596:"eafac744",42659:"fce58780",42677:"7fc4aa15",42690:"165a93e5",42694:"bfdde79f",42722:"ca790126",42799:"5314580d",42801:"bf3d61ec",42887:"fa6fcf0d",42900:"c9d95cbd",42905:"145364e0",42911:"39c7a203",42924:"583fb00a",42942:"19028add",42995:"2812e3b9",43029:"e3477e52",43035:"2907d5eb",43036:"4256b042",43040:"676c7c8e",43042:"bec2896b",43078:"50536743",43088:"341293cf",43113:"12164231",43136:"f1374ba3",43199:"0bcdfdaf",43352:"4c07ba53",43372:"bf7f6ee8",43421:"f048922c",43432:"fbf82623",43445:"83fec35c",43447:"a490aaaa",43512:"d319e9f2",43642:"4cd0ba1b",43675:"eb6ed572",43684:"ac5cd9bd",43833:"fe2d8766",43868:"c09831a6",43880:"dbd5692a",43910:"c5a487ef",43913:"58408940",44008:"5a8b22a0",44040:"43d1bad2",44045:"894f5c0e",44062:"a3a8fa0a",44118:"6503f568",44123:"af753000",44125:"ca2b0f7e",44129:"d653d7ed",44137:"d02da847",44143:"19acc4ed",44169:"bf12a61a",44267:"57767c05",44290:"4f087d20",44301:"3413c8b8",44339:"0a91021f",44351:"bc8f3fce",44381:"fdf1d2ab",44419:"216bf65d",44489:"6fb01322",44492:"9882af90",44546:"0c9b1365",44551:"9b2ae5ff",44567:"502906a9",44605:"5b39e963",44640:"20bfa334",44662:"d65b2c25",44682:"bdc69003",44844:"668e0554",44891:"30769210",44939:"43f3c18b",44960:"12b957b7",44994:"41af2803",44997:"6e34e766",45113:"55946737",45117:"86fe1f77",45218:"57083a92",45238:"c3f790da",45245:"74e64d1a",45268:"33c572e5",45290:"db90ec2b",45323:"815e47ce",45339:"24d4b044",45400:"f86f0ad4",45500:"e85bde03",45541:"a722b43a",45670:"c36346e3",45682:"3533dbd1",45746:"67687911",45919:"a2a2954f",45920:"ec832811",45983:"9926d60d",46001:"8cf74eb7",46008:"2e048b0f",46025:"1fb7523b",46039:"f724037a",46063:"67893f6a",46074:"f1087137",46102:"e8b8ca39",46123:"ccd96dfc",46156:"53cdeba4",46232:"3bf2a847",46244:"ea511817",46246:"b5b4a410",46340:"a490cf35",46352:"5e1e1325",46375:"e49bd305",46381:"89e9b753",46435:"ba786c9d",46451:"4bb02a47",46464:"d7c0035e",46472:"bcb734aa",46513:"9dfe5a97",46515:"c13f246c",46541:"60d50d27",46547:"c5427124",46548:"1a79e020",46598:"8393d26f",46633:"c4f38868",46662:"4f48cd24",46694:"1ee47c02",46697:"a6d25208",46710:"1219dd15",46754:"2b6a7ab0",46814:"e0362487",46850:"917a523c",46888:"db9d1243",46905:"57a58e78",46911:"ff13b684",46917:"7b0a3d41",46921:"a28b89d0",46962:"2d3f88b2",47041:"bbb92300",47087:"a5c8a2aa",47106:"696d889c",47110:"931beacc",47127:"5e9a23c0",47156:"3a2a4cfe",47247:"5048202c",47297:"6111afa9",47433:"b9a767d8",47537:"df0967b2",47555:"0029660c",47573:"925cbbba",47622:"0c1ff092",47693:"39a07549",47699:"17093d00",47730:"4edf53e5",47738:"1b512798",47913:"d783f956",47917:"6bb76d2c",47993:"9e70e253",48015:"8fa8fb45",48023:"47f96c4a",48027:"1b3d7ec5",48050:"ca713325",48063:"c17f9567",48071:"b71c2d32",48097:"06ef9569",48127:"859f73c7",48132:"c467a11b",48140:"bac93bcf",48162:"519b5759",48188:"9d8965aa",48270:"ef31fc63",48285:"e672d61a",48286:"be3fc974",48295:"e2b4c006",48304:"189e3ac3",48310:"f6884a75",48360:"959b45a2",48361:"712c16a5",48532:"2896ce7a",48537:"c5550c10",48544:"0a5f31be",48592:"c1506482",48650:"b775ecd8",48661:"ef4f3413",48673:"5db19d16",48733:"d009d47f",48768:"e054d919",48793:"b71be52f",48879:"49b022dc",48883:"ce18dbde",48939:"e93602d3",48985:"0f461001",49013:"9d9f8394",49109:"e3c5d63e",49112:"3455c0d5",49171:"e3022ebc",49226:"f2a06fea",49289:"828cc8aa",49305:"ad0a2b75",49308:"e28d4356",49350:"2417a912",49388:"8f1510f6",49461:"2019135a",49521:"49d63cc6",49579:"e01bb6c7",49583:"8ec8c5c5",49587:"2cbb324b",49602:"4f5f41be",49655:"b0ba51ed",49676:"2391d372",49693:"b9ce10bd",49709:"70633739",49768:"58e037fc",49783:"acf72eb8",49786:"5bd6f6db",49941:"759a3c81",50012:"40c88f7a",50095:"837c6843",50176:"756c7559",50178:"18dddf22",50208:"4e80a9dd",50261:"ec6a0daf",50293:"fc6a53b6",50306:"5d4911b7",50414:"c59a4667",50424:"36abd830",50428:"a33de290",50446:"eaebafad",50472:"a4e24d6c",50507:"129c4e7a",50570:"c112d1b7",50584:"3fd21eb6",50585:"0bb25d72",50642:"e964b083",50664:"960924c4",50700:"75be343d",50703:"0914ee26",50747:"0d98f85b",50800:"b365f6bc",50819:"4251704e",50839:"8aa0dce2",50934:"e7b82dc0",50981:"3290f534",51009:"dfbb1d90",51047:"4dd6f8d8",51059:"5b9ffc49",51102:"3304ac90",51108:"b4ac58bd",51116:"d366555a",51237:"85a6e3f4",51378:"0a8d92af",51412:"fe2deb8c",51420:"7a04b795",51435:"c9c6fdd1",51438:"14515c80",51465:"704ce0a4",51547:"c548908c",51548:"45b02367",51578:"8447ad38",51589:"f762fff5",51636:"ba5671ab",51649:"6537c712",51665:"65d842b9",51689:"30ab0ff6",51711:"89bdbd96",51763:"9199f8bd",51828:"44e51e65",51837:"5c238f81",51878:"48b6c251",51890:"b5fb4df8",51937:"34689118",51944:"d1e88337",51961:"772b5e3c",51962:"7dbc2502",52036:"1d79e793",52042:"7f8ebea7",52050:"fbaf87e8",52093:"edea4b8a",52102:"95cc61bd",52132:"3498be82",52135:"d0ed28b7",52176:"81d19844",52181:"628d0604",52235:"fadc68df",52250:"8ec5e058",52261:"c292770f",52266:"3e088827",52276:"f6144dd0",52282:"be224150",52286:"8e1e17e5",52342:"0dd8c0ac",52408:"ab586159",52424:"25d3e7f9",52450:"2dc793da",52466:"8c67a0ff",52477:"2c5310f2",52478:"cda1618e",52488:"ca57223f",52569:"7dcd92b5",52572:"a9417ee3",52605:"14ba3414",52612:"27f2e2a4",52634:"c4f5d8e4",52711:"9e4087bc",52731:"c8f57d29",52770:"85afc7f5",52826:"ce319efa",52840:"9e1bed9d",52895:"69fcecaa",53074:"2f32a261",53118:"c0571b49",53132:"5de85215",53178:"71514a42",53201:"d670063b",53237:"79ab3378",53238:"a9129632",53256:"fa713049",53266:"76a0389c",53288:"f8fe23f1",53314:"5440b68b",53370:"edabbd89",53449:"e2bce80a",53458:"63436e22",53488:"23165909",53501:"0f65ad2f",53540:"92f1a745",53559:"7e665e5e",53619:"16640689",53646:"6c9978fa",53670:"52ed38a1",53742:"77612fce",53771:"3a447539",53786:"e352cccc",53832:"7c8deb08",53861:"2a5e97be",53871:"94dd9534",53881:"e9a95c5e",53901:"a4da17e3",53925:"a8933372",53952:"abde70aa",53982:"d5f056f5",54106:"93b4d825",54113:"ba441024",54144:"5026e9d2",54168:"89fdbc0e",54200:"f97d7d88",54240:"3a55b748",54246:"5ba9c4b5",54270:"e5c0ea66",54272:"f020ef51",54277:"71e2c4b4",54310:"14434d81",54313:"45c5f30f",54349:"3c5b6e91",54399:"25aa47d2",54415:"c87c5e1b",54439:"f21fcda3",54500:"fb9e14c7",54540:"66193a96",54568:"633af835",54749:"ff4fb41e",54759:"0f7d8652",54879:"a872c629",54881:"c46bba44",54950:"0a893fdf",54951:"98bd463b",54992:"5bcffa9a",55004:"37d125cb",55100:"70d55848",55144:"152d0582",55167:"c1cb0a0b",55206:"aaa8a12d",55223:"05cfbcb9",55245:"0373e7f9",55276:"c962ae4a",55302:"facc4cc2",55329:"028ccd51",55351:"1921d13a",55395:"e2f2b384",55401:"2027fd18",55413:"b8d6941f",55478:"6a0c8a9c",55483:"342d2e6b",55534:"ab685cdb",55559:"29cf75d4",55566:"c8861997",55579:"3a9c66ce",55616:"d5caed5f",55645:"483b9ea8",55664:"a7511015",55675:"1c411fa3",55836:"94b063ba",55929:"2cbaf53f",55955:"194c8540",56028:"e1a6f6ca",56037:"69ef23f7",56062:"cde3e47b",56068:"6f9d890e",56097:"096bca72",56122:"a7b4d0d7",56123:"602e2465",56145:"9c062d77",56216:"f05409e8",56297:"575869e5",56408:"cbb5064a",56463:"0d71415b",56470:"f71bbf9b",56486:"7a75c11b",56493:"858f1266",56510:"86a45dc2",56560:"c9c31477",56607:"609f9177",56723:"69e6c429",56779:"6664c24a",56819:"7488fea1",56826:"eec5649b",56916:"ebc13825",56948:"1dbfdc18",56974:"39ed0ae4",57013:"dbf9c341",57119:"4d68fc5d",57125:"d592d1b2",57139:"398b4aad",57141:"037241c6",57155:"23348138",57159:"e15f47bb",57165:"034f0308",57251:"779bba71",57326:"3ed58e4a",57352:"8a5814b8",57361:"79cc2eba",57364:"4cc485ec",57430:"ac4d154c",57529:"0b7a8a63",57547:"27211971",57586:"e07fd562",57614:"dd48b375",57647:"0ed7fb46",57730:"658997e4",57749:"c07b5739",57760:"73d3ccec",57800:"17413beb",57845:"48d58c93",57912:"a57bd983",57994:"0cb9db3f",57996:"b75e1b9f",57999:"4b5076d6",58e3:"e2070fcf",58002:"31fce735",58079:"2655f170",58093:"242b0cc2",58144:"a2171a4d",58230:"d1f7176c",58255:"400deb23",58259:"078daaf7",58301:"b296abb0",58359:"a5e62092",58428:"ec854811",58454:"e2adec54",58479:"2a882da6",58484:"36d29ed8",58581:"f0e5f3ed",58582:"e7c7e2bd",58594:"6bd22ece",58632:"1617efa4",58667:"a36e07dd",58704:"7fde9a4c",58707:"6b6aadc5",58780:"b7d1b016",58990:"dbed7045",59005:"39fca8ac",59020:"e84457bb",59053:"11b61292",59070:"c43c6f4f",59114:"1a20bc57",59123:"17ffd4ff",59143:"37bc7ff6",59214:"a065bdfe",59246:"ce62ac6c",59262:"97db775f",59349:"156bd387",59437:"8475b017",59493:"150f4998",59521:"b2555332",59548:"e651f27e",59627:"674c9391",59645:"e4b8975d",59680:"70cca634",59702:"c9b0e9c8",59727:"b51518d2",59732:"9873f053",59740:"ab90a7b7",59866:"03f08ad1",59874:"b62e8859",59923:"95789563",59940:"888f35af",59981:"03137a3d",59994:"e266eeee",60020:"cc3a93a6",60073:"ad9dbc18",60101:"167d6699",60167:"152819f0",60183:"267f1c69",60185:"e04f784f",60189:"c1df8329",60193:"5c430979",60198:"5c417b7f",60203:"5c5dd48c",60257:"3fa5d64e",60294:"93d54c10",60315:"42d452f1",60394:"ce86b1ec",60445:"f83acba0",60501:"7003bb75",60510:"821320eb",60559:"3b57fa48",60565:"0c5e909c",60613:"3523854b",60615:"33cbefd4",60676:"244c7b0a",60696:"d163928b",60737:"aef9dca7",60762:"e9d18558",60776:"d379b051",60819:"c316a3d7",60832:"6327585c",60861:"c9d25191",60884:"709e1a02",60901:"00b58b18",61006:"de3f51c4",61096:"2d694024",61114:"127f988d",61124:"cf0c4cff",61235:"a7456010",61261:"b6b1a235",61265:"84536aab",61300:"31eb78c6",61334:"e0f81731",61368:"9c73eeed",61416:"a1e3441b",61461:"43bc2f0d",61481:"b0f00280",61559:"6b206066",61584:"55b57e06",61702:"faa24029",61706:"89baf629",61729:"13a64537",61740:"bc80aebf",61786:"aa1329f2",61807:"1695d9c3",61816:"8513fbcc",61886:"124bf435",61942:"4431d7f4",61950:"820ef6f8",61959:"9df3c51e",61991:"a6972a3c",61993:"a396a58a",62015:"5cc68a8f",62050:"c9035049",62061:"2638eb20",62111:"d2289dcb",62138:"1a4e3797",62147:"8d364c04",62162:"22c027ab",62182:"0e7e04d8",62188:"1e38d1de",62213:"46e76af1",62254:"9b695413",62263:"e0fe70af",62264:"cb69dde4",62469:"f448ea15",62549:"cca423c7",62639:"0f378f0f",62641:"58728d91",62664:"0bd3abc2",62672:"fcaa2a90",62691:"d9175e87",62703:"345b88a3",62712:"f9a8c23e",62713:"b519e6e1",62827:"4e78ea4f",62838:"973ec13d",62845:"ae5c2262",62867:"07853d90",62927:"c03ef713",62934:"2696b78a",62936:"3415fffa",62957:"e5c6728d",62975:"baa95a18",63002:"4cc6a9b5",63005:"b0635fce",63014:"3a9ee945",63016:"4eaf5bae",63048:"41280170",63075:"37844666",63115:"9bd87750",63124:"d4bcf69a",63156:"2e91affa",63228:"34c77011",63291:"2f1bf685",63292:"2d074af9",63298:"259b7e50",63330:"60b75cbd",63332:"67474760",63342:"780fa4d5",63367:"44bdb747",63382:"5f87f962",63387:"9780a9d6",63430:"465af2b7",63445:"877efd72",63455:"f30739cc",63515:"9612fd60",63521:"58f053e0",63553:"1fd2ca4a",63627:"43a56d47",63646:"47298c37",63700:"eadd254f",63750:"2ac84b5b",63779:"c2750739",63795:"a4974adf",63836:"95e06d9c",63951:"8bbbdfbb",63966:"2278c359",64045:"c47fd21a",64091:"813e2458",64154:"5ae5672b",64184:"f4f77456",64209:"88ed6425",64351:"7c0dabe4",64442:"dfa86ee4",64447:"e4307155",64465:"e9f47cd4",64502:"5d817499",64527:"dae07133",64535:"3756d209",64577:"a2a8ce40",64597:"72a44e21",64623:"e52d80fa",64659:"6ae279e9",64737:"1d00ec5b",64763:"ee942de8",64838:"9a8a6b3c",64848:"eda18b6f",64859:"8c717503",64865:"8768b566",64888:"5609187a",64899:"e80f330c",65017:"f08c8322",65025:"6f5a0de7",65042:"f705c127",65091:"75914136",65133:"c9bcea67",65193:"d0cf31b7",65221:"67922501",65223:"2a11e6a7",65233:"0530d392",65246:"5ea2239d",65276:"238a64af",65359:"070df7e5",65466:"a81fcfc9",65497:"26115f23",65625:"e1ba57a0",65647:"75ba6401",65658:"329c66a5",65745:"d1be0dfb",65835:"fbd3de42",65864:"698932e1",65897:"38147e44",65918:"587a0b3e",65926:"567cfed1",65957:"21719437",66061:"1f391b9e",66085:"274bdcbd",66135:"331ad65a",66140:"136587f9",66162:"cf5645b0",66169:"0b7cbed9",66210:"2b53c3fa",66237:"cc9fb6c4",66327:"eee168db",66338:"dcbc8483",66351:"ea6ff7b1",66415:"6f47e633",66461:"cb8920e1",66499:"85e49a93",66504:"e2fc22cf",66518:"c6ec7d6a",66519:"2ca00666",66524:"83037ff5",66528:"fdd85734",66559:"ecb74126",66575:"b0e34666",66602:"9fce9e91",66615:"5032a87b",66715:"48455675",66759:"e381e7b7",66774:"dc4094c8",66791:"66d49eee",66819:"acc69dc5",66822:"62e9fea7",66832:"e1fde1ef",66867:"58b9aab4",66912:"6e955522",66943:"699a39af",67004:"39734463",67044:"1b143eab",67061:"c1050649",67098:"a7bd4aaa",67100:"60165173",67104:"06073810",67114:"0d86fe8d",67252:"60cef16d",67376:"01ed4ae3",67438:"b6d7433d",67472:"814f3328",67507:"77139df7",67520:"d63d12d5",67545:"d89aa357",67581:"a1a96ebc",67587:"8775fa1c",67668:"47766edd",67683:"cace8592",67704:"8fb89e11",67729:"2c18bef5",67752:"2d2dd3d4",67755:"b57b3f07",67775:"39b26ead",67914:"0a0dd03a",67989:"59171146",68043:"c1c9577e",68094:"e981d05e",68181:"ffcc313e",68210:"a148d810",68215:"1ef2b5c0",68253:"89c88bb6",68315:"98826249",68334:"9d05a91f",68377:"31ea9d3b",68434:"975aa772",68470:"60753781",68535:"e59469ea",68569:"d81421b8",68685:"0b87289b",68710:"dbf13a93",68721:"8980e400",68765:"719a7d9b",68770:"14033dfb",68834:"78a6c606",68839:"3ac10f9a",68910:"62cdbb35",68930:"5aa406a5",68946:"68c6e6bc",68989:"edf3b85e",69017:"ef13094f",69038:"8df5dc78",69129:"4a55387a",69136:"9e7326c6",69169:"fc384521",69180:"5a275050",69199:"f0589cfc",69213:"93ef16a1",69226:"f99651a6",69384:"5a360e6e",69451:"15323d22",69457:"7ffd9a5f",69480:"a112e652",69489:"7b863c8e",69501:"fc15228a",69503:"33a51375",69505:"d0ccd112",69517:"8a4df687",69570:"4d573718",69638:"9c10cdcf",69651:"8aca5a76",69692:"16431fb6",69737:"d14574b9",69770:"b1e8d27b",69773:"f2d19d66",69844:"615fd764",69864:"a29a2c92",69875:"b58f381c",69908:"4d8fcf9e",69982:"8e981336",70008:"0860d759",70022:"c8d1e051",70058:"73a7a1a2",70106:"334fa657",70117:"9f3d620b",70126:"f68988f2",70174:"e04f6385",70179:"cb543535",70184:"36b6576f",70198:"02a73cb3",70210:"8367b76d",70234:"e76e0aa8",70253:"5e1c183f",70267:"9d6ff56f",70399:"d2786aa3",70418:"0bbbad22",70438:"5e32dc25",70502:"8c596cb7",70560:"ac5d28bd",70606:"39583919",70645:"a9f446ca",70687:"70ca6744",70696:"52be8247",70712:"cb488bcc",70749:"ecba2f16",70755:"f3e1c72c",70776:"1edba277",70784:"ac00e857",70788:"c513e822",70791:"fda5ba18",70794:"c1dff2d3",70814:"c3c05d38",70828:"6763bf32",70858:"777d5f9d",70870:"4f594038",70947:"d1fa94a6",70949:"d06511f5",70953:"87d75f25",70963:"16029e49",71021:"05f6486e",71026:"5e0cf2ca",71051:"9b8a5dc6",71075:"620de7f2",71079:"474f21e5",71117:"92f96583",71162:"af7ce5e3",71169:"011132d6",71227:"131dae92",71235:"18891827",71374:"40d0141e",71407:"7380ddcc",71413:"6e97302f",71454:"f0108549",71473:"ff761994",71501:"4d4a432b",71545:"8c13d23f",71548:"d777707b",71585:"d7e2cd1f",71612:"a29b4047",71651:"dbd41ac9",71656:"7ec29cb2",71715:"4a74d13d",71795:"5abeb861",71852:"beab57c8",71857:"cd9789f0",71910:"f783f7a9",71964:"835d6f03",72043:"f0dc2560",72053:"95f36a1a",72143:"052421c5",72322:"4941c7ed",72353:"f23d42f7",72358:"4419dbb7",72446:"27d3d4e0",72485:"b85e11ce",72508:"59aaffb9",72527:"ac84c584",72536:"1b8f178d",72599:"3336b76f",72618:"95579b4f",72656:"262704a5",72662:"408bf78f",72668:"049fd4ea",72675:"f81aef8e",72707:"eb3eed60",72907:"491d56e0",72914:"37eca2aa",72925:"b724edf8",73055:"4cad70b7",73084:"b8385eea",73121:"43dde569",73147:"6a428f5d",73163:"dfab75d7",73193:"da144c90",73264:"33e8889e",73276:"7bd25ebf",73286:"45d08048",73290:"c7f860be",73316:"8b1b48fb",73331:"97d2cbab",73376:"21838a86",73397:"681664ad",73428:"70c4ca3a",73471:"ae7930fa",73473:"158cec25",73539:"5ebbf59b",73569:"ac6289fa",73607:"01689e9b",73693:"c6ea0115",73756:"d8415e6f",73779:"7efb13d8",73800:"5cf43a2c",73864:"4d23536d",73888:"06dd3057",73891:"d721a748",73905:"d502d9c9",73906:"ccd984bd",73922:"8b683930",73940:"f4731b9a",74019:"14841d7a",74031:"4711b74d",74039:"2e6d9cc0",74046:"b7aeb8c2",74069:"ea5e46ff",74076:"8574818b",74134:"393be207",74282:"2fd7ee6b",74312:"acf7953e",74401:"3a983156",74418:"103c2fe7",74524:"111d9467",74588:"84939cad",74657:"033d3629",74684:"e6ce3bd9",74768:"a2afef33",74792:"a5ac74f6",74880:"ec7a5af3",74895:"37b8c62e",74902:"43c329f5",74945:"ad848ffa",74950:"f3ff39ad",74961:"9b3f2ab9",75043:"1c4d0413",75062:"8df3f976",75078:"dd620de6",75106:"9f49c871",75121:"0b0e328b",75173:"3126d1b1",75190:"20c3f46e",75267:"6dab9497",75298:"f2e2ec6f",75317:"152f3add",75359:"84aa8d64",75378:"847c1b9e",75396:"de0473f6",75405:"ceaa6e69",75442:"3e627431",75454:"1e94defc",75459:"605c3775",75461:"c6260f29",75484:"28a52d92",75637:"a9f98915",75666:"2aa42d18",75696:"1ad07866",75718:"d2250181",75723:"264ee92e",75775:"724a4edc",75805:"ad132b09",75894:"d95030e9",75911:"f18854fb",75919:"e01c8f09",76023:"6d79f7cf",76041:"03240ae1",76123:"52166518",76129:"95139762",76166:"1778a2f7",76172:"54111683",76215:"d9605822",76235:"6a3d5afb",76262:"075f4b70",76264:"cb46984a",76289:"1ed4b1ad",76293:"b85747a8",76299:"2519b708",76368:"9267add8",76517:"4fe377f4",76530:"594c10ba",76589:"9a3685aa",76683:"b6f16885",76719:"a50107bb",76748:"9a68cfff",76788:"dab72c8f",76854:"2b00a752",76871:"e364f7ff",77077:"a01a15fc",77088:"bf048e24",77123:"62825cc3",77174:"ce019e24",77222:"fe2389d2",77223:"cb62deb4",77240:"3e56cb01",77261:"1aef3c3b",77298:"109d395b",77369:"c4acdd50",77373:"f3ddbb03",77391:"d0c84d34",77659:"898b52e9",77698:"60381fc6",77749:"3a31d53f",77787:"d9e41302",77901:"793951b2",78001:"33ab05f6",78037:"c9599a77",78069:"3b78a115",78087:"90caa6a1",78127:"c55dd5b8",78159:"8df10e0f",78199:"5455ca0e",78217:"79400fce",78220:"f7f417e7",78283:"de5d0473",78312:"1682c6e0",78354:"c1b680b7",78421:"b1a2ea9a",78497:"28ebe10c",78512:"b7e5c092",78522:"ff4a022d",78544:"4adc4126",78583:"95365ba3",78595:"02c57050",78608:"7abfd700",78632:"4f1d1584",78704:"b80df7ca",78717:"c7dbf2b8",78764:"6000d05b",78820:"04c3dd09",78858:"4f0afd2f",78872:"f99d7a76",78912:"c8939218",78985:"ccd7c88f",78988:"0ee8b775",79039:"803df44c",79048:"a94703ab",79138:"3b97b725",79150:"cdc43a7d",79157:"c884c38e",79180:"cc426672",79302:"74555694",79416:"a2030166",79481:"9740270c",79485:"8b7dab17",79487:"fce2bd9e",79506:"368f9c22",79520:"34900881",79521:"09b9b020",79524:"921cad0e",79534:"a39d4ca2",79635:"85e0d297",79656:"1bfbaba8",79739:"8be24c4d",79776:"e64c963a",79841:"fc26a5d5",79866:"619263e9",79992:"f962f7fc",80018:"5e4ec6cd",80022:"1d1643d8",80046:"93c339e4",80091:"587df15f",80100:"a34d992c",80102:"7349f9da",80159:"e81448e3",80198:"d38a6f54",80201:"6a7c2838",80260:"8aabb1ce",80310:"3c89ed52",80315:"4eb79faf",80342:"81f854a2",80362:"2fd10e89",80408:"81c96f91",80424:"abf14b6e",80442:"e1a35040",80457:"992bda30",80458:"318980ec",80491:"7080aeb9",80524:"a8418b9d",80525:"57f28ae4",80531:"27321f21",80557:"5cb06d06",80579:"9aa3eb98",80649:"80f24550",80677:"6d70fa33",80750:"84ac5929",80772:"fd440a88",80794:"442da8c1",80810:"2942b330",80841:"413bf93f",80863:"b6aee096",80957:"c141421f",80998:"5ea38e3c",81012:"820b9813",81019:"f74d3bfd",81050:"c88d5fcd",81175:"f98df6cf",81188:"ddf9f187",81212:"347b93da",81265:"d99629a2",81319:"12363bc4",81410:"7af33a93",81435:"0e6e8143",81438:"46baeff3",81497:"439b75a7",81544:"13685ceb",81585:"04a0ea54",81643:"dd7ad24f",81666:"a74d38f6",81691:"015f929f",81692:"0d9e9c41",81728:"9df95cfa",81737:"c75c3ca5",81770:"fddd2104",81791:"d3571192",81846:"59115b3a",81902:"29470dda",81903:"acecf23e",81982:"2a59c009",81996:"95a252da",82019:"755e7c7e",82096:"dd5c5048",82221:"9920fffc",82261:"d2c9f0b8",82297:"226eff01",82354:"b87f99cc",82362:"7345c721",82553:"0add85e5",82754:"4ccba4b8",82774:"d45b1270",82776:"0b94f8a7",82847:"dd09cc7b",82905:"12cecbf6",82932:"c609eda1",82946:"492bd0ed",82953:"a76e45f1",82987:"732a7c43",83e3:"7f710e67",83027:"dac8839d",83044:"f729154c",83078:"42174d87",83089:"686a74aa",83103:"21cd7edb",83111:"6060cc06",83127:"10757cc8",83182:"e5cd0e7f",83203:"95126e44",83249:"ccc49370",83260:"5c26bf07",83273:"2b6eabf2",83316:"0ba08ea0",83378:"d0f169c8",83379:"3305f513",83431:"e6c42ffb",83439:"df2607af",83509:"8ac4b897",83523:"3d9e5426",83534:"cb5bafe5",83561:"bbefe8d8",83566:"1b2dcba2",83574:"c85c7bc6",83608:"19560f91",83612:"fa4876cf",83670:"9e37e644",83700:"a8c902bd",83779:"e6fc8a9b",83814:"5bb71e94",83841:"cc517726",83849:"c48426e8",83870:"58dde135",83901:"6f2a2977",83923:"98a236f3",83928:"345eb925",83932:"757c6784",83954:"e67a83cf",83970:"e200187b",83976:"0e384e19",84013:"c17d6939",84070:"511d3e84",84107:"ed83b9b9",84112:"f50461b9",84152:"d2ed2b82",84227:"17d9fbbc",84255:"901160ed",84256:"a86855f2",84259:"2ffd8514",84319:"1132d5f6",84324:"e5fa0c05",84332:"0b82d45d",84467:"615402d6",84527:"8180940b",84530:"5955b5ee",84563:"2760fb69",84572:"d9a7203a",84711:"19441c68",84754:"eeef4db4",84755:"1c52b634",84773:"b738b15f",84813:"6875c492",84822:"fb6c680b",84869:"6bd2e919",84878:"21014f01",84963:"d9d878d8",85008:"f4f70b42",85073:"112387f4",85086:"ec173259",85095:"ec2ed6e2",85105:"ab380486",85205:"0cf3b0b8",85209:"8beefa16",85228:"80b92086",85243:"78c968cb",85257:"ffec2b37",85279:"8f4a15da",85322:"c9ff545e",85353:"3dc48fec",85442:"2f6614a5",85453:"de5aeda1",85478:"10d4d7ab",85529:"021c0cbe",85537:"2c88985c",85558:"86c0ae26",85581:"8f9bc413",85588:"24e645af",85736:"0e8c3a89",85867:"9aa57b9d",85896:"c9fc48eb",85899:"41639dad",85905:"d5ebbe5f",85917:"716f14d9",85960:"5268c144",85967:"94811a36",85973:"5733876a",86063:"d6ce3007",86121:"677325f0",86167:"1f8198a4",86215:"95ee2976",86216:"abe1b280",86246:"7a2c4c43",86354:"d630316d",86417:"669193a7",86424:"8609b6c1",86478:"2a1b9f9a",86480:"3a311bb0",86501:"f4e1ab69",86596:"8bcf4d99",86597:"0e0dfb6a",86616:"6522b4ea",86659:"7ff6577b",86669:"927f97a3",86685:"58421c87",86807:"b0445ba0",86846:"57ec2762",86856:"c942990c",86888:"5687c7cb",86890:"319b6f13",86914:"869411c7",86939:"7a06eb83",86955:"99f485fc",86978:"9c273b44",86992:"d2a66e94",87004:"b62a4e5f",87145:"ae399c1c",87178:"ddb4c0f8",87184:"4462c0cc",87186:"767cce31",87205:"bad31f72",87217:"9c71777e",87269:"747973bc",87282:"c884ad6a",87309:"7a0a590a",87334:"0ca9b6ce",87377:"c4f2c374",87389:"740081cc",87420:"65917e4b",87423:"cfdf8269",87459:"b8f2cc13",87473:"baf4021b",87483:"d5762a9f",87485:"643da015",87495:"0e80f4a8",87514:"813eecac",87598:"74663bf1",87614:"7c29a585",87669:"022ae4ac",87688:"137db567",87747:"3f1a4665",87779:"4afdd010",87781:"6f831635",87863:"4194f325",87875:"01f93a4b",87880:"f553a7ec",87892:"6ccdf67f",87905:"fc17862c",87922:"be72319b",87945:"5b17955f",87971:"dc4ee1bb",87995:"85f9f5a6",88044:"d96d1865",88111:"ca3d464c",88163:"2e05ee79",88226:"10a1a3fb",88248:"ed990644",88298:"85e50ec2",88310:"0169a509",88394:"5ae50f21",88436:"a13618bc",88468:"bf79ed6f",88478:"23a811a2",88547:"2283659c",88591:"b3488ec5",88622:"5871fbee",88626:"6e8a38ea",88696:"6be5dbf9",88775:"b330ac5c",88815:"71cde98c",88821:"b0b71a2a",88847:"014c2cb9",88852:"508d741f",88855:"5edce1ad",88930:"ed9c0dc3",88962:"2da04d93",88986:"7b658d8e",89018:"2c9ce68e",89058:"01950f26",89082:"9a69dd97",89083:"5a1f4d83",89093:"fc93a2ea",89154:"be17da6e",89172:"adb96665",89202:"b70c8f5b",89210:"9b191135",89243:"8ff4e20f",89289:"d8e6b3db",89338:"324cb577",89353:"b919dab0",89362:"cb2f16be",89367:"3373d63c",89387:"4cc89b71",89402:"39ac0d5b",89415:"9ed26de9",89437:"ce1709a8",89455:"978ca64f",89541:"c732f250",89554:"7ff4234e",89610:"2d4f05ca",89641:"cde9af88",89650:"06f81f44",89696:"837dc7e4",89801:"084a80b5",89810:"9bfa1541",89858:"36994c47",89873:"65f8c8fd",89986:"e582f766",90066:"bfb3b697",90092:"25b57518",90135:"8abd7194",90214:"9db841c0",90257:"7b773c92",90323:"e70003d3",90414:"ed2667fa",90438:"fe49dcfb",90497:"50e73369",90502:"f4e4421a",90513:"6157713d",90562:"32eb34e5",90610:"78b09214",90656:"e3d36349",90717:"fff1effb",90727:"b843b03b",90749:"48dc1693",90818:"758aa2d1",90831:"e96ddf11",90842:"837010ac",90910:"e03c6723",90960:"a677093d",90968:"a714cbe0",90972:"70e8710e",91016:"9ba9f70e",91017:"722aa41f",91025:"cdd81d53",91046:"97ce358e",91109:"014625f4",91187:"3629c812",91319:"0f84f33f",91333:"d1980a1b",91359:"88f66091",91396:"68bc82c3",91428:"284c57b4",91517:"beaec3a6",91530:"7118d0f0",91540:"980d0b86",91568:"81ecc5d2",91581:"8614d32b",91587:"1fecd571",91612:"979e654f",91695:"6033c607",91715:"31cc39e5",91724:"9964550a",91765:"2c1d4307",91768:"a37fea11",91787:"df99aa82",91837:"cb350fc2",91844:"41ca93cc",91881:"cd630e7b",91895:"b7201a27",91916:"72fdaa88",91993:"8ce0215f",92018:"0ce689e1",92031:"e2c3948d",92125:"4cce6e5a",92142:"90b60297",92175:"f355773d",92196:"56a0d755",92273:"85fe7d70",92329:"4a4c6752",92410:"4c434b32",92412:"d888d821",92475:"1be20fdf",92535:"b6eb7220",92544:"e53ee22f",92570:"c36ed022",92577:"283d6ebd",92653:"efa442c3",92664:"7c1d6f5a",92673:"9dfaf941",92942:"211e6ca6",92955:"3e082aad",93057:"adfd3bc1",93166:"fed5be48",93210:"e55ca189",93241:"79f4d1f3",93269:"b12147a6",93273:"cf32db66",93281:"0f59d921",93310:"e5a53ed5",93352:"ad148db1",93362:"7a234181",93427:"af68afaa",93636:"e1847ef7",93781:"49c7888e",93849:"09bacf3b",93854:"0a07ac32",93884:"c3c082a1",94065:"ee71d619",94077:"cd593b9a",94091:"beceb38b",94106:"acddd5ca",94155:"5869b01e",94188:"f67432e2",94215:"cffd1a69",94227:"f0cc57e7",94251:"824e6f8c",94314:"00f9d3c8",94417:"85c8b6c7",94429:"f1579842",94445:"55f86eeb",94475:"1af446b4",94538:"13feb7a8",94555:"8e7aaae8",94561:"a1e44e64",94568:"745d4b8c",94592:"72e16faa",94625:"0a02a2d0",94631:"783e4c37",94648:"50774ec6",94711:"0c2c2d88",94750:"0ae9f46f",94776:"e922bdf9",94788:"c26e67a5",94796:"256701a3",94841:"a1282170",94843:"3e1f4a39",94863:"fc66001f",94864:"95ec5604",94910:"bb63d03e",94921:"4e7b7607",94925:"e8b41ff0",94980:"5fc8caff",95020:"63c4b13e",95058:"4b69979c",95093:"f7750a15",95108:"f697d99e",95136:"c0df5757",95159:"cdb727d9",95187:"59700627",95231:"1cb0fe52",95240:"b4030b00",95245:"ed211a79",95407:"526262ab",95427:"52910a8f",95470:"8a40ff6b",95505:"7db94a09",95528:"5c49bc18",95542:"5917c028",95613:"8e175eb7",95641:"188015be",95649:"4885c521",95717:"cb03669e",95768:"89ce4ba3",95785:"8c79a60d",95818:"dbea5ca6",95832:"debfe2ad",95900:"3b1c0220",95909:"9e488927",95980:"86ed5607",96086:"eb84cef2",96239:"380e17bf",96268:"638db053",96276:"82a7c68f",96325:"65d1ec04",96355:"e3dfbe38",96463:"ddd9290b",96470:"1b260ed9",96533:"8168f54b",96555:"d4083900",96609:"19f4d091",96646:"9fd8c386",96771:"a98ffe6a",96846:"78775dd1",96863:"bbabcc43",96881:"d527c17c",96939:"e8630c63",96963:"98749210",97006:"7ab01152",97033:"e9032a0d",97038:"62a12351",97107:"9331da7d",97114:"32bb5bcb",97123:"9d2e74da",97167:"20a30ea0",97223:"7fa05810",97246:"365a7fd7",97251:"0b79e3ae",97253:"1a8a162f",97286:"5345b11d",97296:"205cdcf8",97316:"99ac6847",97342:"c2a473ad",97352:"e507660f",97379:"3bfbd79c",97420:"224c7e3e",97424:"ba47c136",97476:"b93a682d",97536:"3a6c6e5b",97562:"3d08e0be",97585:"8e81e342",97618:"169379e7",97670:"1dba1ecf",97710:"e77acc18",97732:"b58e88de",97737:"8fa9d00b",97763:"7d2fd416",97768:"77f37b47",97821:"97a057b3",97829:"e5562b89",97863:"47edbc34",97887:"26ec8ae2",97895:"ab8b4014",97913:"1e228808",97944:"6018a0af",98020:"16243474",98021:"139d61ea",98070:"bd3cb29f",98087:"b18455bc",98094:"48f67822",98127:"3c410a59",98154:"0d55f18d",98178:"6dd52a8a",98237:"3539b92c",98271:"f62bafa2",98311:"9e297776",98392:"1c3a958e",98425:"b943b6ea",98473:"94dcd3de",98477:"ea6f04d4",98534:"6065ad54",98660:"e155b22a",98700:"99e64d04",98758:"af6e9729",98761:"3314c9d3",98779:"a48978f5",98804:"bf667688",98908:"b4e94af8",98925:"ab37b32f",98941:"c9ba7c72",98947:"ef00b8a0",99077:"9ab9816d",99095:"1c27379d",99105:"9d47e342",99151:"8e563661",99236:"70f30c1c",99252:"3047f3e7",99280:"d5405b72",99306:"bdecca0c",99330:"b3e98411",99335:"df09200e",99389:"ebad1003",99437:"5ffb8f23",99451:"c0684476",99502:"2263a65b",99504:"76af5d51",99528:"16e939a3",99531:"8c2cbe8e",99534:"c49eb59b",99543:"25c655c3",99611:"9cc8ffa2",99678:"25e15e7c",99701:"5a4dd75d",99705:"5fb14ca8",99709:"dc330c71",99710:"6e34d00c",99746:"f4a839f6",99747:"a32c0324",99764:"a9be9b10",99839:"d1ceaa61",99855:"22559948",99905:"2f7d15c4",99970:"8ebb6eb1",99987:"4b2e4980"}[a]||a)+"."+{16:"8ac05ebd",25:"f0362d49",28:"cd15891e",48:"0c461f53",67:"2d55d234",129:"3888799b",142:"5226a575",159:"0d32a66e",192:"2a5e92f3",217:"6f1b0503",273:"08b747b1",292:"567b9204",323:"b66995d1",339:"138b74ba",354:"7a75015e",387:"751989e3",437:"92064fac",569:"ac25fe95",614:"91c15bfc",878:"77a3ca56",917:"a8aab479",924:"72b7899f",940:"684cd7f5",982:"194878d9",1017:"446f3e44",1107:"4a348c43",1119:"814a5e52",1151:"c6a3fe01",1190:"155bc77e",1211:"db2248b1",1397:"d4082297",1422:"0176850e",1458:"ad1e6559",1459:"4d3e082b",1517:"1a694762",1550:"9699f120",1622:"4e919029",1635:"78aa6a72",1707:"134f5de0",1715:"065cc975",1717:"00ea715e",1763:"ef8a6a49",1784:"bef16a2b",1841:"4d0b99cf",1846:"f06e3bc4",1857:"b0569849",1882:"b991f895",1928:"8477dccd",1949:"788eba58",1955:"ac3f145c",1957:"a21a8896",1983:"abaf63ab",2016:"8058788a",2053:"bcf43093",2072:"5873960a",2106:"579083aa",2121:"4a407f3d",2200:"79f1c8ba",2214:"f4723e22",2225:"41dbf674",2256:"70aedd4b",2298:"f48617d2",2368:"b72b7d03",2385:"8f345790",2450:"56d5c2b0",2472:"a8ce9c76",2540:"6e02a076",2577:"9ba93d75",2640:"8d32a009",2652:"875b1af0",2663:"e5cdd507",2679:"d200e52a",2696:"6bba2e9a",2700:"0cad2ac5",2732:"ae456e28",2739:"69eb7dc4",2748:"9a7fe731",2759:"90a51f8b",2772:"d173cb5e",2791:"e559a0ac",2839:"d28a66c3",2854:"a92f21ca",2918:"c86625a7",2932:"5c6ad8ff",2954:"b0478f08",3050:"88be6c15",3075:"c2c3dabc",3104:"e03ffad8",3125:"900b550b",3131:"2c75827a",3137:"7242e424",3144:"59b83e62",3151:"64522f3c",3174:"a1690509",3179:"285e0b24",3303:"84781db8",3313:"fa91bb20",3323:"cc825151",3337:"06808e39",3482:"6525aab1",3558:"1c079f8c",3693:"8d4e55ca",3722:"35a202b7",3740:"6b9b0755",3764:"2f1dadde",3843:"a21d3d9c",3940:"70ec240f",3965:"dc1f1f35",3968:"7218d679",4040:"1e2bf952",4060:"442c94b1",4074:"48c4e4d4",4133:"b73a8a87",4205:"49da151e",4355:"3e38878e",4362:"a0869082",4368:"da0f776d",4405:"e7a97cec",4425:"1a0f7b84",4442:"bde60cf4",4467:"6c9f8ce3",4530:"d709439c",4574:"649efb69",4591:"ee580cd0",4602:"3fb5552e",4629:"2448e6e8",4777:"472918d4",4790:"4134ebc4",4795:"bfcb9e8a",4863:"b5c502a0",4890:"97d9560e",4919:"51b16c65",4980:"194864ff",5028:"0d5e7a6d",5029:"9334a7a6",5065:"7d49a3c1",5137:"d4ab5c9e",5168:"b622a954",5193:"a941a5a7",5195:"edcc5600",5268:"0be145d6",5270:"3d510d75",5289:"ad00e36e",5295:"b5380022",5322:"bd7b5075",5334:"c4b6d4e5",5338:"19b436b9",5397:"009776ef",5594:"aa074bbb",5622:"5a34a558",5631:"b76c6089",5633:"fe458f8c",5685:"500a2807",5721:"a794af55",5795:"559bea76",5806:"fe1c3d81",5887:"7a8be1b4",5888:"5f91de44",5936:"a9b347d0",5988:"6ac33f8f",6045:"db1e1026",6082:"279eebed",6090:"c662b14f",6158:"0be8aada",6171:"b1b630fe",6203:"1ff06562",6225:"1c46ef35",6289:"435264a4",6350:"b906f412",6370:"c0d1e5a3",6371:"6980516d",6372:"ca6f4523",6467:"e7899499",6482:"4c9fed03",6542:"00cd3965",6552:"499b911d",6559:"4d5c8b78",6605:"9dee9f5a",6636:"18ccaed7",6677:"78ed8131",6697:"9e741f49",6709:"5a94c6a8",6739:"9af6f46b",6761:"87a9fc1e",6791:"918a70a8",6823:"b8d052cb",6827:"f224e485",6845:"8e6544d0",6897:"8ccf6b9b",6944:"d9d18539",7033:"ed9b3588",7035:"388ba84b",7071:"5077a002",7100:"56a20715",7125:"fb2f85b3",7140:"04513e55",7160:"f56e090f",7167:"b11db014",7233:"ccda7df5",7277:"39506a42",7317:"c71bc81e",7355:"5a604a37",7414:"2ea5d970",7444:"9f6bfff4",7458:"77fbcb33",7462:"9c14d3e6",7517:"9f4db3e3",7564:"1cfbab8d",7693:"f136c13a",7715:"9b15ed44",7724:"5aee3c9c",7734:"2564e702",7773:"d22f43c1",7802:"18f6315e",7844:"b19094f4",7861:"4f3378c3",7881:"a309c6b8",7904:"15613429",7907:"c025b354",7945:"c2632258",7949:"38e02316",7953:"4e457086",8003:"f80724c2",8070:"4d429baa",8177:"20ac9730",8183:"3a452a20",8192:"230029e7",8209:"c1611e12",8263:"18384273",8281:"d65c537e",8289:"2e24ee20",8348:"d0f2e2d3",8354:"a40ae6b2",8363:"0179079c",8367:"21a50fcb",8413:"fe3f7476",8417:"03b71ec9",8583:"cd14ee3a",8585:"1d1d50de",8606:"fd7dd514",8619:"219db3ab",8645:"e22163b4",8651:"fd6634a4",8668:"0ae30b3e",8688:"0ef8fc51",8762:"ed55bde0",8766:"d4602947",8840:"ba168b8b",8874:"eb2235bd",8888:"4d6ff9cc",8889:"98a3fd62",8892:"9e3d8aa4",8900:"eeb0280d",8909:"f6276f03",8965:"559db5a9",9045:"5064d1a2",9127:"c26a9e92",9151:"cb9f37da",9152:"2086668e",9189:"b9c18810",9195:"22c5016d",9225:"f8e41346",9228:"debc195d",9257:"980441a2",9333:"15df7b70",9351:"71e70b1f",9426:"d153df35",9428:"259145c4",9432:"83b0e397",9446:"25d584a1",9458:"cc256cd5",9471:"c536e3e5",9478:"21869f38",9499:"f7cd652b",9516:"deec291d",9570:"1ddf38d8",9631:"23e4dd86",9647:"4bc8eb58",9676:"3600578e",9700:"0177e547",9702:"a0e15d40",9722:"1e50549b",9737:"1aa9929e",9790:"f4949afe",9836:"77c37a00",9856:"6c3f2d91",9860:"d6bcaf83",9870:"db20a9cc",9888:"a845ad12",9891:"a8192817",9896:"19e0ef21",9914:"6bb2f03d",9944:"51536acf",9986:"481495b3",10030:"b20fee70",10118:"a38b2ac9",10181:"0777fd73",10198:"372a289e",10238:"6e6a9cd7",10285:"b67fa6cc",10354:"741a1086",10384:"8b6aa9a7",10472:"35cf3d5b",10510:"2cac5bb5",10535:"78c63297",10569:"d066683d",10637:"d596e8d0",10640:"9710e162",10642:"3c6be4cd",10682:"171b4746",10683:"209cbd7f",10708:"62ae983a",10727:"7602e1a8",10767:"b67c6cb0",10789:"b4306562",10801:"8e2ffd0e",10907:"dfd7f2e0",10920:"f962ff2d",10954:"08ce30eb",10956:"670638d7",10978:"295a103c",11e3:"189640ba",11002:"e45a7aac",11111:"66cb98e2",11238:"59057ae9",11275:"6a95bbaa",11289:"bed04fe6",11299:"9e7747c5",11326:"76f9307a",11330:"160d982c",11355:"60c16346",11508:"378e29d0",11624:"c26f42b1",11631:"456bf323",11682:"8ebca801",11725:"7955bde6",11738:"e6134e88",11745:"9081e9ac",11768:"7236ce84",11775:"69771f4a",11783:"ef6aba8d",11795:"c2957c56",11804:"65c35fc4",11842:"5225004d",11855:"0d093388",11869:"8ab52dbf",11905:"053c7e23",11906:"2a5c3c67",11977:"2515ce5a",12047:"1119fc54",12110:"545ee368",12123:"a9d8a5cf",12134:"8f01fdba",12144:"36c195ab",12186:"366f93c6",12316:"dac4c86a",12318:"e419dfef",12378:"3c6c9f4e",12395:"1187f8a0",12431:"7429f4cb",12452:"0aecc69f",12477:"b9df0d01",12513:"9e459ecc",12535:"f6122913",12542:"3bf8cace",12613:"f8b011ee",12617:"0b34b7b7",12650:"73cdab89",12654:"a86ca62a",12686:"4fc79481",12869:"0987eeb0",12912:"f3822f11",12945:"eac30142",12995:"30dbdc54",13021:"72281ffd",13060:"2aa3b2d5",13063:"89e4541e",13124:"0b9b75b8",13152:"edfc31e6",13203:"ddbf8f3e",13236:"e36c6187",13358:"a54cc156",13374:"3b5dc33f",13375:"4b923f29",13419:"cf042379",13460:"bffc2d0e",13465:"b3d3cd8c",13525:"350bb64b",13534:"0b159e45",13562:"bab7d1c5",13580:"b5ed32dc",13698:"62b11040",13733:"00549fc4",13762:"34db2b68",13803:"9a5f96ea",13918:"0a0c3afb",13943:"73aebc88",13970:"70c1326d",13996:"134dd2f7",14003:"4c9d4c99",14027:"a2d505b4",14042:"68bbb833",14043:"0f3ff3bf",14059:"6483883a",14125:"73fc368c",14134:"8e9b79d1",14136:"6b15fdc8",14152:"6d1342b3",14163:"539d7459",14168:"961871f4",14179:"ba42a4c5",14224:"e4916c87",14257:"5502ea28",14259:"fefa2252",14261:"fbfae7fd",14264:"1fffbb8c",14286:"e6d9af63",14340:"93862f4c",14363:"9a5204a5",14381:"e96823fc",14388:"4c3202da",14399:"d390ab6a",14410:"81c89a25",14435:"ccff2e24",14446:"116bae8b",14483:"b8756fc1",14496:"2181a5a0",14515:"1db3a2e4",14536:"679edb6e",14549:"7d8e460c",14599:"94173808",14627:"f540a45c",14629:"7cf019b8",14683:"55bc1b0e",14726:"3e9f6cba",14750:"af72168c",14817:"38117e22",14822:"07814cd7",14844:"09027959",14868:"1a051531",14917:"1748e819",14919:"e9585aa1",14943:"473175cb",14971:"9ddab47d",15078:"f57e4316",15079:"4f341544",15144:"46d954c2",15186:"2b478d78",15220:"109d2e90",15235:"d25ccc05",15272:"69681a90",15292:"76382a99",15316:"f3ef7712",15387:"e2ac8551",15403:"a0206d92",15473:"c0502a9a",15528:"88d1eab0",15552:"7c41139b",15607:"e4070ad4",15654:"b4482666",15744:"d3b026ad",15746:"02977e2d",15805:"7f419894",15875:"9971c895",15881:"94e9b95c",15896:"ff07cd1b",15917:"0c478add",15947:"7d0abc22",16032:"a789234e",16090:"59b459a9",16100:"77793a47",16209:"86a3d504",16378:"00a39ac1",16560:"2900993d",16622:"adc5afc5",16641:"2a1eb5f3",16649:"f1f1a85b",16660:"35b674f6",16685:"7cee9c09",16689:"07b5632b",16745:"042dd2d5",16775:"5c011661",16803:"f2b20b61",16885:"9caf8073",16942:"9227373a",16999:"7c7ee436",17033:"6dc883c3",17232:"6370ad0d",17294:"de0343b1",17332:"1c963c67",17368:"43943470",17402:"71c617e9",17411:"13b9d385",17441:"97a9a210",17502:"2f68280c",17530:"262072d1",17606:"16c6b13f",17626:"ca8bef6d",17681:"0a28b4be",17697:"0b4ee2f4",17709:"083b7eeb",17722:"27e29040",17727:"6997bc49",17803:"0c38fcf7",17818:"b2d4ed92",17860:"51f552bb",17867:"a0f6100b",17899:"90cfbfef",17987:"0365bd67",17988:"3b5e67b9",18006:"5c559465",18033:"8b41a0c1",18103:"8862c93b",18115:"93ffe70d",18142:"5dc3538d",18187:"7e0a04fa",18205:"2878db19",18299:"6b1005b5",18351:"95b9e285",18375:"619d0bd8",18401:"e94b36b4",18438:"b128cdaa",18445:"e2638720",18520:"d07e5cfe",18551:"646dc65d",18616:"cd50a18d",18620:"8fc7ba62",18645:"240612b2",18738:"0b492dd1",18757:"3f6cd12f",18940:"adfe8f3e",18950:"1c16d30c",18998:"b4319093",19040:"495e130c",19042:"3900c42d",19052:"46ea8872",19070:"6ff00ece",19108:"02f2695f",19237:"db956b9e",19369:"540a7369",19387:"a45be931",19396:"92b1e64c",19428:"bbb964e5",19521:"bd33f769",19542:"6a596000",19578:"d9ca0649",19659:"7fd63a3e",19664:"7446530f",19686:"6a81d90b",19711:"f705be5c",19774:"96192c07",19798:"8e862db2",19801:"2cd38a63",19851:"40f54417",19865:"c2a61d18",19894:"f2cf7135",19999:"4573ecba",20103:"e296df60",20116:"dfc7eb01",20154:"3f3431d9",20160:"c4a45f43",20216:"dccc3c9e",20229:"ee2596fb",20286:"7ad43929",20304:"3b4d58a4",20358:"2fd910e4",20361:"686333c4",20405:"46ff6b3a",20415:"86022b1b",20428:"751241d4",20434:"49d1eaf5",20491:"fb010bef",20535:"cb7af6cb",20541:"ca584950",20596:"e5b9c711",20639:"88c80dea",20661:"e30cf182",20713:"2c6d24de",20812:"05d2f4fd",20892:"dafa34de",20924:"9e4ccf1f",20951:"4085b498",21070:"bdea221e",21121:"837b54ce",21123:"9345258e",21177:"05e6eba3",21191:"63b947f1",21273:"e3460757",21275:"15644456",21292:"7083f7ed",21303:"388dc2a1",21316:"d318c062",21346:"e3324367",21373:"79507c92",21417:"b5bb43ff",21492:"f8613848",21510:"4eac4151",21524:"3320162b",21560:"96410c41",21585:"d442996e",21630:"9225fb44",21635:"83c1b80c",21644:"c48ffb37",21683:"f8ba8e93",21729:"f9b05879",21805:"db2c2338",21874:"9647af30",21921:"f53a86a2",22087:"fbadb3cb",22124:"89ff5dbb",22141:"b3e9fdd6",22170:"22a965ba",22178:"62d4d7e8",22236:"eca8ba0c",22257:"cf1f4a84",22262:"0df74bae",22385:"ba8ab668",22447:"2647355c",22499:"c959dc92",22501:"02042e9e",22504:"43475c1a",22534:"488ff42b",22579:"67b43690",22595:"6d9f3ec6",22640:"34f41780",22651:"bd743239",22702:"6c60d195",22791:"71eb2085",22809:"d0f84769",22816:"5a1e4a66",22911:"7a0099f9",22916:"c477d29d",22932:"c688b67f",22969:"3926a067",22970:"1cab002c",22973:"8bc0e7ce",23002:"46c384d1",23039:"6c0fce19",23041:"8c1bd410",23081:"d4604ec7",23119:"18122d0d",23141:"dfe3feb6",23208:"fe9f38c2",23332:"aff1ac25",23388:"1a04b7a7",23438:"914e22af",23475:"16251630",23545:"ab209fc0",23563:"4602839d",23591:"16cd9fe0",23600:"953a038a",23634:"dcf1fc77",23637:"22313d2f",23641:"cfe9bbc0",23666:"d4baeaab",23676:"b6d59077",23700:"6958b19b",23805:"91360e3e",24033:"bd66e2b6",24036:"d5f8977c",24065:"7e495472",24071:"bfe1e75b",24084:"7c95d95c",24098:"ac04e3d2",24126:"5ecb3c81",24140:"e76ef921",24143:"b377382c",24172:"0ecb4baa",24234:"8bc4905a",24265:"b94d5152",24292:"5caf29c0",24301:"f4bac114",24327:"f704446a",24340:"9bddd554",24366:"650e3002",24377:"0232f7a4",24393:"241a6877",24475:"48d3eb7c",24476:"25e14ba2",24607:"28a8e3a6",24618:"46db6a06",24644:"00ce995e",24649:"a8b67a6f",24652:"3c345bc6",24704:"b2a1b395",24728:"f98b0bd8",24826:"26d68de7",24838:"bc4155ae",24853:"4007ddd3",24891:"5890efe4",24912:"6817e6e7",24919:"78a88647",24970:"90183578",24991:"629324f8",25044:"68371239",25101:"a872dbec",25130:"59081464",25173:"708ab92d",25186:"5e831468",25243:"8ca109fc",25285:"77ba9f9d",25335:"8839d8ea",25397:"fb32a912",25410:"0c116ef8",25450:"62b2392f",25452:"182cc5e1",25469:"2128064f",25531:"9a415af4",25532:"f7c2567b",25539:"160170f1",25582:"ab6dc686",25632:"b7213de4",25671:"19c346b9",25731:"f3ee2613",25778:"7f42472e",25781:"4e5077ad",25845:"e100cef5",25874:"c9e956a1",25987:"1f79f118",26003:"5170144a",26009:"3bd877b1",26079:"ff6ff1d6",26183:"91985ae6",26184:"b12a9d4f",26216:"5e20fb8e",26260:"c8d40ebf",26305:"e1f80484",26333:"f24faa99",26337:"438f144e",26352:"09ed8b70",26610:"a7babf6e",26627:"c2210b47",26632:"043a2915",26722:"ae9bb6a5",26744:"4f84a6a5",26797:"52da70f8",26812:"654c8081",26882:"1c388de2",26900:"a252ff91",26986:"122b9851",27012:"10d79155",27020:"4f663ffb",27088:"d75dc45b",27092:"e1cd998e",27094:"b42967ad",27115:"6b296f1b",27123:"ca5ae4af",27179:"9517eb87",27212:"98d2a763",27367:"83b93478",27369:"6e19762f",27388:"dd0105b6",27394:"742b91e3",27398:"a7cca359",27444:"95540060",27473:"f36c868f",27493:"c65c480a",27684:"732d93f0",27785:"f5511f80",27955:"84e51b5f",27995:"09203cc8",28081:"c7f06aeb",28086:"97fdf3f8",28111:"e3bccd5c",28166:"f7b1a0f7",28178:"62cfc729",28204:"74066e0a",28235:"c1a0fb92",28252:"880d4216",28294:"4ca542d1",28319:"4eae2708",28369:"7fa0c818",28410:"a7f8d300",28498:"1948bf76",28616:"a066ce01",28627:"1b7c55ec",28636:"a0f4af04",28679:"4756dd10",28687:"52d8bafe",28701:"e6d57536",28782:"fa146d82",28793:"b979c797",28834:"6805fb4b",28920:"8acff1e1",28941:"6c88a1a6",29060:"70769d75",29100:"0ab1cff1",29117:"fa455e62",29148:"50313aed",29243:"5ba26036",29370:"f3a55335",29408:"f798b594",29421:"be77c338",29452:"6c9f7f40",29457:"2dade485",29514:"4ed81190",29523:"1f01d041",29526:"d3ced069",29567:"54eddb7b",29653:"6c1bac51",29679:"83c06c29",29690:"35e6cfa7",29698:"12a0bbd3",29708:"8f01ba9e",29733:"2fc70ef1",29795:"c62884ae",29820:"ba5150b8",29829:"64635776",29838:"63559713",29845:"26d07535",29851:"46d1f4e5",29885:"585d6e13",29943:"0538ff77",29950:"95d8c9c4",29969:"b99437a6",30021:"99c6d723",30035:"7e34ceb4",30154:"69f8d206",30163:"4b199a1a",30167:"2e627378",30200:"9c91a718",30239:"c0efd77f",30262:"b26dce04",30303:"9e473c96",30314:"72aad6a6",30355:"20f0f359",30410:"a1ebb577",30490:"03f6f574",30564:"45a6bb9e",30579:"ecc3681b",30583:"9859512c",30585:"579c479a",30628:"dfa020db",30746:"5c85f7cf",30827:"fbc9b400",30831:"833c3818",30842:"bd41f57b",30848:"8fa0da33",30934:"37abe96f",31016:"da5168fe",31022:"0882a243",31039:"0b15a39f",31125:"052f330b",31150:"f80816ad",31213:"d831b797",31220:"ce77d7b7",31255:"67357ced",31257:"ed9fba36",31272:"6a19c635",31279:"4df831e3",31465:"d0c255c3",31541:"7943aef7",31544:"1a7d8e28",31567:"b2867725",31700:"fac4c96c",31705:"cbed1284",31720:"5f2b67b3",31791:"5804058e",31838:"b9b98db5",31861:"9e90448e",31862:"9abe8fb2",31972:"31acb15a",31996:"00758b71",32005:"84603570",32012:"4b5e21ae",32039:"d731efcb",32183:"8c775c29",32295:"cb1ba43c",32335:"a0130ff4",32365:"96416184",32374:"ca708e35",32384:"5622bab6",32391:"31c297cc",32472:"61845888",32492:"0cfe6e62",32558:"5c77c69b",32691:"fdff4ad5",32728:"f5f8125a",32781:"45016ceb",32787:"28677bad",32825:"d0d1e442",32847:"bb183978",32875:"b9880713",32884:"e764023f",32949:"30519250",32960:"a66f3281",32993:"100ce346",33049:"797f09f6",33065:"96d2bc95",33132:"b9fb732f",33192:"aeddaf9e",33202:"77ce3fa2",33234:"27765e8b",33290:"a7ee7ebb",33307:"b8a90e65",33350:"d0743ce5",33458:"5e27357c",33462:"b6748652",33517:"806e15ea",33540:"4955f299",33567:"58dbec2d",33572:"790be6bb",33612:"952b9785",33621:"fff6756e",33638:"7a8f91fc",33643:"5ff48cf7",33659:"95a3021f",33724:"786208fd",33804:"a4a3288d",33806:"cb9093ec",33825:"8b5277ef",33881:"4ec68caa",33889:"aba0ae0c",33999:"4708bab5",34071:"c529f0d4",34095:"ada1f567",34117:"94f43e49",34127:"43149bd8",34156:"56d9a677",34171:"57af3c1d",34179:"8324fa5c",34196:"85d389e6",34255:"d26c8a6e",34331:"d308b051",34388:"07ce653b",34447:"fe0f180b",34511:"aeaa78e8",34520:"55d7dfba",34528:"fb5dc813",34543:"f1b675bb",34549:"f29b2a9d",34621:"d8f116f0",34662:"d54bb307",34691:"429268a3",34706:"71293920",34750:"a07e2874",34761:"afe7f205",34808:"7442575c",34810:"2657c03b",34812:"cca7b04b",34837:"c6d8e355",34847:"9b92bcf1",34877:"03b8eb1f",34962:"c1d7aca3",35023:"50d0a398",35139:"f3128d42",35168:"fa87447c",35288:"a547d99e",35325:"c3a4c126",35329:"0d7fe910",35402:"84a5c423",35523:"e2e1ee4c",35532:"c84e65a1",35542:"fbefff6b",35546:"3e65ad63",35618:"19eb0c66",35733:"537be3ff",35742:"de61f764",35766:"174487be",35767:"463a7575",35808:"70beac1f",35844:"d7ad5460",35911:"c2f989d6",35932:"db328b4f",35960:"166a77a2",35983:"408a3db9",36009:"beaf7ce6",36055:"b81c37ad",36067:"786b5395",36113:"f79b7ff5",36144:"a3c650a6",36188:"f547e259",36192:"329ae917",36211:"994fbe07",36271:"53ca6387",36302:"02a771b6",36361:"feee8928",36573:"b3366c1a",36619:"600f0e81",36640:"e00d2795",36672:"a5db5682",36682:"896a9672",36689:"ae0b01bc",36703:"afae5ceb",36747:"17dd0f7c",36763:"b3d35020",36790:"c42b1b88",36851:"3f63d885",36890:"3f8a945f",37109:"7520aa6f",37115:"416d8c88",37147:"ed98e2f7",37191:"4fcfa7cb",37204:"49df1dec",37206:"037ab3f9",37209:"a1f9ee00",37287:"e3b3be1d",37298:"30eb2c83",37329:"2beecd8d",37366:"c3c12683",37378:"f069c090",37441:"2f2535a7",37485:"a4887190",37486:"f0cf1f24",37489:"c3b0806e",37578:"293381f7",37617:"98b37d25",37643:"4865d39b",37646:"c5e85ebf",37673:"2a0ca503",37678:"c4033544",37702:"9980cee5",37737:"0b89d08d",37740:"72534e6b",37799:"545730e0",37809:"ba31e5ee",37827:"f146de88",37839:"7e47bbd1",37841:"dc25e3f6",37842:"083b7156",37872:"f0421a75",37979:"56e915df",38001:"e8de45d3",38032:"a9ebe729",38035:"514fa6f3",38055:"cc6f35fb",38056:"157936e5",38238:"2906d599",38288:"8f516468",38370:"edbef2fa",38416:"cc68a397",38439:"c442d347",38451:"15f42485",38460:"4f06ed21",38501:"dad7a44e",38520:"5096bede",38600:"e52df43d",38605:"147e6e2b",38642:"28188f1b",38767:"2069f290",38816:"2e6a995d",38835:"159b959e",38839:"60e4a3f5",38888:"75c8e2d1",38891:"064f0318",38923:"281017c7",38953:"2c10a661",38974:"8999a5eb",39014:"ee4cf326",39058:"27f83944",39088:"9b7cc7e2",39110:"8bf923ff",39138:"30d6c764",39142:"0f9b17a5",39153:"0fbb8eed",39185:"02061a5e",39192:"39ca29cf",39197:"c0794e42",39202:"57acc065",39228:"8913b29b",39230:"90a76867",39240:"f6ee252f",39260:"535b3fba",39265:"9d8cd1c0",39283:"15cb5d63",39404:"29af646c",39405:"5a899176",39407:"536f961b",39423:"873a960d",39444:"44da259f",39472:"51d368b4",39473:"dfb4ccc4",39487:"48461437",39494:"8329c98c",39555:"8a276b1a",39569:"7398d59d",39587:"13c221ba",39608:"de053b18",39712:"569aa42b",39715:"3c3e42dd",39773:"7fa7904a",39777:"8bd37477",39781:"eb0d7286",39876:"79f2bc2d",39887:"d57d214b",39901:"1f6a0196",39908:"3c0a37b5",39973:"f96945d4",40065:"68fc409b",40124:"ec69a342",40132:"56705819",40178:"4f022e3a",40212:"7b9d9dbf",40249:"69931c7f",40369:"b3bf28fe",40463:"c4086162",40555:"b64c7e66",40606:"ed14f172",40616:"a179451a",40651:"f65fd9c4",40690:"fa974390",40694:"ce541902",40697:"99ebdd4e",40733:"594c94dc",40755:"8977d989",40758:"e0d2ec5e",40780:"5aae6ddf",40797:"0df3125f",40827:"9518f3e5",40847:"0b59b074",40879:"0ad293ac",40907:"31b64328",40927:"04e28b7d",40959:"0ea6685a",40999:"08bfb4f0",41030:"64f79f81",41120:"0cb9e462",41125:"2379c8a2",41134:"30c36d3d",41135:"a45fbc1a",41159:"9d363276",41178:"505cde6f",41260:"97d27dd7",41361:"5ac4238f",41409:"d180fce2",41455:"4bae3071",41461:"76a9b09e",41472:"36056a02",41491:"234f70f6",41594:"3c165f92",41637:"64cd5f8b",41640:"55bdbc96",41651:"e484bd7e",41677:"8d7634a6",41695:"594065bf",41739:"bef73aa1",41750:"df955372",41867:"c05584d1",41871:"2c5ca052",41872:"0dcdf39d",41892:"d5217e35",41907:"572711d2",41944:"7508e278",41954:"6c92aec8",41993:"c154ea72",42021:"f38811b3",42068:"199b8920",42187:"a8983f20",42196:"e6f20fc2",42207:"e9fed201",42350:"4ec3a68a",42368:"cc5a76f9",42380:"2a7c900e",42465:"9a67de65",42518:"25af2aca",42566:"46d31542",42576:"6905e2af",42596:"fc41574a",42659:"93e9d96a",42677:"7da804e3",42690:"f9657df2",42694:"8da104b0",42722:"ee6db088",42799:"d2e13f99",42801:"7cdf2de9",42887:"f2711f79",42900:"eb6a27c9",42905:"e3308e05",42911:"e025b437",42924:"496e6416",42942:"007d5a8d",42995:"93272e94",43029:"7cf3ffef",43035:"c603ad5c",43036:"ceacca00",43040:"7f80a0e5",43042:"f9508569",43078:"e4e17ba7",43088:"85d08fb7",43113:"9312a7d7",43136:"26d6858f",43199:"00bc3904",43352:"67598bc8",43372:"4a998c20",43421:"9d76dc5c",43432:"80b8b2d8",43445:"b991db3a",43447:"aecb8dc2",43512:"619aa4cc",43642:"7734b543",43675:"8c9a42e2",43684:"3e820e4d",43833:"c622964c",43868:"e83f47f5",43880:"98e75f99",43910:"68e94bea",43913:"5d92545e",44008:"80b7b469",44040:"4b271072",44045:"f13708b7",44062:"cf73f4af",44118:"330d959e",44123:"4ba5c76c",44125:"39fe181c",44129:"d8fd9fa5",44137:"5560b906",44143:"15678c4c",44169:"d044099c",44267:"e1df3fd0",44290:"2647d7f3",44301:"799f4a56",44339:"5a02a327",44351:"60056a65",44381:"0f2fd8b9",44419:"d38e9ada",44489:"41de95a1",44492:"330d9ab5",44546:"39f05583",44551:"d52e4d6d",44567:"860bcce1",44605:"d8b72653",44640:"b75262a3",44662:"82658600",44682:"77356827",44844:"96049e11",44891:"c2374fbc",44939:"78897c01",44960:"7dbe5447",44994:"b7143504",44997:"a39809ef",45113:"5779d1a0",45117:"9d8351fe",45218:"ff9cc91d",45238:"129e796b",45245:"49a30458",45268:"440e0356",45290:"b07370d3",45323:"33ec6344",45339:"9c5010a0",45400:"df49d30d",45500:"76ee01da",45541:"210626f3",45670:"5db834cb",45682:"4c7ab10c",45746:"066b1fc8",45919:"302c55dc",45920:"3c770b04",45983:"52deea49",46001:"f84251ca",46008:"5f13945b",46025:"a35c2f01",46039:"e488f683",46063:"8327e9c5",46074:"628e6e6a",46102:"fcbd99b0",46123:"0d7536ce",46156:"6aa19e44",46232:"0fbffca1",46244:"d041fcd8",46246:"e4c9315f",46340:"ac4c1bf2",46352:"04c498a3",46375:"a1945bfb",46381:"3c07c273",46435:"adfdda2a",46451:"5ad2c3cd",46464:"c87b3d2d",46472:"c5057fa9",46513:"755239a6",46515:"4aeb0be2",46541:"72e944df",46547:"14076aec",46548:"8a922f8a",46598:"fac3d57b",46633:"ed4369dc",46662:"731a20f8",46694:"a8e5839a",46697:"91082fd3",46710:"26243761",46754:"a456380b",46814:"a68a12e5",46850:"023acee9",46888:"c77e5db7",46905:"f8ceebdd",46911:"355f70cb",46917:"44d76c4f",46921:"e9f4c78c",46962:"edae7d40",47041:"1448ec13",47087:"ab81eade",47106:"2abf8698",47110:"92f36f5d",47127:"8e14d68f",47156:"82ac12c4",47247:"3b0b52a3",47297:"cb1b1ff9",47433:"ad19b756",47537:"ced3c79f",47555:"1da3cbf6",47573:"6362d3f4",47622:"e27a349c",47693:"f047f0c4",47699:"5b99da2f",47730:"744e0083",47738:"74ac10c1",47913:"d559182c",47917:"f9b613ef",47993:"cb4f3804",48015:"a748eaed",48023:"2a187de8",48027:"66bbd683",48050:"bd14dc84",48063:"f777fc95",48071:"3fa7d484",48097:"f567f8db",48127:"2f9721e3",48132:"831080e1",48140:"30ea389c",48158:"d48e413c",48162:"2d6e4867",48188:"f08a8996",48270:"f0792f6c",48285:"6fcc7665",48286:"8f7c465a",48295:"0d3a7887",48304:"26c725f8",48310:"c47eab51",48360:"56bc60a8",48361:"676cbbcf",48532:"3ef93cbb",48537:"69e3c961",48544:"92cb45bb",48592:"96702276",48650:"871bff96",48661:"5daf4874",48673:"992b03cf",48733:"722f48e3",48768:"64a5ccea",48793:"753400ea",48879:"84c26674",48883:"4947161d",48939:"3d39b429",48985:"f4f56d6b",49013:"6d2149b8",49109:"746d3fef",49112:"157f5ea7",49171:"8ac91157",49226:"15a3d3f7",49289:"8c2c7ea8",49305:"74943ae0",49308:"a5dcba6e",49350:"6d83b26d",49388:"d111eae5",49461:"ecdbfd79",49521:"7d4d828f",49579:"6f86456a",49583:"6338f450",49587:"2ebb3b74",49602:"1f0b9670",49655:"18924d47",49676:"1257be60",49693:"a64194d0",49709:"c0a5ad42",49768:"caa6374a",49783:"28f34e65",49786:"b5dc74bb",49941:"3be8d9c7",50012:"046421a9",50095:"bdc29021",50176:"5466516c",50178:"590baa54",50208:"6b02e277",50261:"4fa93c39",50293:"0c2230d7",50306:"70dcbdfe",50414:"95280263",50424:"9ac27fd4",50428:"0ffbd688",50446:"e524ac90",50472:"af650792",50507:"be5cd362",50570:"3357d5e2",50584:"c81b2685",50585:"8c6a9960",50642:"16372d9d",50664:"1b9f4c2b",50700:"228ae4e3",50703:"165693b1",50747:"7e5883c7",50800:"526981a4",50819:"c91daf82",50839:"f5f7ae32",50934:"920d5acf",50981:"8ff8f39a",51009:"377d8def",51047:"dcf69ab5",51059:"69094ebf",51102:"174129d6",51108:"cae2b24d",51116:"0a494911",51237:"416f1727",51378:"5281e06b",51412:"e9bb5008",51420:"6dd60b5e",51435:"d3b86647",51438:"9981eee3",51465:"d9889a9a",51547:"0150fbdb",51548:"a3d0a881",51578:"0e0bf034",51589:"7a33b1a6",51636:"24736e53",51649:"69be6285",51665:"f4ae75ca",51689:"ce7715a2",51711:"33cb0181",51763:"0b4c2285",51828:"c33a949a",51837:"5e4214b4",51878:"65301262",51890:"bd33c6c5",51937:"3d118eb5",51944:"750f9e7a",51961:"f572c73c",51962:"2dce9d3b",52036:"de6dbc15",52042:"f5eb946d",52050:"026c4896",52093:"56f98aab",52102:"b2d23bf5",52132:"766bd661",52135:"2ac8977b",52176:"fef7b7cd",52181:"08e1ba8b",52235:"0826b26d",52250:"8e2ae830",52261:"bceebdef",52266:"671aefb4",52276:"4d33fe9e",52282:"7cbb7598",52286:"e738feae",52342:"0189be92",52408:"569b732e",52424:"5e4c26c1",52450:"9081138a",52466:"5b145139",52477:"f0f7e205",52478:"2893ee91",52488:"00d3e540",52569:"e101fd6f",52572:"bf602782",52605:"cb863eb8",52612:"344cbf36",52634:"6509cbba",52711:"07c974a8",52731:"f7479380",52770:"b38fcad8",52826:"7b528936",52840:"ce7ecaea",52895:"bab31b10",53074:"d0e8bcbf",53118:"bf8f5dfa",53132:"f6956cd1",53178:"adb92c49",53201:"439d929c",53237:"6f6a2fd3",53238:"462287a8",53256:"340f9342",53266:"918ed0aa",53288:"4e88f11e",53314:"f3b2d4a1",53370:"230d73fa",53449:"3ba03479",53458:"bd8d870e",53488:"3abf8211",53501:"96794c38",53540:"117dac6f",53559:"8c6d63d1",53619:"5e7aa94a",53646:"6557930c",53670:"5aa4ab02",53742:"6ef9f091",53771:"1c5a85a6",53786:"5846b816",53832:"0de1e065",53861:"58c5c841",53871:"b51a7127",53881:"325b985f",53901:"dbc52107",53925:"e40c4bea",53952:"56f01164",53982:"36f3b191",54106:"d4f8a48b",54113:"f052a5f3",54144:"441c2adf",54168:"396eb8ac",54200:"8fc3b28b",54240:"03e49bd3",54246:"d97ae29d",54270:"4aacb2a3",54272:"7de26262",54277:"9778d85d",54310:"3e768c3c",54313:"fec778fe",54349:"0ee28c36",54399:"ca04ebb7",54415:"1d5e55f2",54439:"9392c360",54500:"39031b8b",54540:"e9519004",54568:"b318eae1",54749:"80bc2dcd",54759:"95b92ec3",54879:"85008fb9",54881:"62cf0af0",54950:"662eaa7c",54951:"cf766ccd",54992:"57209ece",55004:"025e6b9b",55100:"8ee90ba0",55144:"763b3563",55167:"3d08c140",55206:"778115b9",55223:"55235c25",55245:"427a39fa",55276:"3709bc67",55302:"b035e473",55329:"1c7b8795",55351:"049e007e",55395:"70e7d2b3",55401:"7e220ca3",55413:"82feccc8",55478:"0f30f68c",55483:"45118c64",55534:"4ab016de",55559:"a129ea9a",55566:"2785f3ee",55579:"628a2f1e",55616:"477b7ac5",55645:"2d3c6613",55664:"ac288aaf",55675:"fbb8efca",55836:"bdc2d756",55929:"35861c11",55955:"8f338282",56028:"46d4e9f6",56037:"653b5ced",56062:"5011e556",56068:"b56c7a15",56097:"233a26e7",56122:"85e6c365",56123:"1afda515",56145:"9b2ba0e1",56216:"11de5d71",56297:"fdd24d1c",56408:"795f2f11",56463:"225a01a6",56470:"a46b10ed",56486:"c1778f30",56493:"2e8bc87c",56510:"4783ad22",56560:"690d67be",56607:"09a70a05",56723:"39a237c3",56779:"07e09783",56819:"5e9867d7",56826:"9aacb50a",56916:"f82db3b1",56948:"4600ee5b",56974:"1aec2ebf",57013:"d5a9348f",57119:"2fc3b17e",57125:"960c94a4",57139:"85325d43",57141:"4f472482",57155:"2dbc3311",57159:"969bf570",57165:"da08695a",57251:"62db6714",57326:"696e684f",57352:"6d85694b",57361:"83139dce",57364:"1240e55a",57430:"4c34a1e5",57529:"afe1189b",57547:"56fae0bd",57586:"3c4116f5",57614:"4cd60d60",57647:"2ae7a41f",57730:"3657d642",57749:"abfa81c3",57760:"7a8e101a",57800:"e0d71596",57845:"3c44eeec",57912:"ccfa0087",57994:"84f487ff",57996:"df153f9e",57999:"cb8dcfed",58e3:"7ba38a51",58002:"69538a92",58079:"a239a6ea",58093:"d909e1ac",58144:"9d61ee3c",58230:"e61b5289",58255:"5c394c90",58259:"5d041702",58301:"d5e3cdd6",58359:"092b9bf8",58428:"86afd423",58454:"c7879255",58479:"07f1ba9d",58484:"aba453f7",58581:"bce23def",58582:"dca6957c",58594:"c2394840",58632:"70a5f5db",58667:"6c4023d2",58704:"7d19bc10",58707:"b507199c",58780:"7831a3f5",58913:"e13e4900",58990:"d5d8b5be",59005:"1f42a347",59020:"b9add5a0",59053:"a81199e9",59070:"3e041de2",59114:"01c0b799",59123:"79486d59",59143:"98d2b2b3",59182:"15f5ff3a",59214:"a1e99fc7",59246:"ee9eede8",59262:"7139e0ce",59349:"2fc97b7b",59437:"dce084a7",59493:"4e8c876f",59521:"8c44d2ea",59548:"a0bd2141",59627:"7acd50cd",59645:"ddebd33b",59680:"baf36847",59702:"9f36d91d",59727:"596c5e31",59732:"4398bfeb",59740:"8bd9c911",59866:"8fdbf72c",59874:"0eb6da9e",59923:"bdc97ea1",59940:"e60ccce5",59981:"68449ac5",59994:"dc316918",60020:"145ce4c2",60073:"ae723dc2",60101:"f0bf6250",60167:"e4f5672c",60183:"85cb1a6c",60185:"aa76bb19",60189:"40775e12",60193:"36ff29ce",60198:"3df5e584",60203:"e3443d86",60257:"2b2c3f67",60294:"aa9b85d9",60315:"37555b2f",60394:"8d09f1f9",60445:"abd3cc82",60501:"f77f816e",60510:"c1c788bf",60559:"a3a760b5",60565:"99b419ed",60613:"ac90088d",60615:"2a1a9c0f",60676:"1a896bb0",60696:"a6f21047",60737:"8df80716",60762:"3285e3c0",60776:"d964ca9a",60819:"29b8c7ba",60832:"2d15bb16",60861:"a6bddae6",60884:"670180c2",60901:"b975e70b",61006:"250c7a76",61096:"26e0588d",61114:"2c16e51f",61124:"3ef44a12",61235:"b3fca070",61261:"81e1102b",61265:"7b6cb988",61300:"e0b660c5",61334:"b6c6d670",61368:"cc53d2cd",61416:"83c82fcd",61461:"7a1f9c63",61481:"2d5a70f5",61559:"7bb64022",61584:"4238fee6",61702:"bdfaafe1",61706:"67fd0254",61729:"167d397d",61740:"103b1525",61786:"9e8bca4f",61807:"500d4862",61816:"c1261894",61886:"fff864d1",61942:"04e151da",61950:"88c61ded",61959:"33c92f4e",61991:"b0873a0c",61993:"103cfef9",62015:"e9a32e84",62050:"a3eb4823",62061:"49f56b7d",62111:"13d25625",62138:"567ed5e1",62147:"ada23d01",62162:"d81a96c7",62182:"faa03f42",62188:"ec5f7363",62213:"b87f7368",62254:"1f6dfcd1",62263:"15130536",62264:"05976ada",62469:"27df942f",62549:"3bc574d1",62639:"4bc05ceb",62641:"13102e35",62664:"24161dcd",62672:"6c78e9b2",62691:"16bb2bed",62703:"4844f3fc",62712:"319a1074",62713:"cffabb45",62827:"865451b7",62838:"3ea26e0d",62845:"b95c618b",62867:"22228f77",62927:"ae818ae2",62934:"755cedb6",62936:"63a90335",62957:"08c35719",62975:"07e7171d",63002:"f6c7a028",63005:"37f5fea2",63014:"0e74ff1f",63016:"bf80e6f1",63048:"422b70b5",63075:"f2eaa0d1",63115:"ca15a13f",63124:"797a3817",63156:"7ab0149c",63228:"eecad3d2",63291:"8537d1cc",63292:"84630e0c",63298:"922ffdf4",63330:"c4a3502a",63332:"ef0d6f7a",63342:"ea0532f5",63367:"2354aa87",63382:"b3b81be1",63387:"22a4ea17",63430:"a084fcda",63445:"73f6c41b",63455:"dad34c3c",63515:"bbdf5b40",63521:"eeb1b226",63553:"42a11d6e",63627:"5ec5269c",63646:"e4a9afde",63700:"409b6cda",63750:"3e35da15",63760:"d6e4a1fe",63779:"80f07e5e",63795:"b965ae26",63836:"582a841a",63951:"60b4d24b",63966:"92a1c99d",64045:"5cea5892",64091:"f943b433",64154:"2b3871fd",64184:"f242437a",64209:"6ebe12b3",64351:"fe7a888b",64442:"1794db98",64447:"f0cf3fe6",64465:"fea7ccfb",64502:"3de04243",64527:"35a09887",64535:"04f0d7a2",64577:"a25e57f4",64597:"532992cd",64623:"13c72624",64659:"c3ca1d48",64737:"c578c0a0",64763:"d5f0bbed",64838:"19b15b05",64848:"e9da1eb3",64859:"06168846",64865:"b4b14272",64888:"f24a455a",64899:"b3120ec2",65017:"c8dff3a3",65025:"9f12d973",65042:"1bbaf7e5",65091:"bd48af7a",65133:"dbf0514c",65193:"33d8350c",65221:"cc41a07b",65223:"44b11941",65233:"d26dc2d8",65246:"c4b5eca4",65276:"c06e23ac",65359:"57f34875",65466:"9cf157f9",65497:"033c06a7",65625:"78f63651",65647:"09afc3d9",65658:"80dfe2fe",65745:"441f4cf7",65835:"d4dd74bd",65864:"14f1041f",65897:"66c07b1c",65918:"cfe95400",65926:"83742953",65957:"7866712c",66061:"45757a8b",66085:"cacd78f1",66135:"e326cc6a",66140:"89edab6b",66162:"ad2285af",66169:"28516745",66210:"3080a41e",66237:"e66f96a7",66327:"9d990d8e",66338:"50cadc50",66351:"65d36cc1",66415:"cb2e1664",66461:"ef8eeed3",66499:"e885c006",66504:"fb6b6ba8",66518:"3f60affa",66519:"9cb17f6d",66524:"05f3f677",66528:"25dafd0a",66559:"c4f15b77",66575:"c347fb13",66602:"6507efc2",66615:"b537b6ef",66715:"b44af68e",66759:"b3a36b8f",66774:"680513b0",66791:"bc650588",66819:"7dc5e02a",66822:"c9c50b37",66832:"86f893ab",66867:"5ea30b5a",66912:"a6826a37",66943:"2d0602a6",67004:"40dc15b8",67044:"55f32fa5",67061:"9594aedf",67098:"75ab85df",67100:"9a493c1b",67104:"5cbe8264",67114:"c274ed37",67252:"cbf5e476",67376:"74c2facd",67438:"e8b780ad",67472:"522d8645",67507:"e5f01f65",67520:"cb8621f4",67545:"479e6171",67581:"b7157a45",67587:"97446eaa",67668:"46ed5a1f",67683:"29e3acef",67704:"b4ab3c38",67729:"d3ba3f88",67752:"02218f92",67755:"0e8f8b14",67775:"54dac4a0",67914:"32efd67e",67989:"f1813a8e",68043:"07304768",68094:"c3ff00d7",68181:"dea0e7c5",68210:"fbf9dc31",68215:"f5610e77",68253:"e6a1722b",68315:"d822c661",68334:"e92472f4",68377:"722db604",68434:"9e9b7960",68470:"48f5ab23",68535:"68f5aacd",68569:"a25b4460",68685:"7bd3f18d",68710:"0c8ac1af",68721:"2ecf2a49",68765:"fd8049cb",68770:"83fcf2d8",68834:"31088ee7",68839:"71fdc7fc",68910:"319b9215",68930:"6a2be620",68946:"d7e4ee2c",68989:"4bdc09da",69017:"8e8ddb8b",69038:"e3be4832",69129:"c539fcb9",69136:"92c5bdf5",69169:"51b689ad",69180:"ab2d14c1",69199:"87908dd8",69213:"e8a97edd",69226:"152ff85f",69384:"c83c369b",69451:"7298a8e6",69457:"ac002c53",69480:"0dc7e906",69489:"5e2dfe1d",69501:"0dabf004",69503:"b5b03bf4",69505:"dd5b0437",69517:"f3735c68",69570:"7806e7e5",69638:"18216d7f",69651:"8e522a4d",69692:"6d58596c",69737:"d40f9c5b",69770:"353c2a33",69773:"41ee530b",69844:"d18cbc3b",69864:"ecba478e",69875:"d48fbd76",69908:"782b3044",69982:"1ec8a0f6",70008:"cce27e13",70022:"5081b66c",70058:"805f0292",70106:"51aac657",70117:"f74b5bfd",70126:"5f0248e1",70174:"90b8e6c1",70179:"3320098d",70184:"aa7ade37",70198:"4ad6092e",70210:"46e86f66",70234:"f21f13d5",70253:"e764ea7f",70267:"59055e30",70399:"2e9c4087",70418:"1b674661",70438:"f5d18728",70502:"e1b56d6f",70560:"bc6dc926",70606:"3b651c50",70645:"1183c950",70687:"1291047b",70696:"ffbd5bfe",70712:"f6abbefc",70749:"f4b70d78",70755:"0f6fa463",70776:"f9b40f98",70784:"0338a6c3",70788:"c92b4086",70791:"14c73042",70794:"2e0d622f",70814:"e6c563d5",70828:"9bfbe30a",70858:"249f7ba5",70870:"23b14d1a",70947:"f3628aa3",70949:"86806744",70953:"3804bb33",70963:"3a81c996",71021:"04025985",71026:"e9d19f05",71051:"2b9b1926",71075:"f0900633",71079:"9f6d7d5a",71117:"a7884200",71162:"3809ce30",71169:"e76da8b7",71227:"dcab573e",71235:"2d846c4c",71374:"de58f0cf",71407:"7e34f0a7",71413:"41b66ba7",71454:"4e24541c",71473:"8e987be6",71501:"fc9a73c4",71545:"40802b98",71548:"e4bb0f05",71585:"50cb8f8b",71612:"1c93061d",71651:"e5599a23",71656:"b4d44856",71715:"29fd0686",71795:"ce579d1d",71852:"2e6b70a0",71857:"b6e39072",71910:"5933a309",71964:"6ead8940",72043:"55a4c57e",72053:"8585e9a3",72143:"6b90401a",72322:"f21fa8a3",72353:"023cd3ce",72358:"7cdaa62a",72446:"ce58b74d",72485:"d4eed01e",72508:"1a5ee8b8",72527:"25370726",72536:"78667438",72599:"f3d4ce0f",72618:"d1a76d70",72656:"f5657ba2",72662:"8c571d16",72668:"3ca7cc68",72675:"5094cb71",72707:"afafc041",72907:"0fac960c",72914:"fdfeb2a3",72925:"4ddb3b0f",73055:"be2a387c",73084:"ff30a583",73121:"239c6ae9",73147:"3cbab8b2",73163:"a7161cda",73193:"87a98b7b",73264:"a44c8bca",73276:"23f7c7bb",73286:"d401d161",73290:"066237df",73316:"3fa0430f",73331:"a7d79792",73376:"3451e76e",73397:"c326c542",73428:"09159663",73471:"21824cd1",73473:"7dd1d023",73539:"7b86cbf7",73569:"016a2098",73607:"540a839b",73693:"e679ec54",73756:"4d0d26ec",73779:"38c368e7",73800:"5f63f724",73864:"928fa9c2",73888:"22e79b47",73891:"d6a78f97",73905:"2455dc8a",73906:"891edd66",73922:"295f64b8",73940:"e15d0de1",74019:"2969e5ee",74031:"3ed60645",74039:"7119351c",74046:"a5d4d136",74069:"f5dc9301",74076:"d773372f",74134:"70fc045a",74282:"1d2c4307",74312:"7d8ab2b3",74401:"fe4450ac",74418:"b36eec55",74524:"346c1640",74588:"7172fa20",74657:"bc695932",74684:"b1b3627c",74768:"f1208fa7",74792:"605d6795",74880:"00e3a7d6",74895:"49f7f8e8",74902:"40221f02",74945:"3714ff8a",74950:"a8f2506e",74961:"4336437c",75043:"0fa61777",75062:"d0429d71",75078:"a4474ed0",75106:"5c1d8826",75121:"9274a316",75173:"7a2d306e",75190:"98dcb270",75267:"ef73f4dd",75298:"3419323c",75317:"2425adb8",75359:"4a6d69b3",75378:"a61cb314",75396:"0320340d",75405:"be6907c6",75442:"2cdedeae",75454:"c5fed06b",75459:"216410ca",75461:"1300f9bf",75484:"368b265b",75637:"feb977ac",75666:"82bbfe59",75696:"c701f641",75718:"8c13e1ab",75723:"77707dee",75775:"5c22d8f8",75805:"1df8329b",75894:"7593ad7c",75911:"23bf6615",75919:"7eb9f722",76023:"8d86c672",76041:"639de3c7",76123:"6395a6d8",76129:"3a64c93c",76166:"6cca7338",76172:"b14349c1",76215:"c544dc2d",76235:"8cfcc50d",76262:"487bae10",76264:"01bf28e5",76289:"8da89847",76293:"25df4b35",76299:"5808ec0b",76368:"fe89cda6",76517:"ea36b810",76530:"96a9a724",76589:"1b539a7a",76683:"39dadb92",76719:"1eb4134f",76748:"5c0896d3",76788:"df87c765",76854:"17aef79f",76871:"84440dfb",77077:"d494ab26",77088:"62f0336d",77123:"acd89b11",77174:"b653e6e8",77222:"8e335c04",77223:"41edcb3d",77240:"11029c86",77261:"223c7732",77298:"1defa96c",77369:"bb649c96",77373:"761a5dee",77391:"40fd8149",77659:"86eed6d0",77698:"07bf926d",77749:"ed67871f",77787:"5ea8e20d",77901:"1607e19b",78001:"9ca26614",78037:"07ce1543",78069:"f778de7c",78087:"51316700",78127:"2815f063",78159:"76faa309",78199:"f8f1c0f6",78217:"8af87bbe",78220:"bdbab6b1",78283:"cb3f4213",78312:"5e1e4e98",78354:"fe19cb88",78421:"4603fabc",78497:"2472bcd1",78512:"c92a3f45",78522:"e227b23a",78544:"b4a4e0cf",78583:"f491fac8",78595:"ece1a8c5",78608:"527091bc",78632:"972ebb2c",78704:"0007f4cd",78717:"bf538a7a",78764:"e6bc27a4",78820:"818e5ba8",78858:"25790093",78872:"46ffcf5c",78912:"a70d6c13",78985:"0fda70f5",78988:"d3b97091",79039:"194eb361",79048:"a78c49a8",79138:"6cb5e67d",79150:"597e2a72",79157:"436d8a84",79180:"4b81eae7",79302:"27194ac4",79416:"273ba3fd",79481:"e1ab1326",79485:"1b6c575a",79487:"87a9eb1f",79506:"d5dabd2e",79520:"2e07b453",79521:"55617a85",79524:"74a882d9",79534:"5eec8d0d",79635:"9a03d71b",79656:"403a2f7c",79739:"370af888",79776:"af8f1b99",79841:"4e87f9c8",79866:"d63409c8",79992:"a8729519",80018:"ff79bd92",80022:"191efeb1",80046:"af7d2dd3",80091:"b37d99f3",80100:"d7596ad0",80102:"88fa27df",80159:"e5874eb1",80198:"946a1c40",80201:"8d21b6c6",80260:"50c19885",80310:"7e3078e7",80315:"7da7fce5",80342:"eb1df1cf",80362:"66acb718",80408:"402da38d",80424:"ba6a3304",80442:"a3635951",80457:"420460e3",80458:"62bd7f55",80491:"8a4b09da",80524:"78b4ca8a",80525:"8a0f706b",80531:"d9e62ade",80557:"1bd82d84",80579:"8f12fb48",80649:"89d68cd9",80677:"3ad187fc",80750:"4a06db24",80772:"baba95b2",80794:"5384ccbd",80810:"b2d246f0",80841:"2b125765",80863:"abe83df7",80957:"e386cbd5",80998:"23948ae9",81012:"08b30566",81019:"cca732d0",81050:"171949da",81175:"5a7758b6",81188:"46e48486",81212:"92160316",81265:"af9ff03d",81319:"ad93ea68",81410:"c4689942",81435:"d1b60b7c",81438:"4951e135",81497:"709a8ef8",81544:"ca61aba6",81585:"5ff1fa55",81643:"44b2fa1f",81666:"f4b799c8",81691:"4533ae68",81692:"efd074f6",81728:"90256490",81737:"27108f23",81770:"5f118bff",81791:"a2002919",81846:"181c0e53",81902:"70dd6046",81903:"40bcebb6",81982:"28b5173d",81996:"9083d6b9",82019:"3dcb9f49",82096:"c0f71fc1",82221:"1ea8849c",82237:"96c3210a",82261:"496feebf",82297:"dd49ce28",82354:"09fdb790",82362:"fff9c5ed",82553:"e65ad139",82754:"ba8b40e1",82774:"1ce93819",82776:"26f73b62",82847:"c8029013",82905:"5e407694",82932:"78ed3f4c",82946:"88b23bbe",82953:"2ecea393",82987:"1a6fd885",83e3:"f83cd01b",83027:"3e1cb827",83044:"460114ac",83078:"7d656c5e",83089:"fccee565",83103:"340f8791",83111:"68fc9f70",83127:"43dc426e",83182:"63791073",83203:"0d5e8a7e",83249:"32d3403c",83260:"cd47087b",83273:"b1ae16e0",83316:"63598122",83378:"f0201481",83379:"71700439",83431:"3ead0637",83439:"8e150729",83509:"d63516dc",83523:"607275c0",83534:"360cf729",83561:"4f2ccae5",83566:"c4b25550",83574:"67a5a9e0",83608:"e5960de8",83612:"92a43f9c",83670:"199903ad",83700:"cb7c3f47",83779:"c7d005f8",83814:"57cf2ba9",83841:"e27808f3",83849:"edaac23f",83870:"bd1db92f",83901:"bc354609",83923:"dc27ffc2",83928:"8a81282a",83932:"4e9403e3",83954:"4e747003",83970:"37ea33f4",83976:"c535ab42",84013:"4a6be46f",84070:"3a3af260",84107:"72bc42e3",84112:"df8cd6ee",84152:"992db215",84227:"78658f29",84255:"38b0c07e",84256:"8ce8e14d",84259:"1bf0163e",84319:"cfc5f04e",84324:"f541d309",84332:"56e42b84",84467:"d83c05db",84527:"ca4c7ec0",84530:"459b0ff5",84563:"41adf4ec",84572:"118f765f",84711:"869bc9bd",84754:"144f5327",84755:"81a9eb74",84773:"15e3ad54",84813:"39aa10b6",84822:"b62749f9",84869:"86c2b873",84878:"e7a5ce68",84963:"a27e11aa",85008:"27b2e784",85073:"6e2be049",85086:"5588dd42",85095:"aa0643d2",85105:"36a988af",85205:"a6776889",85209:"e6e74bb3",85228:"06f36fb6",85243:"07282c9f",85257:"9a925270",85279:"75d5c35f",85322:"93eb7d1f",85353:"770dc4f3",85442:"c288cc96",85453:"b326c2e8",85478:"61613af8",85529:"e1347ab2",85537:"d721079c",85558:"88de2a67",85581:"dab11b6f",85588:"d037eb12",85736:"b060f6a2",85867:"c8f0ee34",85896:"1eaa238a",85899:"851136aa",85905:"e97b95fa",85917:"81da1a96",85960:"a4a7b97c",85967:"d5da1a94",85973:"664154f3",86063:"ec205912",86121:"b15808cb",86167:"48279056",86215:"ede82e93",86216:"10a83256",86246:"c805ffc0",86354:"7b45ad63",86417:"58231ce0",86424:"79e0c07f",86478:"e265b1bf",86480:"902a4f66",86501:"bde9b789",86596:"c0cee3e8",86597:"433707a1",86616:"7d1a003d",86659:"eebfe56b",86669:"ba9bd58b",86685:"46fbfce9",86807:"90e0e4b7",86846:"0de86eef",86856:"a3c47e05",86888:"40e352e5",86890:"1787e57c",86914:"3316c552",86939:"9d5ed5b3",86955:"2fc6977c",86978:"0cd74852",86992:"b911e3ee",87004:"752cebb1",87145:"85d7319d",87178:"acf7db74",87184:"290e6444",87186:"144ecf28",87205:"d7c0c2d9",87217:"6995ae77",87269:"1ebedc00",87282:"859aa240",87309:"d4cacd6d",87334:"24215293",87377:"86161ea2",87389:"cd1402d0",87420:"ed05a9dc",87423:"c20a690b",87459:"499c9384",87473:"90f8ac60",87483:"bfad7aa0",87485:"3c84d8c6",87495:"c6ca0dbf",87514:"ace06c24",87598:"d92bafe8",87614:"03a16b2e",87669:"30ffefde",87688:"9721abb7",87747:"4c518d28",87779:"7665a065",87781:"5780fa93",87863:"e411c34a",87875:"0fb6701c",87880:"e6462630",87892:"6a2443af",87905:"c2ef55c6",87922:"2468dfd7",87945:"3d37096a",87971:"c139d0ac",87995:"ff031324",88044:"6f6602c5",88111:"3b471ef0",88163:"adb2e2d4",88226:"48ff391f",88248:"331576af",88298:"d37f55fd",88310:"9cc0ac71",88394:"eae641fa",88436:"d8c7c974",88468:"5d2e58d0",88478:"aa89d658",88547:"d95bf79d",88591:"463e47bc",88622:"6595e4d2",88626:"b7aae424",88696:"0bd519c4",88775:"14023076",88815:"afb9d4f1",88821:"5866c747",88847:"28717646",88852:"ad6f5737",88855:"a7dfd1e0",88930:"c70f1a8a",88962:"97fdf029",88986:"36e0affa",89018:"35ed7d32",89058:"b9fbe7b5",89082:"6129a536",89083:"07e75e07",89093:"e6e88df7",89154:"01ed0bfc",89172:"cf7f9616",89202:"69aa57bd",89210:"6f8e7d24",89243:"127dad60",89289:"8c1b5924",89338:"87c9007e",89353:"506a7ddc",89362:"6ba94fcd",89367:"089fdacc",89387:"635c6a75",89402:"147d9206",89415:"168dcfd0",89437:"b476afaa",89455:"8a638878",89541:"fd189260",89554:"202a135e",89610:"734aa5c5",89641:"ccb49000",89650:"5002e60d",89696:"71b4f147",89801:"892d8b74",89810:"c68adb99",89858:"8b837402",89873:"3dd198ca",89986:"bb978035",90066:"08ff0810",90092:"a6532af0",90135:"076c04b8",90214:"ecdd0bdb",90257:"4c4f2f2b",90323:"3bc52293",90414:"75aa9c37",90438:"3fb2cc5f",90497:"9aec511a",90502:"ce6211c7",90513:"e9890428",90562:"0eb6bd7d",90610:"4c944bc2",90656:"b8f9c9c4",90717:"d319ead4",90727:"a891ae85",90749:"04e2cd2c",90818:"27ccb021",90831:"aa0b45c4",90842:"90dda81f",90910:"9a554039",90960:"5df3c6f9",90968:"804745cf",90972:"d0e3ddef",91016:"e6a01d8d",91017:"094e0f6e",91025:"7d680bf4",91046:"7617106a",91109:"68006d7b",91187:"b9b1c092",91319:"aa39086a",91333:"8793c8f7",91359:"75a52778",91396:"66d3d704",91428:"46325c8e",91517:"02cdf15a",91530:"33496428",91540:"0298fcc3",91568:"e3d8db5b",91581:"33c3db15",91587:"23116cc0",91612:"0f153207",91695:"8e5d687a",91715:"d6ca91e8",91724:"6b860438",91765:"14790174",91768:"efefb15f",91787:"2eebf78e",91837:"25dd4793",91844:"b7ee9a3f",91881:"3db19327",91895:"4e10f0a7",91916:"7c8fa153",91993:"f878d8ef",92018:"0da1989a",92031:"33f3d062",92125:"ad4479b3",92142:"31ed92b0",92175:"f3b6a356",92196:"73f757ec",92273:"5b4c97fa",92329:"efe13982",92410:"b8ef1fbc",92412:"4bb3bf1e",92475:"f5ce8c1e",92535:"c906390f",92544:"ec31faf3",92570:"3443aea6",92577:"7fe00ec7",92653:"92601920",92664:"9857298d",92673:"bcf72ddc",92942:"513a2128",92955:"99c8a760",93057:"a360a0b6",93166:"c81fd4ab",93210:"a5853a6f",93241:"7680849e",93269:"f8444683",93273:"73b7ca0a",93281:"6ae44b64",93310:"73369887",93352:"a41e101c",93362:"1f427018",93427:"5736d59a",93636:"0733d31c",93781:"7a5986b2",93849:"21ba1104",93854:"886ec2a3",93884:"e449c4a3",94065:"d0b76e1e",94077:"b9a34ce4",94091:"f2456708",94106:"35a4b178",94155:"0a24c1e1",94188:"985976da",94215:"1e40249a",94227:"2f3e8f89",94251:"99c27483",94314:"7e2f8a3a",94417:"e155ff4c",94429:"875ef73a",94445:"9e780585",94475:"7313a7cc",94538:"3c3f989a",94555:"9703e7d2",94561:"c4c9257c",94568:"b08b9e52",94592:"5a922718",94625:"6023ef67",94631:"a16a6e04",94648:"6c68a60a",94711:"2a8c00a0",94750:"7f7422ce",94776:"455c9060",94788:"0571077b",94796:"776cc313",94841:"7241d406",94843:"8a1645e9",94863:"1d8b58f8",94864:"7a64a937",94910:"5f87e0c6",94921:"557d97fc",94925:"d3076124",94980:"48967d46",95020:"9ed591c0",95058:"c5944ecc",95093:"38840c61",95108:"3d30b3ae",95136:"b192ff7b",95159:"7f2b787c",95187:"75489218",95231:"4f693b90",95240:"a83d0989",95245:"6d74ba52",95407:"8d24aec2",95427:"b603ea76",95470:"22bae925",95505:"15b5b80c",95528:"1fa3a723",95542:"5a5dc81e",95613:"94d2b7c5",95641:"dac359cc",95649:"113f30a2",95717:"7c63c893",95768:"bb8152e5",95785:"e6bdc1df",95818:"47a4a9dd",95832:"30248407",95900:"a9fa5f68",95909:"5f31a15a",95980:"05bea232",96086:"fa43c59b",96239:"160c24f5",96268:"af08f7f2",96276:"ba2f630a",96325:"115b6b82",96355:"6065af81",96425:"769273ca",96463:"0cb6beb6",96470:"819155f5",96533:"829ae8ca",96555:"b23927ac",96609:"5944975c",96646:"d26a1ccd",96771:"96893b14",96846:"7ff32887",96863:"6b53abce",96881:"d798de2a",96939:"ca953d7c",96963:"66495bb5",97006:"70950e02",97033:"c2d41827",97038:"5b240f26",97107:"8c1d4cc0",97114:"7e8541ae",97123:"9fbb5dee",97167:"6f05f1b4",97223:"2feaf89a",97246:"2a0a597c",97251:"a2fab308",97253:"40cb07ab",97286:"3da76a0a",97296:"5e101b5d",97316:"68f97573",97342:"123cda2a",97352:"85ba7856",97379:"5608b96a",97420:"4443a52b",97424:"861eff42",97476:"465a8fc6",97536:"e4e7238e",97562:"9f1e5008",97585:"e2996fed",97618:"a2d622f6",97670:"31eb362a",97710:"fcd0a82b",97732:"c68c05ab",97737:"a3dccd02",97763:"4e1ed5b0",97768:"0b40be3b",97821:"a0ef1d84",97829:"fe68bd25",97863:"6d4a842e",97887:"9d68541c",97895:"66ec7d53",97913:"4872bf57",97944:"9c4288ea",98020:"61d858f5",98021:"ea23b20c",98070:"6a5732c6",98087:"3278bdb7",98094:"28a39ffe",98127:"c7a4ca94",98154:"b33001bb",98178:"f47a9bff",98237:"ae4b633c",98271:"0371efe7",98311:"f9424f75",98392:"ab78dade",98425:"9b51aa56",98473:"facc58b4",98477:"047de3f6",98534:"2178e04e",98660:"1f2c9482",98700:"0296a2ad",98758:"f2e9a2ed",98761:"4501e889",98779:"502d6d28",98804:"50d9586f",98908:"4d031f91",98925:"c1774d66",98941:"04475847",98947:"596c6a8e",99077:"bfa22d9c",99095:"f65d182f",99105:"baf9cb2c",99151:"395ca1ed",99236:"d7f17e4c",99252:"7ad0ea7b",99280:"0d69f916",99306:"9e6ac719",99330:"d53a3e2b",99335:"1209af34",99389:"41b790e6",99437:"a2e4c602",99451:"3e589645",99502:"8d8f2ab4",99504:"b03bb1f6",99528:"67cfac70",99531:"79cec2c9",99534:"1e6e734c",99543:"6bc51170",99611:"217f06d9",99678:"8d3f3ff5",99701:"f574c3b6",99705:"de2fd36c",99709:"f5fdb057",99710:"f97dcdcb",99746:"643a8fd6",99747:"be57fd41",99764:"df4999bc",99839:"75df4091",99855:"87b87d20",99905:"b5e81d35",99970:"bcf433f5",99987:"1dca585b"}[a]+".js",r.miniCssF=a=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(a){if("object"==typeof window)return window}}(),r.o=(a,e)=>Object.prototype.hasOwnProperty.call(a,e),d={},f="hudi:",r.l=(a,e,c,b)=>{if(d[a])d[a].push(e);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var f=d[a];if(delete d[a],t.parentNode&&t.parentNode.removeChild(t),f&&f.forEach((a=>a(c))),e)return e(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=a=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(a,"__esModule",{value:!0})},r.p="/cn/",r.gca=function(a){return a={12164231:"43113",12935692:"36790",13171783:"29452",14828316:"41944",16243474:"98020",16640689:"53619",17628665:"36682",17896441:"18401",18891827:"71235",21719437:"65957",22559948:"99855",23165909:"53488",23348138:"57155",27211971:"57547",30769210:"44891",31863783:"2256",33241236:"33621",33732613:"14363",34689118:"51937",34900881:"79520",35313843:"23641",37844666:"63075",39583919:"70606",39734463:"67004",41280170:"63048",42545929:"37827",43764587:"32949",47074836:"39260",48455675:"66715",50536743:"43078",50737734:"21373",52166518:"76123",53317765:"39058",53798754:"21191",54111683:"76172",54482276:"24143",55840584:"192",55946737:"45113",58408940:"43913",59171146:"67989",59700627:"95187",60165173:"67100",60753781:"68470",61417793:"27367",61773850:"22504",65511420:"32875",67474760:"63332",67687911:"45746",67922501:"65221",70570476:"12513",70633739:"49709",74555694:"79302",75914136:"65091",77787075:"36689",89514438:"17709",92328698:"20924",93340492:"41159",95139762:"76129",95789563:"59923",97806055:"29851",98749210:"96963",98826249:"68315","0583dad8":"16",a33c645e:"25","0da1f28a":"28",a674d2f7:"48","56169fa6":"67","275b5c51":"129","9c707294":"142",af8190e8:"159",b1f77b90:"217","991760df":"273",fcc9c1b0:"292",be9655ff:"323","1f92d8dd":"339","0b4da2f0":"354","19ac452e":"387",a168e2e0:"437",b4a99b76:"569","0a87a91b":"614",e9038c17:"878","71c6c219":"917","9699c87d":"924","0c459987":"940","5a8ef24f":"982","2ade4e52":"1017","060b2af9":"1107",e3b4090c:"1119","83de9812":"1151",b0127f30:"1190","74fc40e3":"1211","515c7131":"1397","562c897e":"1422",d77e6b8f:"1458",a1c7d286:"1459",da868c82:"1517","8425e24c":"1550","0ae1dc96":"1622","73c8d421":"1635",eaa4e767:"1707","2f671d1e":"1715","89ad6a53":"1717","90afd727":"1763","89dd9b54":"1784","92bb01f4":"1841","9f349e0c":"1846",d032d8fc:"1857",c28fec2b:"1882","6e47a3c2":"1928","051e9a76":"1949","7fbadf7c":"1955",c12d6ad3:"1957",b93dc3c9:"1983","3c15683d":"2016","7a3be72c":"2053","7bec99d6":"2072","1e050fc5":"2106",fdb4abad:"2121","92b5ed46":"2200","32aa7863":"2214","9781112c":"2225",d2a01f74:"2298","717625a8":"2368",fb4f9065:"2385","3b3f1ad3":"2450","1b7e3feb":"2472",e8b490f7:"2540",b9e56da2:"2577",dba6e014:"2640","9ed88412":"2652","9d0312da":"2663","7e9327af":"2679","67f5e351":"2696","5e58268b":"2700","56173bd1":"2732","4c5bb0e3":"2739","7c87f31d":"2748",d28b7dcd:"2759","48f24bab":"2772",ba2305d7:"2791","00cd9d46":"2839","093ec6b1":"2854","9dc1ea4d":"2918","580eda40":"2932","6e7eafb1":"2954","200d970c":"3050",a80470ee:"3075",a4b2d8ca:"3104","32dcc326":"3125",d29911ee:"3131","4f7cd6bb":"3137",aed1d196:"3144","40ebd41e":"3151",f75eea2f:"3174","5c3bdea9":"3179","6be904db":"3303",a3e90044:"3313",b9073401:"3323","388a1337":"3337",f237aa38:"3482","538c7955":"3558",b783cafb:"3693","50cd3db4":"3722",dc1f5b39:"3740","394bb252":"3764","7c1ec31e":"3843","260d7fd0":"3940",d18b6106:"3965","50494a26":"3968",b4ced939:"4040","0bf991f2":"4060","817ed3cf":"4074",b18f8924:"4133","0c12eeea":"4205","1497bce1":"4355","30f46c87":"4362","25fe5fdb":"4368","1dcf0194":"4405","26d64354":"4425",ad9f509c:"4442",ff5a6f64:"4467","1cb4ff83":"4530",d9f219f0:"4574","405284b3":"4591","0be544c4":"4602","98bce106":"4629","43d0cc21":"4777","3b6474f3":"4790",f162832b:"4795",a0c4b68b:"4863","7c52b6f4":"4890","4929a6fa":"4919","006c64a3":"4980",f5c507c6:"5028",ca8c3af7:"5029","25ed107d":"5065","15fcb894":"5137",a3417ffc:"5168",d0ff2798:"5193","8c7f4a45":"5195","8be9b28c":"5268","6ff0c558":"5270",b3a451d2:"5289",bbc3d059:"5295","22b4f68c":"5322","86642e8b":"5334","0e11b6db":"5338",b9ef0c47:"5397","0c74166d":"5594",fb863cab:"5622","32ba6a4c":"5631",a804bb8e:"5633",f8763f0d:"5685","42bda306":"5721","37ae1bc8":"5795","1adb4ab6":"5806",b5960565:"5887","478a7123":"5888","4959f63e":"5936",c4d48ead:"5988","11faa303":"6045",ac2c8141:"6082","384f1d9f":"6090","0d706529":"6158","4fb8ea95":"6171","0ba05648":"6203",baed6a8a:"6225","59ba4d58":"6289",ce3c8465:"6350","36f2d01a":"6370","4658250f":"6371","5c865244":"6372","3faff22d":"6467","2a1db3a7":"6482",a49707a6:"6542",ae59a273:"6552","21b16c5b":"6559",d5ace2db:"6605",f6a1f09d:"6636",ea2cf37a:"6677","17ace3c3":"6697",debf2b54:"6709","01ceb854":"6739","507d925b":"6761",ae0384e2:"6791","4f684eef":"6823",cd9c899c:"6827","5ac9b8db":"6845",b52407fb:"6897","52f660a4":"6944","2aca441f":"7033",e841f655:"7035","6e78b29b":"7071",e7c12d1f:"7100",b744ccc8:"7125","3445e83e":"7140",eec9a679:"7160",bfd461a8:"7167","2a6ac43b":"7233","598dec22":"7277",b1b9fe16:"7317","96f48bd9":"7355",ec45592f:"7414","502758cc":"7444","8fdc7f76":"7458",f786ec4f:"7462","4abd5d51":"7517",faf188f1:"7564",d29a4f88:"7693","06a1e3b2":"7715",b3716f55:"7724",d6b46894:"7734","869d1599":"7773",deab0229:"7802","996feafe":"7844",f09bd126:"7861","28b030e0":"7881","9b8d6628":"7904","7ba20019":"7907",e0f7a560:"7945","95803b07":"7949",df4b657d:"7953",f85e4dd8:"8003","0480b142":"8070","38122bdb":"8177",c7a3e7d6:"8183","934057b1":"8192","01a85c17":"8209",e1d02585:"8263","14cab7b2":"8281",c286af15:"8289","09ff3d76":"8348",db9fbbab:"8354","24179e00":"8363",abd23114:"8367",cd17745a:"8413",bbced460:"8417","3c06fd15":"8583","497095d8":"8585",b6159c54:"8606","15c2f51a":"8619","212a125d":"8645","80bd773e":"8651","6598f23b":"8668",d7d5c50a:"8688","1cd42d14":"8762","7a11cfa3":"8766",e161c803:"8840","9c84f0d3":"8874","3a6a48c9":"8888",effd3c61:"8889","56ab6e97":"8892",eebb3a9f:"8900","48912a3b":"8909",b6e28713:"8965","7c9ee56f":"9045","29c12ff9":"9127","57c73c9c":"9151","17666b14":"9152",d4eb85a9:"9189",b2d2727d:"9195","7b3a4001":"9225",d336ca2e:"9228","0687df23":"9257","00766a8f":"9333","4c14260d":"9351","1a41dab5":"9426",cfb1206c:"9428","8cd4ff44":"9432","49b92117":"9446","762ed4b3":"9458",ebf12a38:"9471",c36198b5:"9478","953153ea":"9499","2fec12c7":"9516","8eea179e":"9570","79e67a34":"9631","5e95c892":"9647","48cf1cd0":"9676","56382a79":"9700",a0d28f55:"9702",c35662b8:"9722","0d37dd31":"9737","6a0b8fcc":"9790","2fd2285d":"9836",db607657:"9856",d6d00b14:"9860","36e3724e":"9870",c14217e6:"9888","8a5cd0c4":"9891","6b16b25a":"9896","06b7dbb6":"9914","9ee88b57":"9944",c782ecef:"9986",c2277200:"10030",f89af623:"10118",f7519df0:"10181",ce5d6b55:"10198","0eb44ec6":"10238",b69fdc1c:"10285","8c29db87":"10354",d592eee2:"10384","0ca8e4c5":"10472",bc663e84:"10510","79c374cf":"10535","6766f38b":"10569","6a326c1d":"10637","13dfa837":"10640","936cf648":"10642",a65658f0:"10682",d496317d:"10683",a83dbf38:"10708",f53cf472:"10727","931768b8":"10767","10fb8f29":"10789",f8d8c88e:"10801",b964b0d3:"10907","42746bb6":"10920","2b571547":"10954","726b1d2e":"10956","90db14b9":"10978","9294d9ac":"11000","33727eb6":"11002","2750cc84":"11111",b051e9c6:"11238","2e961a80":"11275","82b971d3":"11289",ac338f84:"11299",f9cb0cea:"11326","9a744c23":"11330","6ed20719":"11355","039c7621":"11508","5090da06":"11624",d2a270f8:"11631","186775cb":"11682","51e360fd":"11725","4a7296a1":"11738","446810fe":"11745","1db5e20f":"11768",dba75126:"11775","968bfe93":"11783","43ff550e":"11795",b9168984:"11804",f630dd79:"11842","51e592eb":"11855","43c57b15":"11869","41b6dd58":"11905","757b41cf":"11906","608a85b6":"11977",d25544dd:"12047","8e6bc4eb":"12110","1a730a78":"12123","088c57bd":"12134","5617941b":"12144","3deb4153":"12186","77a5f3f8":"12316","9b28f794":"12318","2592f25d":"12378",a0fb693a:"12395","61c30610":"12431",f4a568da:"12452",ac9a039d:"12477","2ca30cc7":"12535","0bce5bfd":"12542",bb6acec0:"12613","89412d1c":"12617","880a76a4":"12650","98af85a1":"12654",f81e2128:"12686","236efcfc":"12869",e57d167d:"12912",bc561320:"12945","72ed5e19":"12995","9b078b3d":"13021","075d0b63":"13060","6695bce8":"13063",ef2299ac:"13124","4d01f822":"13152",a5fd3751:"13203","814487fc":"13236","86aca325":"13358","0c9b8a46":"13374","15be7f5e":"13375","05f125a2":"13419","5b6b8d73":"13460",f7887fd4:"13465",aeb9cb2b:"13525",a221d960:"13534","430c4f94":"13562",b7ffc82e:"13580",e32c93f6:"13698",e4126631:"13733","35ace877":"13762","5005f1cd":"13803",a586ac12:"13918","79c522c5":"13943","7dcf0740":"13970",bb5bef2a:"13996",fe0a5e13:"14003","4fe2812d":"14027","6c6eb236":"14042","2da40935":"14043","160c3f1b":"14059",c58d5881:"14125","88677a17":"14134","5ba7f3a0":"14136","0c792305":"14152","79f5ed7e":"14163","44c788da":"14168","0466f8a1":"14179",e78cae60:"14224","973a6c2e":"14257","4d62164b":"14259","881e0310":"14261","15b03510":"14264","816e216f":"14286","02704d8d":"14340","720024ad":"14381","4330e2c5":"14388","95a29cbe":"14399","262f048a":"14410",a2218d2d:"14435","7990d23a":"14446","11c5ad4e":"14483","0dc66419":"14496",b3880c0f:"14515",b812e3a7:"14536","13366fcd":"14549","04287605":"14599","6b0d4b59":"14627",c135661e:"14629","7cd7848a":"14683",cb290368:"14726","8049dc2a":"14750",cf066a97:"14817",da9a6aef:"14822",d58d42ac:"14844","9c9e6d14":"14868",b2f79aaf:"14917","68aea991":"14919",b634826e:"14943",ffce8ccf:"14971","6773b5f7":"15078","461201e5":"15079",e6691bac:"15144","809a1b46":"15186",e0719818:"15220","246d116d":"15235",ee5dc595:"15272","7bd6096e":"15292",a0583d0f:"15316",f9b192e6:"15387",bbbd3731:"15403",ad07d5ed:"15473","6bd26a95":"15528","1ff337bc":"15552",a309ba1a:"15607",c821ba53:"15654","55b3e6a2":"15744","03719399":"15746","65df1ffd":"15805","6d300ee1":"15875","4bf163bd":"15881",c26e381e:"15896","04d2875d":"15917",f05cb9af:"15947","7f5a2db2":"16032","4de90ec7":"16090","5685cb00":"16100",f0db470e:"16209",a2da2f5b:"16378",ebda94c9:"16560","3d8e248c":"16622","4ccf094c":"16641","2e0d7695":"16649",c01089d4:"16660",ff1ef8b0:"16685","682a1736":"16689","1b334a26":"16745",c5392341:"16775","751ccd8a":"16803","7c3644b1":"16885","426a3c0f":"16942",ec65a1d1:"16999","30e67995":"17033",bc36781c:"17232","82fc01c6":"17294",b4762a45:"17332",de821e02:"17368",b629aa71:"17402","496a5e3a":"17411",c5c8072f:"17441",dddd9631:"17502","8c212f85":"17530",c8aaf3b1:"17606","47f3a505":"17626",a2af438a:"17681","2122acab":"17697",de64262d:"17722","764a6545":"17727","4f311863":"17803","2d9024ae":"17818","7cfc22c1":"17860","9130943e":"17867","992c886e":"17899",f67021ea:"17987",a3255c75:"17988","059d2658":"18006",c1fa975f:"18033","7707ed5e":"18103","85902cb9":"18115",c58d3901:"18142","8e562778":"18187",e6cee3d7:"18205","59b5a3af":"18299","670426f7":"18351",a80e0e03:"18375","7eea383c":"18438","762cb2d4":"18445","905fdac9":"18520","9dc242cc":"18551",b3c2b735:"18616","1bdcf2af":"18620",e798c07e:"18645","3b375bfc":"18738","10b6d210":"18757","6cc2587c":"18940",d75d009b:"18950","7487c019":"18998",fcf2eafb:"19040","378587af":"19042","6e547e58":"19052","6f878c05":"19070","6f3d983d":"19108",e77e0240:"19237",a2cfe627:"19369","9228ff94":"19387",c61ed569:"19396","4b6ad6c1":"19428","7f5a4e86":"19521","3548485f":"19542",c58d7350:"19578","9c65fedd":"19659","76b52ed8":"19664","2bd614fb":"19686","0e4a3360":"19711","3c6c92ad":"19774","83c71362":"19798",a5052667:"19801",f36e33a7:"19851","7e53000f":"19865",ca2ec6d9:"19894","436f8775":"19999","430ee71a":"20103",fa230427:"20116","9e0a0edc":"20154",ecc82a52:"20160","83e7d916":"20216","5aae4c30":"20229",f60a8e85:"20286","13d37261":"20304",a55cf427:"20358","915fad0f":"20361",a170c4b2:"20405","839320c8":"20415","9de16aaf":"20428","39c0c867":"20434","4c056f0f":"20491",ca16b0fe:"20535","2925f13d":"20541",bcad8cf0:"20596","678bd7f6":"20639","72c396ee":"20661",ff781369:"20713",a827f20e:"20812","1d99c39c":"20892","5ef30e9e":"20951",e3b4fd8a:"21070",c1b7702d:"21121",b2a1bef3:"21123","574aa417":"21177","58f98693":"21273",e737da10:"21275","9eea3ae4":"21292",e4bea80c:"21303","266d37b9":"21316",b2c62a3d:"21346","9db9c0e0":"21417",f48374b5:"21492","70b56ba8":"21510","69f9ca18":"21524","6c888f35":"21560",d17a9646:"21585",aad02470:"21630","6224d640":"21635","7682eda6":"21644",b3f2f317:"21683",ea9d899a:"21729","1926d3d7":"21805",a54a9a31:"21874",a8a7f86a:"21921",ab4d9aa4:"22087","3ad1da61":"22124","625beb64":"22141","2231732a":"22170","49e3a5aa":"22178","60be01c6":"22236",e605a73c:"22257",a94ba305:"22262","9a5e9795":"22385",f93d9ca9:"22447","2923e8f3":"22499",ff15e2eb:"22501","6f37f43d":"22534","6e771e2a":"22579",ca5d6ba8:"22595","69375b61":"22640","6d250944":"22651",e0618342:"22702",a4289c8e:"22791","743819ce":"22809","70db0e3d":"22816","9a29e675":"22911",d49fdba3:"22916","0d5f3865":"22932","6a44fd90":"22969","97b786bd":"22970","70a32eac":"22973","1fd06df8":"23002",ad58910b:"23039","07da43c6":"23041",ef1c4348:"23081","39307ee6":"23119",a1c39b3f:"23141",b8dfc3a6:"23208",fe86f3f9:"23332",fa5f4abf:"23388","95d97af4":"23438",fdeab78a:"23475",d4f4b34a:"23545",f24f712d:"23563","53746e73":"23591",af9b00f1:"23600","59e9dc06":"23634","9c150758":"23637",cb16b650:"23666",d235b83f:"23676",ea8366f8:"23700","79757e7c":"23805",a268f692:"24033","54c79a13":"24036","5ef1cef9":"24065",a83d9791:"24071","4ed60a8a":"24084","81c34363":"24098","897856d4":"24126","5ce7213e":"24140","4b2ed2d0":"24172","3af3061a":"24234","7ebf6f1e":"24265","45a47a41":"24292","205ca674":"24301",bbb172c1:"24327",a4e075be:"24340","99d3870c":"24366",b5b376a0:"24377","9be81a8b":"24393","045bd6f5":"24475","6cf93e89":"24476","8a733352":"24607","174b58ca":"24618","9555b08a":"24644",e781e98e:"24649",ff00d8f9:"24652","3befffe2":"24704","91c64349":"24728",ed6ec893:"24826","1574adde":"24838","7cfd7c3a":"24853",f0709bee:"24891","8e01a36e":"24912",cf6129a8:"24919","231cac3a":"24970","1db9daab":"24991","9cd11b72":"25044","8bd2257d":"25101",b277530c:"25130","8a95094d":"25173","96046d19":"25186",f118f569:"25243","1da16fcf":"25285","537936fe":"25335","4083b748":"25397",e346ea56:"25410","143635a6":"25450","5ef8e026":"25452","2a44fc97":"25469",af5c68f9:"25531","20429fae":"25532","7fb09d55":"25539","65603bfa":"25582","71651e9e":"25632",dcc6ca2f:"25671","9c2460d0":"25731",d56bdeaf:"25778",ba115cad:"25781",d2c3f17d:"25845","17268e53":"25874","1645b95d":"25987","90c5833e":"26003","20f9256f":"26009","4f978fc9":"26079",fd6c914a:"26183",a937858f:"26184","4e3e1e17":"26216","477cc2f7":"26260","878dce9b":"26305","9579dcb9":"26333","65009e94":"26337",af138e2a:"26352","26008da6":"26610","8353278b":"26627","960d3eb8":"26632","1802ae9e":"26722","21e535c3":"26744","4681e75f":"26797","38cf2270":"26812","958a296c":"26882",b3749361:"26900","9d0e7fc1":"26986",aca5eee4:"27012","58714c61":"27020","1547c10f":"27088","220c1bc8":"27092",cb33cd4a:"27094",e37692b4:"27115",c4d1e829:"27123",cbec0238:"27179",ce710151:"27212",f52b34fb:"27369",f7e205e5:"27388","30ab0d34":"27394",a3983124:"27398","7a3be7e3":"27444","31ed8f07":"27473","9087a409":"27493",a95ad191:"27684",ce588038:"27785","2e7e1134":"27955",ee4b8f19:"27995","3ad90ad2":"28081","2cc67ca6":"28086","81c204e1":"28111","8120957a":"28166","9adef974":"28178","758b9bc9":"28204","20a81622":"28235",b8d3e47d:"28252","5a4f5a9d":"28294",ec410c33:"28319",bfc2a64d:"28369","89cbd1b8":"28410",b8d60920:"28616","54ad050e":"28627","334e3bb5":"28636",e1758f93:"28679",ab48a39f:"28687",c3856c66:"28701",fd5c5192:"28782","379ac6de":"28793","7ed2bc06":"28834",e7ef6e16:"28920","8c5b1685":"28941","9c7a2f87":"29060","1421c0d2":"29100",fd077c05:"29117","3b189bfd":"29148",d330b699:"29243","04daf44f":"29370",fbce6636:"29408","163a1bae":"29421",e4d4ec4e:"29457","05e733df":"29514",b2f58160:"29523",b45a54e9:"29526","760e2145":"29567","13f72d6c":"29653","6e0a413f":"29679",b1633424:"29690",a642dcef:"29698","80b93830":"29708",da10e58f:"29733",e6557239:"29795","16381f20":"29820",d973177d:"29829","8b18d68f":"29838","5d94dea0":"29845",e534ab35:"29885","225b6447":"29943","5de1c39a":"29950","332b14e0":"29969","8f6c1b4d":"30021","87546ad3":"30035","339988c0":"30154",adcd62ae:"30163","22bf7f69":"30167",b97a54f5:"30200","22e8ffbe":"30239","5320ed26":"30262","967ebe95":"30303",dfcaec69:"30314","4b678e99":"30355","90ffbe81":"30410","874dc058":"30490","407230da":"30564","1ee0a129":"30579","775c5b43":"30583",ceb04c72:"30585","6ee9522e":"30628",ebf8e597:"30746","5814834c":"30827",ced554c7:"30831",d8412727:"30842","677757ca":"30848","44c28e7f":"30934","416fb909":"31016",af819789:"31022","71d5b1f8":"31039",c3c8ddc4:"31125","0b62d7e7":"31150",df232fd5:"31213",b8ab477f:"31220","5c81ce12":"31255","67f1ea1e":"31257",fa366c46:"31272","2c3e7e92":"31279",cc564cf4:"31465","1668cad9":"31541",c602d51d:"31544","8c4bf82a":"31567","0b401b62":"31700","05957343":"31705","0a70c05a":"31720","04eab06f":"31791",de1c8a7d:"31838",a14af959:"31861",c791a767:"31862","4ef864ee":"31972","8dbbcff6":"31996",f0dc0726:"32005","9ba9284f":"32012","116b7e55":"32039","5110a7b7":"32183","4437b871":"32295",f9a4941d:"32335",fe345ee5:"32365","263a95fa":"32374","042ba1e2":"32384",e1407f5b:"32391",c08ba4cb:"32472","0e9894c7":"32492","40c3731f":"32558","798484e3":"32691","1b520177":"32728",a196e32c:"32781","5617aedc":"32787",fdddbf66:"32825","8590fd3e":"32847","69583d95":"32884","225cc45a":"32960","604cd7c5":"32993","97e51b1f":"33049",a172f6b1:"33065","12e68472":"33132",ee003a92:"33192","817d1a47":"33202","465994bd":"33234","7da68ccc":"33290",ff6c3941:"33307","2d0c5b52":"33350",c16e0158:"33458","0b81acdf":"33462","3ed70074":"33517",fe7ac0b7:"33540","6075be34":"33567","269d704a":"33572","3f933ca5":"33612",d294bdb0:"33638",da7149d8:"33643","81a6b262":"33659","755872dc":"33724","1b31aebb":"33804","07399e71":"33806",f8a443f2:"33825",a7690409:"33881",e9c7c2b7:"33889","49aa1a16":"33999","4fc571b0":"34071","04f8849a":"34095",a870955a:"34117","18b5779a":"34127",f5c63bac:"34156","0bc541b1":"34171","3f4396e6":"34179","13e6af21":"34196",e8a8dea2:"34255","164e61b9":"34331","79fbf53e":"34388",f3d3813b:"34447",c2356d7d:"34511","538371ec":"34520",b038a3ec:"34528","782eae4d":"34543","0735e5be":"34549",f30fab6f:"34621",ef071c32:"34662","02e54e09":"34691","47a1bde9":"34706",a5fea1bd:"34750","5d5e0832":"34761","2e6ef254":"34808","924dcf98":"34810","117121a9":"34812","10fcd509":"34837",dc7f8f8b:"34847",f7702246:"34877","075b4af0":"34962","907e7dc3":"35023","6fe5390f":"35139",fd058e1b:"35168","0f3b9f0c":"35288",d42065ad:"35325",a7827f50:"35329","976ab233":"35402","032e2c67":"35523","388d5845":"35532","75d5f1cf":"35542","5c44183c":"35546","97bb73fe":"35618","8fc868c2":"35733",aba21aa0:"35742",ff6f6072:"35766","3019fa66":"35767",c75a0418:"35808","864f74f0":"35844",bb1bce89:"35911",a3142532:"35932",dfa4e294:"35960",b5a599e0:"35983","04afe417":"36009","59be0e8d":"36055",ceff0062:"36067","28f38ec5":"36113","307d712e":"36144",b59f02fe:"36188",b60e28b6:"36192","5cfc9e58":"36211",f8a5caff:"36271",eafd7a74:"36302","4f9c79b6":"36361","9c812e08":"36573","2573355f":"36619","1084a32f":"36640",b6fb003b:"36672","4c7d084b":"36703",a3015275:"36747",c1a328a5:"36763","649faa0e":"36851",b46f5ba1:"36890",d73e6b67:"37109","0b4fcfba":"37115","97da4333":"37147",d786420c:"37191","8f3b27f1":"37204","43dcd746":"37206",e34cac0e:"37209","362ee1f8":"37287","167016d0":"37298","554882a9":"37329","6013ac2e":"37366","4a1368b8":"37378","9bbc9e48":"37441","6929f09d":"37485",ce46a18e:"37486","6a293d29":"37489",e17d733a:"37578",be2ede3f:"37617",a6aa9e1f:"37643","021d469a":"37646",e2657c7c:"37673","2045fade":"37678",f451cc4c:"37702",f5853975:"37737","2cfb265a":"37740",feab7dcb:"37799","5f87fd99":"37809",d5e29b01:"37839","9ad03801":"37841",cd060f40:"37842","88d0aec4":"37872",f6432a48:"37979","690cbdd8":"38001",b61f0370:"38032","63e00c6c":"38035","37b82514":"38055",baad6bf9:"38056","2e9f383c":"38238",d0e9d470:"38288",cf858c26:"38370",dcd7017c:"38416","9474fc0c":"38439",f0fb7623:"38451",fe3e0e89:"38460","0fae8f08":"38501",f9c05060:"38520","0f497157":"38600","6dc06ee1":"38605","47e85d0b":"38642",c4de5678:"38767","5ea125b2":"38816","6495713a":"38835","110e78c3":"38839","6f5eeb66":"38888","7c912802":"38891","17b935cf":"38923","8e72bb53":"38953","2c50796a":"38974","0db7476e":"39014","5560f355":"39088",cb9e1f3d:"39110","755ebe0d":"39138",b5f01515:"39142","0b8a4e62":"39153","06043210":"39185","09b62bf8":"39192","484cbf74":"39197","8b795044":"39202",a7a3cbc9:"39228",b992801d:"39230","90f157dc":"39240",b40642d4:"39265",b1043e58:"39283",aa0fa20f:"39404",cc6505da:"39405","995840bc":"39407",a615dd65:"39423","0f65ccfb":"39444","9e679a0b":"39472","6bf3751d":"39473","9d833fad":"39487",b326207c:"39494","4a80e27a":"39555","06a8eab3":"39569","7d0e1375":"39587","97ae1fff":"39608","8f64cb7a":"39712",a68f0e64:"39715",fb3759c3:"39773","320da59d":"39777","3c2d0811":"39781",a2c9e15c:"39876","9b0c8626":"39887",d76c455f:"39901","09a52b17":"39908",d4a2e930:"39973","5f469a3b":"40065",bc817d28:"40124","59533a49":"40132","0508dae2":"40178",a2d43843:"40212","05c63416":"40249","3c36ce76":"40369","0cd1a20c":"40463","11b8ce75":"40555","3e032765":"40606","12a5de9b":"40616",bf5126e1:"40651",dfc3c224:"40690","25dc0311":"40694",cc01a9d7:"40697","986db944":"40733","5bc29dc0":"40755","1a7b33c3":"40758",d5281bd1:"40780",d2110cc0:"40797",ddebc8bf:"40827","2662e92d":"40847",b1527e4b:"40879","321dafc4":"40907","881bebdd":"40927",ca0149b2:"40959","68c5632a":"40999","33d4a0d4":"41030","406d4ec1":"41120","0fa5c29b":"41125",ddb0149a:"41134","85ffab62":"41135","2a0d650e":"41178","6c9200cf":"41260","247909f7":"41361","803932cd":"41409","2bf5edd4":"41455",fd517388:"41461","06fce5b8":"41472",c3f88c36:"41491",da172daa:"41594","13e47f37":"41637",d407c2c6:"41640",e8e3bd30:"41651","9017a110":"41677","155a9bc0":"41695",b9edf71b:"41739",bc38a1dd:"41750","78f0e259":"41867",edcc5675:"41871","58b3152e":"41872",dc5506b6:"41892",b7a56be4:"41907","7c49023e":"41954",c67e4e1c:"41993",a2839a15:"42021",c413ce11:"42068","295cb0c0":"42187","671726ea":"42196",f1a4f0ee:"42207","6df57399":"42350",ffac4af0:"42368","99bce14a":"42380",b8212f90:"42465","34825c6d":"42518","2b505997":"42566",b184a577:"42576",eafac744:"42596",fce58780:"42659","7fc4aa15":"42677","165a93e5":"42690",bfdde79f:"42694",ca790126:"42722","5314580d":"42799",bf3d61ec:"42801",fa6fcf0d:"42887",c9d95cbd:"42900","145364e0":"42905","39c7a203":"42911","583fb00a":"42924","19028add":"42942","2812e3b9":"42995",e3477e52:"43029","2907d5eb":"43035","4256b042":"43036","676c7c8e":"43040",bec2896b:"43042","341293cf":"43088",f1374ba3:"43136","0bcdfdaf":"43199","4c07ba53":"43352",bf7f6ee8:"43372",f048922c:"43421",fbf82623:"43432","83fec35c":"43445",a490aaaa:"43447",d319e9f2:"43512","4cd0ba1b":"43642",eb6ed572:"43675",ac5cd9bd:"43684",fe2d8766:"43833",c09831a6:"43868",dbd5692a:"43880",c5a487ef:"43910","5a8b22a0":"44008","43d1bad2":"44040","894f5c0e":"44045",a3a8fa0a:"44062","6503f568":"44118",af753000:"44123",ca2b0f7e:"44125",d653d7ed:"44129",d02da847:"44137","19acc4ed":"44143",bf12a61a:"44169","57767c05":"44267","4f087d20":"44290","3413c8b8":"44301","0a91021f":"44339",bc8f3fce:"44351",fdf1d2ab:"44381","216bf65d":"44419","6fb01322":"44489","9882af90":"44492","0c9b1365":"44546","9b2ae5ff":"44551","502906a9":"44567","5b39e963":"44605","20bfa334":"44640",d65b2c25:"44662",bdc69003:"44682","668e0554":"44844","43f3c18b":"44939","12b957b7":"44960","41af2803":"44994","6e34e766":"44997","86fe1f77":"45117","57083a92":"45218",c3f790da:"45238","74e64d1a":"45245","33c572e5":"45268",db90ec2b:"45290","815e47ce":"45323","24d4b044":"45339",f86f0ad4:"45400",e85bde03:"45500",a722b43a:"45541",c36346e3:"45670","3533dbd1":"45682",a2a2954f:"45919",ec832811:"45920","9926d60d":"45983","8cf74eb7":"46001","2e048b0f":"46008","1fb7523b":"46025",f724037a:"46039","67893f6a":"46063",f1087137:"46074",e8b8ca39:"46102",ccd96dfc:"46123","53cdeba4":"46156","3bf2a847":"46232",ea511817:"46244",b5b4a410:"46246",a490cf35:"46340","5e1e1325":"46352",e49bd305:"46375","89e9b753":"46381",ba786c9d:"46435","4bb02a47":"46451",d7c0035e:"46464",bcb734aa:"46472","9dfe5a97":"46513",c13f246c:"46515","60d50d27":"46541",c5427124:"46547","1a79e020":"46548","8393d26f":"46598",c4f38868:"46633","4f48cd24":"46662","1ee47c02":"46694",a6d25208:"46697","1219dd15":"46710","2b6a7ab0":"46754",e0362487:"46814","917a523c":"46850",db9d1243:"46888","57a58e78":"46905",ff13b684:"46911","7b0a3d41":"46917",a28b89d0:"46921","2d3f88b2":"46962",bbb92300:"47041",a5c8a2aa:"47087","696d889c":"47106","931beacc":"47110","5e9a23c0":"47127","3a2a4cfe":"47156","5048202c":"47247","6111afa9":"47297",b9a767d8:"47433",df0967b2:"47537","0029660c":"47555","925cbbba":"47573","0c1ff092":"47622","39a07549":"47693","17093d00":"47699","4edf53e5":"47730","1b512798":"47738",d783f956:"47913","6bb76d2c":"47917","9e70e253":"47993","8fa8fb45":"48015","47f96c4a":"48023","1b3d7ec5":"48027",ca713325:"48050",c17f9567:"48063",b71c2d32:"48071","06ef9569":"48097","859f73c7":"48127",c467a11b:"48132",bac93bcf:"48140","519b5759":"48162","9d8965aa":"48188",ef31fc63:"48270",e672d61a:"48285",be3fc974:"48286",e2b4c006:"48295","189e3ac3":"48304",f6884a75:"48310","959b45a2":"48360","712c16a5":"48361","2896ce7a":"48532",c5550c10:"48537","0a5f31be":"48544",c1506482:"48592",b775ecd8:"48650",ef4f3413:"48661","5db19d16":"48673",d009d47f:"48733",e054d919:"48768",b71be52f:"48793","49b022dc":"48879",ce18dbde:"48883",e93602d3:"48939","0f461001":"48985","9d9f8394":"49013",e3c5d63e:"49109","3455c0d5":"49112",e3022ebc:"49171",f2a06fea:"49226","828cc8aa":"49289",ad0a2b75:"49305",e28d4356:"49308","2417a912":"49350","8f1510f6":"49388","2019135a":"49461","49d63cc6":"49521",e01bb6c7:"49579","8ec8c5c5":"49583","2cbb324b":"49587","4f5f41be":"49602",b0ba51ed:"49655","2391d372":"49676",b9ce10bd:"49693","58e037fc":"49768",acf72eb8:"49783","5bd6f6db":"49786","759a3c81":"49941","40c88f7a":"50012","837c6843":"50095","756c7559":"50176","18dddf22":"50178","4e80a9dd":"50208",ec6a0daf:"50261",fc6a53b6:"50293","5d4911b7":"50306",c59a4667:"50414","36abd830":"50424",a33de290:"50428",eaebafad:"50446",a4e24d6c:"50472","129c4e7a":"50507",c112d1b7:"50570","3fd21eb6":"50584","0bb25d72":"50585",e964b083:"50642","960924c4":"50664","75be343d":"50700","0914ee26":"50703","0d98f85b":"50747",b365f6bc:"50800","4251704e":"50819","8aa0dce2":"50839",e7b82dc0:"50934","3290f534":"50981",dfbb1d90:"51009","4dd6f8d8":"51047","5b9ffc49":"51059","3304ac90":"51102",b4ac58bd:"51108",d366555a:"51116","85a6e3f4":"51237","0a8d92af":"51378",fe2deb8c:"51412","7a04b795":"51420",c9c6fdd1:"51435","14515c80":"51438","704ce0a4":"51465",c548908c:"51547","45b02367":"51548","8447ad38":"51578",f762fff5:"51589",ba5671ab:"51636","6537c712":"51649","65d842b9":"51665","30ab0ff6":"51689","89bdbd96":"51711","9199f8bd":"51763","44e51e65":"51828","5c238f81":"51837","48b6c251":"51878",b5fb4df8:"51890",d1e88337:"51944","772b5e3c":"51961","7dbc2502":"51962","1d79e793":"52036","7f8ebea7":"52042",fbaf87e8:"52050",edea4b8a:"52093","95cc61bd":"52102","3498be82":"52132",d0ed28b7:"52135","81d19844":"52176","628d0604":"52181",fadc68df:"52235","8ec5e058":"52250",c292770f:"52261","3e088827":"52266",f6144dd0:"52276",be224150:"52282","8e1e17e5":"52286","0dd8c0ac":"52342",ab586159:"52408","25d3e7f9":"52424","2dc793da":"52450","8c67a0ff":"52466","2c5310f2":"52477",cda1618e:"52478",ca57223f:"52488","7dcd92b5":"52569",a9417ee3:"52572","14ba3414":"52605","27f2e2a4":"52612",c4f5d8e4:"52634","9e4087bc":"52711",c8f57d29:"52731","85afc7f5":"52770",ce319efa:"52826","9e1bed9d":"52840","69fcecaa":"52895","2f32a261":"53074",c0571b49:"53118","5de85215":"53132","71514a42":"53178",d670063b:"53201","79ab3378":"53237",a9129632:"53238",fa713049:"53256","76a0389c":"53266",f8fe23f1:"53288","5440b68b":"53314",edabbd89:"53370",e2bce80a:"53449","63436e22":"53458","0f65ad2f":"53501","92f1a745":"53540","7e665e5e":"53559","6c9978fa":"53646","52ed38a1":"53670","77612fce":"53742","3a447539":"53771",e352cccc:"53786","7c8deb08":"53832","2a5e97be":"53861","94dd9534":"53871",e9a95c5e:"53881",a4da17e3:"53901",a8933372:"53925",abde70aa:"53952",d5f056f5:"53982","93b4d825":"54106",ba441024:"54113","5026e9d2":"54144","89fdbc0e":"54168",f97d7d88:"54200","3a55b748":"54240","5ba9c4b5":"54246",e5c0ea66:"54270",f020ef51:"54272","71e2c4b4":"54277","14434d81":"54310","45c5f30f":"54313","3c5b6e91":"54349","25aa47d2":"54399",c87c5e1b:"54415",f21fcda3:"54439",fb9e14c7:"54500","66193a96":"54540","633af835":"54568",ff4fb41e:"54749","0f7d8652":"54759",a872c629:"54879",c46bba44:"54881","0a893fdf":"54950","98bd463b":"54951","5bcffa9a":"54992","37d125cb":"55004","70d55848":"55100","152d0582":"55144",c1cb0a0b:"55167",aaa8a12d:"55206","05cfbcb9":"55223","0373e7f9":"55245",c962ae4a:"55276",facc4cc2:"55302","028ccd51":"55329","1921d13a":"55351",e2f2b384:"55395","2027fd18":"55401",b8d6941f:"55413","6a0c8a9c":"55478","342d2e6b":"55483",ab685cdb:"55534","29cf75d4":"55559",c8861997:"55566","3a9c66ce":"55579",d5caed5f:"55616","483b9ea8":"55645",a7511015:"55664","1c411fa3":"55675","94b063ba":"55836","2cbaf53f":"55929","194c8540":"55955",e1a6f6ca:"56028","69ef23f7":"56037",cde3e47b:"56062","6f9d890e":"56068","096bca72":"56097",a7b4d0d7:"56122","602e2465":"56123","9c062d77":"56145",f05409e8:"56216","575869e5":"56297",cbb5064a:"56408","0d71415b":"56463",f71bbf9b:"56470","7a75c11b":"56486","858f1266":"56493","86a45dc2":"56510",c9c31477:"56560","609f9177":"56607","69e6c429":"56723","6664c24a":"56779","7488fea1":"56819",eec5649b:"56826",ebc13825:"56916","1dbfdc18":"56948","39ed0ae4":"56974",dbf9c341:"57013","4d68fc5d":"57119",d592d1b2:"57125","398b4aad":"57139","037241c6":"57141",e15f47bb:"57159","034f0308":"57165","779bba71":"57251","3ed58e4a":"57326","8a5814b8":"57352","79cc2eba":"57361","4cc485ec":"57364",ac4d154c:"57430","0b7a8a63":"57529",e07fd562:"57586",dd48b375:"57614","0ed7fb46":"57647","658997e4":"57730",c07b5739:"57749","73d3ccec":"57760","17413beb":"57800","48d58c93":"57845",a57bd983:"57912","0cb9db3f":"57994",b75e1b9f:"57996","4b5076d6":"57999",e2070fcf:"58000","31fce735":"58002","2655f170":"58079","242b0cc2":"58093",a2171a4d:"58144",d1f7176c:"58230","400deb23":"58255","078daaf7":"58259",b296abb0:"58301",a5e62092:"58359",ec854811:"58428",e2adec54:"58454","2a882da6":"58479","36d29ed8":"58484",f0e5f3ed:"58581",e7c7e2bd:"58582","6bd22ece":"58594","1617efa4":"58632",a36e07dd:"58667","7fde9a4c":"58704","6b6aadc5":"58707",b7d1b016:"58780",dbed7045:"58990","39fca8ac":"59005",e84457bb:"59020","11b61292":"59053",c43c6f4f:"59070","1a20bc57":"59114","17ffd4ff":"59123","37bc7ff6":"59143",a065bdfe:"59214",ce62ac6c:"59246","97db775f":"59262","156bd387":"59349","8475b017":"59437","150f4998":"59493",b2555332:"59521",e651f27e:"59548","674c9391":"59627",e4b8975d:"59645","70cca634":"59680",c9b0e9c8:"59702",b51518d2:"59727","9873f053":"59732",ab90a7b7:"59740","03f08ad1":"59866",b62e8859:"59874","888f35af":"59940","03137a3d":"59981",e266eeee:"59994",cc3a93a6:"60020",ad9dbc18:"60073","167d6699":"60101","152819f0":"60167","267f1c69":"60183",e04f784f:"60185",c1df8329:"60189","5c430979":"60193","5c417b7f":"60198","5c5dd48c":"60203","3fa5d64e":"60257","93d54c10":"60294","42d452f1":"60315",ce86b1ec:"60394",f83acba0:"60445","7003bb75":"60501","821320eb":"60510","3b57fa48":"60559","0c5e909c":"60565","3523854b":"60613","33cbefd4":"60615","244c7b0a":"60676",d163928b:"60696",aef9dca7:"60737",e9d18558:"60762",d379b051:"60776",c316a3d7:"60819","6327585c":"60832",c9d25191:"60861","709e1a02":"60884","00b58b18":"60901",de3f51c4:"61006","2d694024":"61096","127f988d":"61114",cf0c4cff:"61124",a7456010:"61235",b6b1a235:"61261","84536aab":"61265","31eb78c6":"61300",e0f81731:"61334","9c73eeed":"61368",a1e3441b:"61416","43bc2f0d":"61461",b0f00280:"61481","6b206066":"61559","55b57e06":"61584",faa24029:"61702","89baf629":"61706","13a64537":"61729",bc80aebf:"61740",aa1329f2:"61786","1695d9c3":"61807","8513fbcc":"61816","124bf435":"61886","4431d7f4":"61942","820ef6f8":"61950","9df3c51e":"61959",a6972a3c:"61991",a396a58a:"61993","5cc68a8f":"62015",c9035049:"62050","2638eb20":"62061",d2289dcb:"62111","1a4e3797":"62138","8d364c04":"62147","22c027ab":"62162","0e7e04d8":"62182","1e38d1de":"62188","46e76af1":"62213","9b695413":"62254",e0fe70af:"62263",cb69dde4:"62264",f448ea15:"62469",cca423c7:"62549","0f378f0f":"62639","58728d91":"62641","0bd3abc2":"62664",fcaa2a90:"62672",d9175e87:"62691","345b88a3":"62703",f9a8c23e:"62712",b519e6e1:"62713","4e78ea4f":"62827","973ec13d":"62838",ae5c2262:"62845","07853d90":"62867",c03ef713:"62927","2696b78a":"62934","3415fffa":"62936",e5c6728d:"62957",baa95a18:"62975","4cc6a9b5":"63002",b0635fce:"63005","3a9ee945":"63014","4eaf5bae":"63016","9bd87750":"63115",d4bcf69a:"63124","2e91affa":"63156","34c77011":"63228","2f1bf685":"63291","2d074af9":"63292","259b7e50":"63298","60b75cbd":"63330","780fa4d5":"63342","44bdb747":"63367","5f87f962":"63382","9780a9d6":"63387","465af2b7":"63430","877efd72":"63445",f30739cc:"63455","9612fd60":"63515","58f053e0":"63521","1fd2ca4a":"63553","43a56d47":"63627","47298c37":"63646",eadd254f:"63700","2ac84b5b":"63750",c2750739:"63779",a4974adf:"63795","95e06d9c":"63836","8bbbdfbb":"63951","2278c359":"63966",c47fd21a:"64045","813e2458":"64091","5ae5672b":"64154",f4f77456:"64184","88ed6425":"64209","7c0dabe4":"64351",dfa86ee4:"64442",e4307155:"64447",e9f47cd4:"64465","5d817499":"64502",dae07133:"64527","3756d209":"64535",a2a8ce40:"64577","72a44e21":"64597",e52d80fa:"64623","6ae279e9":"64659","1d00ec5b":"64737",ee942de8:"64763","9a8a6b3c":"64838",eda18b6f:"64848","8c717503":"64859","8768b566":"64865","5609187a":"64888",e80f330c:"64899",f08c8322:"65017","6f5a0de7":"65025",f705c127:"65042",c9bcea67:"65133",d0cf31b7:"65193","2a11e6a7":"65223","0530d392":"65233","5ea2239d":"65246","238a64af":"65276","070df7e5":"65359",a81fcfc9:"65466","26115f23":"65497",e1ba57a0:"65625","75ba6401":"65647","329c66a5":"65658",d1be0dfb:"65745",fbd3de42:"65835","698932e1":"65864","38147e44":"65897","587a0b3e":"65918","567cfed1":"65926","1f391b9e":"66061","274bdcbd":"66085","331ad65a":"66135","136587f9":"66140",cf5645b0:"66162","0b7cbed9":"66169","2b53c3fa":"66210",cc9fb6c4:"66237",eee168db:"66327",dcbc8483:"66338",ea6ff7b1:"66351","6f47e633":"66415",cb8920e1:"66461","85e49a93":"66499",e2fc22cf:"66504",c6ec7d6a:"66518","2ca00666":"66519","83037ff5":"66524",fdd85734:"66528",ecb74126:"66559",b0e34666:"66575","9fce9e91":"66602","5032a87b":"66615",e381e7b7:"66759",dc4094c8:"66774","66d49eee":"66791",acc69dc5:"66819","62e9fea7":"66822",e1fde1ef:"66832","58b9aab4":"66867","6e955522":"66912","699a39af":"66943","1b143eab":"67044",c1050649:"67061",a7bd4aaa:"67098","06073810":"67104","0d86fe8d":"67114","60cef16d":"67252","01ed4ae3":"67376",b6d7433d:"67438","814f3328":"67472","77139df7":"67507",d63d12d5:"67520",d89aa357:"67545",a1a96ebc:"67581","8775fa1c":"67587","47766edd":"67668",cace8592:"67683","8fb89e11":"67704","2c18bef5":"67729","2d2dd3d4":"67752",b57b3f07:"67755","39b26ead":"67775","0a0dd03a":"67914",c1c9577e:"68043",e981d05e:"68094",ffcc313e:"68181",a148d810:"68210","1ef2b5c0":"68215","89c88bb6":"68253","9d05a91f":"68334","31ea9d3b":"68377","975aa772":"68434",e59469ea:"68535",d81421b8:"68569","0b87289b":"68685",dbf13a93:"68710","8980e400":"68721","719a7d9b":"68765","14033dfb":"68770","78a6c606":"68834","3ac10f9a":"68839","62cdbb35":"68910","5aa406a5":"68930","68c6e6bc":"68946",edf3b85e:"68989",ef13094f:"69017","8df5dc78":"69038","4a55387a":"69129","9e7326c6":"69136",fc384521:"69169","5a275050":"69180",f0589cfc:"69199","93ef16a1":"69213",f99651a6:"69226","5a360e6e":"69384","15323d22":"69451","7ffd9a5f":"69457",a112e652:"69480","7b863c8e":"69489",fc15228a:"69501","33a51375":"69503",d0ccd112:"69505","8a4df687":"69517","4d573718":"69570","9c10cdcf":"69638","8aca5a76":"69651","16431fb6":"69692",d14574b9:"69737",b1e8d27b:"69770",f2d19d66:"69773","615fd764":"69844",a29a2c92:"69864",b58f381c:"69875","4d8fcf9e":"69908","8e981336":"69982","0860d759":"70008",c8d1e051:"70022","73a7a1a2":"70058","334fa657":"70106","9f3d620b":"70117",f68988f2:"70126",e04f6385:"70174",cb543535:"70179","36b6576f":"70184","02a73cb3":"70198","8367b76d":"70210",e76e0aa8:"70234","5e1c183f":"70253","9d6ff56f":"70267",d2786aa3:"70399","0bbbad22":"70418","5e32dc25":"70438","8c596cb7":"70502",ac5d28bd:"70560",a9f446ca:"70645","70ca6744":"70687","52be8247":"70696",cb488bcc:"70712",ecba2f16:"70749",f3e1c72c:"70755","1edba277":"70776",ac00e857:"70784",c513e822:"70788",fda5ba18:"70791",c1dff2d3:"70794",c3c05d38:"70814","6763bf32":"70828","777d5f9d":"70858","4f594038":"70870",d1fa94a6:"70947",d06511f5:"70949","87d75f25":"70953","16029e49":"70963","05f6486e":"71021","5e0cf2ca":"71026","9b8a5dc6":"71051","620de7f2":"71075","474f21e5":"71079","92f96583":"71117",af7ce5e3:"71162","011132d6":"71169","131dae92":"71227","40d0141e":"71374","7380ddcc":"71407","6e97302f":"71413",f0108549:"71454",ff761994:"71473","4d4a432b":"71501","8c13d23f":"71545",d777707b:"71548",d7e2cd1f:"71585",a29b4047:"71612",dbd41ac9:"71651","7ec29cb2":"71656","4a74d13d":"71715","5abeb861":"71795",beab57c8:"71852",cd9789f0:"71857",f783f7a9:"71910","835d6f03":"71964",f0dc2560:"72043","95f36a1a":"72053","052421c5":"72143","4941c7ed":"72322",f23d42f7:"72353","4419dbb7":"72358","27d3d4e0":"72446",b85e11ce:"72485","59aaffb9":"72508",ac84c584:"72527","1b8f178d":"72536","3336b76f":"72599","95579b4f":"72618","262704a5":"72656","408bf78f":"72662","049fd4ea":"72668",f81aef8e:"72675",eb3eed60:"72707","491d56e0":"72907","37eca2aa":"72914",b724edf8:"72925","4cad70b7":"73055",b8385eea:"73084","43dde569":"73121","6a428f5d":"73147",dfab75d7:"73163",da144c90:"73193","33e8889e":"73264","7bd25ebf":"73276","45d08048":"73286",c7f860be:"73290","8b1b48fb":"73316","97d2cbab":"73331","21838a86":"73376","681664ad":"73397","70c4ca3a":"73428",ae7930fa:"73471","158cec25":"73473","5ebbf59b":"73539",ac6289fa:"73569","01689e9b":"73607",c6ea0115:"73693",d8415e6f:"73756","7efb13d8":"73779","5cf43a2c":"73800","4d23536d":"73864","06dd3057":"73888",d721a748:"73891",d502d9c9:"73905",ccd984bd:"73906","8b683930":"73922",f4731b9a:"73940","14841d7a":"74019","4711b74d":"74031","2e6d9cc0":"74039",b7aeb8c2:"74046",ea5e46ff:"74069","8574818b":"74076","393be207":"74134","2fd7ee6b":"74282",acf7953e:"74312","3a983156":"74401","103c2fe7":"74418","111d9467":"74524","84939cad":"74588","033d3629":"74657",e6ce3bd9:"74684",a2afef33:"74768",a5ac74f6:"74792",ec7a5af3:"74880","37b8c62e":"74895","43c329f5":"74902",ad848ffa:"74945",f3ff39ad:"74950","9b3f2ab9":"74961","1c4d0413":"75043","8df3f976":"75062",dd620de6:"75078","9f49c871":"75106","0b0e328b":"75121","3126d1b1":"75173","20c3f46e":"75190","6dab9497":"75267",f2e2ec6f:"75298","152f3add":"75317","84aa8d64":"75359","847c1b9e":"75378",de0473f6:"75396",ceaa6e69:"75405","3e627431":"75442","1e94defc":"75454","605c3775":"75459",c6260f29:"75461","28a52d92":"75484",a9f98915:"75637","2aa42d18":"75666","1ad07866":"75696",d2250181:"75718","264ee92e":"75723","724a4edc":"75775",ad132b09:"75805",d95030e9:"75894",f18854fb:"75911",e01c8f09:"75919","6d79f7cf":"76023","03240ae1":"76041","1778a2f7":"76166",d9605822:"76215","6a3d5afb":"76235","075f4b70":"76262",cb46984a:"76264","1ed4b1ad":"76289",b85747a8:"76293","2519b708":"76299","9267add8":"76368","4fe377f4":"76517","594c10ba":"76530","9a3685aa":"76589",b6f16885:"76683",a50107bb:"76719","9a68cfff":"76748",dab72c8f:"76788","2b00a752":"76854",e364f7ff:"76871",a01a15fc:"77077",bf048e24:"77088","62825cc3":"77123",ce019e24:"77174",fe2389d2:"77222",cb62deb4:"77223","3e56cb01":"77240","1aef3c3b":"77261","109d395b":"77298",c4acdd50:"77369",f3ddbb03:"77373",d0c84d34:"77391","898b52e9":"77659","60381fc6":"77698","3a31d53f":"77749",d9e41302:"77787","793951b2":"77901","33ab05f6":"78001",c9599a77:"78037","3b78a115":"78069","90caa6a1":"78087",c55dd5b8:"78127","8df10e0f":"78159","5455ca0e":"78199","79400fce":"78217",f7f417e7:"78220",de5d0473:"78283","1682c6e0":"78312",c1b680b7:"78354",b1a2ea9a:"78421","28ebe10c":"78497",b7e5c092:"78512",ff4a022d:"78522","4adc4126":"78544","95365ba3":"78583","02c57050":"78595","7abfd700":"78608","4f1d1584":"78632",b80df7ca:"78704",c7dbf2b8:"78717","6000d05b":"78764","04c3dd09":"78820","4f0afd2f":"78858",f99d7a76:"78872",c8939218:"78912",ccd7c88f:"78985","0ee8b775":"78988","803df44c":"79039",a94703ab:"79048","3b97b725":"79138",cdc43a7d:"79150",c884c38e:"79157",cc426672:"79180",a2030166:"79416","9740270c":"79481","8b7dab17":"79485",fce2bd9e:"79487","368f9c22":"79506","09b9b020":"79521","921cad0e":"79524",a39d4ca2:"79534","85e0d297":"79635","1bfbaba8":"79656","8be24c4d":"79739",e64c963a:"79776",fc26a5d5:"79841","619263e9":"79866",f962f7fc:"79992","5e4ec6cd":"80018","1d1643d8":"80022","93c339e4":"80046","587df15f":"80091",a34d992c:"80100","7349f9da":"80102",e81448e3:"80159",d38a6f54:"80198","6a7c2838":"80201","8aabb1ce":"80260","3c89ed52":"80310","4eb79faf":"80315","81f854a2":"80342","2fd10e89":"80362","81c96f91":"80408",abf14b6e:"80424",e1a35040:"80442","992bda30":"80457","318980ec":"80458","7080aeb9":"80491",a8418b9d:"80524","57f28ae4":"80525","27321f21":"80531","5cb06d06":"80557","9aa3eb98":"80579","80f24550":"80649","6d70fa33":"80677","84ac5929":"80750",fd440a88:"80772","442da8c1":"80794","2942b330":"80810","413bf93f":"80841",b6aee096:"80863",c141421f:"80957","5ea38e3c":"80998","820b9813":"81012",f74d3bfd:"81019",c88d5fcd:"81050",f98df6cf:"81175",ddf9f187:"81188","347b93da":"81212",d99629a2:"81265","12363bc4":"81319","7af33a93":"81410","0e6e8143":"81435","46baeff3":"81438","439b75a7":"81497","13685ceb":"81544","04a0ea54":"81585",dd7ad24f:"81643",a74d38f6:"81666","015f929f":"81691","0d9e9c41":"81692","9df95cfa":"81728",c75c3ca5:"81737",fddd2104:"81770",d3571192:"81791","59115b3a":"81846","29470dda":"81902",acecf23e:"81903","2a59c009":"81982","95a252da":"81996","755e7c7e":"82019",dd5c5048:"82096","9920fffc":"82221",d2c9f0b8:"82261","226eff01":"82297",b87f99cc:"82354","7345c721":"82362","0add85e5":"82553","4ccba4b8":"82754",d45b1270:"82774","0b94f8a7":"82776",dd09cc7b:"82847","12cecbf6":"82905",c609eda1:"82932","492bd0ed":"82946",a76e45f1:"82953","732a7c43":"82987","7f710e67":"83000",dac8839d:"83027",f729154c:"83044","42174d87":"83078","686a74aa":"83089","21cd7edb":"83103","6060cc06":"83111","10757cc8":"83127",e5cd0e7f:"83182","95126e44":"83203",ccc49370:"83249","5c26bf07":"83260","2b6eabf2":"83273","0ba08ea0":"83316",d0f169c8:"83378","3305f513":"83379",e6c42ffb:"83431",df2607af:"83439","8ac4b897":"83509","3d9e5426":"83523",cb5bafe5:"83534",bbefe8d8:"83561","1b2dcba2":"83566",c85c7bc6:"83574","19560f91":"83608",fa4876cf:"83612","9e37e644":"83670",a8c902bd:"83700",e6fc8a9b:"83779","5bb71e94":"83814",cc517726:"83841",c48426e8:"83849","58dde135":"83870","6f2a2977":"83901","98a236f3":"83923","345eb925":"83928","757c6784":"83932",e67a83cf:"83954",e200187b:"83970","0e384e19":"83976",c17d6939:"84013","511d3e84":"84070",ed83b9b9:"84107",f50461b9:"84112",d2ed2b82:"84152","17d9fbbc":"84227","901160ed":"84255",a86855f2:"84256","2ffd8514":"84259","1132d5f6":"84319",e5fa0c05:"84324","0b82d45d":"84332","615402d6":"84467","8180940b":"84527","5955b5ee":"84530","2760fb69":"84563",d9a7203a:"84572","19441c68":"84711",eeef4db4:"84754","1c52b634":"84755",b738b15f:"84773","6875c492":"84813",fb6c680b:"84822","6bd2e919":"84869","21014f01":"84878",d9d878d8:"84963",f4f70b42:"85008","112387f4":"85073",ec173259:"85086",ec2ed6e2:"85095",ab380486:"85105","0cf3b0b8":"85205","8beefa16":"85209","80b92086":"85228","78c968cb":"85243",ffec2b37:"85257","8f4a15da":"85279",c9ff545e:"85322","3dc48fec":"85353","2f6614a5":"85442",de5aeda1:"85453","10d4d7ab":"85478","021c0cbe":"85529","2c88985c":"85537","86c0ae26":"85558","8f9bc413":"85581","24e645af":"85588","0e8c3a89":"85736","9aa57b9d":"85867",c9fc48eb:"85896","41639dad":"85899",d5ebbe5f:"85905","716f14d9":"85917","5268c144":"85960","94811a36":"85967","5733876a":"85973",d6ce3007:"86063","677325f0":"86121","1f8198a4":"86167","95ee2976":"86215",abe1b280:"86216","7a2c4c43":"86246",d630316d:"86354","669193a7":"86417","8609b6c1":"86424","2a1b9f9a":"86478","3a311bb0":"86480",f4e1ab69:"86501","8bcf4d99":"86596","0e0dfb6a":"86597","6522b4ea":"86616","7ff6577b":"86659","927f97a3":"86669","58421c87":"86685",b0445ba0:"86807","57ec2762":"86846",c942990c:"86856","5687c7cb":"86888","319b6f13":"86890","869411c7":"86914","7a06eb83":"86939","99f485fc":"86955","9c273b44":"86978",d2a66e94:"86992",b62a4e5f:"87004",ae399c1c:"87145",ddb4c0f8:"87178","4462c0cc":"87184","767cce31":"87186",bad31f72:"87205","9c71777e":"87217","747973bc":"87269",c884ad6a:"87282","7a0a590a":"87309","0ca9b6ce":"87334",c4f2c374:"87377","740081cc":"87389","65917e4b":"87420",cfdf8269:"87423",b8f2cc13:"87459",baf4021b:"87473",d5762a9f:"87483","643da015":"87485","0e80f4a8":"87495","813eecac":"87514","74663bf1":"87598","7c29a585":"87614","022ae4ac":"87669","137db567":"87688","3f1a4665":"87747","4afdd010":"87779","6f831635":"87781","4194f325":"87863","01f93a4b":"87875",f553a7ec:"87880","6ccdf67f":"87892",fc17862c:"87905",be72319b:"87922","5b17955f":"87945",dc4ee1bb:"87971","85f9f5a6":"87995",d96d1865:"88044",ca3d464c:"88111","2e05ee79":"88163","10a1a3fb":"88226",ed990644:"88248","85e50ec2":"88298","0169a509":"88310","5ae50f21":"88394",a13618bc:"88436",bf79ed6f:"88468","23a811a2":"88478","2283659c":"88547",b3488ec5:"88591","5871fbee":"88622","6e8a38ea":"88626","6be5dbf9":"88696",b330ac5c:"88775","71cde98c":"88815",b0b71a2a:"88821","014c2cb9":"88847","508d741f":"88852","5edce1ad":"88855",ed9c0dc3:"88930","2da04d93":"88962","7b658d8e":"88986","2c9ce68e":"89018","01950f26":"89058","9a69dd97":"89082","5a1f4d83":"89083",fc93a2ea:"89093",be17da6e:"89154",adb96665:"89172",b70c8f5b:"89202","9b191135":"89210","8ff4e20f":"89243",d8e6b3db:"89289","324cb577":"89338",b919dab0:"89353",cb2f16be:"89362","3373d63c":"89367","4cc89b71":"89387","39ac0d5b":"89402","9ed26de9":"89415",ce1709a8:"89437","978ca64f":"89455",c732f250:"89541","7ff4234e":"89554","2d4f05ca":"89610",cde9af88:"89641","06f81f44":"89650","837dc7e4":"89696","084a80b5":"89801","9bfa1541":"89810","36994c47":"89858","65f8c8fd":"89873",e582f766:"89986",bfb3b697:"90066","25b57518":"90092","8abd7194":"90135","9db841c0":"90214","7b773c92":"90257",e70003d3:"90323",ed2667fa:"90414",fe49dcfb:"90438","50e73369":"90497",f4e4421a:"90502","6157713d":"90513","32eb34e5":"90562","78b09214":"90610",e3d36349:"90656",fff1effb:"90717",b843b03b:"90727","48dc1693":"90749","758aa2d1":"90818",e96ddf11:"90831","837010ac":"90842",e03c6723:"90910",a677093d:"90960",a714cbe0:"90968","70e8710e":"90972","9ba9f70e":"91016","722aa41f":"91017",cdd81d53:"91025","97ce358e":"91046","014625f4":"91109","3629c812":"91187","0f84f33f":"91319",d1980a1b:"91333","88f66091":"91359","68bc82c3":"91396","284c57b4":"91428",beaec3a6:"91517","7118d0f0":"91530","980d0b86":"91540","81ecc5d2":"91568","8614d32b":"91581","1fecd571":"91587","979e654f":"91612","6033c607":"91695","31cc39e5":"91715","9964550a":"91724","2c1d4307":"91765",a37fea11:"91768",df99aa82:"91787",cb350fc2:"91837","41ca93cc":"91844",cd630e7b:"91881",b7201a27:"91895","72fdaa88":"91916","8ce0215f":"91993","0ce689e1":"92018",e2c3948d:"92031","4cce6e5a":"92125","90b60297":"92142",f355773d:"92175","56a0d755":"92196","85fe7d70":"92273","4a4c6752":"92329","4c434b32":"92410",d888d821:"92412","1be20fdf":"92475",b6eb7220:"92535",e53ee22f:"92544",c36ed022:"92570","283d6ebd":"92577",efa442c3:"92653","7c1d6f5a":"92664","9dfaf941":"92673","211e6ca6":"92942","3e082aad":"92955",adfd3bc1:"93057",fed5be48:"93166",e55ca189:"93210","79f4d1f3":"93241",b12147a6:"93269",cf32db66:"93273","0f59d921":"93281",e5a53ed5:"93310",ad148db1:"93352","7a234181":"93362",af68afaa:"93427",e1847ef7:"93636","49c7888e":"93781","09bacf3b":"93849","0a07ac32":"93854",c3c082a1:"93884",ee71d619:"94065",cd593b9a:"94077",beceb38b:"94091",acddd5ca:"94106","5869b01e":"94155",f67432e2:"94188",cffd1a69:"94215",f0cc57e7:"94227","824e6f8c":"94251","00f9d3c8":"94314","85c8b6c7":"94417",f1579842:"94429","55f86eeb":"94445","1af446b4":"94475","13feb7a8":"94538","8e7aaae8":"94555",a1e44e64:"94561","745d4b8c":"94568","72e16faa":"94592","0a02a2d0":"94625","783e4c37":"94631","50774ec6":"94648","0c2c2d88":"94711","0ae9f46f":"94750",e922bdf9:"94776",c26e67a5:"94788","256701a3":"94796",a1282170:"94841","3e1f4a39":"94843",fc66001f:"94863","95ec5604":"94864",bb63d03e:"94910","4e7b7607":"94921",e8b41ff0:"94925","5fc8caff":"94980","63c4b13e":"95020","4b69979c":"95058",f7750a15:"95093",f697d99e:"95108",c0df5757:"95136",cdb727d9:"95159","1cb0fe52":"95231",b4030b00:"95240",ed211a79:"95245","526262ab":"95407","52910a8f":"95427","8a40ff6b":"95470","7db94a09":"95505","5c49bc18":"95528","5917c028":"95542","8e175eb7":"95613","188015be":"95641","4885c521":"95649",cb03669e:"95717","89ce4ba3":"95768","8c79a60d":"95785",dbea5ca6:"95818",debfe2ad:"95832","3b1c0220":"95900","9e488927":"95909","86ed5607":"95980",eb84cef2:"96086","380e17bf":"96239","638db053":"96268","82a7c68f":"96276","65d1ec04":"96325",e3dfbe38:"96355",ddd9290b:"96463","1b260ed9":"96470","8168f54b":"96533",d4083900:"96555","19f4d091":"96609","9fd8c386":"96646",a98ffe6a:"96771","78775dd1":"96846",bbabcc43:"96863",d527c17c:"96881",e8630c63:"96939","7ab01152":"97006",e9032a0d:"97033","62a12351":"97038","9331da7d":"97107","32bb5bcb":"97114","9d2e74da":"97123","20a30ea0":"97167","7fa05810":"97223","365a7fd7":"97246","0b79e3ae":"97251","1a8a162f":"97253","5345b11d":"97286","205cdcf8":"97296","99ac6847":"97316",c2a473ad:"97342",e507660f:"97352","3bfbd79c":"97379","224c7e3e":"97420",ba47c136:"97424",b93a682d:"97476","3a6c6e5b":"97536","3d08e0be":"97562","8e81e342":"97585","169379e7":"97618","1dba1ecf":"97670",e77acc18:"97710",b58e88de:"97732","8fa9d00b":"97737","7d2fd416":"97763","77f37b47":"97768","97a057b3":"97821",e5562b89:"97829","47edbc34":"97863","26ec8ae2":"97887",ab8b4014:"97895","1e228808":"97913","6018a0af":"97944","139d61ea":"98021",bd3cb29f:"98070",b18455bc:"98087","48f67822":"98094","3c410a59":"98127","0d55f18d":"98154","6dd52a8a":"98178","3539b92c":"98237",f62bafa2:"98271","9e297776":"98311","1c3a958e":"98392",b943b6ea:"98425","94dcd3de":"98473",ea6f04d4:"98477","6065ad54":"98534",e155b22a:"98660","99e64d04":"98700",af6e9729:"98758","3314c9d3":"98761",a48978f5:"98779",bf667688:"98804",b4e94af8:"98908",ab37b32f:"98925",c9ba7c72:"98941",ef00b8a0:"98947","9ab9816d":"99077","1c27379d":"99095","9d47e342":"99105","8e563661":"99151","70f30c1c":"99236","3047f3e7":"99252",d5405b72:"99280",bdecca0c:"99306",b3e98411:"99330",df09200e:"99335",ebad1003:"99389","5ffb8f23":"99437",c0684476:"99451","2263a65b":"99502","76af5d51":"99504","16e939a3":"99528","8c2cbe8e":"99531",c49eb59b:"99534","25c655c3":"99543","9cc8ffa2":"99611","25e15e7c":"99678","5a4dd75d":"99701","5fb14ca8":"99705",dc330c71:"99709","6e34d00c":"99710",f4a839f6:"99746",a32c0324:"99747",a9be9b10:"99764",d1ceaa61:"99839","2f7d15c4":"99905","8ebb6eb1":"99970","4b2e4980":"99987"}[a]||a,r.p+r.u(a)},(()=>{var a={45354:0,71869:0};r.f.j=(e,c)=>{var d=r.o(a,e)?a[e]:void 0;if(0!==d)if(d)c.push(d[2]);else if(/^(45354|71869)$/.test(e))a[e]=0;else{var f=new Promise(((c,f)=>d=a[e]=[c,f]));c.push(d[2]=f);var b=r.p+r.u(e),t=new Error;r.l(b,(c=>{if(r.o(a,e)&&(0!==(d=a[e])&&(a[e]=void 0),d)){var f=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+e+" failed.\n("+f+": "+b+")",t.name="ChunkLoadError",t.type=f,t.request=b,d[1](t)}}),"chunk-"+e,e)}},r.O.j=e=>0===a[e];var e=(e,c)=>{var d,f,b=c[0],t=c[1],o=c[2],n=0;if(b.some((e=>0!==a[e]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(e&&e(c);n{"use strict";var a,e,c,d,f,b={},t={};function r(a){var e=t[a];if(void 0!==e)return e.exports;var c=t[a]={exports:{}};return b[a].call(c.exports,c,c.exports,r),c.exports}r.m=b,a=[],r.O=(e,c,d,f)=>{if(!c){var b=1/0;for(i=0;i=f)&&Object.keys(r.O).every((a=>r.O[a](c[o])))?c.splice(o--,1):(t=!1,f0&&a[i-1][2]>f;i--)a[i]=a[i-1];a[i]=[c,d,f]},r.n=a=>{var e=a&&a.__esModule?()=>a.default:()=>a;return r.d(e,{a:e}),e},c=Object.getPrototypeOf?a=>Object.getPrototypeOf(a):a=>a.__proto__,r.t=function(a,d){if(1&d&&(a=this(a)),8&d)return a;if("object"==typeof a&&a){if(4&d&&a.__esModule)return a;if(16&d&&"function"==typeof a.then)return a}var f=Object.create(null);r.r(f);var b={};e=e||[null,c({}),c([]),c(c)];for(var t=2&d&&a;"object"==typeof t&&!~e.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((e=>b[e]=()=>a[e]));return b.default=()=>a,r.d(f,b),f},r.d=(a,e)=>{for(var c in e)r.o(e,c)&&!r.o(a,c)&&Object.defineProperty(a,c,{enumerable:!0,get:e[c]})},r.f={},r.e=a=>Promise.all(Object.keys(r.f).reduce(((e,c)=>(r.f[c](a,e),e)),[])),r.u=a=>"assets/js/"+({16:"0583dad8",25:"a33c645e",28:"0da1f28a",48:"a674d2f7",67:"56169fa6",129:"275b5c51",142:"9c707294",159:"af8190e8",192:"55840584",217:"b1f77b90",273:"991760df",292:"fcc9c1b0",323:"be9655ff",339:"1f92d8dd",354:"0b4da2f0",387:"19ac452e",437:"a168e2e0",569:"b4a99b76",614:"0a87a91b",878:"e9038c17",917:"71c6c219",924:"9699c87d",940:"0c459987",982:"5a8ef24f",1017:"2ade4e52",1107:"060b2af9",1119:"e3b4090c",1151:"83de9812",1190:"b0127f30",1211:"74fc40e3",1397:"515c7131",1422:"562c897e",1458:"d77e6b8f",1459:"a1c7d286",1517:"da868c82",1550:"8425e24c",1622:"0ae1dc96",1635:"73c8d421",1707:"eaa4e767",1715:"2f671d1e",1717:"89ad6a53",1763:"90afd727",1784:"89dd9b54",1841:"92bb01f4",1846:"9f349e0c",1857:"d032d8fc",1882:"c28fec2b",1928:"6e47a3c2",1949:"051e9a76",1955:"7fbadf7c",1957:"c12d6ad3",1983:"b93dc3c9",2016:"3c15683d",2053:"7a3be72c",2072:"7bec99d6",2106:"1e050fc5",2121:"fdb4abad",2200:"92b5ed46",2214:"32aa7863",2225:"9781112c",2256:"31863783",2298:"d2a01f74",2368:"717625a8",2385:"fb4f9065",2450:"3b3f1ad3",2472:"1b7e3feb",2540:"e8b490f7",2577:"b9e56da2",2640:"dba6e014",2652:"9ed88412",2663:"9d0312da",2679:"7e9327af",2696:"67f5e351",2700:"5e58268b",2732:"56173bd1",2739:"4c5bb0e3",2748:"7c87f31d",2759:"d28b7dcd",2772:"48f24bab",2791:"ba2305d7",2839:"00cd9d46",2854:"093ec6b1",2918:"9dc1ea4d",2932:"580eda40",2954:"6e7eafb1",3050:"200d970c",3075:"a80470ee",3104:"a4b2d8ca",3125:"32dcc326",3131:"d29911ee",3137:"4f7cd6bb",3144:"aed1d196",3151:"40ebd41e",3174:"f75eea2f",3179:"5c3bdea9",3303:"6be904db",3313:"a3e90044",3323:"b9073401",3337:"388a1337",3482:"f237aa38",3558:"538c7955",3693:"b783cafb",3722:"50cd3db4",3740:"dc1f5b39",3764:"394bb252",3843:"7c1ec31e",3940:"260d7fd0",3965:"d18b6106",3968:"50494a26",4040:"b4ced939",4060:"0bf991f2",4074:"817ed3cf",4133:"b18f8924",4205:"0c12eeea",4355:"1497bce1",4362:"30f46c87",4368:"25fe5fdb",4405:"1dcf0194",4425:"26d64354",4442:"ad9f509c",4467:"ff5a6f64",4530:"1cb4ff83",4574:"d9f219f0",4591:"405284b3",4602:"0be544c4",4629:"98bce106",4777:"43d0cc21",4790:"3b6474f3",4795:"f162832b",4863:"a0c4b68b",4890:"7c52b6f4",4919:"4929a6fa",4980:"006c64a3",5028:"f5c507c6",5029:"ca8c3af7",5065:"25ed107d",5137:"15fcb894",5168:"a3417ffc",5193:"d0ff2798",5195:"8c7f4a45",5268:"8be9b28c",5270:"6ff0c558",5289:"b3a451d2",5295:"bbc3d059",5322:"22b4f68c",5334:"86642e8b",5338:"0e11b6db",5397:"b9ef0c47",5594:"0c74166d",5622:"fb863cab",5631:"32ba6a4c",5633:"a804bb8e",5685:"f8763f0d",5721:"42bda306",5795:"37ae1bc8",5806:"1adb4ab6",5887:"b5960565",5888:"478a7123",5936:"4959f63e",5988:"c4d48ead",6045:"11faa303",6082:"ac2c8141",6090:"384f1d9f",6158:"0d706529",6171:"4fb8ea95",6203:"0ba05648",6225:"baed6a8a",6289:"59ba4d58",6350:"ce3c8465",6370:"36f2d01a",6371:"4658250f",6372:"5c865244",6467:"3faff22d",6482:"2a1db3a7",6542:"a49707a6",6552:"ae59a273",6559:"21b16c5b",6605:"d5ace2db",6636:"f6a1f09d",6677:"ea2cf37a",6697:"17ace3c3",6709:"debf2b54",6739:"01ceb854",6761:"507d925b",6791:"ae0384e2",6823:"4f684eef",6827:"cd9c899c",6845:"5ac9b8db",6897:"b52407fb",6944:"52f660a4",7033:"2aca441f",7035:"e841f655",7071:"6e78b29b",7100:"e7c12d1f",7125:"b744ccc8",7140:"3445e83e",7160:"eec9a679",7167:"bfd461a8",7233:"2a6ac43b",7277:"598dec22",7317:"b1b9fe16",7355:"96f48bd9",7414:"ec45592f",7444:"502758cc",7458:"8fdc7f76",7462:"f786ec4f",7517:"4abd5d51",7564:"faf188f1",7693:"d29a4f88",7715:"06a1e3b2",7724:"b3716f55",7734:"d6b46894",7773:"869d1599",7802:"deab0229",7844:"996feafe",7861:"f09bd126",7881:"28b030e0",7904:"9b8d6628",7907:"7ba20019",7945:"e0f7a560",7949:"95803b07",7953:"df4b657d",8003:"f85e4dd8",8070:"0480b142",8177:"38122bdb",8183:"c7a3e7d6",8192:"934057b1",8209:"01a85c17",8263:"e1d02585",8281:"14cab7b2",8289:"c286af15",8348:"09ff3d76",8354:"db9fbbab",8363:"24179e00",8367:"abd23114",8413:"cd17745a",8417:"bbced460",8583:"3c06fd15",8585:"497095d8",8606:"b6159c54",8619:"15c2f51a",8645:"212a125d",8651:"80bd773e",8668:"6598f23b",8688:"d7d5c50a",8762:"1cd42d14",8766:"7a11cfa3",8840:"e161c803",8874:"9c84f0d3",8888:"3a6a48c9",8889:"effd3c61",8892:"56ab6e97",8900:"eebb3a9f",8909:"48912a3b",8965:"b6e28713",9045:"7c9ee56f",9127:"29c12ff9",9151:"57c73c9c",9152:"17666b14",9189:"d4eb85a9",9195:"b2d2727d",9225:"7b3a4001",9228:"d336ca2e",9257:"0687df23",9333:"00766a8f",9351:"4c14260d",9426:"1a41dab5",9428:"cfb1206c",9432:"8cd4ff44",9446:"49b92117",9458:"762ed4b3",9471:"ebf12a38",9478:"c36198b5",9499:"953153ea",9516:"2fec12c7",9570:"8eea179e",9631:"79e67a34",9647:"5e95c892",9676:"48cf1cd0",9700:"56382a79",9702:"a0d28f55",9722:"c35662b8",9737:"0d37dd31",9790:"6a0b8fcc",9836:"2fd2285d",9856:"db607657",9860:"d6d00b14",9870:"36e3724e",9888:"c14217e6",9891:"8a5cd0c4",9896:"6b16b25a",9914:"06b7dbb6",9944:"9ee88b57",9986:"c782ecef",10030:"c2277200",10118:"f89af623",10181:"f7519df0",10198:"ce5d6b55",10238:"0eb44ec6",10285:"b69fdc1c",10354:"8c29db87",10384:"d592eee2",10472:"0ca8e4c5",10510:"bc663e84",10535:"79c374cf",10569:"6766f38b",10637:"6a326c1d",10640:"13dfa837",10642:"936cf648",10682:"a65658f0",10683:"d496317d",10708:"a83dbf38",10727:"f53cf472",10767:"931768b8",10789:"10fb8f29",10801:"f8d8c88e",10907:"b964b0d3",10920:"42746bb6",10954:"2b571547",10956:"726b1d2e",10978:"90db14b9",11e3:"9294d9ac",11002:"33727eb6",11111:"2750cc84",11238:"b051e9c6",11275:"2e961a80",11289:"82b971d3",11299:"ac338f84",11326:"f9cb0cea",11330:"9a744c23",11355:"6ed20719",11508:"039c7621",11624:"5090da06",11631:"d2a270f8",11682:"186775cb",11725:"51e360fd",11738:"4a7296a1",11745:"446810fe",11768:"1db5e20f",11775:"dba75126",11783:"968bfe93",11795:"43ff550e",11804:"b9168984",11842:"f630dd79",11855:"51e592eb",11869:"43c57b15",11905:"41b6dd58",11906:"757b41cf",11977:"608a85b6",12047:"d25544dd",12110:"8e6bc4eb",12123:"1a730a78",12134:"088c57bd",12144:"5617941b",12186:"3deb4153",12316:"77a5f3f8",12318:"9b28f794",12378:"2592f25d",12395:"a0fb693a",12431:"61c30610",12452:"f4a568da",12477:"ac9a039d",12513:"70570476",12535:"2ca30cc7",12542:"0bce5bfd",12613:"bb6acec0",12617:"89412d1c",12650:"880a76a4",12654:"98af85a1",12686:"f81e2128",12869:"236efcfc",12912:"e57d167d",12945:"bc561320",12995:"72ed5e19",13021:"9b078b3d",13060:"075d0b63",13063:"6695bce8",13124:"ef2299ac",13152:"4d01f822",13203:"a5fd3751",13236:"814487fc",13358:"86aca325",13374:"0c9b8a46",13375:"15be7f5e",13419:"05f125a2",13460:"5b6b8d73",13465:"f7887fd4",13525:"aeb9cb2b",13534:"a221d960",13562:"430c4f94",13580:"b7ffc82e",13698:"e32c93f6",13733:"e4126631",13762:"35ace877",13803:"5005f1cd",13918:"a586ac12",13943:"79c522c5",13970:"7dcf0740",13996:"bb5bef2a",14003:"fe0a5e13",14027:"4fe2812d",14042:"6c6eb236",14043:"2da40935",14059:"160c3f1b",14125:"c58d5881",14134:"88677a17",14136:"5ba7f3a0",14152:"0c792305",14163:"79f5ed7e",14168:"44c788da",14179:"0466f8a1",14224:"e78cae60",14257:"973a6c2e",14259:"4d62164b",14261:"881e0310",14264:"15b03510",14286:"816e216f",14340:"02704d8d",14363:"33732613",14381:"720024ad",14388:"4330e2c5",14399:"95a29cbe",14410:"262f048a",14435:"a2218d2d",14446:"7990d23a",14483:"11c5ad4e",14496:"0dc66419",14515:"b3880c0f",14536:"b812e3a7",14549:"13366fcd",14599:"04287605",14627:"6b0d4b59",14629:"c135661e",14683:"7cd7848a",14726:"cb290368",14750:"8049dc2a",14817:"cf066a97",14822:"da9a6aef",14844:"d58d42ac",14868:"9c9e6d14",14917:"b2f79aaf",14919:"68aea991",14943:"b634826e",14971:"ffce8ccf",15078:"6773b5f7",15079:"461201e5",15144:"e6691bac",15186:"809a1b46",15220:"e0719818",15235:"246d116d",15272:"ee5dc595",15292:"7bd6096e",15316:"a0583d0f",15387:"f9b192e6",15403:"bbbd3731",15473:"ad07d5ed",15528:"6bd26a95",15552:"1ff337bc",15607:"a309ba1a",15654:"c821ba53",15744:"55b3e6a2",15746:"03719399",15805:"65df1ffd",15875:"6d300ee1",15881:"4bf163bd",15896:"c26e381e",15917:"04d2875d",15947:"f05cb9af",16032:"7f5a2db2",16090:"4de90ec7",16100:"5685cb00",16209:"f0db470e",16378:"a2da2f5b",16560:"ebda94c9",16622:"3d8e248c",16641:"4ccf094c",16649:"2e0d7695",16660:"c01089d4",16685:"ff1ef8b0",16689:"682a1736",16745:"1b334a26",16775:"c5392341",16803:"751ccd8a",16885:"7c3644b1",16942:"426a3c0f",16999:"ec65a1d1",17033:"30e67995",17232:"bc36781c",17294:"82fc01c6",17332:"b4762a45",17368:"de821e02",17402:"b629aa71",17411:"496a5e3a",17441:"c5c8072f",17502:"dddd9631",17530:"8c212f85",17606:"c8aaf3b1",17626:"47f3a505",17681:"a2af438a",17697:"2122acab",17709:"89514438",17722:"de64262d",17727:"764a6545",17803:"4f311863",17818:"2d9024ae",17860:"7cfc22c1",17867:"9130943e",17899:"992c886e",17987:"f67021ea",17988:"a3255c75",18006:"059d2658",18033:"c1fa975f",18103:"7707ed5e",18115:"85902cb9",18142:"c58d3901",18187:"8e562778",18205:"e6cee3d7",18299:"59b5a3af",18351:"670426f7",18375:"a80e0e03",18401:"17896441",18438:"7eea383c",18445:"762cb2d4",18520:"905fdac9",18551:"9dc242cc",18616:"b3c2b735",18620:"1bdcf2af",18645:"e798c07e",18738:"3b375bfc",18757:"10b6d210",18940:"6cc2587c",18950:"d75d009b",18998:"7487c019",19040:"fcf2eafb",19042:"378587af",19052:"6e547e58",19070:"6f878c05",19108:"6f3d983d",19237:"e77e0240",19369:"a2cfe627",19387:"9228ff94",19396:"c61ed569",19428:"4b6ad6c1",19521:"7f5a4e86",19542:"3548485f",19578:"c58d7350",19659:"9c65fedd",19664:"76b52ed8",19686:"2bd614fb",19711:"0e4a3360",19774:"3c6c92ad",19798:"83c71362",19801:"a5052667",19851:"f36e33a7",19865:"7e53000f",19894:"ca2ec6d9",19999:"436f8775",20103:"430ee71a",20116:"fa230427",20154:"9e0a0edc",20160:"ecc82a52",20216:"83e7d916",20229:"5aae4c30",20286:"f60a8e85",20304:"13d37261",20358:"a55cf427",20361:"915fad0f",20405:"a170c4b2",20415:"839320c8",20428:"9de16aaf",20434:"39c0c867",20491:"4c056f0f",20535:"ca16b0fe",20541:"2925f13d",20596:"bcad8cf0",20639:"678bd7f6",20661:"72c396ee",20713:"ff781369",20812:"a827f20e",20892:"1d99c39c",20924:"92328698",20951:"5ef30e9e",21070:"e3b4fd8a",21121:"c1b7702d",21123:"b2a1bef3",21177:"574aa417",21191:"53798754",21273:"58f98693",21275:"e737da10",21292:"9eea3ae4",21303:"e4bea80c",21316:"266d37b9",21346:"b2c62a3d",21373:"50737734",21417:"9db9c0e0",21492:"f48374b5",21510:"70b56ba8",21524:"69f9ca18",21560:"6c888f35",21585:"d17a9646",21630:"aad02470",21635:"6224d640",21644:"7682eda6",21683:"b3f2f317",21729:"ea9d899a",21805:"1926d3d7",21874:"a54a9a31",21921:"a8a7f86a",22087:"ab4d9aa4",22124:"3ad1da61",22141:"625beb64",22170:"2231732a",22178:"49e3a5aa",22236:"60be01c6",22257:"e605a73c",22262:"a94ba305",22385:"9a5e9795",22447:"f93d9ca9",22499:"2923e8f3",22501:"ff15e2eb",22504:"61773850",22534:"6f37f43d",22579:"6e771e2a",22595:"ca5d6ba8",22640:"69375b61",22651:"6d250944",22702:"e0618342",22791:"a4289c8e",22809:"743819ce",22816:"70db0e3d",22911:"9a29e675",22916:"d49fdba3",22932:"0d5f3865",22969:"6a44fd90",22970:"97b786bd",22973:"70a32eac",23002:"1fd06df8",23039:"ad58910b",23041:"07da43c6",23081:"ef1c4348",23119:"39307ee6",23141:"a1c39b3f",23208:"b8dfc3a6",23332:"fe86f3f9",23388:"fa5f4abf",23438:"95d97af4",23475:"fdeab78a",23545:"d4f4b34a",23563:"f24f712d",23591:"53746e73",23600:"af9b00f1",23634:"59e9dc06",23637:"9c150758",23641:"35313843",23666:"cb16b650",23676:"d235b83f",23700:"ea8366f8",23805:"79757e7c",24033:"a268f692",24036:"54c79a13",24065:"5ef1cef9",24071:"a83d9791",24084:"4ed60a8a",24098:"81c34363",24126:"897856d4",24140:"5ce7213e",24143:"54482276",24172:"4b2ed2d0",24234:"3af3061a",24265:"7ebf6f1e",24292:"45a47a41",24301:"205ca674",24327:"bbb172c1",24340:"a4e075be",24366:"99d3870c",24377:"b5b376a0",24393:"9be81a8b",24475:"045bd6f5",24476:"6cf93e89",24607:"8a733352",24618:"174b58ca",24644:"9555b08a",24649:"e781e98e",24652:"ff00d8f9",24704:"3befffe2",24728:"91c64349",24826:"ed6ec893",24838:"1574adde",24853:"7cfd7c3a",24891:"f0709bee",24912:"8e01a36e",24919:"cf6129a8",24970:"231cac3a",24991:"1db9daab",25044:"9cd11b72",25101:"8bd2257d",25130:"b277530c",25173:"8a95094d",25186:"96046d19",25243:"f118f569",25285:"1da16fcf",25335:"537936fe",25397:"4083b748",25410:"e346ea56",25450:"143635a6",25452:"5ef8e026",25469:"2a44fc97",25531:"af5c68f9",25532:"20429fae",25539:"7fb09d55",25582:"65603bfa",25632:"71651e9e",25671:"dcc6ca2f",25731:"9c2460d0",25778:"d56bdeaf",25781:"ba115cad",25845:"d2c3f17d",25874:"17268e53",25987:"1645b95d",26003:"90c5833e",26009:"20f9256f",26079:"4f978fc9",26183:"fd6c914a",26184:"a937858f",26216:"4e3e1e17",26260:"477cc2f7",26305:"878dce9b",26333:"9579dcb9",26337:"65009e94",26352:"af138e2a",26610:"26008da6",26627:"8353278b",26632:"960d3eb8",26722:"1802ae9e",26744:"21e535c3",26797:"4681e75f",26812:"38cf2270",26882:"958a296c",26900:"b3749361",26986:"9d0e7fc1",27012:"aca5eee4",27020:"58714c61",27088:"1547c10f",27092:"220c1bc8",27094:"cb33cd4a",27115:"e37692b4",27123:"c4d1e829",27179:"cbec0238",27212:"ce710151",27367:"61417793",27369:"f52b34fb",27388:"f7e205e5",27394:"30ab0d34",27398:"a3983124",27444:"7a3be7e3",27473:"31ed8f07",27493:"9087a409",27684:"a95ad191",27785:"ce588038",27955:"2e7e1134",27995:"ee4b8f19",28081:"3ad90ad2",28086:"2cc67ca6",28111:"81c204e1",28166:"8120957a",28178:"9adef974",28204:"758b9bc9",28235:"20a81622",28252:"b8d3e47d",28294:"5a4f5a9d",28319:"ec410c33",28369:"bfc2a64d",28410:"89cbd1b8",28616:"b8d60920",28627:"54ad050e",28636:"334e3bb5",28679:"e1758f93",28687:"ab48a39f",28701:"c3856c66",28782:"fd5c5192",28793:"379ac6de",28834:"7ed2bc06",28920:"e7ef6e16",28941:"8c5b1685",29060:"9c7a2f87",29100:"1421c0d2",29117:"fd077c05",29148:"3b189bfd",29243:"d330b699",29370:"04daf44f",29408:"fbce6636",29421:"163a1bae",29452:"13171783",29457:"e4d4ec4e",29514:"05e733df",29523:"b2f58160",29526:"b45a54e9",29567:"760e2145",29653:"13f72d6c",29679:"6e0a413f",29690:"b1633424",29698:"a642dcef",29708:"80b93830",29733:"da10e58f",29795:"e6557239",29820:"16381f20",29829:"d973177d",29838:"8b18d68f",29845:"5d94dea0",29851:"97806055",29885:"e534ab35",29943:"225b6447",29950:"5de1c39a",29969:"332b14e0",30021:"8f6c1b4d",30035:"87546ad3",30154:"339988c0",30163:"adcd62ae",30167:"22bf7f69",30200:"b97a54f5",30239:"22e8ffbe",30262:"5320ed26",30303:"967ebe95",30314:"dfcaec69",30355:"4b678e99",30410:"90ffbe81",30490:"874dc058",30564:"407230da",30579:"1ee0a129",30583:"775c5b43",30585:"ceb04c72",30628:"6ee9522e",30746:"ebf8e597",30827:"5814834c",30831:"ced554c7",30842:"d8412727",30848:"677757ca",30934:"44c28e7f",31016:"416fb909",31022:"af819789",31039:"71d5b1f8",31125:"c3c8ddc4",31150:"0b62d7e7",31213:"df232fd5",31220:"b8ab477f",31255:"5c81ce12",31257:"67f1ea1e",31272:"fa366c46",31279:"2c3e7e92",31465:"cc564cf4",31541:"1668cad9",31544:"c602d51d",31567:"8c4bf82a",31700:"0b401b62",31705:"05957343",31720:"0a70c05a",31791:"04eab06f",31838:"de1c8a7d",31861:"a14af959",31862:"c791a767",31972:"4ef864ee",31996:"8dbbcff6",32005:"f0dc0726",32012:"9ba9284f",32039:"116b7e55",32183:"5110a7b7",32295:"4437b871",32335:"f9a4941d",32365:"fe345ee5",32374:"263a95fa",32384:"042ba1e2",32391:"e1407f5b",32472:"c08ba4cb",32492:"0e9894c7",32558:"40c3731f",32691:"798484e3",32728:"1b520177",32781:"a196e32c",32787:"5617aedc",32825:"fdddbf66",32847:"8590fd3e",32875:"65511420",32884:"69583d95",32949:"43764587",32960:"225cc45a",32993:"604cd7c5",33049:"97e51b1f",33065:"a172f6b1",33132:"12e68472",33192:"ee003a92",33202:"817d1a47",33234:"465994bd",33290:"7da68ccc",33307:"ff6c3941",33350:"2d0c5b52",33458:"c16e0158",33462:"0b81acdf",33517:"3ed70074",33540:"fe7ac0b7",33567:"6075be34",33572:"269d704a",33612:"3f933ca5",33621:"33241236",33638:"d294bdb0",33643:"da7149d8",33659:"81a6b262",33724:"755872dc",33804:"1b31aebb",33806:"07399e71",33825:"f8a443f2",33881:"a7690409",33889:"e9c7c2b7",33999:"49aa1a16",34071:"4fc571b0",34095:"04f8849a",34117:"a870955a",34127:"18b5779a",34156:"f5c63bac",34171:"0bc541b1",34179:"3f4396e6",34196:"13e6af21",34255:"e8a8dea2",34331:"164e61b9",34388:"79fbf53e",34447:"f3d3813b",34511:"c2356d7d",34520:"538371ec",34528:"b038a3ec",34543:"782eae4d",34549:"0735e5be",34621:"f30fab6f",34662:"ef071c32",34691:"02e54e09",34706:"47a1bde9",34750:"a5fea1bd",34761:"5d5e0832",34808:"2e6ef254",34810:"924dcf98",34812:"117121a9",34837:"10fcd509",34847:"dc7f8f8b",34877:"f7702246",34962:"075b4af0",35023:"907e7dc3",35139:"6fe5390f",35168:"fd058e1b",35288:"0f3b9f0c",35325:"d42065ad",35329:"a7827f50",35402:"976ab233",35523:"032e2c67",35532:"388d5845",35542:"75d5f1cf",35546:"5c44183c",35618:"97bb73fe",35733:"8fc868c2",35742:"aba21aa0",35766:"ff6f6072",35767:"3019fa66",35808:"c75a0418",35844:"864f74f0",35911:"bb1bce89",35932:"a3142532",35960:"dfa4e294",35983:"b5a599e0",36009:"04afe417",36055:"59be0e8d",36067:"ceff0062",36113:"28f38ec5",36144:"307d712e",36188:"b59f02fe",36192:"b60e28b6",36211:"5cfc9e58",36271:"f8a5caff",36302:"eafd7a74",36361:"4f9c79b6",36573:"9c812e08",36619:"2573355f",36640:"1084a32f",36672:"b6fb003b",36682:"17628665",36689:"77787075",36703:"4c7d084b",36747:"a3015275",36763:"c1a328a5",36790:"12935692",36851:"649faa0e",36890:"b46f5ba1",37109:"d73e6b67",37115:"0b4fcfba",37147:"97da4333",37191:"d786420c",37204:"8f3b27f1",37206:"43dcd746",37209:"e34cac0e",37287:"362ee1f8",37298:"167016d0",37329:"554882a9",37366:"6013ac2e",37378:"4a1368b8",37441:"9bbc9e48",37485:"6929f09d",37486:"ce46a18e",37489:"6a293d29",37578:"e17d733a",37617:"be2ede3f",37643:"a6aa9e1f",37646:"021d469a",37673:"e2657c7c",37678:"2045fade",37702:"f451cc4c",37737:"f5853975",37740:"2cfb265a",37799:"feab7dcb",37809:"5f87fd99",37827:"42545929",37839:"d5e29b01",37841:"9ad03801",37842:"cd060f40",37872:"88d0aec4",37979:"f6432a48",38001:"690cbdd8",38032:"b61f0370",38035:"63e00c6c",38055:"37b82514",38056:"baad6bf9",38238:"2e9f383c",38288:"d0e9d470",38370:"cf858c26",38416:"dcd7017c",38439:"9474fc0c",38451:"f0fb7623",38460:"fe3e0e89",38501:"0fae8f08",38520:"f9c05060",38600:"0f497157",38605:"6dc06ee1",38642:"47e85d0b",38767:"c4de5678",38816:"5ea125b2",38835:"6495713a",38839:"110e78c3",38888:"6f5eeb66",38891:"7c912802",38923:"17b935cf",38953:"8e72bb53",38974:"2c50796a",39014:"0db7476e",39058:"53317765",39088:"5560f355",39110:"cb9e1f3d",39138:"755ebe0d",39142:"b5f01515",39153:"0b8a4e62",39185:"06043210",39192:"09b62bf8",39197:"484cbf74",39202:"8b795044",39228:"a7a3cbc9",39230:"b992801d",39240:"90f157dc",39260:"47074836",39265:"b40642d4",39283:"b1043e58",39404:"aa0fa20f",39405:"cc6505da",39407:"995840bc",39423:"a615dd65",39444:"0f65ccfb",39472:"9e679a0b",39473:"6bf3751d",39487:"9d833fad",39494:"b326207c",39555:"4a80e27a",39569:"06a8eab3",39587:"7d0e1375",39608:"97ae1fff",39712:"8f64cb7a",39715:"a68f0e64",39773:"fb3759c3",39777:"320da59d",39781:"3c2d0811",39876:"a2c9e15c",39887:"9b0c8626",39901:"d76c455f",39908:"09a52b17",39973:"d4a2e930",40065:"5f469a3b",40124:"bc817d28",40132:"59533a49",40178:"0508dae2",40212:"a2d43843",40249:"05c63416",40369:"3c36ce76",40463:"0cd1a20c",40555:"11b8ce75",40606:"3e032765",40616:"12a5de9b",40651:"bf5126e1",40690:"dfc3c224",40694:"25dc0311",40697:"cc01a9d7",40733:"986db944",40755:"5bc29dc0",40758:"1a7b33c3",40780:"d5281bd1",40797:"d2110cc0",40827:"ddebc8bf",40847:"2662e92d",40879:"b1527e4b",40907:"321dafc4",40927:"881bebdd",40959:"ca0149b2",40999:"68c5632a",41030:"33d4a0d4",41120:"406d4ec1",41125:"0fa5c29b",41134:"ddb0149a",41135:"85ffab62",41159:"93340492",41178:"2a0d650e",41260:"6c9200cf",41361:"247909f7",41409:"803932cd",41455:"2bf5edd4",41461:"fd517388",41472:"06fce5b8",41491:"c3f88c36",41594:"da172daa",41637:"13e47f37",41640:"d407c2c6",41651:"e8e3bd30",41677:"9017a110",41695:"155a9bc0",41739:"b9edf71b",41750:"bc38a1dd",41867:"78f0e259",41871:"edcc5675",41872:"58b3152e",41892:"dc5506b6",41907:"b7a56be4",41944:"14828316",41954:"7c49023e",41993:"c67e4e1c",42021:"a2839a15",42068:"c413ce11",42187:"295cb0c0",42196:"671726ea",42207:"f1a4f0ee",42350:"6df57399",42368:"ffac4af0",42380:"99bce14a",42465:"b8212f90",42518:"34825c6d",42566:"2b505997",42576:"b184a577",42596:"eafac744",42659:"fce58780",42677:"7fc4aa15",42690:"165a93e5",42694:"bfdde79f",42722:"ca790126",42799:"5314580d",42801:"bf3d61ec",42887:"fa6fcf0d",42900:"c9d95cbd",42905:"145364e0",42911:"39c7a203",42924:"583fb00a",42942:"19028add",42995:"2812e3b9",43029:"e3477e52",43035:"2907d5eb",43036:"4256b042",43040:"676c7c8e",43042:"bec2896b",43078:"50536743",43088:"341293cf",43113:"12164231",43136:"f1374ba3",43199:"0bcdfdaf",43352:"4c07ba53",43372:"bf7f6ee8",43421:"f048922c",43432:"fbf82623",43445:"83fec35c",43447:"a490aaaa",43512:"d319e9f2",43642:"4cd0ba1b",43675:"eb6ed572",43684:"ac5cd9bd",43833:"fe2d8766",43868:"c09831a6",43880:"dbd5692a",43910:"c5a487ef",43913:"58408940",44008:"5a8b22a0",44040:"43d1bad2",44045:"894f5c0e",44062:"a3a8fa0a",44118:"6503f568",44123:"af753000",44125:"ca2b0f7e",44129:"d653d7ed",44137:"d02da847",44143:"19acc4ed",44169:"bf12a61a",44267:"57767c05",44290:"4f087d20",44301:"3413c8b8",44339:"0a91021f",44351:"bc8f3fce",44381:"fdf1d2ab",44419:"216bf65d",44489:"6fb01322",44492:"9882af90",44546:"0c9b1365",44551:"9b2ae5ff",44567:"502906a9",44605:"5b39e963",44640:"20bfa334",44662:"d65b2c25",44682:"bdc69003",44844:"668e0554",44891:"30769210",44939:"43f3c18b",44960:"12b957b7",44994:"41af2803",44997:"6e34e766",45113:"55946737",45117:"86fe1f77",45218:"57083a92",45238:"c3f790da",45245:"74e64d1a",45268:"33c572e5",45290:"db90ec2b",45323:"815e47ce",45339:"24d4b044",45400:"f86f0ad4",45500:"e85bde03",45541:"a722b43a",45670:"c36346e3",45682:"3533dbd1",45746:"67687911",45919:"a2a2954f",45920:"ec832811",45983:"9926d60d",46001:"8cf74eb7",46008:"2e048b0f",46025:"1fb7523b",46039:"f724037a",46063:"67893f6a",46074:"f1087137",46102:"e8b8ca39",46123:"ccd96dfc",46156:"53cdeba4",46232:"3bf2a847",46244:"ea511817",46246:"b5b4a410",46340:"a490cf35",46352:"5e1e1325",46375:"e49bd305",46381:"89e9b753",46435:"ba786c9d",46451:"4bb02a47",46464:"d7c0035e",46472:"bcb734aa",46513:"9dfe5a97",46515:"c13f246c",46541:"60d50d27",46547:"c5427124",46548:"1a79e020",46598:"8393d26f",46633:"c4f38868",46662:"4f48cd24",46694:"1ee47c02",46697:"a6d25208",46710:"1219dd15",46754:"2b6a7ab0",46814:"e0362487",46850:"917a523c",46888:"db9d1243",46905:"57a58e78",46911:"ff13b684",46917:"7b0a3d41",46921:"a28b89d0",46962:"2d3f88b2",47041:"bbb92300",47087:"a5c8a2aa",47106:"696d889c",47110:"931beacc",47127:"5e9a23c0",47156:"3a2a4cfe",47247:"5048202c",47297:"6111afa9",47433:"b9a767d8",47537:"df0967b2",47555:"0029660c",47573:"925cbbba",47622:"0c1ff092",47693:"39a07549",47699:"17093d00",47730:"4edf53e5",47738:"1b512798",47913:"d783f956",47917:"6bb76d2c",47993:"9e70e253",48015:"8fa8fb45",48023:"47f96c4a",48027:"1b3d7ec5",48050:"ca713325",48063:"c17f9567",48071:"b71c2d32",48097:"06ef9569",48127:"859f73c7",48132:"c467a11b",48140:"bac93bcf",48162:"519b5759",48188:"9d8965aa",48270:"ef31fc63",48285:"e672d61a",48286:"be3fc974",48295:"e2b4c006",48304:"189e3ac3",48310:"f6884a75",48360:"959b45a2",48361:"712c16a5",48532:"2896ce7a",48537:"c5550c10",48544:"0a5f31be",48592:"c1506482",48650:"b775ecd8",48661:"ef4f3413",48673:"5db19d16",48733:"d009d47f",48768:"e054d919",48793:"b71be52f",48879:"49b022dc",48883:"ce18dbde",48939:"e93602d3",48985:"0f461001",49013:"9d9f8394",49109:"e3c5d63e",49112:"3455c0d5",49171:"e3022ebc",49226:"f2a06fea",49289:"828cc8aa",49305:"ad0a2b75",49308:"e28d4356",49350:"2417a912",49388:"8f1510f6",49461:"2019135a",49521:"49d63cc6",49579:"e01bb6c7",49583:"8ec8c5c5",49587:"2cbb324b",49602:"4f5f41be",49655:"b0ba51ed",49676:"2391d372",49693:"b9ce10bd",49709:"70633739",49768:"58e037fc",49783:"acf72eb8",49786:"5bd6f6db",49941:"759a3c81",50012:"40c88f7a",50095:"837c6843",50176:"756c7559",50178:"18dddf22",50208:"4e80a9dd",50261:"ec6a0daf",50293:"fc6a53b6",50306:"5d4911b7",50414:"c59a4667",50424:"36abd830",50428:"a33de290",50446:"eaebafad",50472:"a4e24d6c",50507:"129c4e7a",50570:"c112d1b7",50584:"3fd21eb6",50585:"0bb25d72",50642:"e964b083",50664:"960924c4",50700:"75be343d",50703:"0914ee26",50747:"0d98f85b",50800:"b365f6bc",50819:"4251704e",50839:"8aa0dce2",50934:"e7b82dc0",50981:"3290f534",51009:"dfbb1d90",51047:"4dd6f8d8",51059:"5b9ffc49",51102:"3304ac90",51108:"b4ac58bd",51116:"d366555a",51237:"85a6e3f4",51378:"0a8d92af",51412:"fe2deb8c",51420:"7a04b795",51435:"c9c6fdd1",51438:"14515c80",51465:"704ce0a4",51547:"c548908c",51548:"45b02367",51578:"8447ad38",51589:"f762fff5",51636:"ba5671ab",51649:"6537c712",51665:"65d842b9",51689:"30ab0ff6",51711:"89bdbd96",51763:"9199f8bd",51828:"44e51e65",51837:"5c238f81",51878:"48b6c251",51890:"b5fb4df8",51937:"34689118",51944:"d1e88337",51961:"772b5e3c",51962:"7dbc2502",52036:"1d79e793",52042:"7f8ebea7",52050:"fbaf87e8",52093:"edea4b8a",52102:"95cc61bd",52132:"3498be82",52135:"d0ed28b7",52176:"81d19844",52181:"628d0604",52235:"fadc68df",52250:"8ec5e058",52261:"c292770f",52266:"3e088827",52276:"f6144dd0",52282:"be224150",52286:"8e1e17e5",52342:"0dd8c0ac",52408:"ab586159",52424:"25d3e7f9",52450:"2dc793da",52466:"8c67a0ff",52477:"2c5310f2",52478:"cda1618e",52488:"ca57223f",52569:"7dcd92b5",52572:"a9417ee3",52605:"14ba3414",52612:"27f2e2a4",52634:"c4f5d8e4",52711:"9e4087bc",52731:"c8f57d29",52770:"85afc7f5",52826:"ce319efa",52840:"9e1bed9d",52895:"69fcecaa",53074:"2f32a261",53118:"c0571b49",53132:"5de85215",53178:"71514a42",53201:"d670063b",53237:"79ab3378",53238:"a9129632",53256:"fa713049",53266:"76a0389c",53288:"f8fe23f1",53314:"5440b68b",53370:"edabbd89",53449:"e2bce80a",53458:"63436e22",53488:"23165909",53501:"0f65ad2f",53540:"92f1a745",53559:"7e665e5e",53619:"16640689",53646:"6c9978fa",53670:"52ed38a1",53742:"77612fce",53771:"3a447539",53786:"e352cccc",53832:"7c8deb08",53861:"2a5e97be",53871:"94dd9534",53881:"e9a95c5e",53901:"a4da17e3",53925:"a8933372",53952:"abde70aa",53982:"d5f056f5",54106:"93b4d825",54113:"ba441024",54144:"5026e9d2",54168:"89fdbc0e",54200:"f97d7d88",54240:"3a55b748",54246:"5ba9c4b5",54270:"e5c0ea66",54272:"f020ef51",54277:"71e2c4b4",54310:"14434d81",54313:"45c5f30f",54349:"3c5b6e91",54399:"25aa47d2",54415:"c87c5e1b",54439:"f21fcda3",54500:"fb9e14c7",54540:"66193a96",54568:"633af835",54749:"ff4fb41e",54759:"0f7d8652",54879:"a872c629",54881:"c46bba44",54950:"0a893fdf",54951:"98bd463b",54992:"5bcffa9a",55004:"37d125cb",55100:"70d55848",55144:"152d0582",55167:"c1cb0a0b",55206:"aaa8a12d",55223:"05cfbcb9",55245:"0373e7f9",55276:"c962ae4a",55302:"facc4cc2",55329:"028ccd51",55351:"1921d13a",55395:"e2f2b384",55401:"2027fd18",55413:"b8d6941f",55478:"6a0c8a9c",55483:"342d2e6b",55534:"ab685cdb",55559:"29cf75d4",55566:"c8861997",55579:"3a9c66ce",55616:"d5caed5f",55645:"483b9ea8",55664:"a7511015",55675:"1c411fa3",55836:"94b063ba",55929:"2cbaf53f",55955:"194c8540",56028:"e1a6f6ca",56037:"69ef23f7",56062:"cde3e47b",56068:"6f9d890e",56097:"096bca72",56122:"a7b4d0d7",56123:"602e2465",56145:"9c062d77",56216:"f05409e8",56297:"575869e5",56408:"cbb5064a",56463:"0d71415b",56470:"f71bbf9b",56486:"7a75c11b",56493:"858f1266",56510:"86a45dc2",56560:"c9c31477",56607:"609f9177",56723:"69e6c429",56779:"6664c24a",56819:"7488fea1",56826:"eec5649b",56916:"ebc13825",56948:"1dbfdc18",56974:"39ed0ae4",57013:"dbf9c341",57119:"4d68fc5d",57125:"d592d1b2",57139:"398b4aad",57141:"037241c6",57155:"23348138",57159:"e15f47bb",57165:"034f0308",57251:"779bba71",57326:"3ed58e4a",57352:"8a5814b8",57361:"79cc2eba",57364:"4cc485ec",57430:"ac4d154c",57529:"0b7a8a63",57547:"27211971",57586:"e07fd562",57614:"dd48b375",57647:"0ed7fb46",57730:"658997e4",57749:"c07b5739",57760:"73d3ccec",57800:"17413beb",57845:"48d58c93",57912:"a57bd983",57994:"0cb9db3f",57996:"b75e1b9f",57999:"4b5076d6",58e3:"e2070fcf",58002:"31fce735",58079:"2655f170",58093:"242b0cc2",58144:"a2171a4d",58230:"d1f7176c",58255:"400deb23",58259:"078daaf7",58301:"b296abb0",58359:"a5e62092",58428:"ec854811",58454:"e2adec54",58479:"2a882da6",58484:"36d29ed8",58581:"f0e5f3ed",58582:"e7c7e2bd",58594:"6bd22ece",58632:"1617efa4",58667:"a36e07dd",58704:"7fde9a4c",58707:"6b6aadc5",58780:"b7d1b016",58990:"dbed7045",59005:"39fca8ac",59020:"e84457bb",59053:"11b61292",59070:"c43c6f4f",59114:"1a20bc57",59123:"17ffd4ff",59143:"37bc7ff6",59214:"a065bdfe",59246:"ce62ac6c",59262:"97db775f",59349:"156bd387",59437:"8475b017",59493:"150f4998",59521:"b2555332",59548:"e651f27e",59627:"674c9391",59645:"e4b8975d",59680:"70cca634",59702:"c9b0e9c8",59727:"b51518d2",59732:"9873f053",59740:"ab90a7b7",59866:"03f08ad1",59874:"b62e8859",59923:"95789563",59940:"888f35af",59981:"03137a3d",59994:"e266eeee",60020:"cc3a93a6",60073:"ad9dbc18",60101:"167d6699",60167:"152819f0",60183:"267f1c69",60185:"e04f784f",60189:"c1df8329",60193:"5c430979",60198:"5c417b7f",60203:"5c5dd48c",60257:"3fa5d64e",60294:"93d54c10",60315:"42d452f1",60394:"ce86b1ec",60445:"f83acba0",60501:"7003bb75",60510:"821320eb",60559:"3b57fa48",60565:"0c5e909c",60613:"3523854b",60615:"33cbefd4",60676:"244c7b0a",60696:"d163928b",60737:"aef9dca7",60762:"e9d18558",60776:"d379b051",60819:"c316a3d7",60832:"6327585c",60861:"c9d25191",60884:"709e1a02",60901:"00b58b18",61006:"de3f51c4",61096:"2d694024",61114:"127f988d",61124:"cf0c4cff",61235:"a7456010",61261:"b6b1a235",61265:"84536aab",61300:"31eb78c6",61334:"e0f81731",61368:"9c73eeed",61416:"a1e3441b",61461:"43bc2f0d",61481:"b0f00280",61559:"6b206066",61584:"55b57e06",61702:"faa24029",61706:"89baf629",61729:"13a64537",61740:"bc80aebf",61786:"aa1329f2",61807:"1695d9c3",61816:"8513fbcc",61886:"124bf435",61942:"4431d7f4",61950:"820ef6f8",61959:"9df3c51e",61991:"a6972a3c",61993:"a396a58a",62015:"5cc68a8f",62050:"c9035049",62061:"2638eb20",62111:"d2289dcb",62138:"1a4e3797",62147:"8d364c04",62162:"22c027ab",62182:"0e7e04d8",62188:"1e38d1de",62213:"46e76af1",62254:"9b695413",62263:"e0fe70af",62264:"cb69dde4",62469:"f448ea15",62549:"cca423c7",62639:"0f378f0f",62641:"58728d91",62664:"0bd3abc2",62672:"fcaa2a90",62691:"d9175e87",62703:"345b88a3",62712:"f9a8c23e",62713:"b519e6e1",62827:"4e78ea4f",62838:"973ec13d",62845:"ae5c2262",62867:"07853d90",62927:"c03ef713",62934:"2696b78a",62936:"3415fffa",62957:"e5c6728d",62975:"baa95a18",63002:"4cc6a9b5",63005:"b0635fce",63014:"3a9ee945",63016:"4eaf5bae",63048:"41280170",63075:"37844666",63115:"9bd87750",63124:"d4bcf69a",63156:"2e91affa",63228:"34c77011",63291:"2f1bf685",63292:"2d074af9",63298:"259b7e50",63330:"60b75cbd",63332:"67474760",63342:"780fa4d5",63367:"44bdb747",63382:"5f87f962",63387:"9780a9d6",63430:"465af2b7",63445:"877efd72",63455:"f30739cc",63515:"9612fd60",63521:"58f053e0",63553:"1fd2ca4a",63627:"43a56d47",63646:"47298c37",63700:"eadd254f",63750:"2ac84b5b",63779:"c2750739",63795:"a4974adf",63836:"95e06d9c",63951:"8bbbdfbb",63966:"2278c359",64045:"c47fd21a",64091:"813e2458",64154:"5ae5672b",64184:"f4f77456",64209:"88ed6425",64351:"7c0dabe4",64442:"dfa86ee4",64447:"e4307155",64465:"e9f47cd4",64502:"5d817499",64527:"dae07133",64535:"3756d209",64577:"a2a8ce40",64597:"72a44e21",64623:"e52d80fa",64659:"6ae279e9",64737:"1d00ec5b",64763:"ee942de8",64838:"9a8a6b3c",64848:"eda18b6f",64859:"8c717503",64865:"8768b566",64888:"5609187a",64899:"e80f330c",65017:"f08c8322",65025:"6f5a0de7",65042:"f705c127",65091:"75914136",65133:"c9bcea67",65193:"d0cf31b7",65221:"67922501",65223:"2a11e6a7",65233:"0530d392",65246:"5ea2239d",65276:"238a64af",65359:"070df7e5",65466:"a81fcfc9",65497:"26115f23",65625:"e1ba57a0",65647:"75ba6401",65658:"329c66a5",65745:"d1be0dfb",65835:"fbd3de42",65864:"698932e1",65897:"38147e44",65918:"587a0b3e",65926:"567cfed1",65957:"21719437",66061:"1f391b9e",66085:"274bdcbd",66135:"331ad65a",66140:"136587f9",66162:"cf5645b0",66169:"0b7cbed9",66210:"2b53c3fa",66237:"cc9fb6c4",66327:"eee168db",66338:"dcbc8483",66351:"ea6ff7b1",66415:"6f47e633",66461:"cb8920e1",66499:"85e49a93",66504:"e2fc22cf",66518:"c6ec7d6a",66519:"2ca00666",66524:"83037ff5",66528:"fdd85734",66559:"ecb74126",66575:"b0e34666",66602:"9fce9e91",66615:"5032a87b",66715:"48455675",66759:"e381e7b7",66774:"dc4094c8",66791:"66d49eee",66819:"acc69dc5",66822:"62e9fea7",66832:"e1fde1ef",66867:"58b9aab4",66912:"6e955522",66943:"699a39af",67004:"39734463",67044:"1b143eab",67061:"c1050649",67098:"a7bd4aaa",67100:"60165173",67104:"06073810",67114:"0d86fe8d",67252:"60cef16d",67376:"01ed4ae3",67438:"b6d7433d",67472:"814f3328",67507:"77139df7",67520:"d63d12d5",67545:"d89aa357",67581:"a1a96ebc",67587:"8775fa1c",67668:"47766edd",67683:"cace8592",67704:"8fb89e11",67729:"2c18bef5",67752:"2d2dd3d4",67755:"b57b3f07",67775:"39b26ead",67914:"0a0dd03a",67989:"59171146",68043:"c1c9577e",68094:"e981d05e",68181:"ffcc313e",68210:"a148d810",68215:"1ef2b5c0",68253:"89c88bb6",68315:"98826249",68334:"9d05a91f",68377:"31ea9d3b",68434:"975aa772",68470:"60753781",68535:"e59469ea",68569:"d81421b8",68685:"0b87289b",68710:"dbf13a93",68721:"8980e400",68765:"719a7d9b",68770:"14033dfb",68834:"78a6c606",68839:"3ac10f9a",68910:"62cdbb35",68930:"5aa406a5",68946:"68c6e6bc",68989:"edf3b85e",69017:"ef13094f",69038:"8df5dc78",69129:"4a55387a",69136:"9e7326c6",69169:"fc384521",69180:"5a275050",69199:"f0589cfc",69213:"93ef16a1",69226:"f99651a6",69384:"5a360e6e",69451:"15323d22",69457:"7ffd9a5f",69480:"a112e652",69489:"7b863c8e",69501:"fc15228a",69503:"33a51375",69505:"d0ccd112",69517:"8a4df687",69570:"4d573718",69638:"9c10cdcf",69651:"8aca5a76",69692:"16431fb6",69737:"d14574b9",69770:"b1e8d27b",69773:"f2d19d66",69844:"615fd764",69864:"a29a2c92",69875:"b58f381c",69908:"4d8fcf9e",69982:"8e981336",70008:"0860d759",70022:"c8d1e051",70058:"73a7a1a2",70106:"334fa657",70117:"9f3d620b",70126:"f68988f2",70174:"e04f6385",70179:"cb543535",70184:"36b6576f",70198:"02a73cb3",70210:"8367b76d",70234:"e76e0aa8",70253:"5e1c183f",70267:"9d6ff56f",70399:"d2786aa3",70418:"0bbbad22",70438:"5e32dc25",70502:"8c596cb7",70560:"ac5d28bd",70606:"39583919",70645:"a9f446ca",70687:"70ca6744",70696:"52be8247",70712:"cb488bcc",70749:"ecba2f16",70755:"f3e1c72c",70776:"1edba277",70784:"ac00e857",70788:"c513e822",70791:"fda5ba18",70794:"c1dff2d3",70814:"c3c05d38",70828:"6763bf32",70858:"777d5f9d",70870:"4f594038",70947:"d1fa94a6",70949:"d06511f5",70953:"87d75f25",70963:"16029e49",71021:"05f6486e",71026:"5e0cf2ca",71051:"9b8a5dc6",71075:"620de7f2",71079:"474f21e5",71117:"92f96583",71162:"af7ce5e3",71169:"011132d6",71227:"131dae92",71235:"18891827",71374:"40d0141e",71407:"7380ddcc",71413:"6e97302f",71454:"f0108549",71473:"ff761994",71501:"4d4a432b",71545:"8c13d23f",71548:"d777707b",71585:"d7e2cd1f",71612:"a29b4047",71651:"dbd41ac9",71656:"7ec29cb2",71715:"4a74d13d",71795:"5abeb861",71852:"beab57c8",71857:"cd9789f0",71910:"f783f7a9",71964:"835d6f03",72043:"f0dc2560",72053:"95f36a1a",72143:"052421c5",72322:"4941c7ed",72353:"f23d42f7",72358:"4419dbb7",72446:"27d3d4e0",72485:"b85e11ce",72508:"59aaffb9",72527:"ac84c584",72536:"1b8f178d",72599:"3336b76f",72618:"95579b4f",72656:"262704a5",72662:"408bf78f",72668:"049fd4ea",72675:"f81aef8e",72707:"eb3eed60",72907:"491d56e0",72914:"37eca2aa",72925:"b724edf8",73055:"4cad70b7",73084:"b8385eea",73121:"43dde569",73147:"6a428f5d",73163:"dfab75d7",73193:"da144c90",73264:"33e8889e",73276:"7bd25ebf",73286:"45d08048",73290:"c7f860be",73316:"8b1b48fb",73331:"97d2cbab",73376:"21838a86",73397:"681664ad",73428:"70c4ca3a",73471:"ae7930fa",73473:"158cec25",73539:"5ebbf59b",73569:"ac6289fa",73607:"01689e9b",73693:"c6ea0115",73756:"d8415e6f",73779:"7efb13d8",73800:"5cf43a2c",73864:"4d23536d",73888:"06dd3057",73891:"d721a748",73905:"d502d9c9",73906:"ccd984bd",73922:"8b683930",73940:"f4731b9a",74019:"14841d7a",74031:"4711b74d",74039:"2e6d9cc0",74046:"b7aeb8c2",74069:"ea5e46ff",74076:"8574818b",74134:"393be207",74282:"2fd7ee6b",74312:"acf7953e",74401:"3a983156",74418:"103c2fe7",74524:"111d9467",74588:"84939cad",74657:"033d3629",74684:"e6ce3bd9",74768:"a2afef33",74792:"a5ac74f6",74880:"ec7a5af3",74895:"37b8c62e",74902:"43c329f5",74945:"ad848ffa",74950:"f3ff39ad",74961:"9b3f2ab9",75043:"1c4d0413",75062:"8df3f976",75078:"dd620de6",75106:"9f49c871",75121:"0b0e328b",75173:"3126d1b1",75190:"20c3f46e",75267:"6dab9497",75298:"f2e2ec6f",75317:"152f3add",75359:"84aa8d64",75378:"847c1b9e",75396:"de0473f6",75405:"ceaa6e69",75442:"3e627431",75454:"1e94defc",75459:"605c3775",75461:"c6260f29",75484:"28a52d92",75637:"a9f98915",75666:"2aa42d18",75696:"1ad07866",75718:"d2250181",75723:"264ee92e",75775:"724a4edc",75805:"ad132b09",75894:"d95030e9",75911:"f18854fb",75919:"e01c8f09",76023:"6d79f7cf",76041:"03240ae1",76123:"52166518",76129:"95139762",76166:"1778a2f7",76172:"54111683",76215:"d9605822",76235:"6a3d5afb",76262:"075f4b70",76264:"cb46984a",76289:"1ed4b1ad",76293:"b85747a8",76299:"2519b708",76368:"9267add8",76517:"4fe377f4",76530:"594c10ba",76589:"9a3685aa",76683:"b6f16885",76719:"a50107bb",76748:"9a68cfff",76788:"dab72c8f",76854:"2b00a752",76871:"e364f7ff",77077:"a01a15fc",77088:"bf048e24",77123:"62825cc3",77174:"ce019e24",77222:"fe2389d2",77223:"cb62deb4",77240:"3e56cb01",77261:"1aef3c3b",77298:"109d395b",77369:"c4acdd50",77373:"f3ddbb03",77391:"d0c84d34",77659:"898b52e9",77698:"60381fc6",77749:"3a31d53f",77787:"d9e41302",77901:"793951b2",78001:"33ab05f6",78037:"c9599a77",78069:"3b78a115",78087:"90caa6a1",78127:"c55dd5b8",78159:"8df10e0f",78199:"5455ca0e",78217:"79400fce",78220:"f7f417e7",78283:"de5d0473",78312:"1682c6e0",78354:"c1b680b7",78421:"b1a2ea9a",78497:"28ebe10c",78512:"b7e5c092",78522:"ff4a022d",78544:"4adc4126",78583:"95365ba3",78595:"02c57050",78608:"7abfd700",78632:"4f1d1584",78704:"b80df7ca",78717:"c7dbf2b8",78764:"6000d05b",78820:"04c3dd09",78858:"4f0afd2f",78872:"f99d7a76",78912:"c8939218",78985:"ccd7c88f",78988:"0ee8b775",79039:"803df44c",79048:"a94703ab",79138:"3b97b725",79150:"cdc43a7d",79157:"c884c38e",79180:"cc426672",79302:"74555694",79416:"a2030166",79481:"9740270c",79485:"8b7dab17",79487:"fce2bd9e",79506:"368f9c22",79520:"34900881",79521:"09b9b020",79524:"921cad0e",79534:"a39d4ca2",79635:"85e0d297",79656:"1bfbaba8",79739:"8be24c4d",79776:"e64c963a",79841:"fc26a5d5",79866:"619263e9",79992:"f962f7fc",80018:"5e4ec6cd",80022:"1d1643d8",80046:"93c339e4",80091:"587df15f",80100:"a34d992c",80102:"7349f9da",80159:"e81448e3",80198:"d38a6f54",80201:"6a7c2838",80260:"8aabb1ce",80310:"3c89ed52",80315:"4eb79faf",80342:"81f854a2",80362:"2fd10e89",80408:"81c96f91",80424:"abf14b6e",80442:"e1a35040",80457:"992bda30",80458:"318980ec",80491:"7080aeb9",80524:"a8418b9d",80525:"57f28ae4",80531:"27321f21",80557:"5cb06d06",80579:"9aa3eb98",80649:"80f24550",80677:"6d70fa33",80750:"84ac5929",80772:"fd440a88",80794:"442da8c1",80810:"2942b330",80841:"413bf93f",80863:"b6aee096",80957:"c141421f",80998:"5ea38e3c",81012:"820b9813",81019:"f74d3bfd",81050:"c88d5fcd",81175:"f98df6cf",81188:"ddf9f187",81212:"347b93da",81265:"d99629a2",81319:"12363bc4",81410:"7af33a93",81435:"0e6e8143",81438:"46baeff3",81497:"439b75a7",81544:"13685ceb",81585:"04a0ea54",81643:"dd7ad24f",81666:"a74d38f6",81691:"015f929f",81692:"0d9e9c41",81728:"9df95cfa",81737:"c75c3ca5",81770:"fddd2104",81791:"d3571192",81846:"59115b3a",81902:"29470dda",81903:"acecf23e",81982:"2a59c009",81996:"95a252da",82019:"755e7c7e",82096:"dd5c5048",82221:"9920fffc",82261:"d2c9f0b8",82297:"226eff01",82354:"b87f99cc",82362:"7345c721",82553:"0add85e5",82754:"4ccba4b8",82774:"d45b1270",82776:"0b94f8a7",82847:"dd09cc7b",82905:"12cecbf6",82932:"c609eda1",82946:"492bd0ed",82953:"a76e45f1",82987:"732a7c43",83e3:"7f710e67",83027:"dac8839d",83044:"f729154c",83078:"42174d87",83089:"686a74aa",83103:"21cd7edb",83111:"6060cc06",83127:"10757cc8",83182:"e5cd0e7f",83203:"95126e44",83249:"ccc49370",83260:"5c26bf07",83273:"2b6eabf2",83316:"0ba08ea0",83378:"d0f169c8",83379:"3305f513",83431:"e6c42ffb",83439:"df2607af",83509:"8ac4b897",83523:"3d9e5426",83534:"cb5bafe5",83561:"bbefe8d8",83566:"1b2dcba2",83574:"c85c7bc6",83608:"19560f91",83612:"fa4876cf",83670:"9e37e644",83700:"a8c902bd",83779:"e6fc8a9b",83814:"5bb71e94",83841:"cc517726",83849:"c48426e8",83870:"58dde135",83901:"6f2a2977",83923:"98a236f3",83928:"345eb925",83932:"757c6784",83954:"e67a83cf",83970:"e200187b",83976:"0e384e19",84013:"c17d6939",84070:"511d3e84",84107:"ed83b9b9",84112:"f50461b9",84152:"d2ed2b82",84227:"17d9fbbc",84255:"901160ed",84256:"a86855f2",84259:"2ffd8514",84319:"1132d5f6",84324:"e5fa0c05",84332:"0b82d45d",84467:"615402d6",84527:"8180940b",84530:"5955b5ee",84563:"2760fb69",84572:"d9a7203a",84711:"19441c68",84754:"eeef4db4",84755:"1c52b634",84773:"b738b15f",84813:"6875c492",84822:"fb6c680b",84869:"6bd2e919",84878:"21014f01",84963:"d9d878d8",85008:"f4f70b42",85073:"112387f4",85086:"ec173259",85095:"ec2ed6e2",85105:"ab380486",85205:"0cf3b0b8",85209:"8beefa16",85228:"80b92086",85243:"78c968cb",85257:"ffec2b37",85279:"8f4a15da",85322:"c9ff545e",85353:"3dc48fec",85442:"2f6614a5",85453:"de5aeda1",85478:"10d4d7ab",85529:"021c0cbe",85537:"2c88985c",85558:"86c0ae26",85581:"8f9bc413",85588:"24e645af",85736:"0e8c3a89",85867:"9aa57b9d",85896:"c9fc48eb",85899:"41639dad",85905:"d5ebbe5f",85917:"716f14d9",85960:"5268c144",85967:"94811a36",85973:"5733876a",86063:"d6ce3007",86121:"677325f0",86167:"1f8198a4",86215:"95ee2976",86216:"abe1b280",86246:"7a2c4c43",86354:"d630316d",86417:"669193a7",86424:"8609b6c1",86478:"2a1b9f9a",86480:"3a311bb0",86501:"f4e1ab69",86596:"8bcf4d99",86597:"0e0dfb6a",86616:"6522b4ea",86659:"7ff6577b",86669:"927f97a3",86685:"58421c87",86807:"b0445ba0",86846:"57ec2762",86856:"c942990c",86888:"5687c7cb",86890:"319b6f13",86914:"869411c7",86939:"7a06eb83",86955:"99f485fc",86978:"9c273b44",86992:"d2a66e94",87004:"b62a4e5f",87145:"ae399c1c",87178:"ddb4c0f8",87184:"4462c0cc",87186:"767cce31",87205:"bad31f72",87217:"9c71777e",87269:"747973bc",87282:"c884ad6a",87309:"7a0a590a",87334:"0ca9b6ce",87377:"c4f2c374",87389:"740081cc",87420:"65917e4b",87423:"cfdf8269",87459:"b8f2cc13",87473:"baf4021b",87483:"d5762a9f",87485:"643da015",87495:"0e80f4a8",87514:"813eecac",87598:"74663bf1",87614:"7c29a585",87669:"022ae4ac",87688:"137db567",87747:"3f1a4665",87779:"4afdd010",87781:"6f831635",87863:"4194f325",87875:"01f93a4b",87880:"f553a7ec",87892:"6ccdf67f",87905:"fc17862c",87922:"be72319b",87945:"5b17955f",87971:"dc4ee1bb",87995:"85f9f5a6",88044:"d96d1865",88111:"ca3d464c",88163:"2e05ee79",88226:"10a1a3fb",88248:"ed990644",88298:"85e50ec2",88310:"0169a509",88394:"5ae50f21",88436:"a13618bc",88468:"bf79ed6f",88478:"23a811a2",88547:"2283659c",88591:"b3488ec5",88622:"5871fbee",88626:"6e8a38ea",88696:"6be5dbf9",88775:"b330ac5c",88815:"71cde98c",88821:"b0b71a2a",88847:"014c2cb9",88852:"508d741f",88855:"5edce1ad",88930:"ed9c0dc3",88962:"2da04d93",88986:"7b658d8e",89018:"2c9ce68e",89058:"01950f26",89082:"9a69dd97",89083:"5a1f4d83",89093:"fc93a2ea",89154:"be17da6e",89172:"adb96665",89202:"b70c8f5b",89210:"9b191135",89243:"8ff4e20f",89289:"d8e6b3db",89338:"324cb577",89353:"b919dab0",89362:"cb2f16be",89367:"3373d63c",89387:"4cc89b71",89402:"39ac0d5b",89415:"9ed26de9",89437:"ce1709a8",89455:"978ca64f",89541:"c732f250",89554:"7ff4234e",89610:"2d4f05ca",89641:"cde9af88",89650:"06f81f44",89696:"837dc7e4",89801:"084a80b5",89810:"9bfa1541",89858:"36994c47",89873:"65f8c8fd",89986:"e582f766",90066:"bfb3b697",90092:"25b57518",90135:"8abd7194",90214:"9db841c0",90257:"7b773c92",90323:"e70003d3",90414:"ed2667fa",90438:"fe49dcfb",90497:"50e73369",90502:"f4e4421a",90513:"6157713d",90562:"32eb34e5",90610:"78b09214",90656:"e3d36349",90717:"fff1effb",90727:"b843b03b",90749:"48dc1693",90818:"758aa2d1",90831:"e96ddf11",90842:"837010ac",90910:"e03c6723",90960:"a677093d",90968:"a714cbe0",90972:"70e8710e",91016:"9ba9f70e",91017:"722aa41f",91025:"cdd81d53",91046:"97ce358e",91109:"014625f4",91187:"3629c812",91319:"0f84f33f",91333:"d1980a1b",91359:"88f66091",91396:"68bc82c3",91428:"284c57b4",91517:"beaec3a6",91530:"7118d0f0",91540:"980d0b86",91568:"81ecc5d2",91581:"8614d32b",91587:"1fecd571",91612:"979e654f",91695:"6033c607",91715:"31cc39e5",91724:"9964550a",91765:"2c1d4307",91768:"a37fea11",91787:"df99aa82",91837:"cb350fc2",91844:"41ca93cc",91881:"cd630e7b",91895:"b7201a27",91916:"72fdaa88",91993:"8ce0215f",92018:"0ce689e1",92031:"e2c3948d",92125:"4cce6e5a",92142:"90b60297",92175:"f355773d",92196:"56a0d755",92273:"85fe7d70",92329:"4a4c6752",92410:"4c434b32",92412:"d888d821",92475:"1be20fdf",92535:"b6eb7220",92544:"e53ee22f",92570:"c36ed022",92577:"283d6ebd",92653:"efa442c3",92664:"7c1d6f5a",92673:"9dfaf941",92942:"211e6ca6",92955:"3e082aad",93057:"adfd3bc1",93166:"fed5be48",93210:"e55ca189",93241:"79f4d1f3",93269:"b12147a6",93273:"cf32db66",93281:"0f59d921",93310:"e5a53ed5",93352:"ad148db1",93362:"7a234181",93427:"af68afaa",93636:"e1847ef7",93781:"49c7888e",93849:"09bacf3b",93854:"0a07ac32",93884:"c3c082a1",94065:"ee71d619",94077:"cd593b9a",94091:"beceb38b",94106:"acddd5ca",94155:"5869b01e",94188:"f67432e2",94215:"cffd1a69",94227:"f0cc57e7",94251:"824e6f8c",94314:"00f9d3c8",94417:"85c8b6c7",94429:"f1579842",94445:"55f86eeb",94475:"1af446b4",94538:"13feb7a8",94555:"8e7aaae8",94561:"a1e44e64",94568:"745d4b8c",94592:"72e16faa",94625:"0a02a2d0",94631:"783e4c37",94648:"50774ec6",94711:"0c2c2d88",94750:"0ae9f46f",94776:"e922bdf9",94788:"c26e67a5",94796:"256701a3",94841:"a1282170",94843:"3e1f4a39",94863:"fc66001f",94864:"95ec5604",94910:"bb63d03e",94921:"4e7b7607",94925:"e8b41ff0",94980:"5fc8caff",95020:"63c4b13e",95058:"4b69979c",95093:"f7750a15",95108:"f697d99e",95136:"c0df5757",95159:"cdb727d9",95187:"59700627",95231:"1cb0fe52",95240:"b4030b00",95245:"ed211a79",95407:"526262ab",95427:"52910a8f",95470:"8a40ff6b",95505:"7db94a09",95528:"5c49bc18",95542:"5917c028",95613:"8e175eb7",95641:"188015be",95649:"4885c521",95717:"cb03669e",95768:"89ce4ba3",95785:"8c79a60d",95818:"dbea5ca6",95832:"debfe2ad",95900:"3b1c0220",95909:"9e488927",95980:"86ed5607",96086:"eb84cef2",96239:"380e17bf",96268:"638db053",96276:"82a7c68f",96325:"65d1ec04",96355:"e3dfbe38",96463:"ddd9290b",96470:"1b260ed9",96533:"8168f54b",96555:"d4083900",96609:"19f4d091",96646:"9fd8c386",96771:"a98ffe6a",96846:"78775dd1",96863:"bbabcc43",96881:"d527c17c",96939:"e8630c63",96963:"98749210",97006:"7ab01152",97033:"e9032a0d",97038:"62a12351",97107:"9331da7d",97114:"32bb5bcb",97123:"9d2e74da",97167:"20a30ea0",97223:"7fa05810",97246:"365a7fd7",97251:"0b79e3ae",97253:"1a8a162f",97286:"5345b11d",97296:"205cdcf8",97316:"99ac6847",97342:"c2a473ad",97352:"e507660f",97379:"3bfbd79c",97420:"224c7e3e",97424:"ba47c136",97476:"b93a682d",97536:"3a6c6e5b",97562:"3d08e0be",97585:"8e81e342",97618:"169379e7",97670:"1dba1ecf",97710:"e77acc18",97732:"b58e88de",97737:"8fa9d00b",97763:"7d2fd416",97768:"77f37b47",97821:"97a057b3",97829:"e5562b89",97863:"47edbc34",97887:"26ec8ae2",97895:"ab8b4014",97913:"1e228808",97944:"6018a0af",98020:"16243474",98021:"139d61ea",98070:"bd3cb29f",98087:"b18455bc",98094:"48f67822",98127:"3c410a59",98154:"0d55f18d",98178:"6dd52a8a",98237:"3539b92c",98271:"f62bafa2",98311:"9e297776",98392:"1c3a958e",98425:"b943b6ea",98473:"94dcd3de",98477:"ea6f04d4",98534:"6065ad54",98660:"e155b22a",98700:"99e64d04",98758:"af6e9729",98761:"3314c9d3",98779:"a48978f5",98804:"bf667688",98908:"b4e94af8",98925:"ab37b32f",98941:"c9ba7c72",98947:"ef00b8a0",99077:"9ab9816d",99095:"1c27379d",99105:"9d47e342",99151:"8e563661",99236:"70f30c1c",99252:"3047f3e7",99280:"d5405b72",99306:"bdecca0c",99330:"b3e98411",99335:"df09200e",99389:"ebad1003",99437:"5ffb8f23",99451:"c0684476",99502:"2263a65b",99504:"76af5d51",99528:"16e939a3",99531:"8c2cbe8e",99534:"c49eb59b",99543:"25c655c3",99611:"9cc8ffa2",99678:"25e15e7c",99701:"5a4dd75d",99705:"5fb14ca8",99709:"dc330c71",99710:"6e34d00c",99746:"f4a839f6",99747:"a32c0324",99764:"a9be9b10",99839:"d1ceaa61",99855:"22559948",99905:"2f7d15c4",99970:"8ebb6eb1",99987:"4b2e4980"}[a]||a)+"."+{16:"8ac05ebd",25:"f0362d49",28:"cd15891e",48:"0c461f53",67:"2d55d234",129:"3888799b",142:"5226a575",159:"0d32a66e",192:"2a5e92f3",217:"6f1b0503",273:"08b747b1",292:"567b9204",323:"b66995d1",339:"138b74ba",354:"7a75015e",387:"751989e3",437:"92064fac",569:"ac25fe95",614:"91c15bfc",878:"77a3ca56",917:"a8aab479",924:"72b7899f",940:"684cd7f5",982:"194878d9",1017:"446f3e44",1107:"4a348c43",1119:"814a5e52",1151:"c6a3fe01",1190:"155bc77e",1211:"db2248b1",1397:"d4082297",1422:"0176850e",1458:"ad1e6559",1459:"4d3e082b",1517:"1a694762",1550:"9699f120",1622:"4e919029",1635:"78aa6a72",1707:"134f5de0",1715:"065cc975",1717:"00ea715e",1763:"ef8a6a49",1784:"bef16a2b",1841:"4d0b99cf",1846:"f06e3bc4",1857:"b0569849",1882:"b991f895",1928:"8477dccd",1949:"788eba58",1955:"ac3f145c",1957:"a21a8896",1983:"abaf63ab",2016:"8058788a",2053:"bcf43093",2072:"5873960a",2106:"579083aa",2121:"4a407f3d",2200:"79f1c8ba",2214:"f4723e22",2225:"41dbf674",2256:"70aedd4b",2298:"f48617d2",2368:"b72b7d03",2385:"8f345790",2450:"56d5c2b0",2472:"a8ce9c76",2540:"6e02a076",2577:"9ba93d75",2640:"8d32a009",2652:"875b1af0",2663:"e5cdd507",2679:"d200e52a",2696:"6bba2e9a",2700:"0cad2ac5",2732:"ae456e28",2739:"69eb7dc4",2748:"9a7fe731",2759:"90a51f8b",2772:"d173cb5e",2791:"e559a0ac",2839:"d28a66c3",2854:"a92f21ca",2918:"c86625a7",2932:"5c6ad8ff",2954:"b0478f08",3050:"88be6c15",3075:"c2c3dabc",3104:"e03ffad8",3125:"900b550b",3131:"2c75827a",3137:"7242e424",3144:"59b83e62",3151:"64522f3c",3174:"a1690509",3179:"285e0b24",3303:"84781db8",3313:"fa91bb20",3323:"cc825151",3337:"06808e39",3482:"6525aab1",3558:"1c079f8c",3693:"8d4e55ca",3722:"35a202b7",3740:"6b9b0755",3764:"2f1dadde",3843:"a21d3d9c",3940:"70ec240f",3965:"dc1f1f35",3968:"7218d679",4040:"1e2bf952",4060:"442c94b1",4074:"48c4e4d4",4133:"b73a8a87",4205:"49da151e",4355:"3e38878e",4362:"a0869082",4368:"da0f776d",4405:"e7a97cec",4425:"1a0f7b84",4442:"bde60cf4",4467:"6c9f8ce3",4530:"d709439c",4574:"649efb69",4591:"ee580cd0",4602:"3fb5552e",4629:"2448e6e8",4777:"472918d4",4790:"4134ebc4",4795:"bfcb9e8a",4863:"b5c502a0",4890:"97d9560e",4919:"51b16c65",4980:"194864ff",5028:"0d5e7a6d",5029:"9334a7a6",5065:"7d49a3c1",5137:"d4ab5c9e",5168:"b622a954",5193:"a941a5a7",5195:"edcc5600",5268:"0be145d6",5270:"3d510d75",5289:"ad00e36e",5295:"b5380022",5322:"bd7b5075",5334:"c4b6d4e5",5338:"19b436b9",5397:"009776ef",5594:"aa074bbb",5622:"5a34a558",5631:"b76c6089",5633:"fe458f8c",5685:"500a2807",5721:"a794af55",5795:"559bea76",5806:"fe1c3d81",5887:"7a8be1b4",5888:"5f91de44",5936:"a9b347d0",5988:"6ac33f8f",6045:"db1e1026",6082:"279eebed",6090:"c662b14f",6158:"0be8aada",6171:"b1b630fe",6203:"1ff06562",6225:"1c46ef35",6289:"435264a4",6350:"b906f412",6370:"c0d1e5a3",6371:"6980516d",6372:"ca6f4523",6467:"e7899499",6482:"4c9fed03",6542:"00cd3965",6552:"499b911d",6559:"4d5c8b78",6605:"9dee9f5a",6636:"18ccaed7",6677:"78ed8131",6697:"9e741f49",6709:"5a94c6a8",6739:"9af6f46b",6761:"87a9fc1e",6791:"918a70a8",6823:"b8d052cb",6827:"f224e485",6845:"8e6544d0",6897:"8ccf6b9b",6944:"d9d18539",7033:"ed9b3588",7035:"388ba84b",7071:"5077a002",7100:"56a20715",7125:"fb2f85b3",7140:"04513e55",7160:"f56e090f",7167:"b11db014",7233:"ccda7df5",7277:"39506a42",7317:"c71bc81e",7355:"5a604a37",7414:"2ea5d970",7444:"9f6bfff4",7458:"77fbcb33",7462:"9c14d3e6",7517:"9f4db3e3",7564:"1cfbab8d",7693:"f136c13a",7715:"9b15ed44",7724:"5aee3c9c",7734:"2564e702",7773:"d22f43c1",7802:"18f6315e",7844:"b19094f4",7861:"4f3378c3",7881:"a309c6b8",7904:"15613429",7907:"c025b354",7945:"c2632258",7949:"38e02316",7953:"4e457086",8003:"f80724c2",8070:"4d429baa",8177:"20ac9730",8183:"3a452a20",8192:"230029e7",8209:"c1611e12",8263:"18384273",8281:"d65c537e",8289:"2e24ee20",8348:"d0f2e2d3",8354:"a40ae6b2",8363:"0179079c",8367:"21a50fcb",8413:"fe3f7476",8417:"03b71ec9",8583:"cd14ee3a",8585:"1d1d50de",8606:"fd7dd514",8619:"219db3ab",8645:"e22163b4",8651:"fd6634a4",8668:"0ae30b3e",8688:"0ef8fc51",8762:"ed55bde0",8766:"d4602947",8840:"ba168b8b",8874:"eb2235bd",8888:"4d6ff9cc",8889:"85a7e3a7",8892:"9e3d8aa4",8900:"eeb0280d",8909:"f6276f03",8965:"559db5a9",9045:"5064d1a2",9127:"c26a9e92",9151:"cb9f37da",9152:"2086668e",9189:"b9c18810",9195:"22c5016d",9225:"f8e41346",9228:"debc195d",9257:"980441a2",9333:"15df7b70",9351:"71e70b1f",9426:"d153df35",9428:"259145c4",9432:"83b0e397",9446:"25d584a1",9458:"cc256cd5",9471:"c536e3e5",9478:"21869f38",9499:"f7cd652b",9516:"deec291d",9570:"1ddf38d8",9631:"23e4dd86",9647:"4bc8eb58",9676:"3600578e",9700:"0177e547",9702:"a0e15d40",9722:"1e50549b",9737:"1aa9929e",9790:"f4949afe",9836:"77c37a00",9856:"6c3f2d91",9860:"d6bcaf83",9870:"db20a9cc",9888:"a845ad12",9891:"a8192817",9896:"19e0ef21",9914:"6bb2f03d",9944:"51536acf",9986:"481495b3",10030:"b20fee70",10118:"a38b2ac9",10181:"0777fd73",10198:"372a289e",10238:"6e6a9cd7",10285:"b67fa6cc",10354:"741a1086",10384:"8b6aa9a7",10472:"35cf3d5b",10510:"2cac5bb5",10535:"78c63297",10569:"d066683d",10637:"d596e8d0",10640:"9710e162",10642:"3c6be4cd",10682:"171b4746",10683:"209cbd7f",10708:"62ae983a",10727:"7602e1a8",10767:"b67c6cb0",10789:"b4306562",10801:"8e2ffd0e",10907:"dfd7f2e0",10920:"f962ff2d",10954:"08ce30eb",10956:"670638d7",10978:"295a103c",11e3:"189640ba",11002:"e45a7aac",11111:"66cb98e2",11238:"59057ae9",11275:"6a95bbaa",11289:"bed04fe6",11299:"9e7747c5",11326:"76f9307a",11330:"160d982c",11355:"60c16346",11508:"378e29d0",11624:"c26f42b1",11631:"456bf323",11682:"8ebca801",11725:"7955bde6",11738:"e6134e88",11745:"9081e9ac",11768:"7236ce84",11775:"69771f4a",11783:"ef6aba8d",11795:"c2957c56",11804:"65c35fc4",11842:"5225004d",11855:"0d093388",11869:"8ab52dbf",11905:"053c7e23",11906:"2a5c3c67",11977:"2515ce5a",12047:"1119fc54",12110:"545ee368",12123:"a9d8a5cf",12134:"8f01fdba",12144:"36c195ab",12186:"366f93c6",12316:"dac4c86a",12318:"e419dfef",12378:"3c6c9f4e",12395:"1187f8a0",12431:"7429f4cb",12452:"0aecc69f",12477:"b9df0d01",12513:"9e459ecc",12535:"f6122913",12542:"3bf8cace",12613:"f8b011ee",12617:"0b34b7b7",12650:"73cdab89",12654:"a86ca62a",12686:"4fc79481",12869:"0987eeb0",12912:"f3822f11",12945:"eac30142",12995:"30dbdc54",13021:"72281ffd",13060:"2aa3b2d5",13063:"89e4541e",13124:"0b9b75b8",13152:"edfc31e6",13203:"ddbf8f3e",13236:"e36c6187",13358:"a54cc156",13374:"3b5dc33f",13375:"4b923f29",13419:"cf042379",13460:"bffc2d0e",13465:"b3d3cd8c",13525:"350bb64b",13534:"0b159e45",13562:"bab7d1c5",13580:"b5ed32dc",13698:"62b11040",13733:"00549fc4",13762:"34db2b68",13803:"9a5f96ea",13918:"0a0c3afb",13943:"73aebc88",13970:"70c1326d",13996:"134dd2f7",14003:"4c9d4c99",14027:"a2d505b4",14042:"68bbb833",14043:"0f3ff3bf",14059:"6483883a",14125:"73fc368c",14134:"8e9b79d1",14136:"6b15fdc8",14152:"6d1342b3",14163:"539d7459",14168:"961871f4",14179:"ba42a4c5",14224:"e4916c87",14257:"5502ea28",14259:"fefa2252",14261:"fbfae7fd",14264:"1fffbb8c",14286:"e6d9af63",14340:"93862f4c",14363:"9a5204a5",14381:"e96823fc",14388:"4c3202da",14399:"d390ab6a",14410:"81c89a25",14435:"ccff2e24",14446:"116bae8b",14483:"b8756fc1",14496:"2181a5a0",14515:"1db3a2e4",14536:"679edb6e",14549:"7d8e460c",14599:"94173808",14627:"f540a45c",14629:"7cf019b8",14683:"55bc1b0e",14726:"3e9f6cba",14750:"af72168c",14817:"38117e22",14822:"07814cd7",14844:"09027959",14868:"1a051531",14917:"1748e819",14919:"e9585aa1",14943:"473175cb",14971:"9ddab47d",15078:"f57e4316",15079:"4f341544",15144:"46d954c2",15186:"2b478d78",15220:"109d2e90",15235:"d25ccc05",15272:"69681a90",15292:"76382a99",15316:"f3ef7712",15387:"e2ac8551",15403:"a0206d92",15473:"c0502a9a",15528:"88d1eab0",15552:"7c41139b",15607:"e4070ad4",15654:"b4482666",15744:"d3b026ad",15746:"02977e2d",15805:"7f419894",15875:"9971c895",15881:"94e9b95c",15896:"ff07cd1b",15917:"0c478add",15947:"7d0abc22",16032:"a789234e",16090:"59b459a9",16100:"77793a47",16209:"86a3d504",16378:"00a39ac1",16560:"2900993d",16622:"adc5afc5",16641:"2a1eb5f3",16649:"f1f1a85b",16660:"35b674f6",16685:"7cee9c09",16689:"07b5632b",16745:"042dd2d5",16775:"5c011661",16803:"f2b20b61",16885:"9caf8073",16942:"9227373a",16999:"7c7ee436",17033:"6dc883c3",17232:"6370ad0d",17294:"de0343b1",17332:"1c963c67",17368:"43943470",17402:"71c617e9",17411:"13b9d385",17441:"97a9a210",17502:"2f68280c",17530:"262072d1",17606:"16c6b13f",17626:"ca8bef6d",17681:"0a28b4be",17697:"0b4ee2f4",17709:"083b7eeb",17722:"27e29040",17727:"6997bc49",17803:"0c38fcf7",17818:"b2d4ed92",17860:"51f552bb",17867:"a0f6100b",17899:"90cfbfef",17987:"028e87dd",17988:"3b5e67b9",18006:"5c559465",18033:"8b41a0c1",18103:"8862c93b",18115:"93ffe70d",18142:"5dc3538d",18187:"7e0a04fa",18205:"2878db19",18299:"6b1005b5",18351:"95b9e285",18375:"619d0bd8",18401:"e94b36b4",18438:"b128cdaa",18445:"e2638720",18520:"d07e5cfe",18551:"646dc65d",18616:"cd50a18d",18620:"8fc7ba62",18645:"240612b2",18738:"0b492dd1",18757:"c61f07fc",18940:"adfe8f3e",18950:"1c16d30c",18998:"b4319093",19040:"495e130c",19042:"3900c42d",19052:"46ea8872",19070:"6ff00ece",19108:"02f2695f",19237:"db956b9e",19369:"540a7369",19387:"a45be931",19396:"92b1e64c",19428:"bbb964e5",19521:"bd33f769",19542:"6a596000",19578:"d9ca0649",19659:"7fd63a3e",19664:"7446530f",19686:"6a81d90b",19711:"f705be5c",19774:"96192c07",19798:"8e862db2",19801:"2cd38a63",19851:"40f54417",19865:"c2a61d18",19894:"f2cf7135",19999:"4573ecba",20103:"e296df60",20116:"dfc7eb01",20154:"3f3431d9",20160:"c4a45f43",20216:"dccc3c9e",20229:"ee2596fb",20286:"7ad43929",20304:"3b4d58a4",20358:"2fd910e4",20361:"686333c4",20405:"46ff6b3a",20415:"86022b1b",20428:"751241d4",20434:"49d1eaf5",20491:"fb010bef",20535:"cb7af6cb",20541:"ca584950",20596:"e5b9c711",20639:"88c80dea",20661:"e30cf182",20713:"2c6d24de",20812:"05d2f4fd",20892:"dafa34de",20924:"9e4ccf1f",20951:"4085b498",21070:"bdea221e",21121:"837b54ce",21123:"9345258e",21177:"05e6eba3",21191:"63b947f1",21273:"e3460757",21275:"15644456",21292:"7083f7ed",21303:"388dc2a1",21316:"d318c062",21346:"e3324367",21373:"79507c92",21417:"b5bb43ff",21492:"f8613848",21510:"4eac4151",21524:"3320162b",21560:"96410c41",21585:"d442996e",21630:"9225fb44",21635:"83c1b80c",21644:"c48ffb37",21683:"f8ba8e93",21729:"f9b05879",21805:"db2c2338",21874:"9647af30",21921:"f53a86a2",22087:"fbadb3cb",22124:"89ff5dbb",22141:"b3e9fdd6",22170:"22a965ba",22178:"62d4d7e8",22236:"eca8ba0c",22257:"cf1f4a84",22262:"0df74bae",22385:"ba8ab668",22447:"2647355c",22499:"c959dc92",22501:"02042e9e",22504:"43475c1a",22534:"488ff42b",22579:"67b43690",22595:"6d9f3ec6",22640:"34f41780",22651:"bd743239",22702:"6c60d195",22791:"71eb2085",22809:"d0f84769",22816:"5a1e4a66",22911:"7a0099f9",22916:"c477d29d",22932:"c688b67f",22969:"3926a067",22970:"1cab002c",22973:"8bc0e7ce",23002:"46c384d1",23039:"6c0fce19",23041:"8c1bd410",23081:"d4604ec7",23119:"18122d0d",23141:"dfe3feb6",23208:"fe9f38c2",23332:"aff1ac25",23388:"1a04b7a7",23438:"914e22af",23475:"16251630",23545:"ab209fc0",23563:"4602839d",23591:"16cd9fe0",23600:"953a038a",23634:"dcf1fc77",23637:"22313d2f",23641:"cfe9bbc0",23666:"d4baeaab",23676:"b6d59077",23700:"4813ce1f",23805:"91360e3e",24033:"bd66e2b6",24036:"d5f8977c",24065:"7e495472",24071:"bfe1e75b",24084:"7c95d95c",24098:"ac04e3d2",24126:"5ecb3c81",24140:"e76ef921",24143:"b377382c",24172:"0ecb4baa",24234:"8bc4905a",24265:"b94d5152",24292:"5caf29c0",24301:"f4bac114",24327:"f704446a",24340:"9bddd554",24366:"650e3002",24377:"0232f7a4",24393:"241a6877",24475:"48d3eb7c",24476:"25e14ba2",24607:"28a8e3a6",24618:"46db6a06",24644:"00ce995e",24649:"a8b67a6f",24652:"3c345bc6",24704:"b2a1b395",24728:"f98b0bd8",24826:"26d68de7",24838:"bc4155ae",24853:"4007ddd3",24891:"5890efe4",24912:"6817e6e7",24919:"78a88647",24970:"90183578",24991:"629324f8",25044:"68371239",25101:"a872dbec",25130:"59081464",25173:"708ab92d",25186:"5e831468",25243:"8ca109fc",25285:"77ba9f9d",25335:"8839d8ea",25397:"fb32a912",25410:"0c116ef8",25450:"62b2392f",25452:"182cc5e1",25469:"2128064f",25531:"9a415af4",25532:"f7c2567b",25539:"160170f1",25582:"ab6dc686",25632:"b7213de4",25671:"19c346b9",25731:"f3ee2613",25778:"7f42472e",25781:"4e5077ad",25845:"e100cef5",25874:"c9e956a1",25987:"1f79f118",26003:"5170144a",26009:"3bd877b1",26079:"ff6ff1d6",26183:"91985ae6",26184:"b12a9d4f",26216:"5e20fb8e",26260:"c8d40ebf",26305:"e1f80484",26333:"f24faa99",26337:"438f144e",26352:"09ed8b70",26610:"a7babf6e",26627:"c2210b47",26632:"043a2915",26722:"ae9bb6a5",26744:"4f84a6a5",26797:"52da70f8",26812:"654c8081",26882:"1c388de2",26900:"a252ff91",26986:"122b9851",27012:"10d79155",27020:"4f663ffb",27088:"d75dc45b",27092:"e1cd998e",27094:"b42967ad",27115:"6b296f1b",27123:"ca5ae4af",27179:"9517eb87",27212:"98d2a763",27367:"83b93478",27369:"6e19762f",27388:"dd0105b6",27394:"742b91e3",27398:"a7cca359",27444:"95540060",27473:"f36c868f",27493:"c65c480a",27684:"732d93f0",27785:"f5511f80",27955:"84e51b5f",27995:"09203cc8",28081:"c7f06aeb",28086:"97fdf3f8",28111:"e3bccd5c",28166:"f7b1a0f7",28178:"62cfc729",28204:"74066e0a",28235:"c1a0fb92",28252:"880d4216",28294:"4ca542d1",28319:"4eae2708",28369:"7fa0c818",28410:"a7f8d300",28498:"1948bf76",28616:"a066ce01",28627:"1b7c55ec",28636:"a0f4af04",28679:"4756dd10",28687:"52d8bafe",28701:"e6d57536",28782:"fa146d82",28793:"b979c797",28834:"6805fb4b",28920:"8acff1e1",28941:"6c88a1a6",29060:"70769d75",29100:"0ab1cff1",29117:"fa455e62",29148:"50313aed",29243:"5ba26036",29370:"f3a55335",29408:"f798b594",29421:"be77c338",29452:"6c9f7f40",29457:"2dade485",29514:"4ed81190",29523:"1f01d041",29526:"d3ced069",29567:"54eddb7b",29653:"6c1bac51",29679:"83c06c29",29690:"35e6cfa7",29698:"12a0bbd3",29708:"8f01ba9e",29733:"2fc70ef1",29795:"c62884ae",29820:"ba5150b8",29829:"64635776",29838:"63559713",29845:"26d07535",29851:"46d1f4e5",29885:"585d6e13",29943:"0538ff77",29950:"95d8c9c4",29969:"b99437a6",30021:"99c6d723",30035:"7e34ceb4",30154:"69f8d206",30163:"4b199a1a",30167:"2e627378",30200:"9c91a718",30239:"c0efd77f",30262:"b26dce04",30303:"9e473c96",30314:"72aad6a6",30355:"20f0f359",30410:"a1ebb577",30490:"03f6f574",30564:"45a6bb9e",30579:"ecc3681b",30583:"9859512c",30585:"579c479a",30628:"dfa020db",30746:"5c85f7cf",30827:"fbc9b400",30831:"833c3818",30842:"bd41f57b",30848:"8fa0da33",30934:"37abe96f",31016:"da5168fe",31022:"0882a243",31039:"0b15a39f",31125:"052f330b",31150:"f80816ad",31213:"d831b797",31220:"ce77d7b7",31255:"67357ced",31257:"ed9fba36",31272:"6a19c635",31279:"4df831e3",31465:"d0c255c3",31541:"7943aef7",31544:"1a7d8e28",31567:"b2867725",31700:"fac4c96c",31705:"cbed1284",31720:"5f2b67b3",31791:"5804058e",31838:"b9b98db5",31861:"9e90448e",31862:"9abe8fb2",31972:"31acb15a",31996:"00758b71",32005:"84603570",32012:"4b5e21ae",32039:"d731efcb",32183:"8c775c29",32295:"cb1ba43c",32335:"a0130ff4",32365:"96416184",32374:"ca708e35",32384:"5622bab6",32391:"31c297cc",32472:"61845888",32492:"0cfe6e62",32558:"5c77c69b",32691:"fdff4ad5",32728:"f5f8125a",32781:"45016ceb",32787:"28677bad",32825:"d0d1e442",32847:"bb183978",32875:"b9880713",32884:"e764023f",32949:"30519250",32960:"a66f3281",32993:"100ce346",33049:"797f09f6",33065:"96d2bc95",33132:"b9fb732f",33192:"aeddaf9e",33202:"77ce3fa2",33234:"27765e8b",33290:"a7ee7ebb",33307:"b8a90e65",33350:"d0743ce5",33458:"5e27357c",33462:"b6748652",33517:"806e15ea",33540:"4955f299",33567:"58dbec2d",33572:"790be6bb",33612:"952b9785",33621:"fff6756e",33638:"7a8f91fc",33643:"5ff48cf7",33659:"95a3021f",33724:"786208fd",33804:"a4a3288d",33806:"cb9093ec",33825:"8b5277ef",33881:"4ec68caa",33889:"aba0ae0c",33999:"4708bab5",34071:"c529f0d4",34095:"ada1f567",34117:"94f43e49",34127:"43149bd8",34156:"56d9a677",34171:"57af3c1d",34179:"8324fa5c",34196:"85d389e6",34255:"d26c8a6e",34331:"d308b051",34388:"07ce653b",34447:"fe0f180b",34511:"aeaa78e8",34520:"55d7dfba",34528:"fb5dc813",34543:"204a4d9a",34549:"f29b2a9d",34621:"d8f116f0",34662:"d54bb307",34691:"641379dc",34706:"71293920",34750:"a07e2874",34761:"afe7f205",34808:"7442575c",34810:"2657c03b",34812:"cca7b04b",34837:"c6d8e355",34847:"9b92bcf1",34877:"03b8eb1f",34962:"c1d7aca3",35023:"50d0a398",35139:"f3128d42",35168:"fa87447c",35288:"a547d99e",35325:"c3a4c126",35329:"0d7fe910",35402:"84a5c423",35523:"e2e1ee4c",35532:"c84e65a1",35542:"fbefff6b",35546:"3e65ad63",35618:"19eb0c66",35733:"537be3ff",35742:"de61f764",35766:"174487be",35767:"463a7575",35808:"70beac1f",35844:"d7ad5460",35911:"c2f989d6",35932:"db328b4f",35960:"166a77a2",35983:"408a3db9",36009:"beaf7ce6",36055:"b81c37ad",36067:"786b5395",36113:"f79b7ff5",36144:"a3c650a6",36188:"f547e259",36192:"329ae917",36211:"994fbe07",36271:"53ca6387",36302:"02a771b6",36361:"feee8928",36573:"b3366c1a",36619:"600f0e81",36640:"e00d2795",36672:"a5db5682",36682:"896a9672",36689:"ae0b01bc",36703:"afae5ceb",36747:"17dd0f7c",36763:"b3d35020",36790:"c42b1b88",36851:"3f63d885",36890:"3f8a945f",37109:"7520aa6f",37115:"416d8c88",37147:"ed98e2f7",37191:"4fcfa7cb",37204:"49df1dec",37206:"037ab3f9",37209:"a1f9ee00",37287:"e3b3be1d",37298:"30eb2c83",37329:"2beecd8d",37366:"c3c12683",37378:"f069c090",37441:"2f2535a7",37485:"a4887190",37486:"f0cf1f24",37489:"c3b0806e",37578:"293381f7",37617:"98b37d25",37643:"4865d39b",37646:"c5e85ebf",37673:"2a0ca503",37678:"c4033544",37702:"9980cee5",37737:"0b89d08d",37740:"72534e6b",37799:"545730e0",37809:"ba31e5ee",37827:"f146de88",37839:"7e47bbd1",37841:"dc25e3f6",37842:"083b7156",37872:"f0421a75",37979:"56e915df",38001:"e8de45d3",38032:"a9ebe729",38035:"514fa6f3",38055:"cc6f35fb",38056:"157936e5",38238:"2906d599",38288:"8f516468",38370:"edbef2fa",38416:"cc68a397",38439:"c442d347",38451:"15f42485",38460:"4f06ed21",38501:"dad7a44e",38520:"5096bede",38600:"e52df43d",38605:"147e6e2b",38642:"28188f1b",38767:"2069f290",38816:"2e6a995d",38835:"159b959e",38839:"60e4a3f5",38888:"75c8e2d1",38891:"064f0318",38923:"281017c7",38953:"2c10a661",38974:"8999a5eb",39014:"ee4cf326",39058:"27f83944",39088:"9b7cc7e2",39110:"8bf923ff",39138:"30d6c764",39142:"0f9b17a5",39153:"0fbb8eed",39185:"02061a5e",39192:"39ca29cf",39197:"c0794e42",39202:"57acc065",39228:"8913b29b",39230:"90a76867",39240:"f6ee252f",39260:"535b3fba",39265:"9d8cd1c0",39283:"15cb5d63",39404:"29af646c",39405:"5a899176",39407:"536f961b",39423:"873a960d",39444:"44da259f",39472:"51d368b4",39473:"dfb4ccc4",39487:"48461437",39494:"8329c98c",39555:"8a276b1a",39569:"7398d59d",39587:"13c221ba",39608:"de053b18",39712:"569aa42b",39715:"3c3e42dd",39773:"7fa7904a",39777:"8bd37477",39781:"eb0d7286",39876:"79f2bc2d",39887:"d57d214b",39901:"1f6a0196",39908:"3c0a37b5",39973:"f96945d4",40065:"68fc409b",40124:"ec69a342",40132:"56705819",40178:"4f022e3a",40212:"7b9d9dbf",40249:"69931c7f",40369:"b3bf28fe",40463:"c4086162",40555:"b64c7e66",40606:"ed14f172",40616:"a179451a",40651:"f65fd9c4",40690:"fa974390",40694:"ce541902",40697:"99ebdd4e",40733:"594c94dc",40755:"8977d989",40758:"e0d2ec5e",40780:"5aae6ddf",40797:"0df3125f",40827:"9518f3e5",40847:"0b59b074",40879:"0ad293ac",40907:"31b64328",40927:"04e28b7d",40959:"0ea6685a",40999:"08bfb4f0",41030:"64f79f81",41120:"0cb9e462",41125:"2379c8a2",41134:"30c36d3d",41135:"a45fbc1a",41159:"9d363276",41178:"505cde6f",41260:"97d27dd7",41361:"5ac4238f",41409:"d180fce2",41455:"4bae3071",41461:"76a9b09e",41472:"36056a02",41491:"234f70f6",41594:"3c165f92",41637:"64cd5f8b",41640:"55bdbc96",41651:"e484bd7e",41677:"8d7634a6",41695:"594065bf",41739:"bef73aa1",41750:"df955372",41867:"c05584d1",41871:"2c5ca052",41872:"0dcdf39d",41892:"d5217e35",41907:"572711d2",41944:"7508e278",41954:"6c92aec8",41993:"c154ea72",42021:"f38811b3",42068:"199b8920",42187:"a8983f20",42196:"e6f20fc2",42207:"e9fed201",42350:"4ec3a68a",42368:"cc5a76f9",42380:"2a7c900e",42465:"9a67de65",42518:"25af2aca",42566:"46d31542",42576:"6905e2af",42596:"fc41574a",42659:"93e9d96a",42677:"7da804e3",42690:"f9657df2",42694:"8da104b0",42722:"ee6db088",42799:"d2e13f99",42801:"7cdf2de9",42887:"f2711f79",42900:"eb6a27c9",42905:"e3308e05",42911:"e025b437",42924:"496e6416",42942:"007d5a8d",42995:"93272e94",43029:"7cf3ffef",43035:"c603ad5c",43036:"ceacca00",43040:"7f80a0e5",43042:"f9508569",43078:"e4e17ba7",43088:"85d08fb7",43113:"9312a7d7",43136:"26d6858f",43199:"00bc3904",43352:"67598bc8",43372:"4a998c20",43421:"9d76dc5c",43432:"80b8b2d8",43445:"b991db3a",43447:"aecb8dc2",43512:"619aa4cc",43642:"7734b543",43675:"8c9a42e2",43684:"3e820e4d",43833:"c622964c",43868:"e83f47f5",43880:"98e75f99",43910:"68e94bea",43913:"5d92545e",44008:"80b7b469",44040:"4b271072",44045:"f13708b7",44062:"cf73f4af",44118:"330d959e",44123:"4ba5c76c",44125:"39fe181c",44129:"d8fd9fa5",44137:"5560b906",44143:"15678c4c",44169:"d044099c",44267:"e1df3fd0",44290:"2647d7f3",44301:"799f4a56",44339:"5a02a327",44351:"60056a65",44381:"0f2fd8b9",44419:"d38e9ada",44489:"41de95a1",44492:"330d9ab5",44546:"39f05583",44551:"d52e4d6d",44567:"860bcce1",44605:"d8b72653",44640:"b75262a3",44662:"82658600",44682:"77356827",44844:"96049e11",44891:"c2374fbc",44939:"78897c01",44960:"7dbe5447",44994:"b7143504",44997:"a39809ef",45113:"5779d1a0",45117:"9d8351fe",45218:"ff9cc91d",45238:"129e796b",45245:"49a30458",45268:"440e0356",45290:"b07370d3",45323:"33ec6344",45339:"9c5010a0",45400:"df49d30d",45500:"76ee01da",45541:"210626f3",45670:"5db834cb",45682:"4c7ab10c",45746:"066b1fc8",45919:"302c55dc",45920:"3c770b04",45983:"52deea49",46001:"f84251ca",46008:"5f13945b",46025:"a35c2f01",46039:"e488f683",46063:"8327e9c5",46074:"628e6e6a",46102:"fcbd99b0",46123:"0d7536ce",46156:"6aa19e44",46232:"0fbffca1",46244:"d041fcd8",46246:"e4c9315f",46340:"ac4c1bf2",46352:"04c498a3",46375:"a1945bfb",46381:"3c07c273",46435:"adfdda2a",46451:"5ad2c3cd",46464:"c87b3d2d",46472:"c5057fa9",46513:"755239a6",46515:"4aeb0be2",46541:"72e944df",46547:"14076aec",46548:"8a922f8a",46598:"fac3d57b",46633:"ed4369dc",46662:"731a20f8",46694:"a8e5839a",46697:"91082fd3",46710:"26243761",46754:"a456380b",46814:"a68a12e5",46850:"023acee9",46888:"c77e5db7",46905:"f8ceebdd",46911:"355f70cb",46917:"44d76c4f",46921:"e9f4c78c",46962:"edae7d40",47041:"1448ec13",47087:"ab81eade",47106:"2abf8698",47110:"92f36f5d",47127:"8e14d68f",47156:"82ac12c4",47247:"3b0b52a3",47297:"cb1b1ff9",47433:"ad19b756",47537:"ced3c79f",47555:"1da3cbf6",47573:"6362d3f4",47622:"e27a349c",47693:"f047f0c4",47699:"5b99da2f",47730:"744e0083",47738:"74ac10c1",47913:"d559182c",47917:"f9b613ef",47993:"cb4f3804",48015:"a748eaed",48023:"2a187de8",48027:"66bbd683",48050:"bd14dc84",48063:"f777fc95",48071:"3fa7d484",48097:"f567f8db",48127:"2f9721e3",48132:"831080e1",48140:"30ea389c",48158:"d48e413c",48162:"2d6e4867",48188:"f08a8996",48270:"f0792f6c",48285:"6fcc7665",48286:"8f7c465a",48295:"0d3a7887",48304:"26c725f8",48310:"c47eab51",48360:"56bc60a8",48361:"676cbbcf",48532:"3ef93cbb",48537:"69e3c961",48544:"92cb45bb",48592:"96702276",48650:"871bff96",48661:"5daf4874",48673:"992b03cf",48733:"722f48e3",48768:"64a5ccea",48793:"753400ea",48879:"84c26674",48883:"4947161d",48939:"3d39b429",48985:"f4f56d6b",49013:"6d2149b8",49109:"746d3fef",49112:"157f5ea7",49171:"8ac91157",49226:"15a3d3f7",49289:"8c2c7ea8",49305:"74943ae0",49308:"a5dcba6e",49350:"6d83b26d",49388:"d111eae5",49461:"ecdbfd79",49521:"7d4d828f",49579:"6f86456a",49583:"6338f450",49587:"2ebb3b74",49602:"1f0b9670",49655:"18924d47",49676:"1257be60",49693:"a64194d0",49709:"c0a5ad42",49768:"caa6374a",49783:"28f34e65",49786:"b5dc74bb",49941:"3be8d9c7",50012:"046421a9",50095:"bdc29021",50176:"5466516c",50178:"590baa54",50208:"6b02e277",50261:"4fa93c39",50293:"0c2230d7",50306:"70dcbdfe",50414:"95280263",50424:"9ac27fd4",50428:"0ffbd688",50446:"e524ac90",50472:"af650792",50507:"be5cd362",50570:"3357d5e2",50584:"c81b2685",50585:"8c6a9960",50642:"16372d9d",50664:"1b9f4c2b",50700:"228ae4e3",50703:"165693b1",50747:"7e5883c7",50800:"526981a4",50819:"c91daf82",50839:"f5f7ae32",50934:"920d5acf",50981:"8ff8f39a",51009:"377d8def",51047:"dcf69ab5",51059:"69094ebf",51102:"174129d6",51108:"cae2b24d",51116:"0a494911",51237:"416f1727",51378:"5281e06b",51412:"e9bb5008",51420:"6dd60b5e",51435:"d3b86647",51438:"9981eee3",51465:"d9889a9a",51547:"0150fbdb",51548:"a3d0a881",51578:"0e0bf034",51589:"7a33b1a6",51636:"24736e53",51649:"69be6285",51665:"f4ae75ca",51689:"ce7715a2",51711:"33cb0181",51763:"0b4c2285",51828:"c33a949a",51837:"5e4214b4",51878:"65301262",51890:"bd33c6c5",51937:"3d118eb5",51944:"750f9e7a",51961:"f572c73c",51962:"2dce9d3b",52036:"de6dbc15",52042:"f5eb946d",52050:"026c4896",52093:"56f98aab",52102:"b2d23bf5",52132:"766bd661",52135:"2ac8977b",52176:"fef7b7cd",52181:"08e1ba8b",52235:"0826b26d",52250:"8e2ae830",52261:"bceebdef",52266:"671aefb4",52276:"4d33fe9e",52282:"7cbb7598",52286:"e738feae",52342:"0189be92",52408:"569b732e",52424:"5e4c26c1",52450:"9081138a",52466:"5b145139",52477:"f0f7e205",52478:"2893ee91",52488:"00d3e540",52569:"e101fd6f",52572:"bf602782",52605:"cb863eb8",52612:"344cbf36",52634:"6509cbba",52711:"07c974a8",52731:"f7479380",52770:"b38fcad8",52826:"7b528936",52840:"ce7ecaea",52895:"bab31b10",53074:"d0e8bcbf",53118:"bf8f5dfa",53132:"f6956cd1",53178:"adb92c49",53201:"439d929c",53237:"6f6a2fd3",53238:"462287a8",53256:"340f9342",53266:"918ed0aa",53288:"4e88f11e",53314:"f3b2d4a1",53370:"230d73fa",53449:"3ba03479",53458:"bd8d870e",53488:"3abf8211",53501:"96794c38",53540:"117dac6f",53559:"8c6d63d1",53619:"5e7aa94a",53646:"6557930c",53670:"5aa4ab02",53742:"6ef9f091",53771:"1c5a85a6",53786:"5846b816",53832:"0de1e065",53861:"58c5c841",53871:"b51a7127",53881:"325b985f",53901:"dbc52107",53925:"e40c4bea",53952:"56f01164",53982:"36f3b191",54106:"d4f8a48b",54113:"f052a5f3",54144:"441c2adf",54168:"396eb8ac",54200:"8fc3b28b",54240:"03e49bd3",54246:"d97ae29d",54270:"4aacb2a3",54272:"7de26262",54277:"9778d85d",54310:"3e768c3c",54313:"fec778fe",54349:"0ee28c36",54399:"ca04ebb7",54415:"1d5e55f2",54439:"9392c360",54500:"39031b8b",54540:"e9519004",54568:"b318eae1",54749:"80bc2dcd",54759:"95b92ec3",54879:"85008fb9",54881:"62cf0af0",54950:"662eaa7c",54951:"cf766ccd",54992:"57209ece",55004:"025e6b9b",55100:"8ee90ba0",55144:"763b3563",55167:"3d08c140",55206:"778115b9",55223:"55235c25",55245:"427a39fa",55276:"3709bc67",55302:"b035e473",55329:"1c7b8795",55351:"049e007e",55395:"70e7d2b3",55401:"7e220ca3",55413:"82feccc8",55478:"0f30f68c",55483:"45118c64",55534:"4ab016de",55559:"a129ea9a",55566:"2785f3ee",55579:"628a2f1e",55616:"477b7ac5",55645:"2d3c6613",55664:"ac288aaf",55675:"fbb8efca",55836:"bdc2d756",55929:"35861c11",55955:"8f338282",56028:"46d4e9f6",56037:"653b5ced",56062:"5011e556",56068:"b56c7a15",56097:"233a26e7",56122:"85e6c365",56123:"1afda515",56145:"9b2ba0e1",56216:"11de5d71",56297:"fdd24d1c",56408:"795f2f11",56463:"225a01a6",56470:"a46b10ed",56486:"c1778f30",56493:"2e8bc87c",56510:"4783ad22",56560:"690d67be",56607:"09a70a05",56723:"39a237c3",56779:"07e09783",56819:"5e9867d7",56826:"9aacb50a",56916:"f82db3b1",56948:"4600ee5b",56974:"1aec2ebf",57013:"d5a9348f",57119:"2fc3b17e",57125:"960c94a4",57139:"85325d43",57141:"4f472482",57155:"2dbc3311",57159:"969bf570",57165:"da08695a",57251:"62db6714",57326:"696e684f",57352:"6d85694b",57361:"83139dce",57364:"1240e55a",57430:"4c34a1e5",57529:"afe1189b",57547:"56fae0bd",57586:"3c4116f5",57614:"4cd60d60",57647:"2ae7a41f",57730:"3657d642",57749:"abfa81c3",57760:"7a8e101a",57800:"e0d71596",57845:"3c44eeec",57912:"ccfa0087",57994:"84f487ff",57996:"df153f9e",57999:"cb8dcfed",58e3:"7ba38a51",58002:"69538a92",58079:"a239a6ea",58093:"d909e1ac",58144:"9d61ee3c",58230:"e61b5289",58255:"5c394c90",58259:"5d041702",58301:"d5e3cdd6",58359:"092b9bf8",58428:"86afd423",58454:"c7879255",58479:"07f1ba9d",58484:"aba453f7",58581:"bce23def",58582:"dca6957c",58594:"c2394840",58632:"70a5f5db",58667:"6c4023d2",58704:"7d19bc10",58707:"b507199c",58780:"7831a3f5",58913:"e13e4900",58990:"d5d8b5be",59005:"1f42a347",59020:"b9add5a0",59053:"a81199e9",59070:"3e041de2",59114:"4eb3f9ea",59123:"79486d59",59143:"98d2b2b3",59182:"15f5ff3a",59214:"a1e99fc7",59246:"ee9eede8",59262:"7139e0ce",59349:"2fc97b7b",59437:"dce084a7",59493:"4e8c876f",59521:"8c44d2ea",59548:"a0bd2141",59627:"7acd50cd",59645:"ddebd33b",59680:"baf36847",59702:"9f36d91d",59727:"596c5e31",59732:"4398bfeb",59740:"8bd9c911",59866:"8fdbf72c",59874:"0eb6da9e",59923:"bdc97ea1",59940:"e60ccce5",59981:"68449ac5",59994:"dc316918",60020:"145ce4c2",60073:"ae723dc2",60101:"f0bf6250",60167:"e4f5672c",60183:"85cb1a6c",60185:"aa76bb19",60189:"40775e12",60193:"36ff29ce",60198:"3df5e584",60203:"e3443d86",60257:"2b2c3f67",60294:"aa9b85d9",60315:"37555b2f",60394:"8d09f1f9",60445:"abd3cc82",60501:"f77f816e",60510:"c1c788bf",60559:"a3a760b5",60565:"99b419ed",60613:"ac90088d",60615:"2a1a9c0f",60676:"1a896bb0",60696:"a6f21047",60737:"8df80716",60762:"3285e3c0",60776:"d964ca9a",60819:"29b8c7ba",60832:"2d15bb16",60861:"a6bddae6",60884:"670180c2",60901:"b975e70b",61006:"250c7a76",61096:"26e0588d",61114:"2c16e51f",61124:"3ef44a12",61235:"b3fca070",61261:"81e1102b",61265:"7b6cb988",61300:"e0b660c5",61334:"b6c6d670",61368:"cc53d2cd",61416:"83c82fcd",61461:"7a1f9c63",61481:"2d5a70f5",61559:"7bb64022",61584:"4238fee6",61702:"bdfaafe1",61706:"67fd0254",61729:"167d397d",61740:"103b1525",61786:"9e8bca4f",61807:"500d4862",61816:"c1261894",61886:"fff864d1",61942:"04e151da",61950:"88c61ded",61959:"33c92f4e",61991:"b0873a0c",61993:"103cfef9",62015:"e9a32e84",62050:"a3eb4823",62061:"49f56b7d",62111:"13d25625",62138:"567ed5e1",62147:"ada23d01",62162:"d81a96c7",62182:"faa03f42",62188:"ec5f7363",62213:"b87f7368",62254:"1f6dfcd1",62263:"15130536",62264:"05976ada",62469:"27df942f",62549:"3bc574d1",62639:"4bc05ceb",62641:"13102e35",62664:"24161dcd",62672:"6c78e9b2",62691:"16bb2bed",62703:"4844f3fc",62712:"319a1074",62713:"cffabb45",62827:"865451b7",62838:"3ea26e0d",62845:"b95c618b",62867:"22228f77",62927:"ae818ae2",62934:"755cedb6",62936:"63a90335",62957:"08c35719",62975:"07e7171d",63002:"f6c7a028",63005:"37f5fea2",63014:"0e74ff1f",63016:"bf80e6f1",63048:"422b70b5",63075:"f2eaa0d1",63115:"ca15a13f",63124:"797a3817",63156:"7ab0149c",63228:"eecad3d2",63291:"8537d1cc",63292:"84630e0c",63298:"922ffdf4",63330:"c4a3502a",63332:"ef0d6f7a",63342:"ea0532f5",63367:"2354aa87",63382:"b3b81be1",63387:"22a4ea17",63430:"a084fcda",63445:"73f6c41b",63455:"dad34c3c",63515:"bbdf5b40",63521:"eeb1b226",63553:"42a11d6e",63627:"5ec5269c",63646:"e4a9afde",63700:"409b6cda",63750:"3e35da15",63760:"d6e4a1fe",63779:"80f07e5e",63795:"b965ae26",63836:"582a841a",63951:"60b4d24b",63966:"92a1c99d",64045:"5cea5892",64091:"f943b433",64154:"2b3871fd",64184:"f242437a",64209:"6ebe12b3",64351:"fe7a888b",64442:"1794db98",64447:"f0cf3fe6",64465:"fea7ccfb",64502:"3de04243",64527:"35a09887",64535:"04f0d7a2",64577:"a25e57f4",64597:"532992cd",64623:"13c72624",64659:"c3ca1d48",64737:"c578c0a0",64763:"d5f0bbed",64838:"19b15b05",64848:"e9da1eb3",64859:"06168846",64865:"b4b14272",64888:"f24a455a",64899:"b3120ec2",65017:"c8dff3a3",65025:"9f12d973",65042:"1bbaf7e5",65091:"bd48af7a",65133:"dbf0514c",65193:"33d8350c",65221:"cc41a07b",65223:"44b11941",65233:"d26dc2d8",65246:"c4b5eca4",65276:"c06e23ac",65359:"57f34875",65466:"9cf157f9",65497:"033c06a7",65625:"78f63651",65647:"09afc3d9",65658:"80dfe2fe",65745:"441f4cf7",65835:"d4dd74bd",65864:"14f1041f",65897:"66c07b1c",65918:"cfe95400",65926:"83742953",65957:"7866712c",66061:"45757a8b",66085:"cacd78f1",66135:"e326cc6a",66140:"89edab6b",66162:"ad2285af",66169:"28516745",66210:"3080a41e",66237:"e66f96a7",66327:"9d990d8e",66338:"50cadc50",66351:"65d36cc1",66415:"cb2e1664",66461:"ef8eeed3",66499:"e885c006",66504:"fb6b6ba8",66518:"3f60affa",66519:"9cb17f6d",66524:"05f3f677",66528:"25dafd0a",66559:"c4f15b77",66575:"c347fb13",66602:"6507efc2",66615:"b537b6ef",66715:"b44af68e",66759:"b3a36b8f",66774:"680513b0",66791:"bc650588",66819:"7dc5e02a",66822:"c9c50b37",66832:"86f893ab",66867:"5ea30b5a",66912:"a6826a37",66943:"2d0602a6",67004:"40dc15b8",67044:"55f32fa5",67061:"9594aedf",67098:"75ab85df",67100:"9a493c1b",67104:"5cbe8264",67114:"c274ed37",67252:"cbf5e476",67376:"74c2facd",67438:"e8b780ad",67472:"522d8645",67507:"e5f01f65",67520:"cb8621f4",67545:"479e6171",67581:"b7157a45",67587:"97446eaa",67668:"46ed5a1f",67683:"29e3acef",67704:"b4ab3c38",67729:"d3ba3f88",67752:"02218f92",67755:"0e8f8b14",67775:"54dac4a0",67914:"32efd67e",67989:"f1813a8e",68043:"07304768",68094:"c3ff00d7",68181:"dea0e7c5",68210:"fbf9dc31",68215:"f5610e77",68253:"e6a1722b",68315:"d822c661",68334:"e92472f4",68377:"722db604",68434:"9e9b7960",68470:"48f5ab23",68535:"68f5aacd",68569:"a25b4460",68685:"7bd3f18d",68710:"0c8ac1af",68721:"2ecf2a49",68765:"fd8049cb",68770:"83fcf2d8",68834:"31088ee7",68839:"71fdc7fc",68910:"319b9215",68930:"6a2be620",68946:"d7e4ee2c",68989:"4bdc09da",69017:"8e8ddb8b",69038:"e3be4832",69129:"c539fcb9",69136:"92c5bdf5",69169:"51b689ad",69180:"ab2d14c1",69199:"87908dd8",69213:"e8a97edd",69226:"152ff85f",69384:"c83c369b",69451:"7298a8e6",69457:"ac002c53",69480:"0dc7e906",69489:"5e2dfe1d",69501:"0dabf004",69503:"b5b03bf4",69505:"dd5b0437",69517:"f3735c68",69570:"7806e7e5",69638:"18216d7f",69651:"8e522a4d",69692:"6d58596c",69737:"d40f9c5b",69770:"353c2a33",69773:"41ee530b",69844:"d18cbc3b",69864:"ecba478e",69875:"d48fbd76",69908:"782b3044",69982:"1ec8a0f6",70008:"cce27e13",70022:"5081b66c",70058:"805f0292",70106:"51aac657",70117:"f74b5bfd",70126:"5f0248e1",70174:"90b8e6c1",70179:"3320098d",70184:"aa7ade37",70198:"4ad6092e",70210:"46e86f66",70234:"f21f13d5",70253:"cea1b634",70267:"59055e30",70399:"2e9c4087",70418:"1b674661",70438:"f5d18728",70502:"e1b56d6f",70560:"bc6dc926",70606:"3b651c50",70645:"1183c950",70687:"1291047b",70696:"ffbd5bfe",70712:"f6abbefc",70749:"f4b70d78",70755:"0f6fa463",70776:"f9b40f98",70784:"0338a6c3",70788:"c92b4086",70791:"14c73042",70794:"2e0d622f",70814:"e6c563d5",70828:"9bfbe30a",70858:"249f7ba5",70870:"23b14d1a",70947:"f3628aa3",70949:"86806744",70953:"3804bb33",70963:"3a81c996",71021:"04025985",71026:"e9d19f05",71051:"2b9b1926",71075:"f0900633",71079:"9f6d7d5a",71117:"a7884200",71162:"3809ce30",71169:"e76da8b7",71227:"dcab573e",71235:"2d846c4c",71374:"de58f0cf",71407:"7e34f0a7",71413:"41b66ba7",71454:"4e24541c",71473:"8e987be6",71501:"fc9a73c4",71545:"40802b98",71548:"e4bb0f05",71585:"50cb8f8b",71612:"1c93061d",71651:"e5599a23",71656:"b4d44856",71715:"29fd0686",71795:"ce579d1d",71852:"2e6b70a0",71857:"b6e39072",71910:"5933a309",71964:"6ead8940",72043:"55a4c57e",72053:"8585e9a3",72143:"6b90401a",72322:"f21fa8a3",72353:"023cd3ce",72358:"7cdaa62a",72446:"ce58b74d",72485:"d4eed01e",72508:"1a5ee8b8",72527:"25370726",72536:"78667438",72599:"f3d4ce0f",72618:"d1a76d70",72656:"f5657ba2",72662:"8c571d16",72668:"3ca7cc68",72675:"5094cb71",72707:"afafc041",72907:"76e97535",72914:"fdfeb2a3",72925:"4ddb3b0f",73055:"be2a387c",73084:"ff30a583",73121:"239c6ae9",73147:"3cbab8b2",73163:"a7161cda",73193:"87a98b7b",73264:"a44c8bca",73276:"23f7c7bb",73286:"d401d161",73290:"066237df",73316:"3fa0430f",73331:"a7d79792",73376:"3451e76e",73397:"c326c542",73428:"09159663",73471:"21824cd1",73473:"7dd1d023",73539:"7b86cbf7",73569:"016a2098",73607:"540a839b",73693:"e679ec54",73756:"4d0d26ec",73779:"38c368e7",73800:"5f63f724",73864:"928fa9c2",73888:"22e79b47",73891:"d6a78f97",73905:"2455dc8a",73906:"891edd66",73922:"295f64b8",73940:"e15d0de1",74019:"2969e5ee",74031:"3ed60645",74039:"7119351c",74046:"a5d4d136",74069:"f5dc9301",74076:"d773372f",74134:"70fc045a",74282:"1d2c4307",74312:"7d8ab2b3",74401:"fe4450ac",74418:"b36eec55",74524:"346c1640",74588:"7172fa20",74657:"bc695932",74684:"b1b3627c",74768:"f1208fa7",74792:"605d6795",74880:"00e3a7d6",74895:"49f7f8e8",74902:"40221f02",74945:"3714ff8a",74950:"a8f2506e",74961:"4336437c",75043:"0fa61777",75062:"d0429d71",75078:"a4474ed0",75106:"5c1d8826",75121:"9274a316",75173:"7a2d306e",75190:"98dcb270",75267:"ef73f4dd",75298:"3419323c",75317:"2425adb8",75359:"4a6d69b3",75378:"a61cb314",75396:"0320340d",75405:"be6907c6",75442:"2cdedeae",75454:"c5fed06b",75459:"216410ca",75461:"1300f9bf",75484:"368b265b",75637:"feb977ac",75666:"82bbfe59",75696:"c701f641",75718:"8c13e1ab",75723:"77707dee",75775:"5c22d8f8",75805:"1df8329b",75894:"7593ad7c",75911:"23bf6615",75919:"7eb9f722",76023:"8d86c672",76041:"639de3c7",76123:"6395a6d8",76129:"3a64c93c",76166:"6cca7338",76172:"b14349c1",76215:"c544dc2d",76235:"8cfcc50d",76262:"487bae10",76264:"01bf28e5",76289:"8da89847",76293:"25df4b35",76299:"5808ec0b",76368:"fe89cda6",76517:"ea36b810",76530:"96a9a724",76589:"1b539a7a",76683:"39dadb92",76719:"1eb4134f",76748:"5c0896d3",76788:"df87c765",76854:"17aef79f",76871:"84440dfb",77077:"d494ab26",77088:"62f0336d",77123:"acd89b11",77174:"b653e6e8",77222:"8e335c04",77223:"41edcb3d",77240:"11029c86",77261:"223c7732",77298:"1defa96c",77369:"bb649c96",77373:"761a5dee",77391:"40fd8149",77659:"86eed6d0",77698:"07bf926d",77749:"ed67871f",77787:"5ea8e20d",77901:"1607e19b",78001:"9ca26614",78037:"07ce1543",78069:"f778de7c",78087:"51316700",78127:"2815f063",78159:"76faa309",78199:"f8f1c0f6",78217:"8af87bbe",78220:"bdbab6b1",78283:"cb3f4213",78312:"5e1e4e98",78354:"fe19cb88",78421:"4603fabc",78497:"2472bcd1",78512:"c92a3f45",78522:"e227b23a",78544:"b4a4e0cf",78583:"f491fac8",78595:"ece1a8c5",78608:"527091bc",78632:"972ebb2c",78704:"0007f4cd",78717:"bf538a7a",78764:"e6bc27a4",78820:"818e5ba8",78858:"25790093",78872:"46ffcf5c",78912:"a70d6c13",78985:"0fda70f5",78988:"d3b97091",79039:"194eb361",79048:"a78c49a8",79138:"6cb5e67d",79150:"597e2a72",79157:"436d8a84",79180:"4b81eae7",79302:"27194ac4",79416:"273ba3fd",79481:"e1ab1326",79485:"1b6c575a",79487:"87a9eb1f",79506:"d5dabd2e",79520:"2e07b453",79521:"55617a85",79524:"74a882d9",79534:"5eec8d0d",79635:"9a03d71b",79656:"403a2f7c",79739:"370af888",79776:"af8f1b99",79841:"4e87f9c8",79866:"d63409c8",79992:"a8729519",80018:"ff79bd92",80022:"191efeb1",80046:"af7d2dd3",80091:"b37d99f3",80100:"d7596ad0",80102:"88fa27df",80159:"e5874eb1",80198:"946a1c40",80201:"8d21b6c6",80260:"50c19885",80310:"7e3078e7",80315:"7da7fce5",80342:"eb1df1cf",80362:"66acb718",80408:"402da38d",80424:"ba6a3304",80442:"a3635951",80457:"420460e3",80458:"62bd7f55",80491:"8a4b09da",80524:"78b4ca8a",80525:"8a0f706b",80531:"d9e62ade",80557:"1bd82d84",80579:"8f12fb48",80649:"89d68cd9",80677:"3ad187fc",80750:"4a06db24",80772:"baba95b2",80794:"5384ccbd",80810:"b2d246f0",80841:"2b125765",80863:"abe83df7",80957:"e386cbd5",80998:"23948ae9",81012:"08b30566",81019:"cca732d0",81050:"171949da",81175:"5a7758b6",81188:"46e48486",81212:"92160316",81265:"af9ff03d",81319:"ad93ea68",81410:"c4689942",81435:"d1b60b7c",81438:"4951e135",81497:"709a8ef8",81544:"ca61aba6",81585:"5ff1fa55",81643:"44b2fa1f",81666:"f4b799c8",81691:"4533ae68",81692:"efd074f6",81728:"90256490",81737:"27108f23",81770:"5f118bff",81791:"a2002919",81846:"181c0e53",81902:"70dd6046",81903:"40bcebb6",81982:"28b5173d",81996:"9083d6b9",82019:"3dcb9f49",82096:"c0f71fc1",82221:"1ea8849c",82237:"96c3210a",82261:"496feebf",82297:"dd49ce28",82354:"09fdb790",82362:"fff9c5ed",82553:"e65ad139",82754:"ba8b40e1",82774:"1ce93819",82776:"26f73b62",82847:"c8029013",82905:"5e407694",82932:"78ed3f4c",82946:"88b23bbe",82953:"2ecea393",82987:"1a6fd885",83e3:"f83cd01b",83027:"3e1cb827",83044:"460114ac",83078:"7d656c5e",83089:"fccee565",83103:"340f8791",83111:"68fc9f70",83127:"43dc426e",83182:"63791073",83203:"0d5e8a7e",83249:"32d3403c",83260:"cd47087b",83273:"b1ae16e0",83316:"63598122",83378:"f0201481",83379:"71700439",83431:"3ead0637",83439:"8e150729",83509:"d63516dc",83523:"607275c0",83534:"360cf729",83561:"4f2ccae5",83566:"c4b25550",83574:"67a5a9e0",83608:"e5960de8",83612:"92a43f9c",83670:"199903ad",83700:"cb7c3f47",83779:"c7d005f8",83814:"57cf2ba9",83841:"e27808f3",83849:"edaac23f",83870:"bd1db92f",83901:"bc354609",83923:"dc27ffc2",83928:"8a81282a",83932:"4e9403e3",83954:"4e747003",83970:"37ea33f4",83976:"c535ab42",84013:"4a6be46f",84070:"3a3af260",84107:"72bc42e3",84112:"df8cd6ee",84152:"992db215",84227:"78658f29",84255:"38b0c07e",84256:"8ce8e14d",84259:"1bf0163e",84319:"cfc5f04e",84324:"f541d309",84332:"56e42b84",84467:"d83c05db",84527:"ca4c7ec0",84530:"459b0ff5",84563:"41adf4ec",84572:"118f765f",84711:"869bc9bd",84754:"144f5327",84755:"81a9eb74",84773:"15e3ad54",84813:"39aa10b6",84822:"b62749f9",84869:"86c2b873",84878:"e7a5ce68",84963:"a27e11aa",85008:"27b2e784",85073:"6e2be049",85086:"5588dd42",85095:"aa0643d2",85105:"36a988af",85205:"a6776889",85209:"e6e74bb3",85228:"06f36fb6",85243:"07282c9f",85257:"9a925270",85279:"75d5c35f",85322:"93eb7d1f",85353:"770dc4f3",85442:"c288cc96",85453:"b326c2e8",85478:"61613af8",85529:"e1347ab2",85537:"d721079c",85558:"88de2a67",85581:"dab11b6f",85588:"d037eb12",85736:"b060f6a2",85867:"c8f0ee34",85896:"1eaa238a",85899:"851136aa",85905:"e97b95fa",85917:"81da1a96",85960:"a4a7b97c",85967:"d5da1a94",85973:"a87a72dc",86063:"ec205912",86121:"b15808cb",86167:"48279056",86215:"ede82e93",86216:"10a83256",86246:"c805ffc0",86354:"7b45ad63",86417:"58231ce0",86424:"79e0c07f",86478:"e265b1bf",86480:"902a4f66",86501:"bde9b789",86596:"c0cee3e8",86597:"433707a1",86616:"7d1a003d",86659:"eebfe56b",86669:"ba9bd58b",86685:"46fbfce9",86807:"90e0e4b7",86846:"0de86eef",86856:"a3c47e05",86888:"40e352e5",86890:"1787e57c",86914:"3316c552",86939:"9d5ed5b3",86955:"2fc6977c",86978:"0cd74852",86992:"b911e3ee",87004:"752cebb1",87145:"85d7319d",87178:"acf7db74",87184:"290e6444",87186:"144ecf28",87205:"d7c0c2d9",87217:"6995ae77",87269:"1ebedc00",87282:"859aa240",87309:"d4cacd6d",87334:"24215293",87377:"86161ea2",87389:"cd1402d0",87420:"ed05a9dc",87423:"c20a690b",87459:"499c9384",87473:"90f8ac60",87483:"bfad7aa0",87485:"3c84d8c6",87495:"c6ca0dbf",87514:"ace06c24",87598:"d92bafe8",87614:"03a16b2e",87669:"30ffefde",87688:"9721abb7",87747:"4c518d28",87779:"7665a065",87781:"5780fa93",87863:"e411c34a",87875:"0fb6701c",87880:"e6462630",87892:"6a2443af",87905:"c2ef55c6",87922:"2468dfd7",87945:"3d37096a",87971:"c139d0ac",87995:"ff031324",88044:"6f6602c5",88111:"3b471ef0",88163:"adb2e2d4",88226:"48ff391f",88248:"331576af",88298:"d37f55fd",88310:"9cc0ac71",88394:"eae641fa",88436:"d8c7c974",88468:"5d2e58d0",88478:"aa89d658",88547:"d95bf79d",88591:"463e47bc",88622:"6595e4d2",88626:"b7aae424",88696:"0bd519c4",88775:"14023076",88815:"afb9d4f1",88821:"5866c747",88847:"28717646",88852:"ad6f5737",88855:"a7dfd1e0",88930:"c70f1a8a",88962:"97fdf029",88986:"36e0affa",89018:"35ed7d32",89058:"b9fbe7b5",89082:"6129a536",89083:"07e75e07",89093:"e6e88df7",89154:"01ed0bfc",89172:"cf7f9616",89202:"69aa57bd",89210:"6f8e7d24",89243:"127dad60",89289:"8c1b5924",89338:"87c9007e",89353:"506a7ddc",89362:"6ba94fcd",89367:"089fdacc",89387:"635c6a75",89402:"147d9206",89415:"168dcfd0",89437:"b476afaa",89455:"8a638878",89541:"fd189260",89554:"202a135e",89610:"734aa5c5",89641:"ccb49000",89650:"5002e60d",89696:"71b4f147",89801:"892d8b74",89810:"c68adb99",89858:"8b837402",89873:"3dd198ca",89986:"bb978035",90066:"08ff0810",90092:"a6532af0",90135:"076c04b8",90214:"ecdd0bdb",90257:"4c4f2f2b",90323:"3bc52293",90414:"75aa9c37",90438:"3fb2cc5f",90497:"9aec511a",90502:"ce6211c7",90513:"e9890428",90562:"0eb6bd7d",90610:"4c944bc2",90656:"b8f9c9c4",90717:"d319ead4",90727:"a891ae85",90749:"04e2cd2c",90818:"27ccb021",90831:"aa0b45c4",90842:"90dda81f",90910:"9a554039",90960:"5df3c6f9",90968:"804745cf",90972:"d0e3ddef",91016:"e6a01d8d",91017:"094e0f6e",91025:"7d680bf4",91046:"7617106a",91109:"68006d7b",91187:"b9b1c092",91319:"aa39086a",91333:"8793c8f7",91359:"75a52778",91396:"66d3d704",91428:"46325c8e",91517:"02cdf15a",91530:"33496428",91540:"0298fcc3",91568:"e3d8db5b",91581:"33c3db15",91587:"23116cc0",91612:"0f153207",91695:"8e5d687a",91715:"d6ca91e8",91724:"6b860438",91765:"14790174",91768:"efefb15f",91787:"2eebf78e",91837:"25dd4793",91844:"b7ee9a3f",91881:"3db19327",91895:"4e10f0a7",91916:"7c8fa153",91993:"f878d8ef",92018:"0da1989a",92031:"33f3d062",92125:"ad4479b3",92142:"31ed92b0",92175:"f3b6a356",92196:"73f757ec",92273:"5b4c97fa",92329:"efe13982",92410:"b8ef1fbc",92412:"4bb3bf1e",92475:"f5ce8c1e",92535:"c906390f",92544:"ec31faf3",92570:"3443aea6",92577:"7fe00ec7",92653:"92601920",92664:"9857298d",92673:"bcf72ddc",92942:"513a2128",92955:"99c8a760",93057:"a360a0b6",93166:"c81fd4ab",93210:"a5853a6f",93241:"7680849e",93269:"f8444683",93273:"73b7ca0a",93281:"6ae44b64",93310:"73369887",93352:"a41e101c",93362:"1f427018",93427:"5736d59a",93636:"0733d31c",93781:"7a5986b2",93849:"21ba1104",93854:"886ec2a3",93884:"e449c4a3",94065:"d0b76e1e",94077:"b9a34ce4",94091:"f2456708",94106:"35a4b178",94155:"0a24c1e1",94188:"985976da",94215:"1e40249a",94227:"2f3e8f89",94251:"99c27483",94314:"7e2f8a3a",94417:"e155ff4c",94429:"875ef73a",94445:"9e780585",94475:"7313a7cc",94538:"3c3f989a",94555:"9703e7d2",94561:"c4c9257c",94568:"b08b9e52",94592:"5a922718",94625:"6023ef67",94631:"a16a6e04",94648:"6c68a60a",94711:"2a8c00a0",94750:"7f7422ce",94776:"455c9060",94788:"0571077b",94796:"776cc313",94841:"7241d406",94843:"8a1645e9",94863:"1d8b58f8",94864:"7a64a937",94910:"5f87e0c6",94921:"557d97fc",94925:"d3076124",94980:"48967d46",95020:"9ed591c0",95058:"c5944ecc",95093:"38840c61",95108:"3d30b3ae",95136:"b192ff7b",95159:"7f2b787c",95187:"75489218",95231:"4f693b90",95240:"a83d0989",95245:"6d74ba52",95407:"8d24aec2",95427:"b603ea76",95470:"22bae925",95505:"15b5b80c",95528:"1fa3a723",95542:"5a5dc81e",95613:"94d2b7c5",95641:"dac359cc",95649:"113f30a2",95717:"7c63c893",95768:"bb8152e5",95785:"e6bdc1df",95818:"47a4a9dd",95832:"30248407",95900:"a9fa5f68",95909:"5f31a15a",95980:"05bea232",96086:"fa43c59b",96239:"160c24f5",96268:"af08f7f2",96276:"ba2f630a",96325:"115b6b82",96355:"6065af81",96425:"769273ca",96463:"0cb6beb6",96470:"819155f5",96533:"829ae8ca",96555:"b23927ac",96609:"5944975c",96646:"d26a1ccd",96771:"96893b14",96846:"7ff32887",96863:"6b53abce",96881:"d798de2a",96939:"ca953d7c",96963:"66495bb5",97006:"70950e02",97033:"c2d41827",97038:"5b240f26",97107:"8c1d4cc0",97114:"7e8541ae",97123:"9fbb5dee",97167:"6f05f1b4",97223:"2feaf89a",97246:"2a0a597c",97251:"a2fab308",97253:"40cb07ab",97286:"3da76a0a",97296:"5e101b5d",97316:"68f97573",97342:"123cda2a",97352:"85ba7856",97379:"5608b96a",97420:"4443a52b",97424:"14210e60",97476:"16ed56a0",97536:"e4e7238e",97562:"9f1e5008",97585:"e2996fed",97618:"a2d622f6",97670:"31eb362a",97710:"fcd0a82b",97732:"c68c05ab",97737:"a3dccd02",97763:"4e1ed5b0",97768:"0b40be3b",97821:"a0ef1d84",97829:"fe68bd25",97863:"6d4a842e",97887:"9d68541c",97895:"66ec7d53",97913:"4872bf57",97944:"9c4288ea",98020:"61d858f5",98021:"ea23b20c",98070:"6a5732c6",98087:"3278bdb7",98094:"28a39ffe",98127:"c7a4ca94",98154:"b33001bb",98178:"f47a9bff",98237:"ae4b633c",98271:"0371efe7",98311:"f9424f75",98392:"ab78dade",98425:"9b51aa56",98473:"facc58b4",98477:"047de3f6",98534:"2178e04e",98660:"1f2c9482",98700:"0296a2ad",98758:"f2e9a2ed",98761:"4501e889",98779:"502d6d28",98804:"50d9586f",98908:"4d031f91",98925:"c1774d66",98941:"04475847",98947:"596c6a8e",99077:"bfa22d9c",99095:"f65d182f",99105:"baf9cb2c",99151:"395ca1ed",99236:"d7f17e4c",99252:"7ad0ea7b",99280:"0d69f916",99306:"9e6ac719",99330:"d53a3e2b",99335:"1209af34",99389:"41b790e6",99437:"a2e4c602",99451:"3e589645",99502:"48601d47",99504:"b03bb1f6",99528:"67cfac70",99531:"79cec2c9",99534:"1e6e734c",99543:"6bc51170",99611:"217f06d9",99678:"8d3f3ff5",99701:"f574c3b6",99705:"de2fd36c",99709:"f5fdb057",99710:"f97dcdcb",99746:"643a8fd6",99747:"be57fd41",99764:"df4999bc",99839:"75df4091",99855:"87b87d20",99905:"b5e81d35",99970:"bcf433f5",99987:"1dca585b"}[a]+".js",r.miniCssF=a=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(a){if("object"==typeof window)return window}}(),r.o=(a,e)=>Object.prototype.hasOwnProperty.call(a,e),d={},f="hudi:",r.l=(a,e,c,b)=>{if(d[a])d[a].push(e);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var f=d[a];if(delete d[a],t.parentNode&&t.parentNode.removeChild(t),f&&f.forEach((a=>a(c))),e)return e(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=a=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(a,"__esModule",{value:!0})},r.p="/cn/",r.gca=function(a){return a={12164231:"43113",12935692:"36790",13171783:"29452",14828316:"41944",16243474:"98020",16640689:"53619",17628665:"36682",17896441:"18401",18891827:"71235",21719437:"65957",22559948:"99855",23165909:"53488",23348138:"57155",27211971:"57547",30769210:"44891",31863783:"2256",33241236:"33621",33732613:"14363",34689118:"51937",34900881:"79520",35313843:"23641",37844666:"63075",39583919:"70606",39734463:"67004",41280170:"63048",42545929:"37827",43764587:"32949",47074836:"39260",48455675:"66715",50536743:"43078",50737734:"21373",52166518:"76123",53317765:"39058",53798754:"21191",54111683:"76172",54482276:"24143",55840584:"192",55946737:"45113",58408940:"43913",59171146:"67989",59700627:"95187",60165173:"67100",60753781:"68470",61417793:"27367",61773850:"22504",65511420:"32875",67474760:"63332",67687911:"45746",67922501:"65221",70570476:"12513",70633739:"49709",74555694:"79302",75914136:"65091",77787075:"36689",89514438:"17709",92328698:"20924",93340492:"41159",95139762:"76129",95789563:"59923",97806055:"29851",98749210:"96963",98826249:"68315","0583dad8":"16",a33c645e:"25","0da1f28a":"28",a674d2f7:"48","56169fa6":"67","275b5c51":"129","9c707294":"142",af8190e8:"159",b1f77b90:"217","991760df":"273",fcc9c1b0:"292",be9655ff:"323","1f92d8dd":"339","0b4da2f0":"354","19ac452e":"387",a168e2e0:"437",b4a99b76:"569","0a87a91b":"614",e9038c17:"878","71c6c219":"917","9699c87d":"924","0c459987":"940","5a8ef24f":"982","2ade4e52":"1017","060b2af9":"1107",e3b4090c:"1119","83de9812":"1151",b0127f30:"1190","74fc40e3":"1211","515c7131":"1397","562c897e":"1422",d77e6b8f:"1458",a1c7d286:"1459",da868c82:"1517","8425e24c":"1550","0ae1dc96":"1622","73c8d421":"1635",eaa4e767:"1707","2f671d1e":"1715","89ad6a53":"1717","90afd727":"1763","89dd9b54":"1784","92bb01f4":"1841","9f349e0c":"1846",d032d8fc:"1857",c28fec2b:"1882","6e47a3c2":"1928","051e9a76":"1949","7fbadf7c":"1955",c12d6ad3:"1957",b93dc3c9:"1983","3c15683d":"2016","7a3be72c":"2053","7bec99d6":"2072","1e050fc5":"2106",fdb4abad:"2121","92b5ed46":"2200","32aa7863":"2214","9781112c":"2225",d2a01f74:"2298","717625a8":"2368",fb4f9065:"2385","3b3f1ad3":"2450","1b7e3feb":"2472",e8b490f7:"2540",b9e56da2:"2577",dba6e014:"2640","9ed88412":"2652","9d0312da":"2663","7e9327af":"2679","67f5e351":"2696","5e58268b":"2700","56173bd1":"2732","4c5bb0e3":"2739","7c87f31d":"2748",d28b7dcd:"2759","48f24bab":"2772",ba2305d7:"2791","00cd9d46":"2839","093ec6b1":"2854","9dc1ea4d":"2918","580eda40":"2932","6e7eafb1":"2954","200d970c":"3050",a80470ee:"3075",a4b2d8ca:"3104","32dcc326":"3125",d29911ee:"3131","4f7cd6bb":"3137",aed1d196:"3144","40ebd41e":"3151",f75eea2f:"3174","5c3bdea9":"3179","6be904db":"3303",a3e90044:"3313",b9073401:"3323","388a1337":"3337",f237aa38:"3482","538c7955":"3558",b783cafb:"3693","50cd3db4":"3722",dc1f5b39:"3740","394bb252":"3764","7c1ec31e":"3843","260d7fd0":"3940",d18b6106:"3965","50494a26":"3968",b4ced939:"4040","0bf991f2":"4060","817ed3cf":"4074",b18f8924:"4133","0c12eeea":"4205","1497bce1":"4355","30f46c87":"4362","25fe5fdb":"4368","1dcf0194":"4405","26d64354":"4425",ad9f509c:"4442",ff5a6f64:"4467","1cb4ff83":"4530",d9f219f0:"4574","405284b3":"4591","0be544c4":"4602","98bce106":"4629","43d0cc21":"4777","3b6474f3":"4790",f162832b:"4795",a0c4b68b:"4863","7c52b6f4":"4890","4929a6fa":"4919","006c64a3":"4980",f5c507c6:"5028",ca8c3af7:"5029","25ed107d":"5065","15fcb894":"5137",a3417ffc:"5168",d0ff2798:"5193","8c7f4a45":"5195","8be9b28c":"5268","6ff0c558":"5270",b3a451d2:"5289",bbc3d059:"5295","22b4f68c":"5322","86642e8b":"5334","0e11b6db":"5338",b9ef0c47:"5397","0c74166d":"5594",fb863cab:"5622","32ba6a4c":"5631",a804bb8e:"5633",f8763f0d:"5685","42bda306":"5721","37ae1bc8":"5795","1adb4ab6":"5806",b5960565:"5887","478a7123":"5888","4959f63e":"5936",c4d48ead:"5988","11faa303":"6045",ac2c8141:"6082","384f1d9f":"6090","0d706529":"6158","4fb8ea95":"6171","0ba05648":"6203",baed6a8a:"6225","59ba4d58":"6289",ce3c8465:"6350","36f2d01a":"6370","4658250f":"6371","5c865244":"6372","3faff22d":"6467","2a1db3a7":"6482",a49707a6:"6542",ae59a273:"6552","21b16c5b":"6559",d5ace2db:"6605",f6a1f09d:"6636",ea2cf37a:"6677","17ace3c3":"6697",debf2b54:"6709","01ceb854":"6739","507d925b":"6761",ae0384e2:"6791","4f684eef":"6823",cd9c899c:"6827","5ac9b8db":"6845",b52407fb:"6897","52f660a4":"6944","2aca441f":"7033",e841f655:"7035","6e78b29b":"7071",e7c12d1f:"7100",b744ccc8:"7125","3445e83e":"7140",eec9a679:"7160",bfd461a8:"7167","2a6ac43b":"7233","598dec22":"7277",b1b9fe16:"7317","96f48bd9":"7355",ec45592f:"7414","502758cc":"7444","8fdc7f76":"7458",f786ec4f:"7462","4abd5d51":"7517",faf188f1:"7564",d29a4f88:"7693","06a1e3b2":"7715",b3716f55:"7724",d6b46894:"7734","869d1599":"7773",deab0229:"7802","996feafe":"7844",f09bd126:"7861","28b030e0":"7881","9b8d6628":"7904","7ba20019":"7907",e0f7a560:"7945","95803b07":"7949",df4b657d:"7953",f85e4dd8:"8003","0480b142":"8070","38122bdb":"8177",c7a3e7d6:"8183","934057b1":"8192","01a85c17":"8209",e1d02585:"8263","14cab7b2":"8281",c286af15:"8289","09ff3d76":"8348",db9fbbab:"8354","24179e00":"8363",abd23114:"8367",cd17745a:"8413",bbced460:"8417","3c06fd15":"8583","497095d8":"8585",b6159c54:"8606","15c2f51a":"8619","212a125d":"8645","80bd773e":"8651","6598f23b":"8668",d7d5c50a:"8688","1cd42d14":"8762","7a11cfa3":"8766",e161c803:"8840","9c84f0d3":"8874","3a6a48c9":"8888",effd3c61:"8889","56ab6e97":"8892",eebb3a9f:"8900","48912a3b":"8909",b6e28713:"8965","7c9ee56f":"9045","29c12ff9":"9127","57c73c9c":"9151","17666b14":"9152",d4eb85a9:"9189",b2d2727d:"9195","7b3a4001":"9225",d336ca2e:"9228","0687df23":"9257","00766a8f":"9333","4c14260d":"9351","1a41dab5":"9426",cfb1206c:"9428","8cd4ff44":"9432","49b92117":"9446","762ed4b3":"9458",ebf12a38:"9471",c36198b5:"9478","953153ea":"9499","2fec12c7":"9516","8eea179e":"9570","79e67a34":"9631","5e95c892":"9647","48cf1cd0":"9676","56382a79":"9700",a0d28f55:"9702",c35662b8:"9722","0d37dd31":"9737","6a0b8fcc":"9790","2fd2285d":"9836",db607657:"9856",d6d00b14:"9860","36e3724e":"9870",c14217e6:"9888","8a5cd0c4":"9891","6b16b25a":"9896","06b7dbb6":"9914","9ee88b57":"9944",c782ecef:"9986",c2277200:"10030",f89af623:"10118",f7519df0:"10181",ce5d6b55:"10198","0eb44ec6":"10238",b69fdc1c:"10285","8c29db87":"10354",d592eee2:"10384","0ca8e4c5":"10472",bc663e84:"10510","79c374cf":"10535","6766f38b":"10569","6a326c1d":"10637","13dfa837":"10640","936cf648":"10642",a65658f0:"10682",d496317d:"10683",a83dbf38:"10708",f53cf472:"10727","931768b8":"10767","10fb8f29":"10789",f8d8c88e:"10801",b964b0d3:"10907","42746bb6":"10920","2b571547":"10954","726b1d2e":"10956","90db14b9":"10978","9294d9ac":"11000","33727eb6":"11002","2750cc84":"11111",b051e9c6:"11238","2e961a80":"11275","82b971d3":"11289",ac338f84:"11299",f9cb0cea:"11326","9a744c23":"11330","6ed20719":"11355","039c7621":"11508","5090da06":"11624",d2a270f8:"11631","186775cb":"11682","51e360fd":"11725","4a7296a1":"11738","446810fe":"11745","1db5e20f":"11768",dba75126:"11775","968bfe93":"11783","43ff550e":"11795",b9168984:"11804",f630dd79:"11842","51e592eb":"11855","43c57b15":"11869","41b6dd58":"11905","757b41cf":"11906","608a85b6":"11977",d25544dd:"12047","8e6bc4eb":"12110","1a730a78":"12123","088c57bd":"12134","5617941b":"12144","3deb4153":"12186","77a5f3f8":"12316","9b28f794":"12318","2592f25d":"12378",a0fb693a:"12395","61c30610":"12431",f4a568da:"12452",ac9a039d:"12477","2ca30cc7":"12535","0bce5bfd":"12542",bb6acec0:"12613","89412d1c":"12617","880a76a4":"12650","98af85a1":"12654",f81e2128:"12686","236efcfc":"12869",e57d167d:"12912",bc561320:"12945","72ed5e19":"12995","9b078b3d":"13021","075d0b63":"13060","6695bce8":"13063",ef2299ac:"13124","4d01f822":"13152",a5fd3751:"13203","814487fc":"13236","86aca325":"13358","0c9b8a46":"13374","15be7f5e":"13375","05f125a2":"13419","5b6b8d73":"13460",f7887fd4:"13465",aeb9cb2b:"13525",a221d960:"13534","430c4f94":"13562",b7ffc82e:"13580",e32c93f6:"13698",e4126631:"13733","35ace877":"13762","5005f1cd":"13803",a586ac12:"13918","79c522c5":"13943","7dcf0740":"13970",bb5bef2a:"13996",fe0a5e13:"14003","4fe2812d":"14027","6c6eb236":"14042","2da40935":"14043","160c3f1b":"14059",c58d5881:"14125","88677a17":"14134","5ba7f3a0":"14136","0c792305":"14152","79f5ed7e":"14163","44c788da":"14168","0466f8a1":"14179",e78cae60:"14224","973a6c2e":"14257","4d62164b":"14259","881e0310":"14261","15b03510":"14264","816e216f":"14286","02704d8d":"14340","720024ad":"14381","4330e2c5":"14388","95a29cbe":"14399","262f048a":"14410",a2218d2d:"14435","7990d23a":"14446","11c5ad4e":"14483","0dc66419":"14496",b3880c0f:"14515",b812e3a7:"14536","13366fcd":"14549","04287605":"14599","6b0d4b59":"14627",c135661e:"14629","7cd7848a":"14683",cb290368:"14726","8049dc2a":"14750",cf066a97:"14817",da9a6aef:"14822",d58d42ac:"14844","9c9e6d14":"14868",b2f79aaf:"14917","68aea991":"14919",b634826e:"14943",ffce8ccf:"14971","6773b5f7":"15078","461201e5":"15079",e6691bac:"15144","809a1b46":"15186",e0719818:"15220","246d116d":"15235",ee5dc595:"15272","7bd6096e":"15292",a0583d0f:"15316",f9b192e6:"15387",bbbd3731:"15403",ad07d5ed:"15473","6bd26a95":"15528","1ff337bc":"15552",a309ba1a:"15607",c821ba53:"15654","55b3e6a2":"15744","03719399":"15746","65df1ffd":"15805","6d300ee1":"15875","4bf163bd":"15881",c26e381e:"15896","04d2875d":"15917",f05cb9af:"15947","7f5a2db2":"16032","4de90ec7":"16090","5685cb00":"16100",f0db470e:"16209",a2da2f5b:"16378",ebda94c9:"16560","3d8e248c":"16622","4ccf094c":"16641","2e0d7695":"16649",c01089d4:"16660",ff1ef8b0:"16685","682a1736":"16689","1b334a26":"16745",c5392341:"16775","751ccd8a":"16803","7c3644b1":"16885","426a3c0f":"16942",ec65a1d1:"16999","30e67995":"17033",bc36781c:"17232","82fc01c6":"17294",b4762a45:"17332",de821e02:"17368",b629aa71:"17402","496a5e3a":"17411",c5c8072f:"17441",dddd9631:"17502","8c212f85":"17530",c8aaf3b1:"17606","47f3a505":"17626",a2af438a:"17681","2122acab":"17697",de64262d:"17722","764a6545":"17727","4f311863":"17803","2d9024ae":"17818","7cfc22c1":"17860","9130943e":"17867","992c886e":"17899",f67021ea:"17987",a3255c75:"17988","059d2658":"18006",c1fa975f:"18033","7707ed5e":"18103","85902cb9":"18115",c58d3901:"18142","8e562778":"18187",e6cee3d7:"18205","59b5a3af":"18299","670426f7":"18351",a80e0e03:"18375","7eea383c":"18438","762cb2d4":"18445","905fdac9":"18520","9dc242cc":"18551",b3c2b735:"18616","1bdcf2af":"18620",e798c07e:"18645","3b375bfc":"18738","10b6d210":"18757","6cc2587c":"18940",d75d009b:"18950","7487c019":"18998",fcf2eafb:"19040","378587af":"19042","6e547e58":"19052","6f878c05":"19070","6f3d983d":"19108",e77e0240:"19237",a2cfe627:"19369","9228ff94":"19387",c61ed569:"19396","4b6ad6c1":"19428","7f5a4e86":"19521","3548485f":"19542",c58d7350:"19578","9c65fedd":"19659","76b52ed8":"19664","2bd614fb":"19686","0e4a3360":"19711","3c6c92ad":"19774","83c71362":"19798",a5052667:"19801",f36e33a7:"19851","7e53000f":"19865",ca2ec6d9:"19894","436f8775":"19999","430ee71a":"20103",fa230427:"20116","9e0a0edc":"20154",ecc82a52:"20160","83e7d916":"20216","5aae4c30":"20229",f60a8e85:"20286","13d37261":"20304",a55cf427:"20358","915fad0f":"20361",a170c4b2:"20405","839320c8":"20415","9de16aaf":"20428","39c0c867":"20434","4c056f0f":"20491",ca16b0fe:"20535","2925f13d":"20541",bcad8cf0:"20596","678bd7f6":"20639","72c396ee":"20661",ff781369:"20713",a827f20e:"20812","1d99c39c":"20892","5ef30e9e":"20951",e3b4fd8a:"21070",c1b7702d:"21121",b2a1bef3:"21123","574aa417":"21177","58f98693":"21273",e737da10:"21275","9eea3ae4":"21292",e4bea80c:"21303","266d37b9":"21316",b2c62a3d:"21346","9db9c0e0":"21417",f48374b5:"21492","70b56ba8":"21510","69f9ca18":"21524","6c888f35":"21560",d17a9646:"21585",aad02470:"21630","6224d640":"21635","7682eda6":"21644",b3f2f317:"21683",ea9d899a:"21729","1926d3d7":"21805",a54a9a31:"21874",a8a7f86a:"21921",ab4d9aa4:"22087","3ad1da61":"22124","625beb64":"22141","2231732a":"22170","49e3a5aa":"22178","60be01c6":"22236",e605a73c:"22257",a94ba305:"22262","9a5e9795":"22385",f93d9ca9:"22447","2923e8f3":"22499",ff15e2eb:"22501","6f37f43d":"22534","6e771e2a":"22579",ca5d6ba8:"22595","69375b61":"22640","6d250944":"22651",e0618342:"22702",a4289c8e:"22791","743819ce":"22809","70db0e3d":"22816","9a29e675":"22911",d49fdba3:"22916","0d5f3865":"22932","6a44fd90":"22969","97b786bd":"22970","70a32eac":"22973","1fd06df8":"23002",ad58910b:"23039","07da43c6":"23041",ef1c4348:"23081","39307ee6":"23119",a1c39b3f:"23141",b8dfc3a6:"23208",fe86f3f9:"23332",fa5f4abf:"23388","95d97af4":"23438",fdeab78a:"23475",d4f4b34a:"23545",f24f712d:"23563","53746e73":"23591",af9b00f1:"23600","59e9dc06":"23634","9c150758":"23637",cb16b650:"23666",d235b83f:"23676",ea8366f8:"23700","79757e7c":"23805",a268f692:"24033","54c79a13":"24036","5ef1cef9":"24065",a83d9791:"24071","4ed60a8a":"24084","81c34363":"24098","897856d4":"24126","5ce7213e":"24140","4b2ed2d0":"24172","3af3061a":"24234","7ebf6f1e":"24265","45a47a41":"24292","205ca674":"24301",bbb172c1:"24327",a4e075be:"24340","99d3870c":"24366",b5b376a0:"24377","9be81a8b":"24393","045bd6f5":"24475","6cf93e89":"24476","8a733352":"24607","174b58ca":"24618","9555b08a":"24644",e781e98e:"24649",ff00d8f9:"24652","3befffe2":"24704","91c64349":"24728",ed6ec893:"24826","1574adde":"24838","7cfd7c3a":"24853",f0709bee:"24891","8e01a36e":"24912",cf6129a8:"24919","231cac3a":"24970","1db9daab":"24991","9cd11b72":"25044","8bd2257d":"25101",b277530c:"25130","8a95094d":"25173","96046d19":"25186",f118f569:"25243","1da16fcf":"25285","537936fe":"25335","4083b748":"25397",e346ea56:"25410","143635a6":"25450","5ef8e026":"25452","2a44fc97":"25469",af5c68f9:"25531","20429fae":"25532","7fb09d55":"25539","65603bfa":"25582","71651e9e":"25632",dcc6ca2f:"25671","9c2460d0":"25731",d56bdeaf:"25778",ba115cad:"25781",d2c3f17d:"25845","17268e53":"25874","1645b95d":"25987","90c5833e":"26003","20f9256f":"26009","4f978fc9":"26079",fd6c914a:"26183",a937858f:"26184","4e3e1e17":"26216","477cc2f7":"26260","878dce9b":"26305","9579dcb9":"26333","65009e94":"26337",af138e2a:"26352","26008da6":"26610","8353278b":"26627","960d3eb8":"26632","1802ae9e":"26722","21e535c3":"26744","4681e75f":"26797","38cf2270":"26812","958a296c":"26882",b3749361:"26900","9d0e7fc1":"26986",aca5eee4:"27012","58714c61":"27020","1547c10f":"27088","220c1bc8":"27092",cb33cd4a:"27094",e37692b4:"27115",c4d1e829:"27123",cbec0238:"27179",ce710151:"27212",f52b34fb:"27369",f7e205e5:"27388","30ab0d34":"27394",a3983124:"27398","7a3be7e3":"27444","31ed8f07":"27473","9087a409":"27493",a95ad191:"27684",ce588038:"27785","2e7e1134":"27955",ee4b8f19:"27995","3ad90ad2":"28081","2cc67ca6":"28086","81c204e1":"28111","8120957a":"28166","9adef974":"28178","758b9bc9":"28204","20a81622":"28235",b8d3e47d:"28252","5a4f5a9d":"28294",ec410c33:"28319",bfc2a64d:"28369","89cbd1b8":"28410",b8d60920:"28616","54ad050e":"28627","334e3bb5":"28636",e1758f93:"28679",ab48a39f:"28687",c3856c66:"28701",fd5c5192:"28782","379ac6de":"28793","7ed2bc06":"28834",e7ef6e16:"28920","8c5b1685":"28941","9c7a2f87":"29060","1421c0d2":"29100",fd077c05:"29117","3b189bfd":"29148",d330b699:"29243","04daf44f":"29370",fbce6636:"29408","163a1bae":"29421",e4d4ec4e:"29457","05e733df":"29514",b2f58160:"29523",b45a54e9:"29526","760e2145":"29567","13f72d6c":"29653","6e0a413f":"29679",b1633424:"29690",a642dcef:"29698","80b93830":"29708",da10e58f:"29733",e6557239:"29795","16381f20":"29820",d973177d:"29829","8b18d68f":"29838","5d94dea0":"29845",e534ab35:"29885","225b6447":"29943","5de1c39a":"29950","332b14e0":"29969","8f6c1b4d":"30021","87546ad3":"30035","339988c0":"30154",adcd62ae:"30163","22bf7f69":"30167",b97a54f5:"30200","22e8ffbe":"30239","5320ed26":"30262","967ebe95":"30303",dfcaec69:"30314","4b678e99":"30355","90ffbe81":"30410","874dc058":"30490","407230da":"30564","1ee0a129":"30579","775c5b43":"30583",ceb04c72:"30585","6ee9522e":"30628",ebf8e597:"30746","5814834c":"30827",ced554c7:"30831",d8412727:"30842","677757ca":"30848","44c28e7f":"30934","416fb909":"31016",af819789:"31022","71d5b1f8":"31039",c3c8ddc4:"31125","0b62d7e7":"31150",df232fd5:"31213",b8ab477f:"31220","5c81ce12":"31255","67f1ea1e":"31257",fa366c46:"31272","2c3e7e92":"31279",cc564cf4:"31465","1668cad9":"31541",c602d51d:"31544","8c4bf82a":"31567","0b401b62":"31700","05957343":"31705","0a70c05a":"31720","04eab06f":"31791",de1c8a7d:"31838",a14af959:"31861",c791a767:"31862","4ef864ee":"31972","8dbbcff6":"31996",f0dc0726:"32005","9ba9284f":"32012","116b7e55":"32039","5110a7b7":"32183","4437b871":"32295",f9a4941d:"32335",fe345ee5:"32365","263a95fa":"32374","042ba1e2":"32384",e1407f5b:"32391",c08ba4cb:"32472","0e9894c7":"32492","40c3731f":"32558","798484e3":"32691","1b520177":"32728",a196e32c:"32781","5617aedc":"32787",fdddbf66:"32825","8590fd3e":"32847","69583d95":"32884","225cc45a":"32960","604cd7c5":"32993","97e51b1f":"33049",a172f6b1:"33065","12e68472":"33132",ee003a92:"33192","817d1a47":"33202","465994bd":"33234","7da68ccc":"33290",ff6c3941:"33307","2d0c5b52":"33350",c16e0158:"33458","0b81acdf":"33462","3ed70074":"33517",fe7ac0b7:"33540","6075be34":"33567","269d704a":"33572","3f933ca5":"33612",d294bdb0:"33638",da7149d8:"33643","81a6b262":"33659","755872dc":"33724","1b31aebb":"33804","07399e71":"33806",f8a443f2:"33825",a7690409:"33881",e9c7c2b7:"33889","49aa1a16":"33999","4fc571b0":"34071","04f8849a":"34095",a870955a:"34117","18b5779a":"34127",f5c63bac:"34156","0bc541b1":"34171","3f4396e6":"34179","13e6af21":"34196",e8a8dea2:"34255","164e61b9":"34331","79fbf53e":"34388",f3d3813b:"34447",c2356d7d:"34511","538371ec":"34520",b038a3ec:"34528","782eae4d":"34543","0735e5be":"34549",f30fab6f:"34621",ef071c32:"34662","02e54e09":"34691","47a1bde9":"34706",a5fea1bd:"34750","5d5e0832":"34761","2e6ef254":"34808","924dcf98":"34810","117121a9":"34812","10fcd509":"34837",dc7f8f8b:"34847",f7702246:"34877","075b4af0":"34962","907e7dc3":"35023","6fe5390f":"35139",fd058e1b:"35168","0f3b9f0c":"35288",d42065ad:"35325",a7827f50:"35329","976ab233":"35402","032e2c67":"35523","388d5845":"35532","75d5f1cf":"35542","5c44183c":"35546","97bb73fe":"35618","8fc868c2":"35733",aba21aa0:"35742",ff6f6072:"35766","3019fa66":"35767",c75a0418:"35808","864f74f0":"35844",bb1bce89:"35911",a3142532:"35932",dfa4e294:"35960",b5a599e0:"35983","04afe417":"36009","59be0e8d":"36055",ceff0062:"36067","28f38ec5":"36113","307d712e":"36144",b59f02fe:"36188",b60e28b6:"36192","5cfc9e58":"36211",f8a5caff:"36271",eafd7a74:"36302","4f9c79b6":"36361","9c812e08":"36573","2573355f":"36619","1084a32f":"36640",b6fb003b:"36672","4c7d084b":"36703",a3015275:"36747",c1a328a5:"36763","649faa0e":"36851",b46f5ba1:"36890",d73e6b67:"37109","0b4fcfba":"37115","97da4333":"37147",d786420c:"37191","8f3b27f1":"37204","43dcd746":"37206",e34cac0e:"37209","362ee1f8":"37287","167016d0":"37298","554882a9":"37329","6013ac2e":"37366","4a1368b8":"37378","9bbc9e48":"37441","6929f09d":"37485",ce46a18e:"37486","6a293d29":"37489",e17d733a:"37578",be2ede3f:"37617",a6aa9e1f:"37643","021d469a":"37646",e2657c7c:"37673","2045fade":"37678",f451cc4c:"37702",f5853975:"37737","2cfb265a":"37740",feab7dcb:"37799","5f87fd99":"37809",d5e29b01:"37839","9ad03801":"37841",cd060f40:"37842","88d0aec4":"37872",f6432a48:"37979","690cbdd8":"38001",b61f0370:"38032","63e00c6c":"38035","37b82514":"38055",baad6bf9:"38056","2e9f383c":"38238",d0e9d470:"38288",cf858c26:"38370",dcd7017c:"38416","9474fc0c":"38439",f0fb7623:"38451",fe3e0e89:"38460","0fae8f08":"38501",f9c05060:"38520","0f497157":"38600","6dc06ee1":"38605","47e85d0b":"38642",c4de5678:"38767","5ea125b2":"38816","6495713a":"38835","110e78c3":"38839","6f5eeb66":"38888","7c912802":"38891","17b935cf":"38923","8e72bb53":"38953","2c50796a":"38974","0db7476e":"39014","5560f355":"39088",cb9e1f3d:"39110","755ebe0d":"39138",b5f01515:"39142","0b8a4e62":"39153","06043210":"39185","09b62bf8":"39192","484cbf74":"39197","8b795044":"39202",a7a3cbc9:"39228",b992801d:"39230","90f157dc":"39240",b40642d4:"39265",b1043e58:"39283",aa0fa20f:"39404",cc6505da:"39405","995840bc":"39407",a615dd65:"39423","0f65ccfb":"39444","9e679a0b":"39472","6bf3751d":"39473","9d833fad":"39487",b326207c:"39494","4a80e27a":"39555","06a8eab3":"39569","7d0e1375":"39587","97ae1fff":"39608","8f64cb7a":"39712",a68f0e64:"39715",fb3759c3:"39773","320da59d":"39777","3c2d0811":"39781",a2c9e15c:"39876","9b0c8626":"39887",d76c455f:"39901","09a52b17":"39908",d4a2e930:"39973","5f469a3b":"40065",bc817d28:"40124","59533a49":"40132","0508dae2":"40178",a2d43843:"40212","05c63416":"40249","3c36ce76":"40369","0cd1a20c":"40463","11b8ce75":"40555","3e032765":"40606","12a5de9b":"40616",bf5126e1:"40651",dfc3c224:"40690","25dc0311":"40694",cc01a9d7:"40697","986db944":"40733","5bc29dc0":"40755","1a7b33c3":"40758",d5281bd1:"40780",d2110cc0:"40797",ddebc8bf:"40827","2662e92d":"40847",b1527e4b:"40879","321dafc4":"40907","881bebdd":"40927",ca0149b2:"40959","68c5632a":"40999","33d4a0d4":"41030","406d4ec1":"41120","0fa5c29b":"41125",ddb0149a:"41134","85ffab62":"41135","2a0d650e":"41178","6c9200cf":"41260","247909f7":"41361","803932cd":"41409","2bf5edd4":"41455",fd517388:"41461","06fce5b8":"41472",c3f88c36:"41491",da172daa:"41594","13e47f37":"41637",d407c2c6:"41640",e8e3bd30:"41651","9017a110":"41677","155a9bc0":"41695",b9edf71b:"41739",bc38a1dd:"41750","78f0e259":"41867",edcc5675:"41871","58b3152e":"41872",dc5506b6:"41892",b7a56be4:"41907","7c49023e":"41954",c67e4e1c:"41993",a2839a15:"42021",c413ce11:"42068","295cb0c0":"42187","671726ea":"42196",f1a4f0ee:"42207","6df57399":"42350",ffac4af0:"42368","99bce14a":"42380",b8212f90:"42465","34825c6d":"42518","2b505997":"42566",b184a577:"42576",eafac744:"42596",fce58780:"42659","7fc4aa15":"42677","165a93e5":"42690",bfdde79f:"42694",ca790126:"42722","5314580d":"42799",bf3d61ec:"42801",fa6fcf0d:"42887",c9d95cbd:"42900","145364e0":"42905","39c7a203":"42911","583fb00a":"42924","19028add":"42942","2812e3b9":"42995",e3477e52:"43029","2907d5eb":"43035","4256b042":"43036","676c7c8e":"43040",bec2896b:"43042","341293cf":"43088",f1374ba3:"43136","0bcdfdaf":"43199","4c07ba53":"43352",bf7f6ee8:"43372",f048922c:"43421",fbf82623:"43432","83fec35c":"43445",a490aaaa:"43447",d319e9f2:"43512","4cd0ba1b":"43642",eb6ed572:"43675",ac5cd9bd:"43684",fe2d8766:"43833",c09831a6:"43868",dbd5692a:"43880",c5a487ef:"43910","5a8b22a0":"44008","43d1bad2":"44040","894f5c0e":"44045",a3a8fa0a:"44062","6503f568":"44118",af753000:"44123",ca2b0f7e:"44125",d653d7ed:"44129",d02da847:"44137","19acc4ed":"44143",bf12a61a:"44169","57767c05":"44267","4f087d20":"44290","3413c8b8":"44301","0a91021f":"44339",bc8f3fce:"44351",fdf1d2ab:"44381","216bf65d":"44419","6fb01322":"44489","9882af90":"44492","0c9b1365":"44546","9b2ae5ff":"44551","502906a9":"44567","5b39e963":"44605","20bfa334":"44640",d65b2c25:"44662",bdc69003:"44682","668e0554":"44844","43f3c18b":"44939","12b957b7":"44960","41af2803":"44994","6e34e766":"44997","86fe1f77":"45117","57083a92":"45218",c3f790da:"45238","74e64d1a":"45245","33c572e5":"45268",db90ec2b:"45290","815e47ce":"45323","24d4b044":"45339",f86f0ad4:"45400",e85bde03:"45500",a722b43a:"45541",c36346e3:"45670","3533dbd1":"45682",a2a2954f:"45919",ec832811:"45920","9926d60d":"45983","8cf74eb7":"46001","2e048b0f":"46008","1fb7523b":"46025",f724037a:"46039","67893f6a":"46063",f1087137:"46074",e8b8ca39:"46102",ccd96dfc:"46123","53cdeba4":"46156","3bf2a847":"46232",ea511817:"46244",b5b4a410:"46246",a490cf35:"46340","5e1e1325":"46352",e49bd305:"46375","89e9b753":"46381",ba786c9d:"46435","4bb02a47":"46451",d7c0035e:"46464",bcb734aa:"46472","9dfe5a97":"46513",c13f246c:"46515","60d50d27":"46541",c5427124:"46547","1a79e020":"46548","8393d26f":"46598",c4f38868:"46633","4f48cd24":"46662","1ee47c02":"46694",a6d25208:"46697","1219dd15":"46710","2b6a7ab0":"46754",e0362487:"46814","917a523c":"46850",db9d1243:"46888","57a58e78":"46905",ff13b684:"46911","7b0a3d41":"46917",a28b89d0:"46921","2d3f88b2":"46962",bbb92300:"47041",a5c8a2aa:"47087","696d889c":"47106","931beacc":"47110","5e9a23c0":"47127","3a2a4cfe":"47156","5048202c":"47247","6111afa9":"47297",b9a767d8:"47433",df0967b2:"47537","0029660c":"47555","925cbbba":"47573","0c1ff092":"47622","39a07549":"47693","17093d00":"47699","4edf53e5":"47730","1b512798":"47738",d783f956:"47913","6bb76d2c":"47917","9e70e253":"47993","8fa8fb45":"48015","47f96c4a":"48023","1b3d7ec5":"48027",ca713325:"48050",c17f9567:"48063",b71c2d32:"48071","06ef9569":"48097","859f73c7":"48127",c467a11b:"48132",bac93bcf:"48140","519b5759":"48162","9d8965aa":"48188",ef31fc63:"48270",e672d61a:"48285",be3fc974:"48286",e2b4c006:"48295","189e3ac3":"48304",f6884a75:"48310","959b45a2":"48360","712c16a5":"48361","2896ce7a":"48532",c5550c10:"48537","0a5f31be":"48544",c1506482:"48592",b775ecd8:"48650",ef4f3413:"48661","5db19d16":"48673",d009d47f:"48733",e054d919:"48768",b71be52f:"48793","49b022dc":"48879",ce18dbde:"48883",e93602d3:"48939","0f461001":"48985","9d9f8394":"49013",e3c5d63e:"49109","3455c0d5":"49112",e3022ebc:"49171",f2a06fea:"49226","828cc8aa":"49289",ad0a2b75:"49305",e28d4356:"49308","2417a912":"49350","8f1510f6":"49388","2019135a":"49461","49d63cc6":"49521",e01bb6c7:"49579","8ec8c5c5":"49583","2cbb324b":"49587","4f5f41be":"49602",b0ba51ed:"49655","2391d372":"49676",b9ce10bd:"49693","58e037fc":"49768",acf72eb8:"49783","5bd6f6db":"49786","759a3c81":"49941","40c88f7a":"50012","837c6843":"50095","756c7559":"50176","18dddf22":"50178","4e80a9dd":"50208",ec6a0daf:"50261",fc6a53b6:"50293","5d4911b7":"50306",c59a4667:"50414","36abd830":"50424",a33de290:"50428",eaebafad:"50446",a4e24d6c:"50472","129c4e7a":"50507",c112d1b7:"50570","3fd21eb6":"50584","0bb25d72":"50585",e964b083:"50642","960924c4":"50664","75be343d":"50700","0914ee26":"50703","0d98f85b":"50747",b365f6bc:"50800","4251704e":"50819","8aa0dce2":"50839",e7b82dc0:"50934","3290f534":"50981",dfbb1d90:"51009","4dd6f8d8":"51047","5b9ffc49":"51059","3304ac90":"51102",b4ac58bd:"51108",d366555a:"51116","85a6e3f4":"51237","0a8d92af":"51378",fe2deb8c:"51412","7a04b795":"51420",c9c6fdd1:"51435","14515c80":"51438","704ce0a4":"51465",c548908c:"51547","45b02367":"51548","8447ad38":"51578",f762fff5:"51589",ba5671ab:"51636","6537c712":"51649","65d842b9":"51665","30ab0ff6":"51689","89bdbd96":"51711","9199f8bd":"51763","44e51e65":"51828","5c238f81":"51837","48b6c251":"51878",b5fb4df8:"51890",d1e88337:"51944","772b5e3c":"51961","7dbc2502":"51962","1d79e793":"52036","7f8ebea7":"52042",fbaf87e8:"52050",edea4b8a:"52093","95cc61bd":"52102","3498be82":"52132",d0ed28b7:"52135","81d19844":"52176","628d0604":"52181",fadc68df:"52235","8ec5e058":"52250",c292770f:"52261","3e088827":"52266",f6144dd0:"52276",be224150:"52282","8e1e17e5":"52286","0dd8c0ac":"52342",ab586159:"52408","25d3e7f9":"52424","2dc793da":"52450","8c67a0ff":"52466","2c5310f2":"52477",cda1618e:"52478",ca57223f:"52488","7dcd92b5":"52569",a9417ee3:"52572","14ba3414":"52605","27f2e2a4":"52612",c4f5d8e4:"52634","9e4087bc":"52711",c8f57d29:"52731","85afc7f5":"52770",ce319efa:"52826","9e1bed9d":"52840","69fcecaa":"52895","2f32a261":"53074",c0571b49:"53118","5de85215":"53132","71514a42":"53178",d670063b:"53201","79ab3378":"53237",a9129632:"53238",fa713049:"53256","76a0389c":"53266",f8fe23f1:"53288","5440b68b":"53314",edabbd89:"53370",e2bce80a:"53449","63436e22":"53458","0f65ad2f":"53501","92f1a745":"53540","7e665e5e":"53559","6c9978fa":"53646","52ed38a1":"53670","77612fce":"53742","3a447539":"53771",e352cccc:"53786","7c8deb08":"53832","2a5e97be":"53861","94dd9534":"53871",e9a95c5e:"53881",a4da17e3:"53901",a8933372:"53925",abde70aa:"53952",d5f056f5:"53982","93b4d825":"54106",ba441024:"54113","5026e9d2":"54144","89fdbc0e":"54168",f97d7d88:"54200","3a55b748":"54240","5ba9c4b5":"54246",e5c0ea66:"54270",f020ef51:"54272","71e2c4b4":"54277","14434d81":"54310","45c5f30f":"54313","3c5b6e91":"54349","25aa47d2":"54399",c87c5e1b:"54415",f21fcda3:"54439",fb9e14c7:"54500","66193a96":"54540","633af835":"54568",ff4fb41e:"54749","0f7d8652":"54759",a872c629:"54879",c46bba44:"54881","0a893fdf":"54950","98bd463b":"54951","5bcffa9a":"54992","37d125cb":"55004","70d55848":"55100","152d0582":"55144",c1cb0a0b:"55167",aaa8a12d:"55206","05cfbcb9":"55223","0373e7f9":"55245",c962ae4a:"55276",facc4cc2:"55302","028ccd51":"55329","1921d13a":"55351",e2f2b384:"55395","2027fd18":"55401",b8d6941f:"55413","6a0c8a9c":"55478","342d2e6b":"55483",ab685cdb:"55534","29cf75d4":"55559",c8861997:"55566","3a9c66ce":"55579",d5caed5f:"55616","483b9ea8":"55645",a7511015:"55664","1c411fa3":"55675","94b063ba":"55836","2cbaf53f":"55929","194c8540":"55955",e1a6f6ca:"56028","69ef23f7":"56037",cde3e47b:"56062","6f9d890e":"56068","096bca72":"56097",a7b4d0d7:"56122","602e2465":"56123","9c062d77":"56145",f05409e8:"56216","575869e5":"56297",cbb5064a:"56408","0d71415b":"56463",f71bbf9b:"56470","7a75c11b":"56486","858f1266":"56493","86a45dc2":"56510",c9c31477:"56560","609f9177":"56607","69e6c429":"56723","6664c24a":"56779","7488fea1":"56819",eec5649b:"56826",ebc13825:"56916","1dbfdc18":"56948","39ed0ae4":"56974",dbf9c341:"57013","4d68fc5d":"57119",d592d1b2:"57125","398b4aad":"57139","037241c6":"57141",e15f47bb:"57159","034f0308":"57165","779bba71":"57251","3ed58e4a":"57326","8a5814b8":"57352","79cc2eba":"57361","4cc485ec":"57364",ac4d154c:"57430","0b7a8a63":"57529",e07fd562:"57586",dd48b375:"57614","0ed7fb46":"57647","658997e4":"57730",c07b5739:"57749","73d3ccec":"57760","17413beb":"57800","48d58c93":"57845",a57bd983:"57912","0cb9db3f":"57994",b75e1b9f:"57996","4b5076d6":"57999",e2070fcf:"58000","31fce735":"58002","2655f170":"58079","242b0cc2":"58093",a2171a4d:"58144",d1f7176c:"58230","400deb23":"58255","078daaf7":"58259",b296abb0:"58301",a5e62092:"58359",ec854811:"58428",e2adec54:"58454","2a882da6":"58479","36d29ed8":"58484",f0e5f3ed:"58581",e7c7e2bd:"58582","6bd22ece":"58594","1617efa4":"58632",a36e07dd:"58667","7fde9a4c":"58704","6b6aadc5":"58707",b7d1b016:"58780",dbed7045:"58990","39fca8ac":"59005",e84457bb:"59020","11b61292":"59053",c43c6f4f:"59070","1a20bc57":"59114","17ffd4ff":"59123","37bc7ff6":"59143",a065bdfe:"59214",ce62ac6c:"59246","97db775f":"59262","156bd387":"59349","8475b017":"59437","150f4998":"59493",b2555332:"59521",e651f27e:"59548","674c9391":"59627",e4b8975d:"59645","70cca634":"59680",c9b0e9c8:"59702",b51518d2:"59727","9873f053":"59732",ab90a7b7:"59740","03f08ad1":"59866",b62e8859:"59874","888f35af":"59940","03137a3d":"59981",e266eeee:"59994",cc3a93a6:"60020",ad9dbc18:"60073","167d6699":"60101","152819f0":"60167","267f1c69":"60183",e04f784f:"60185",c1df8329:"60189","5c430979":"60193","5c417b7f":"60198","5c5dd48c":"60203","3fa5d64e":"60257","93d54c10":"60294","42d452f1":"60315",ce86b1ec:"60394",f83acba0:"60445","7003bb75":"60501","821320eb":"60510","3b57fa48":"60559","0c5e909c":"60565","3523854b":"60613","33cbefd4":"60615","244c7b0a":"60676",d163928b:"60696",aef9dca7:"60737",e9d18558:"60762",d379b051:"60776",c316a3d7:"60819","6327585c":"60832",c9d25191:"60861","709e1a02":"60884","00b58b18":"60901",de3f51c4:"61006","2d694024":"61096","127f988d":"61114",cf0c4cff:"61124",a7456010:"61235",b6b1a235:"61261","84536aab":"61265","31eb78c6":"61300",e0f81731:"61334","9c73eeed":"61368",a1e3441b:"61416","43bc2f0d":"61461",b0f00280:"61481","6b206066":"61559","55b57e06":"61584",faa24029:"61702","89baf629":"61706","13a64537":"61729",bc80aebf:"61740",aa1329f2:"61786","1695d9c3":"61807","8513fbcc":"61816","124bf435":"61886","4431d7f4":"61942","820ef6f8":"61950","9df3c51e":"61959",a6972a3c:"61991",a396a58a:"61993","5cc68a8f":"62015",c9035049:"62050","2638eb20":"62061",d2289dcb:"62111","1a4e3797":"62138","8d364c04":"62147","22c027ab":"62162","0e7e04d8":"62182","1e38d1de":"62188","46e76af1":"62213","9b695413":"62254",e0fe70af:"62263",cb69dde4:"62264",f448ea15:"62469",cca423c7:"62549","0f378f0f":"62639","58728d91":"62641","0bd3abc2":"62664",fcaa2a90:"62672",d9175e87:"62691","345b88a3":"62703",f9a8c23e:"62712",b519e6e1:"62713","4e78ea4f":"62827","973ec13d":"62838",ae5c2262:"62845","07853d90":"62867",c03ef713:"62927","2696b78a":"62934","3415fffa":"62936",e5c6728d:"62957",baa95a18:"62975","4cc6a9b5":"63002",b0635fce:"63005","3a9ee945":"63014","4eaf5bae":"63016","9bd87750":"63115",d4bcf69a:"63124","2e91affa":"63156","34c77011":"63228","2f1bf685":"63291","2d074af9":"63292","259b7e50":"63298","60b75cbd":"63330","780fa4d5":"63342","44bdb747":"63367","5f87f962":"63382","9780a9d6":"63387","465af2b7":"63430","877efd72":"63445",f30739cc:"63455","9612fd60":"63515","58f053e0":"63521","1fd2ca4a":"63553","43a56d47":"63627","47298c37":"63646",eadd254f:"63700","2ac84b5b":"63750",c2750739:"63779",a4974adf:"63795","95e06d9c":"63836","8bbbdfbb":"63951","2278c359":"63966",c47fd21a:"64045","813e2458":"64091","5ae5672b":"64154",f4f77456:"64184","88ed6425":"64209","7c0dabe4":"64351",dfa86ee4:"64442",e4307155:"64447",e9f47cd4:"64465","5d817499":"64502",dae07133:"64527","3756d209":"64535",a2a8ce40:"64577","72a44e21":"64597",e52d80fa:"64623","6ae279e9":"64659","1d00ec5b":"64737",ee942de8:"64763","9a8a6b3c":"64838",eda18b6f:"64848","8c717503":"64859","8768b566":"64865","5609187a":"64888",e80f330c:"64899",f08c8322:"65017","6f5a0de7":"65025",f705c127:"65042",c9bcea67:"65133",d0cf31b7:"65193","2a11e6a7":"65223","0530d392":"65233","5ea2239d":"65246","238a64af":"65276","070df7e5":"65359",a81fcfc9:"65466","26115f23":"65497",e1ba57a0:"65625","75ba6401":"65647","329c66a5":"65658",d1be0dfb:"65745",fbd3de42:"65835","698932e1":"65864","38147e44":"65897","587a0b3e":"65918","567cfed1":"65926","1f391b9e":"66061","274bdcbd":"66085","331ad65a":"66135","136587f9":"66140",cf5645b0:"66162","0b7cbed9":"66169","2b53c3fa":"66210",cc9fb6c4:"66237",eee168db:"66327",dcbc8483:"66338",ea6ff7b1:"66351","6f47e633":"66415",cb8920e1:"66461","85e49a93":"66499",e2fc22cf:"66504",c6ec7d6a:"66518","2ca00666":"66519","83037ff5":"66524",fdd85734:"66528",ecb74126:"66559",b0e34666:"66575","9fce9e91":"66602","5032a87b":"66615",e381e7b7:"66759",dc4094c8:"66774","66d49eee":"66791",acc69dc5:"66819","62e9fea7":"66822",e1fde1ef:"66832","58b9aab4":"66867","6e955522":"66912","699a39af":"66943","1b143eab":"67044",c1050649:"67061",a7bd4aaa:"67098","06073810":"67104","0d86fe8d":"67114","60cef16d":"67252","01ed4ae3":"67376",b6d7433d:"67438","814f3328":"67472","77139df7":"67507",d63d12d5:"67520",d89aa357:"67545",a1a96ebc:"67581","8775fa1c":"67587","47766edd":"67668",cace8592:"67683","8fb89e11":"67704","2c18bef5":"67729","2d2dd3d4":"67752",b57b3f07:"67755","39b26ead":"67775","0a0dd03a":"67914",c1c9577e:"68043",e981d05e:"68094",ffcc313e:"68181",a148d810:"68210","1ef2b5c0":"68215","89c88bb6":"68253","9d05a91f":"68334","31ea9d3b":"68377","975aa772":"68434",e59469ea:"68535",d81421b8:"68569","0b87289b":"68685",dbf13a93:"68710","8980e400":"68721","719a7d9b":"68765","14033dfb":"68770","78a6c606":"68834","3ac10f9a":"68839","62cdbb35":"68910","5aa406a5":"68930","68c6e6bc":"68946",edf3b85e:"68989",ef13094f:"69017","8df5dc78":"69038","4a55387a":"69129","9e7326c6":"69136",fc384521:"69169","5a275050":"69180",f0589cfc:"69199","93ef16a1":"69213",f99651a6:"69226","5a360e6e":"69384","15323d22":"69451","7ffd9a5f":"69457",a112e652:"69480","7b863c8e":"69489",fc15228a:"69501","33a51375":"69503",d0ccd112:"69505","8a4df687":"69517","4d573718":"69570","9c10cdcf":"69638","8aca5a76":"69651","16431fb6":"69692",d14574b9:"69737",b1e8d27b:"69770",f2d19d66:"69773","615fd764":"69844",a29a2c92:"69864",b58f381c:"69875","4d8fcf9e":"69908","8e981336":"69982","0860d759":"70008",c8d1e051:"70022","73a7a1a2":"70058","334fa657":"70106","9f3d620b":"70117",f68988f2:"70126",e04f6385:"70174",cb543535:"70179","36b6576f":"70184","02a73cb3":"70198","8367b76d":"70210",e76e0aa8:"70234","5e1c183f":"70253","9d6ff56f":"70267",d2786aa3:"70399","0bbbad22":"70418","5e32dc25":"70438","8c596cb7":"70502",ac5d28bd:"70560",a9f446ca:"70645","70ca6744":"70687","52be8247":"70696",cb488bcc:"70712",ecba2f16:"70749",f3e1c72c:"70755","1edba277":"70776",ac00e857:"70784",c513e822:"70788",fda5ba18:"70791",c1dff2d3:"70794",c3c05d38:"70814","6763bf32":"70828","777d5f9d":"70858","4f594038":"70870",d1fa94a6:"70947",d06511f5:"70949","87d75f25":"70953","16029e49":"70963","05f6486e":"71021","5e0cf2ca":"71026","9b8a5dc6":"71051","620de7f2":"71075","474f21e5":"71079","92f96583":"71117",af7ce5e3:"71162","011132d6":"71169","131dae92":"71227","40d0141e":"71374","7380ddcc":"71407","6e97302f":"71413",f0108549:"71454",ff761994:"71473","4d4a432b":"71501","8c13d23f":"71545",d777707b:"71548",d7e2cd1f:"71585",a29b4047:"71612",dbd41ac9:"71651","7ec29cb2":"71656","4a74d13d":"71715","5abeb861":"71795",beab57c8:"71852",cd9789f0:"71857",f783f7a9:"71910","835d6f03":"71964",f0dc2560:"72043","95f36a1a":"72053","052421c5":"72143","4941c7ed":"72322",f23d42f7:"72353","4419dbb7":"72358","27d3d4e0":"72446",b85e11ce:"72485","59aaffb9":"72508",ac84c584:"72527","1b8f178d":"72536","3336b76f":"72599","95579b4f":"72618","262704a5":"72656","408bf78f":"72662","049fd4ea":"72668",f81aef8e:"72675",eb3eed60:"72707","491d56e0":"72907","37eca2aa":"72914",b724edf8:"72925","4cad70b7":"73055",b8385eea:"73084","43dde569":"73121","6a428f5d":"73147",dfab75d7:"73163",da144c90:"73193","33e8889e":"73264","7bd25ebf":"73276","45d08048":"73286",c7f860be:"73290","8b1b48fb":"73316","97d2cbab":"73331","21838a86":"73376","681664ad":"73397","70c4ca3a":"73428",ae7930fa:"73471","158cec25":"73473","5ebbf59b":"73539",ac6289fa:"73569","01689e9b":"73607",c6ea0115:"73693",d8415e6f:"73756","7efb13d8":"73779","5cf43a2c":"73800","4d23536d":"73864","06dd3057":"73888",d721a748:"73891",d502d9c9:"73905",ccd984bd:"73906","8b683930":"73922",f4731b9a:"73940","14841d7a":"74019","4711b74d":"74031","2e6d9cc0":"74039",b7aeb8c2:"74046",ea5e46ff:"74069","8574818b":"74076","393be207":"74134","2fd7ee6b":"74282",acf7953e:"74312","3a983156":"74401","103c2fe7":"74418","111d9467":"74524","84939cad":"74588","033d3629":"74657",e6ce3bd9:"74684",a2afef33:"74768",a5ac74f6:"74792",ec7a5af3:"74880","37b8c62e":"74895","43c329f5":"74902",ad848ffa:"74945",f3ff39ad:"74950","9b3f2ab9":"74961","1c4d0413":"75043","8df3f976":"75062",dd620de6:"75078","9f49c871":"75106","0b0e328b":"75121","3126d1b1":"75173","20c3f46e":"75190","6dab9497":"75267",f2e2ec6f:"75298","152f3add":"75317","84aa8d64":"75359","847c1b9e":"75378",de0473f6:"75396",ceaa6e69:"75405","3e627431":"75442","1e94defc":"75454","605c3775":"75459",c6260f29:"75461","28a52d92":"75484",a9f98915:"75637","2aa42d18":"75666","1ad07866":"75696",d2250181:"75718","264ee92e":"75723","724a4edc":"75775",ad132b09:"75805",d95030e9:"75894",f18854fb:"75911",e01c8f09:"75919","6d79f7cf":"76023","03240ae1":"76041","1778a2f7":"76166",d9605822:"76215","6a3d5afb":"76235","075f4b70":"76262",cb46984a:"76264","1ed4b1ad":"76289",b85747a8:"76293","2519b708":"76299","9267add8":"76368","4fe377f4":"76517","594c10ba":"76530","9a3685aa":"76589",b6f16885:"76683",a50107bb:"76719","9a68cfff":"76748",dab72c8f:"76788","2b00a752":"76854",e364f7ff:"76871",a01a15fc:"77077",bf048e24:"77088","62825cc3":"77123",ce019e24:"77174",fe2389d2:"77222",cb62deb4:"77223","3e56cb01":"77240","1aef3c3b":"77261","109d395b":"77298",c4acdd50:"77369",f3ddbb03:"77373",d0c84d34:"77391","898b52e9":"77659","60381fc6":"77698","3a31d53f":"77749",d9e41302:"77787","793951b2":"77901","33ab05f6":"78001",c9599a77:"78037","3b78a115":"78069","90caa6a1":"78087",c55dd5b8:"78127","8df10e0f":"78159","5455ca0e":"78199","79400fce":"78217",f7f417e7:"78220",de5d0473:"78283","1682c6e0":"78312",c1b680b7:"78354",b1a2ea9a:"78421","28ebe10c":"78497",b7e5c092:"78512",ff4a022d:"78522","4adc4126":"78544","95365ba3":"78583","02c57050":"78595","7abfd700":"78608","4f1d1584":"78632",b80df7ca:"78704",c7dbf2b8:"78717","6000d05b":"78764","04c3dd09":"78820","4f0afd2f":"78858",f99d7a76:"78872",c8939218:"78912",ccd7c88f:"78985","0ee8b775":"78988","803df44c":"79039",a94703ab:"79048","3b97b725":"79138",cdc43a7d:"79150",c884c38e:"79157",cc426672:"79180",a2030166:"79416","9740270c":"79481","8b7dab17":"79485",fce2bd9e:"79487","368f9c22":"79506","09b9b020":"79521","921cad0e":"79524",a39d4ca2:"79534","85e0d297":"79635","1bfbaba8":"79656","8be24c4d":"79739",e64c963a:"79776",fc26a5d5:"79841","619263e9":"79866",f962f7fc:"79992","5e4ec6cd":"80018","1d1643d8":"80022","93c339e4":"80046","587df15f":"80091",a34d992c:"80100","7349f9da":"80102",e81448e3:"80159",d38a6f54:"80198","6a7c2838":"80201","8aabb1ce":"80260","3c89ed52":"80310","4eb79faf":"80315","81f854a2":"80342","2fd10e89":"80362","81c96f91":"80408",abf14b6e:"80424",e1a35040:"80442","992bda30":"80457","318980ec":"80458","7080aeb9":"80491",a8418b9d:"80524","57f28ae4":"80525","27321f21":"80531","5cb06d06":"80557","9aa3eb98":"80579","80f24550":"80649","6d70fa33":"80677","84ac5929":"80750",fd440a88:"80772","442da8c1":"80794","2942b330":"80810","413bf93f":"80841",b6aee096:"80863",c141421f:"80957","5ea38e3c":"80998","820b9813":"81012",f74d3bfd:"81019",c88d5fcd:"81050",f98df6cf:"81175",ddf9f187:"81188","347b93da":"81212",d99629a2:"81265","12363bc4":"81319","7af33a93":"81410","0e6e8143":"81435","46baeff3":"81438","439b75a7":"81497","13685ceb":"81544","04a0ea54":"81585",dd7ad24f:"81643",a74d38f6:"81666","015f929f":"81691","0d9e9c41":"81692","9df95cfa":"81728",c75c3ca5:"81737",fddd2104:"81770",d3571192:"81791","59115b3a":"81846","29470dda":"81902",acecf23e:"81903","2a59c009":"81982","95a252da":"81996","755e7c7e":"82019",dd5c5048:"82096","9920fffc":"82221",d2c9f0b8:"82261","226eff01":"82297",b87f99cc:"82354","7345c721":"82362","0add85e5":"82553","4ccba4b8":"82754",d45b1270:"82774","0b94f8a7":"82776",dd09cc7b:"82847","12cecbf6":"82905",c609eda1:"82932","492bd0ed":"82946",a76e45f1:"82953","732a7c43":"82987","7f710e67":"83000",dac8839d:"83027",f729154c:"83044","42174d87":"83078","686a74aa":"83089","21cd7edb":"83103","6060cc06":"83111","10757cc8":"83127",e5cd0e7f:"83182","95126e44":"83203",ccc49370:"83249","5c26bf07":"83260","2b6eabf2":"83273","0ba08ea0":"83316",d0f169c8:"83378","3305f513":"83379",e6c42ffb:"83431",df2607af:"83439","8ac4b897":"83509","3d9e5426":"83523",cb5bafe5:"83534",bbefe8d8:"83561","1b2dcba2":"83566",c85c7bc6:"83574","19560f91":"83608",fa4876cf:"83612","9e37e644":"83670",a8c902bd:"83700",e6fc8a9b:"83779","5bb71e94":"83814",cc517726:"83841",c48426e8:"83849","58dde135":"83870","6f2a2977":"83901","98a236f3":"83923","345eb925":"83928","757c6784":"83932",e67a83cf:"83954",e200187b:"83970","0e384e19":"83976",c17d6939:"84013","511d3e84":"84070",ed83b9b9:"84107",f50461b9:"84112",d2ed2b82:"84152","17d9fbbc":"84227","901160ed":"84255",a86855f2:"84256","2ffd8514":"84259","1132d5f6":"84319",e5fa0c05:"84324","0b82d45d":"84332","615402d6":"84467","8180940b":"84527","5955b5ee":"84530","2760fb69":"84563",d9a7203a:"84572","19441c68":"84711",eeef4db4:"84754","1c52b634":"84755",b738b15f:"84773","6875c492":"84813",fb6c680b:"84822","6bd2e919":"84869","21014f01":"84878",d9d878d8:"84963",f4f70b42:"85008","112387f4":"85073",ec173259:"85086",ec2ed6e2:"85095",ab380486:"85105","0cf3b0b8":"85205","8beefa16":"85209","80b92086":"85228","78c968cb":"85243",ffec2b37:"85257","8f4a15da":"85279",c9ff545e:"85322","3dc48fec":"85353","2f6614a5":"85442",de5aeda1:"85453","10d4d7ab":"85478","021c0cbe":"85529","2c88985c":"85537","86c0ae26":"85558","8f9bc413":"85581","24e645af":"85588","0e8c3a89":"85736","9aa57b9d":"85867",c9fc48eb:"85896","41639dad":"85899",d5ebbe5f:"85905","716f14d9":"85917","5268c144":"85960","94811a36":"85967","5733876a":"85973",d6ce3007:"86063","677325f0":"86121","1f8198a4":"86167","95ee2976":"86215",abe1b280:"86216","7a2c4c43":"86246",d630316d:"86354","669193a7":"86417","8609b6c1":"86424","2a1b9f9a":"86478","3a311bb0":"86480",f4e1ab69:"86501","8bcf4d99":"86596","0e0dfb6a":"86597","6522b4ea":"86616","7ff6577b":"86659","927f97a3":"86669","58421c87":"86685",b0445ba0:"86807","57ec2762":"86846",c942990c:"86856","5687c7cb":"86888","319b6f13":"86890","869411c7":"86914","7a06eb83":"86939","99f485fc":"86955","9c273b44":"86978",d2a66e94:"86992",b62a4e5f:"87004",ae399c1c:"87145",ddb4c0f8:"87178","4462c0cc":"87184","767cce31":"87186",bad31f72:"87205","9c71777e":"87217","747973bc":"87269",c884ad6a:"87282","7a0a590a":"87309","0ca9b6ce":"87334",c4f2c374:"87377","740081cc":"87389","65917e4b":"87420",cfdf8269:"87423",b8f2cc13:"87459",baf4021b:"87473",d5762a9f:"87483","643da015":"87485","0e80f4a8":"87495","813eecac":"87514","74663bf1":"87598","7c29a585":"87614","022ae4ac":"87669","137db567":"87688","3f1a4665":"87747","4afdd010":"87779","6f831635":"87781","4194f325":"87863","01f93a4b":"87875",f553a7ec:"87880","6ccdf67f":"87892",fc17862c:"87905",be72319b:"87922","5b17955f":"87945",dc4ee1bb:"87971","85f9f5a6":"87995",d96d1865:"88044",ca3d464c:"88111","2e05ee79":"88163","10a1a3fb":"88226",ed990644:"88248","85e50ec2":"88298","0169a509":"88310","5ae50f21":"88394",a13618bc:"88436",bf79ed6f:"88468","23a811a2":"88478","2283659c":"88547",b3488ec5:"88591","5871fbee":"88622","6e8a38ea":"88626","6be5dbf9":"88696",b330ac5c:"88775","71cde98c":"88815",b0b71a2a:"88821","014c2cb9":"88847","508d741f":"88852","5edce1ad":"88855",ed9c0dc3:"88930","2da04d93":"88962","7b658d8e":"88986","2c9ce68e":"89018","01950f26":"89058","9a69dd97":"89082","5a1f4d83":"89083",fc93a2ea:"89093",be17da6e:"89154",adb96665:"89172",b70c8f5b:"89202","9b191135":"89210","8ff4e20f":"89243",d8e6b3db:"89289","324cb577":"89338",b919dab0:"89353",cb2f16be:"89362","3373d63c":"89367","4cc89b71":"89387","39ac0d5b":"89402","9ed26de9":"89415",ce1709a8:"89437","978ca64f":"89455",c732f250:"89541","7ff4234e":"89554","2d4f05ca":"89610",cde9af88:"89641","06f81f44":"89650","837dc7e4":"89696","084a80b5":"89801","9bfa1541":"89810","36994c47":"89858","65f8c8fd":"89873",e582f766:"89986",bfb3b697:"90066","25b57518":"90092","8abd7194":"90135","9db841c0":"90214","7b773c92":"90257",e70003d3:"90323",ed2667fa:"90414",fe49dcfb:"90438","50e73369":"90497",f4e4421a:"90502","6157713d":"90513","32eb34e5":"90562","78b09214":"90610",e3d36349:"90656",fff1effb:"90717",b843b03b:"90727","48dc1693":"90749","758aa2d1":"90818",e96ddf11:"90831","837010ac":"90842",e03c6723:"90910",a677093d:"90960",a714cbe0:"90968","70e8710e":"90972","9ba9f70e":"91016","722aa41f":"91017",cdd81d53:"91025","97ce358e":"91046","014625f4":"91109","3629c812":"91187","0f84f33f":"91319",d1980a1b:"91333","88f66091":"91359","68bc82c3":"91396","284c57b4":"91428",beaec3a6:"91517","7118d0f0":"91530","980d0b86":"91540","81ecc5d2":"91568","8614d32b":"91581","1fecd571":"91587","979e654f":"91612","6033c607":"91695","31cc39e5":"91715","9964550a":"91724","2c1d4307":"91765",a37fea11:"91768",df99aa82:"91787",cb350fc2:"91837","41ca93cc":"91844",cd630e7b:"91881",b7201a27:"91895","72fdaa88":"91916","8ce0215f":"91993","0ce689e1":"92018",e2c3948d:"92031","4cce6e5a":"92125","90b60297":"92142",f355773d:"92175","56a0d755":"92196","85fe7d70":"92273","4a4c6752":"92329","4c434b32":"92410",d888d821:"92412","1be20fdf":"92475",b6eb7220:"92535",e53ee22f:"92544",c36ed022:"92570","283d6ebd":"92577",efa442c3:"92653","7c1d6f5a":"92664","9dfaf941":"92673","211e6ca6":"92942","3e082aad":"92955",adfd3bc1:"93057",fed5be48:"93166",e55ca189:"93210","79f4d1f3":"93241",b12147a6:"93269",cf32db66:"93273","0f59d921":"93281",e5a53ed5:"93310",ad148db1:"93352","7a234181":"93362",af68afaa:"93427",e1847ef7:"93636","49c7888e":"93781","09bacf3b":"93849","0a07ac32":"93854",c3c082a1:"93884",ee71d619:"94065",cd593b9a:"94077",beceb38b:"94091",acddd5ca:"94106","5869b01e":"94155",f67432e2:"94188",cffd1a69:"94215",f0cc57e7:"94227","824e6f8c":"94251","00f9d3c8":"94314","85c8b6c7":"94417",f1579842:"94429","55f86eeb":"94445","1af446b4":"94475","13feb7a8":"94538","8e7aaae8":"94555",a1e44e64:"94561","745d4b8c":"94568","72e16faa":"94592","0a02a2d0":"94625","783e4c37":"94631","50774ec6":"94648","0c2c2d88":"94711","0ae9f46f":"94750",e922bdf9:"94776",c26e67a5:"94788","256701a3":"94796",a1282170:"94841","3e1f4a39":"94843",fc66001f:"94863","95ec5604":"94864",bb63d03e:"94910","4e7b7607":"94921",e8b41ff0:"94925","5fc8caff":"94980","63c4b13e":"95020","4b69979c":"95058",f7750a15:"95093",f697d99e:"95108",c0df5757:"95136",cdb727d9:"95159","1cb0fe52":"95231",b4030b00:"95240",ed211a79:"95245","526262ab":"95407","52910a8f":"95427","8a40ff6b":"95470","7db94a09":"95505","5c49bc18":"95528","5917c028":"95542","8e175eb7":"95613","188015be":"95641","4885c521":"95649",cb03669e:"95717","89ce4ba3":"95768","8c79a60d":"95785",dbea5ca6:"95818",debfe2ad:"95832","3b1c0220":"95900","9e488927":"95909","86ed5607":"95980",eb84cef2:"96086","380e17bf":"96239","638db053":"96268","82a7c68f":"96276","65d1ec04":"96325",e3dfbe38:"96355",ddd9290b:"96463","1b260ed9":"96470","8168f54b":"96533",d4083900:"96555","19f4d091":"96609","9fd8c386":"96646",a98ffe6a:"96771","78775dd1":"96846",bbabcc43:"96863",d527c17c:"96881",e8630c63:"96939","7ab01152":"97006",e9032a0d:"97033","62a12351":"97038","9331da7d":"97107","32bb5bcb":"97114","9d2e74da":"97123","20a30ea0":"97167","7fa05810":"97223","365a7fd7":"97246","0b79e3ae":"97251","1a8a162f":"97253","5345b11d":"97286","205cdcf8":"97296","99ac6847":"97316",c2a473ad:"97342",e507660f:"97352","3bfbd79c":"97379","224c7e3e":"97420",ba47c136:"97424",b93a682d:"97476","3a6c6e5b":"97536","3d08e0be":"97562","8e81e342":"97585","169379e7":"97618","1dba1ecf":"97670",e77acc18:"97710",b58e88de:"97732","8fa9d00b":"97737","7d2fd416":"97763","77f37b47":"97768","97a057b3":"97821",e5562b89:"97829","47edbc34":"97863","26ec8ae2":"97887",ab8b4014:"97895","1e228808":"97913","6018a0af":"97944","139d61ea":"98021",bd3cb29f:"98070",b18455bc:"98087","48f67822":"98094","3c410a59":"98127","0d55f18d":"98154","6dd52a8a":"98178","3539b92c":"98237",f62bafa2:"98271","9e297776":"98311","1c3a958e":"98392",b943b6ea:"98425","94dcd3de":"98473",ea6f04d4:"98477","6065ad54":"98534",e155b22a:"98660","99e64d04":"98700",af6e9729:"98758","3314c9d3":"98761",a48978f5:"98779",bf667688:"98804",b4e94af8:"98908",ab37b32f:"98925",c9ba7c72:"98941",ef00b8a0:"98947","9ab9816d":"99077","1c27379d":"99095","9d47e342":"99105","8e563661":"99151","70f30c1c":"99236","3047f3e7":"99252",d5405b72:"99280",bdecca0c:"99306",b3e98411:"99330",df09200e:"99335",ebad1003:"99389","5ffb8f23":"99437",c0684476:"99451","2263a65b":"99502","76af5d51":"99504","16e939a3":"99528","8c2cbe8e":"99531",c49eb59b:"99534","25c655c3":"99543","9cc8ffa2":"99611","25e15e7c":"99678","5a4dd75d":"99701","5fb14ca8":"99705",dc330c71:"99709","6e34d00c":"99710",f4a839f6:"99746",a32c0324:"99747",a9be9b10:"99764",d1ceaa61:"99839","2f7d15c4":"99905","8ebb6eb1":"99970","4b2e4980":"99987"}[a]||a,r.p+r.u(a)},(()=>{var a={45354:0,71869:0};r.f.j=(e,c)=>{var d=r.o(a,e)?a[e]:void 0;if(0!==d)if(d)c.push(d[2]);else if(/^(45354|71869)$/.test(e))a[e]=0;else{var f=new Promise(((c,f)=>d=a[e]=[c,f]));c.push(d[2]=f);var b=r.p+r.u(e),t=new Error;r.l(b,(c=>{if(r.o(a,e)&&(0!==(d=a[e])&&(a[e]=void 0),d)){var f=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+e+" failed.\n("+f+": "+b+")",t.name="ChunkLoadError",t.type=f,t.request=b,d[1](t)}}),"chunk-"+e,e)}},r.O.j=e=>0===a[e];var e=(e,c)=>{var d,f,b=c[0],t=c[1],o=c[2],n=0;if(b.some((e=>0!==a[e]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(e&&e(c);n - + diff --git a/content/cn/blog/2016/12/30/strata-talk-2017/index.html b/content/cn/blog/2016/12/30/strata-talk-2017/index.html index 7d05b19c416d6..8c1e93969ac44 100644 --- a/content/cn/blog/2016/12/30/strata-talk-2017/index.html +++ b/content/cn/blog/2016/12/30/strata-talk-2017/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2017/03/12/Hoodie-Uber-Engineerings-Incremental-Processing-Framework-on-Hadoop/index.html b/content/cn/blog/2017/03/12/Hoodie-Uber-Engineerings-Incremental-Processing-Framework-on-Hadoop/index.html index f36ce40388395..257aeb2969014 100644 --- a/content/cn/blog/2017/03/12/Hoodie-Uber-Engineerings-Incremental-Processing-Framework-on-Hadoop/index.html +++ b/content/cn/blog/2017/03/12/Hoodie-Uber-Engineerings-Incremental-Processing-Framework-on-Hadoop/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2019/01/18/asf-incubation/index.html b/content/cn/blog/2019/01/18/asf-incubation/index.html index 96134e8f44537..b5f6036847a1b 100644 --- a/content/cn/blog/2019/01/18/asf-incubation/index.html +++ b/content/cn/blog/2019/01/18/asf-incubation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2019/03/07/batch-vs-incremental/index.html b/content/cn/blog/2019/03/07/batch-vs-incremental/index.html index 00da78c69e3dd..3241e611985f7 100644 --- a/content/cn/blog/2019/03/07/batch-vs-incremental/index.html +++ b/content/cn/blog/2019/03/07/batch-vs-incremental/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2019/05/14/registering-dataset-to-hive/index.html b/content/cn/blog/2019/05/14/registering-dataset-to-hive/index.html index 0f762863c17ef..7cacf30fd6cc0 100644 --- a/content/cn/blog/2019/05/14/registering-dataset-to-hive/index.html +++ b/content/cn/blog/2019/05/14/registering-dataset-to-hive/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2019/09/09/ingesting-database-changes/index.html b/content/cn/blog/2019/09/09/ingesting-database-changes/index.html index 34a0e43ad0bb0..613aaf3b80a32 100644 --- a/content/cn/blog/2019/09/09/ingesting-database-changes/index.html +++ b/content/cn/blog/2019/09/09/ingesting-database-changes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2019/10/22/Hudi-On-Hops/index.html b/content/cn/blog/2019/10/22/Hudi-On-Hops/index.html index 1efbf8220ab9b..8de82d231de4e 100644 --- a/content/cn/blog/2019/10/22/Hudi-On-Hops/index.html +++ b/content/cn/blog/2019/10/22/Hudi-On-Hops/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2019/11/15/New-Insert-Update-Delete-Data-on-S3-with-Amazon-EMR-and-Apache-Hudi/index.html b/content/cn/blog/2019/11/15/New-Insert-Update-Delete-Data-on-S3-with-Amazon-EMR-and-Apache-Hudi/index.html index 17a6f24c8e344..201f930888247 100644 --- a/content/cn/blog/2019/11/15/New-Insert-Update-Delete-Data-on-S3-with-Amazon-EMR-and-Apache-Hudi/index.html +++ b/content/cn/blog/2019/11/15/New-Insert-Update-Delete-Data-on-S3-with-Amazon-EMR-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/01/15/delete-support-in-hudi/index.html b/content/cn/blog/2020/01/15/delete-support-in-hudi/index.html index db24e7d957438..addde57336392 100644 --- a/content/cn/blog/2020/01/15/delete-support-in-hudi/index.html +++ b/content/cn/blog/2020/01/15/delete-support-in-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/01/20/change-capture-using-aws/index.html b/content/cn/blog/2020/01/20/change-capture-using-aws/index.html index ad15e414664ea..ebf7d8951a307 100644 --- a/content/cn/blog/2020/01/20/change-capture-using-aws/index.html +++ b/content/cn/blog/2020/01/20/change-capture-using-aws/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/03/22/exporting-hudi-datasets/index.html b/content/cn/blog/2020/03/22/exporting-hudi-datasets/index.html index e01e93f71f081..6dfc89d2c8b16 100644 --- a/content/cn/blog/2020/03/22/exporting-hudi-datasets/index.html +++ b/content/cn/blog/2020/03/22/exporting-hudi-datasets/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/04/27/apache-hudi-apache-zepplin/index.html b/content/cn/blog/2020/04/27/apache-hudi-apache-zepplin/index.html index 923f46ebaa18d..d138f8cdb33cd 100644 --- a/content/cn/blog/2020/04/27/apache-hudi-apache-zepplin/index.html +++ b/content/cn/blog/2020/04/27/apache-hudi-apache-zepplin/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/05/28/monitoring-hudi-metrics-with-datadog/index.html b/content/cn/blog/2020/05/28/monitoring-hudi-metrics-with-datadog/index.html index 157d5b4af0448..845bda68d710d 100644 --- a/content/cn/blog/2020/05/28/monitoring-hudi-metrics-with-datadog/index.html +++ b/content/cn/blog/2020/05/28/monitoring-hudi-metrics-with-datadog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/06/04/The-Apache-Software-Foundation-Announces-Apache-Hudi-as-a-Top-Level-Project/index.html b/content/cn/blog/2020/06/04/The-Apache-Software-Foundation-Announces-Apache-Hudi-as-a-Top-Level-Project/index.html index 0fc8496c11b30..e8aeb49d7f9a1 100644 --- a/content/cn/blog/2020/06/04/The-Apache-Software-Foundation-Announces-Apache-Hudi-as-a-Top-Level-Project/index.html +++ b/content/cn/blog/2020/06/04/The-Apache-Software-Foundation-Announces-Apache-Hudi-as-a-Top-Level-Project/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/06/09/Building-a-Large-scale-Transactional-Data-Lake-at-Uber-Using-Apache-Hudi/index.html b/content/cn/blog/2020/06/09/Building-a-Large-scale-Transactional-Data-Lake-at-Uber-Using-Apache-Hudi/index.html index 0439ff7e23289..20cd421635df1 100644 --- a/content/cn/blog/2020/06/09/Building-a-Large-scale-Transactional-Data-Lake-at-Uber-Using-Apache-Hudi/index.html +++ b/content/cn/blog/2020/06/09/Building-a-Large-scale-Transactional-Data-Lake-at-Uber-Using-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/06/16/Apache-Hudi-grows-cloud-data-lake-maturity/index.html b/content/cn/blog/2020/06/16/Apache-Hudi-grows-cloud-data-lake-maturity/index.html index 62baee8e9649d..0f24bf9ca1553 100644 --- a/content/cn/blog/2020/06/16/Apache-Hudi-grows-cloud-data-lake-maturity/index.html +++ b/content/cn/blog/2020/06/16/Apache-Hudi-grows-cloud-data-lake-maturity/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/08/04/PrestoDB-and-Apache-Hudi/index.html b/content/cn/blog/2020/08/04/PrestoDB-and-Apache-Hudi/index.html index 1505e44c6f667..e15ee0534bf09 100644 --- a/content/cn/blog/2020/08/04/PrestoDB-and-Apache-Hudi/index.html +++ b/content/cn/blog/2020/08/04/PrestoDB-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/08/18/hudi-incremental-processing-on-data-lakes/index.html b/content/cn/blog/2020/08/18/hudi-incremental-processing-on-data-lakes/index.html index 52166c5d61e86..b2b66e5203574 100644 --- a/content/cn/blog/2020/08/18/hudi-incremental-processing-on-data-lakes/index.html +++ b/content/cn/blog/2020/08/18/hudi-incremental-processing-on-data-lakes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/08/20/efficient-migration-of-large-parquet-tables/index.html b/content/cn/blog/2020/08/20/efficient-migration-of-large-parquet-tables/index.html index ef513b049fef5..87e89f48cf282 100644 --- a/content/cn/blog/2020/08/20/efficient-migration-of-large-parquet-tables/index.html +++ b/content/cn/blog/2020/08/20/efficient-migration-of-large-parquet-tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/08/21/async-compaction-deployment-model/index.html b/content/cn/blog/2020/08/21/async-compaction-deployment-model/index.html index 353007f27aa8f..cefbfb47a898e 100644 --- a/content/cn/blog/2020/08/21/async-compaction-deployment-model/index.html +++ b/content/cn/blog/2020/08/21/async-compaction-deployment-model/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/08/22/ingest-multiple-tables-using-hudi/index.html b/content/cn/blog/2020/08/22/ingest-multiple-tables-using-hudi/index.html index 3289ba4aaf6d3..dc0ff402f3f6d 100644 --- a/content/cn/blog/2020/08/22/ingest-multiple-tables-using-hudi/index.html +++ b/content/cn/blog/2020/08/22/ingest-multiple-tables-using-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/10/06/cdc-solution-using-hudi-by-nclouds/index.html b/content/cn/blog/2020/10/06/cdc-solution-using-hudi-by-nclouds/index.html index c9c3d916acd9c..2d9c7ed4999ff 100644 --- a/content/cn/blog/2020/10/06/cdc-solution-using-hudi-by-nclouds/index.html +++ b/content/cn/blog/2020/10/06/cdc-solution-using-hudi-by-nclouds/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/10/15/apache-hudi-meets-apache-flink/index.html b/content/cn/blog/2020/10/15/apache-hudi-meets-apache-flink/index.html index 60e6d175d2ea8..c6d260462d3da 100644 --- a/content/cn/blog/2020/10/15/apache-hudi-meets-apache-flink/index.html +++ b/content/cn/blog/2020/10/15/apache-hudi-meets-apache-flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/10/19/Origins-of-Data-Lake-at-Grofers/index.html b/content/cn/blog/2020/10/19/Origins-of-Data-Lake-at-Grofers/index.html index 75a2859a90f23..087f1efb32ec7 100644 --- a/content/cn/blog/2020/10/19/Origins-of-Data-Lake-at-Grofers/index.html +++ b/content/cn/blog/2020/10/19/Origins-of-Data-Lake-at-Grofers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/10/19/hudi-meets-aws-emr-and-aws-dms/index.html b/content/cn/blog/2020/10/19/hudi-meets-aws-emr-and-aws-dms/index.html index 438a1f124d261..3d871e05a7b01 100644 --- a/content/cn/blog/2020/10/19/hudi-meets-aws-emr-and-aws-dms/index.html +++ b/content/cn/blog/2020/10/19/hudi-meets-aws-emr-and-aws-dms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/10/21/Architecting-Data-Lakes-for-the-Modern-Enterprise-at-Data-Summit-Connect-Fall-2020/index.html b/content/cn/blog/2020/10/21/Architecting-Data-Lakes-for-the-Modern-Enterprise-at-Data-Summit-Connect-Fall-2020/index.html index 93f42ef956c64..3ab8bfdc9b166 100644 --- a/content/cn/blog/2020/10/21/Architecting-Data-Lakes-for-the-Modern-Enterprise-at-Data-Summit-Connect-Fall-2020/index.html +++ b/content/cn/blog/2020/10/21/Architecting-Data-Lakes-for-the-Modern-Enterprise-at-Data-Summit-Connect-Fall-2020/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/10/21/Data-Lake-Change-Capture-using-Apache-Hudi-and-Amazon-AMS-EMR/index.html b/content/cn/blog/2020/10/21/Data-Lake-Change-Capture-using-Apache-Hudi-and-Amazon-AMS-EMR/index.html index 2e9252cb35f1a..29d717d7c3661 100644 --- a/content/cn/blog/2020/10/21/Data-Lake-Change-Capture-using-Apache-Hudi-and-Amazon-AMS-EMR/index.html +++ b/content/cn/blog/2020/10/21/Data-Lake-Change-Capture-using-Apache-Hudi-and-Amazon-AMS-EMR/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/11/11/hudi-indexing-mechanisms/index.html b/content/cn/blog/2020/11/11/hudi-indexing-mechanisms/index.html index 076db7414a78f..ef49e25e72cdc 100644 --- a/content/cn/blog/2020/11/11/hudi-indexing-mechanisms/index.html +++ b/content/cn/blog/2020/11/11/hudi-indexing-mechanisms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/11/29/Can-Big-Data-Solutions-Be-Affordable/index.html b/content/cn/blog/2020/11/29/Can-Big-Data-Solutions-Be-Affordable/index.html index 9cff7a7521684..f43854ccdc51f 100644 --- a/content/cn/blog/2020/11/29/Can-Big-Data-Solutions-Be-Affordable/index.html +++ b/content/cn/blog/2020/11/29/Can-Big-Data-Solutions-Be-Affordable/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2020/12/01/high-perf-data-lake-with-hudi-and-alluxio-t3go/index.html b/content/cn/blog/2020/12/01/high-perf-data-lake-with-hudi-and-alluxio-t3go/index.html index 090100e55e4c8..1de328dbab44f 100644 --- a/content/cn/blog/2020/12/01/high-perf-data-lake-with-hudi-and-alluxio-t3go/index.html +++ b/content/cn/blog/2020/12/01/high-perf-data-lake-with-hudi-and-alluxio-t3go/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/01/27/hudi-clustering-intro/index.html b/content/cn/blog/2021/01/27/hudi-clustering-intro/index.html index b4821ea141ecf..6b52f9ae04471 100644 --- a/content/cn/blog/2021/01/27/hudi-clustering-intro/index.html +++ b/content/cn/blog/2021/01/27/hudi-clustering-intro/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/02/13/hudi-key-generators/index.html b/content/cn/blog/2021/02/13/hudi-key-generators/index.html index 75b0d7e151941..8068904f07755 100644 --- a/content/cn/blog/2021/02/13/hudi-key-generators/index.html +++ b/content/cn/blog/2021/02/13/hudi-key-generators/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/02/24/Time-travel-operations-in-Hopsworks-Feature-Store/index.html b/content/cn/blog/2021/02/24/Time-travel-operations-in-Hopsworks-Feature-Store/index.html index 29a52b248076a..c9472e0e37e71 100644 --- a/content/cn/blog/2021/02/24/Time-travel-operations-in-Hopsworks-Feature-Store/index.html +++ b/content/cn/blog/2021/02/24/Time-travel-operations-in-Hopsworks-Feature-Store/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/03/01/Data-Lakehouse-Building-the-Next-Generation-of-Data-Lakes-using-Apache-Hudi/index.html b/content/cn/blog/2021/03/01/Data-Lakehouse-Building-the-Next-Generation-of-Data-Lakes-using-Apache-Hudi/index.html index 1d5dc0dd92bc6..a66225e96812a 100644 --- a/content/cn/blog/2021/03/01/Data-Lakehouse-Building-the-Next-Generation-of-Data-Lakes-using-Apache-Hudi/index.html +++ b/content/cn/blog/2021/03/01/Data-Lakehouse-Building-the-Next-Generation-of-Data-Lakes-using-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/03/01/hudi-file-sizing/index.html b/content/cn/blog/2021/03/01/hudi-file-sizing/index.html index 120e3229bbc4c..ed573e1fc1f42 100644 --- a/content/cn/blog/2021/03/01/hudi-file-sizing/index.html +++ b/content/cn/blog/2021/03/01/hudi-file-sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/03/04/Build-a-data-lake-using-amazon-kinesis-data-stream-for-amazon-dynamodb-and-apache-hudi/index.html b/content/cn/blog/2021/03/04/Build-a-data-lake-using-amazon-kinesis-data-stream-for-amazon-dynamodb-and-apache-hudi/index.html index a555e404e25b1..3b990ae829176 100644 --- a/content/cn/blog/2021/03/04/Build-a-data-lake-using-amazon-kinesis-data-stream-for-amazon-dynamodb-and-apache-hudi/index.html +++ b/content/cn/blog/2021/03/04/Build-a-data-lake-using-amazon-kinesis-data-stream-for-amazon-dynamodb-and-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/03/11/New-features-from-Apache-hudi-in-Amazon-EMR/index.html b/content/cn/blog/2021/03/11/New-features-from-Apache-hudi-in-Amazon-EMR/index.html index 5cdeacaed930e..ab4781042d8ab 100644 --- a/content/cn/blog/2021/03/11/New-features-from-Apache-hudi-in-Amazon-EMR/index.html +++ b/content/cn/blog/2021/03/11/New-features-from-Apache-hudi-in-Amazon-EMR/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/04/12/Build-Slowly-Changing-Dimensions-Type-2-SCD2-with-Apache-Spark-and-Apache-Hudi-on-Amazon-EMR/index.html b/content/cn/blog/2021/04/12/Build-Slowly-Changing-Dimensions-Type-2-SCD2-with-Apache-Spark-and-Apache-Hudi-on-Amazon-EMR/index.html index e4ff9a41bfe68..8d178a1c8980a 100644 --- a/content/cn/blog/2021/04/12/Build-Slowly-Changing-Dimensions-Type-2-SCD2-with-Apache-Spark-and-Apache-Hudi-on-Amazon-EMR/index.html +++ b/content/cn/blog/2021/04/12/Build-Slowly-Changing-Dimensions-Type-2-SCD2-with-Apache-Spark-and-Apache-Hudi-on-Amazon-EMR/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/05/12/Experts-primer-on-Apache-Hudi/index.html b/content/cn/blog/2021/05/12/Experts-primer-on-Apache-Hudi/index.html index ba1c1225a3dca..5d95489aeb80d 100644 --- a/content/cn/blog/2021/05/12/Experts-primer-on-Apache-Hudi/index.html +++ b/content/cn/blog/2021/05/12/Experts-primer-on-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/06/04/Apache-Hudi-How-Uber-gets-data-a-ride-to-its-destination/index.html b/content/cn/blog/2021/06/04/Apache-Hudi-How-Uber-gets-data-a-ride-to-its-destination/index.html index 57f84d091ec62..2519dd9b360f7 100644 --- a/content/cn/blog/2021/06/04/Apache-Hudi-How-Uber-gets-data-a-ride-to-its-destination/index.html +++ b/content/cn/blog/2021/06/04/Apache-Hudi-How-Uber-gets-data-a-ride-to-its-destination/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/06/10/employing-right-configurations-for-hudi-cleaner/index.html b/content/cn/blog/2021/06/10/employing-right-configurations-for-hudi-cleaner/index.html index 42274069682da..346f3c50c3487 100644 --- a/content/cn/blog/2021/06/10/employing-right-configurations-for-hudi-cleaner/index.html +++ b/content/cn/blog/2021/06/10/employing-right-configurations-for-hudi-cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/07/16/Amazon-Athena-expands-Apache-Hudi-support/index.html b/content/cn/blog/2021/07/16/Amazon-Athena-expands-Apache-Hudi-support/index.html index 9c46595537748..5c83b09e513e2 100644 --- a/content/cn/blog/2021/07/16/Amazon-Athena-expands-Apache-Hudi-support/index.html +++ b/content/cn/blog/2021/07/16/Amazon-Athena-expands-Apache-Hudi-support/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/07/16/Query-apache-hudi-dataset-in-an-amazon-S3-data-lake-with-amazon-athena-Read-optimized-queries/index.html b/content/cn/blog/2021/07/16/Query-apache-hudi-dataset-in-an-amazon-S3-data-lake-with-amazon-athena-Read-optimized-queries/index.html index c0cdc86a70e17..964aca718c098 100644 --- a/content/cn/blog/2021/07/16/Query-apache-hudi-dataset-in-an-amazon-S3-data-lake-with-amazon-athena-Read-optimized-queries/index.html +++ b/content/cn/blog/2021/07/16/Query-apache-hudi-dataset-in-an-amazon-S3-data-lake-with-amazon-athena-Read-optimized-queries/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/07/21/streaming-data-lake-platform/index.html b/content/cn/blog/2021/07/21/streaming-data-lake-platform/index.html index ea2e2e46cdbe9..c26b46b0e4281 100644 --- a/content/cn/blog/2021/07/21/streaming-data-lake-platform/index.html +++ b/content/cn/blog/2021/07/21/streaming-data-lake-platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/07/26/Baixin-banksreal-time-data-lake-evolution-scheme-based-on-Apache-Hudi/index.html b/content/cn/blog/2021/07/26/Baixin-banksreal-time-data-lake-evolution-scheme-based-on-Apache-Hudi/index.html index c848620419e95..7408d261a76b0 100644 --- a/content/cn/blog/2021/07/26/Baixin-banksreal-time-data-lake-evolution-scheme-based-on-Apache-Hudi/index.html +++ b/content/cn/blog/2021/07/26/Baixin-banksreal-time-data-lake-evolution-scheme-based-on-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/08/03/MLOps-Wars-Versioned-Feature-Data-with-a-Lakehouse/index.html b/content/cn/blog/2021/08/03/MLOps-Wars-Versioned-Feature-Data-with-a-Lakehouse/index.html index 293c248973161..6a8d41850f949 100644 --- a/content/cn/blog/2021/08/03/MLOps-Wars-Versioned-Feature-Data-with-a-Lakehouse/index.html +++ b/content/cn/blog/2021/08/03/MLOps-Wars-Versioned-Feature-Data-with-a-Lakehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/08/11/Cost-Efficient-Open-Source-Big-Data-Platform-at-Uber/index.html b/content/cn/blog/2021/08/11/Cost-Efficient-Open-Source-Big-Data-Platform-at-Uber/index.html index 36367d0013595..74e29195fa763 100644 --- a/content/cn/blog/2021/08/11/Cost-Efficient-Open-Source-Big-Data-Platform-at-Uber/index.html +++ b/content/cn/blog/2021/08/11/Cost-Efficient-Open-Source-Big-Data-Platform-at-Uber/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/08/16/kafka-custom-deserializer/index.html b/content/cn/blog/2021/08/16/kafka-custom-deserializer/index.html index 084dc5d8633c3..c14b53bba7907 100644 --- a/content/cn/blog/2021/08/16/kafka-custom-deserializer/index.html +++ b/content/cn/blog/2021/08/16/kafka-custom-deserializer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/08/18/improving-marker-mechanism/index.html b/content/cn/blog/2021/08/18/improving-marker-mechanism/index.html index da51084eba9cd..ee1b6e1920364 100644 --- a/content/cn/blog/2021/08/18/improving-marker-mechanism/index.html +++ b/content/cn/blog/2021/08/18/improving-marker-mechanism/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/08/18/virtual-keys/index.html b/content/cn/blog/2021/08/18/virtual-keys/index.html index d809ec4e75f5a..74e83d217cb3b 100644 --- a/content/cn/blog/2021/08/18/virtual-keys/index.html +++ b/content/cn/blog/2021/08/18/virtual-keys/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/08/23/async-clustering/index.html b/content/cn/blog/2021/08/23/async-clustering/index.html index 8c3a27c86be3f..34422b29caf8a 100644 --- a/content/cn/blog/2021/08/23/async-clustering/index.html +++ b/content/cn/blog/2021/08/23/async-clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/08/23/s3-events-source/index.html b/content/cn/blog/2021/08/23/s3-events-source/index.html index 55f4e72f8109a..8d26ca5ad87e2 100644 --- a/content/cn/blog/2021/08/23/s3-events-source/index.html +++ b/content/cn/blog/2021/08/23/s3-events-source/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/09/01/building-eb-level-data-lake-using-hudi-at-bytedance/index.html b/content/cn/blog/2021/09/01/building-eb-level-data-lake-using-hudi-at-bytedance/index.html index f806f59717633..161598ea9c7b6 100644 --- a/content/cn/blog/2021/09/01/building-eb-level-data-lake-using-hudi-at-bytedance/index.html +++ b/content/cn/blog/2021/09/01/building-eb-level-data-lake-using-hudi-at-bytedance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/10/05/Data-Platform-2.0-Part-I/index.html b/content/cn/blog/2021/10/05/Data-Platform-2.0-Part-I/index.html index 1e533aad04e85..2f36c66f1c11d 100644 --- a/content/cn/blog/2021/10/05/Data-Platform-2.0-Part-I/index.html +++ b/content/cn/blog/2021/10/05/Data-Platform-2.0-Part-I/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/10/14/How-Amazon-Transportation-Service-enabled-near-real-time-event-analytics-at-petabyte-scale-using-AWS-Glue-with-Apache-Hudi/index.html b/content/cn/blog/2021/10/14/How-Amazon-Transportation-Service-enabled-near-real-time-event-analytics-at-petabyte-scale-using-AWS-Glue-with-Apache-Hudi/index.html index 3e24a3a94ba02..b2ce7a46e23d8 100644 --- a/content/cn/blog/2021/10/14/How-Amazon-Transportation-Service-enabled-near-real-time-event-analytics-at-petabyte-scale-using-AWS-Glue-with-Apache-Hudi/index.html +++ b/content/cn/blog/2021/10/14/How-Amazon-Transportation-Service-enabled-near-real-time-event-analytics-at-petabyte-scale-using-AWS-Glue-with-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/10/21/Practice-of-Apache-Hudi-in-building-real-time-data-lake-at-station-B/index.html b/content/cn/blog/2021/10/21/Practice-of-Apache-Hudi-in-building-real-time-data-lake-at-station-B/index.html index ca76cb0666038..7841cd35e87bb 100644 --- a/content/cn/blog/2021/10/21/Practice-of-Apache-Hudi-in-building-real-time-data-lake-at-station-B/index.html +++ b/content/cn/blog/2021/10/21/Practice-of-Apache-Hudi-in-building-real-time-data-lake-at-station-B/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/11/16/How-GE-Aviation-built-cloud-native-data-pipelines-at-enterprise-scale-using-the-AWS-platform/index.html b/content/cn/blog/2021/11/16/How-GE-Aviation-built-cloud-native-data-pipelines-at-enterprise-scale-using-the-AWS-platform/index.html index d77f1b07205f8..24037dc38217f 100644 --- a/content/cn/blog/2021/11/16/How-GE-Aviation-built-cloud-native-data-pipelines-at-enterprise-scale-using-the-AWS-platform/index.html +++ b/content/cn/blog/2021/11/16/How-GE-Aviation-built-cloud-native-data-pipelines-at-enterprise-scale-using-the-AWS-platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/11/22/Apache-Hudi-Architecture-Tools-and-Best-Practices/index.html b/content/cn/blog/2021/11/22/Apache-Hudi-Architecture-Tools-and-Best-Practices/index.html index 0d14c8cb44e65..bd115a6e90b3e 100644 --- a/content/cn/blog/2021/11/22/Apache-Hudi-Architecture-Tools-and-Best-Practices/index.html +++ b/content/cn/blog/2021/11/22/Apache-Hudi-Architecture-Tools-and-Best-Practices/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/12/16/lakehouse-concurrency-control-are-we-too-optimistic/index.html b/content/cn/blog/2021/12/16/lakehouse-concurrency-control-are-we-too-optimistic/index.html index 763684c557143..e2e84539cd3cc 100644 --- a/content/cn/blog/2021/12/16/lakehouse-concurrency-control-are-we-too-optimistic/index.html +++ b/content/cn/blog/2021/12/16/lakehouse-concurrency-control-are-we-too-optimistic/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/12/20/New-features-from-Apache-Hudi-0.7.0-and-0.8.0-available-on-Amazon-EMR/index.html b/content/cn/blog/2021/12/20/New-features-from-Apache-Hudi-0.7.0-and-0.8.0-available-on-Amazon-EMR/index.html index 6292599eb6822..615cb1ccaaa02 100644 --- a/content/cn/blog/2021/12/20/New-features-from-Apache-Hudi-0.7.0-and-0.8.0-available-on-Amazon-EMR/index.html +++ b/content/cn/blog/2021/12/20/New-features-from-Apache-Hudi-0.7.0-and-0.8.0-available-on-Amazon-EMR/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/12/29/hudi-zorder-and-hilbert-space-filling-curves/index.html b/content/cn/blog/2021/12/29/hudi-zorder-and-hilbert-space-filling-curves/index.html index e1e36b13c1f61..9ccd0080d3cad 100644 --- a/content/cn/blog/2021/12/29/hudi-zorder-and-hilbert-space-filling-curves/index.html +++ b/content/cn/blog/2021/12/29/hudi-zorder-and-hilbert-space-filling-curves/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2021/12/31/The-Art-of-Building-Open-Data-Lakes-with-Apache-Hudi-Kafka-Hive-and-Debezium/index.html b/content/cn/blog/2021/12/31/The-Art-of-Building-Open-Data-Lakes-with-Apache-Hudi-Kafka-Hive-and-Debezium/index.html index 4357b639e39ed..2cb0e4dcea2b9 100644 --- a/content/cn/blog/2021/12/31/The-Art-of-Building-Open-Data-Lakes-with-Apache-Hudi-Kafka-Hive-and-Debezium/index.html +++ b/content/cn/blog/2021/12/31/The-Art-of-Building-Open-Data-Lakes-with-Apache-Hudi-Kafka-Hive-and-Debezium/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/01/06/apache-hudi-2021-a-year-in-review/index.html b/content/cn/blog/2022/01/06/apache-hudi-2021-a-year-in-review/index.html index 09b18abf4e8cf..f2766be0deef6 100644 --- a/content/cn/blog/2022/01/06/apache-hudi-2021-a-year-in-review/index.html +++ b/content/cn/blog/2022/01/06/apache-hudi-2021-a-year-in-review/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/01/14/change-data-capture-with-debezium-and-apache-hudi/index.html b/content/cn/blog/2022/01/14/change-data-capture-with-debezium-and-apache-hudi/index.html index 795db6f1e66a1..aa20cb80f58e8 100644 --- a/content/cn/blog/2022/01/14/change-data-capture-with-debezium-and-apache-hudi/index.html +++ b/content/cn/blog/2022/01/14/change-data-capture-with-debezium-and-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/01/18/Why-and-How-I-Integrated-Airbyte-and-Apache-Hudi/index.html b/content/cn/blog/2022/01/18/Why-and-How-I-Integrated-Airbyte-and-Apache-Hudi/index.html index 59022ff9c51c5..2f38f3c39cfd2 100644 --- a/content/cn/blog/2022/01/18/Why-and-How-I-Integrated-Airbyte-and-Apache-Hudi/index.html +++ b/content/cn/blog/2022/01/18/Why-and-How-I-Integrated-Airbyte-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/01/20/Hudi-powering-data-lake-efforts-at-Walmart-and-Disney-Hotstar/index.html b/content/cn/blog/2022/01/20/Hudi-powering-data-lake-efforts-at-Walmart-and-Disney-Hotstar/index.html index de41c5106d0d9..3881dddb5c4b2 100644 --- a/content/cn/blog/2022/01/20/Hudi-powering-data-lake-efforts-at-Walmart-and-Disney-Hotstar/index.html +++ b/content/cn/blog/2022/01/20/Hudi-powering-data-lake-efforts-at-Walmart-and-Disney-Hotstar/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/01/25/Cost-Efficiency-Scale-in-Big-Data-File-Format/index.html b/content/cn/blog/2022/01/25/Cost-Efficiency-Scale-in-Big-Data-File-Format/index.html index 5846dbe32f6fa..486885ebaebac 100644 --- a/content/cn/blog/2022/01/25/Cost-Efficiency-Scale-in-Big-Data-File-Format/index.html +++ b/content/cn/blog/2022/01/25/Cost-Efficiency-Scale-in-Big-Data-File-Format/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/02/02/Onehouse-Commitment-to-Openness/index.html b/content/cn/blog/2022/02/02/Onehouse-Commitment-to-Openness/index.html index f2b717bd398a5..65e7689fba6e1 100644 --- a/content/cn/blog/2022/02/02/Onehouse-Commitment-to-Openness/index.html +++ b/content/cn/blog/2022/02/02/Onehouse-Commitment-to-Openness/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/02/03/Onehouse-brings-a-fully-managed-lakehouse-to-Apache-Hudi/index.html b/content/cn/blog/2022/02/03/Onehouse-brings-a-fully-managed-lakehouse-to-Apache-Hudi/index.html index 4d52cad71656b..323a6d8bed4f0 100644 --- a/content/cn/blog/2022/02/03/Onehouse-brings-a-fully-managed-lakehouse-to-Apache-Hudi/index.html +++ b/content/cn/blog/2022/02/03/Onehouse-brings-a-fully-managed-lakehouse-to-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/02/09/ACID-transformations-on-Distributed-file-system/index.html b/content/cn/blog/2022/02/09/ACID-transformations-on-Distributed-file-system/index.html index 31a45fe6fa4e8..2256881f6f0dc 100644 --- a/content/cn/blog/2022/02/09/ACID-transformations-on-Distributed-file-system/index.html +++ b/content/cn/blog/2022/02/09/ACID-transformations-on-Distributed-file-system/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/02/12/Open-Source-Data-Lake-Table-Formats-Evaluating-Current-Interest-and-Rate-of-Adoption/index.html b/content/cn/blog/2022/02/12/Open-Source-Data-Lake-Table-Formats-Evaluating-Current-Interest-and-Rate-of-Adoption/index.html index 1bf4029521bc9..4cb8dd1a50fc9 100644 --- a/content/cn/blog/2022/02/12/Open-Source-Data-Lake-Table-Formats-Evaluating-Current-Interest-and-Rate-of-Adoption/index.html +++ b/content/cn/blog/2022/02/12/Open-Source-Data-Lake-Table-Formats-Evaluating-Current-Interest-and-Rate-of-Adoption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/02/17/Fresher-Data-Lake-on-AWS-S3/index.html b/content/cn/blog/2022/02/17/Fresher-Data-Lake-on-AWS-S3/index.html index 6cb54eb768b23..8a6266effc81a 100644 --- a/content/cn/blog/2022/02/17/Fresher-Data-Lake-on-AWS-S3/index.html +++ b/content/cn/blog/2022/02/17/Fresher-Data-Lake-on-AWS-S3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/02/20/Understanding-its-core-concepts-from-hudi-persistence-files/index.html b/content/cn/blog/2022/02/20/Understanding-its-core-concepts-from-hudi-persistence-files/index.html index 2e469f3c2038f..9a6d3a75d9a2f 100644 --- a/content/cn/blog/2022/02/20/Understanding-its-core-concepts-from-hudi-persistence-files/index.html +++ b/content/cn/blog/2022/02/20/Understanding-its-core-concepts-from-hudi-persistence-files/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/03/01/Create-a-low-latency-source-to-data-lake-pipeline-using-Amazon-MSK-Connect-Apache-Flink-and-Apache-Hudi/index.html b/content/cn/blog/2022/03/01/Create-a-low-latency-source-to-data-lake-pipeline-using-Amazon-MSK-Connect-Apache-Flink-and-Apache-Hudi/index.html index 2a4827e7f1401..9267a7f787740 100644 --- a/content/cn/blog/2022/03/01/Create-a-low-latency-source-to-data-lake-pipeline-using-Amazon-MSK-Connect-Apache-Flink-and-Apache-Hudi/index.html +++ b/content/cn/blog/2022/03/01/Create-a-low-latency-source-to-data-lake-pipeline-using-Amazon-MSK-Connect-Apache-Flink-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/03/09/Build-a-serverless-pipeline-to-analyze-streaming-data-using-AWS-Glue-Apache-Hudi-and-Amazon-S3/index.html b/content/cn/blog/2022/03/09/Build-a-serverless-pipeline-to-analyze-streaming-data-using-AWS-Glue-Apache-Hudi-and-Amazon-S3/index.html index 50e62a647f30a..d15ea02c5149a 100644 --- a/content/cn/blog/2022/03/09/Build-a-serverless-pipeline-to-analyze-streaming-data-using-AWS-Glue-Apache-Hudi-and-Amazon-S3/index.html +++ b/content/cn/blog/2022/03/09/Build-a-serverless-pipeline-to-analyze-streaming-data-using-AWS-Glue-Apache-Hudi-and-Amazon-S3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/03/24/Zendesk-Insights-for-CTOs-Part-3-Growing-your-business-with-modern-data-capabilities/index.html b/content/cn/blog/2022/03/24/Zendesk-Insights-for-CTOs-Part-3-Growing-your-business-with-modern-data-capabilities/index.html index 6a3685cc4b4d3..f9625f8689a38 100644 --- a/content/cn/blog/2022/03/24/Zendesk-Insights-for-CTOs-Part-3-Growing-your-business-with-modern-data-capabilities/index.html +++ b/content/cn/blog/2022/03/24/Zendesk-Insights-for-CTOs-Part-3-Growing-your-business-with-modern-data-capabilities/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/04/04/Key-Learnings-on-Using-Apache-HUDI-in-building-Lakehouse-Architecture-at-Halodoc/index.html b/content/cn/blog/2022/04/04/Key-Learnings-on-Using-Apache-HUDI-in-building-Lakehouse-Architecture-at-Halodoc/index.html index 78506bf1b61f8..7ff2ab574fc86 100644 --- a/content/cn/blog/2022/04/04/Key-Learnings-on-Using-Apache-HUDI-in-building-Lakehouse-Architecture-at-Halodoc/index.html +++ b/content/cn/blog/2022/04/04/Key-Learnings-on-Using-Apache-HUDI-in-building-Lakehouse-Architecture-at-Halodoc/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/04/04/New-features-from-Apache-Hudi-0.9.0-on-Amazon-EMR/index.html b/content/cn/blog/2022/04/04/New-features-from-Apache-Hudi-0.9.0-on-Amazon-EMR/index.html index 13dd1c83e2c6a..0c4e298b9628a 100644 --- a/content/cn/blog/2022/04/04/New-features-from-Apache-Hudi-0.9.0-on-Amazon-EMR/index.html +++ b/content/cn/blog/2022/04/04/New-features-from-Apache-Hudi-0.9.0-on-Amazon-EMR/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/04/19/Corrections-in-data-lakehouse-table-format-comparisons/index.html b/content/cn/blog/2022/04/19/Corrections-in-data-lakehouse-table-format-comparisons/index.html index 210c2c473ce61..3fe4f66379f50 100644 --- a/content/cn/blog/2022/04/19/Corrections-in-data-lakehouse-table-format-comparisons/index.html +++ b/content/cn/blog/2022/04/19/Corrections-in-data-lakehouse-table-format-comparisons/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/05/17/Introducing-Multi-Modal-Index-for-the-Lakehouse-in-Apache-Hudi/index.html b/content/cn/blog/2022/05/17/Introducing-Multi-Modal-Index-for-the-Lakehouse-in-Apache-Hudi/index.html index bc29f644883ed..127a1eea0792c 100644 --- a/content/cn/blog/2022/05/17/Introducing-Multi-Modal-Index-for-the-Lakehouse-in-Apache-Hudi/index.html +++ b/content/cn/blog/2022/05/17/Introducing-Multi-Modal-Index-for-the-Lakehouse-in-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/05/25/Record-by-record-deletable-data-lake-using-Apache-Hudi/index.html b/content/cn/blog/2022/05/25/Record-by-record-deletable-data-lake-using-Apache-Hudi/index.html index e5ae2e94c2882..20f3029afb9fe 100644 --- a/content/cn/blog/2022/05/25/Record-by-record-deletable-data-lake-using-Apache-Hudi/index.html +++ b/content/cn/blog/2022/05/25/Record-by-record-deletable-data-lake-using-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/06/04/Asynchronous-Indexing-Using-Hudi/index.html b/content/cn/blog/2022/06/04/Asynchronous-Indexing-Using-Hudi/index.html index c1a055c96695b..f820bf3bc8766 100644 --- a/content/cn/blog/2022/06/04/Asynchronous-Indexing-Using-Hudi/index.html +++ b/content/cn/blog/2022/06/04/Asynchronous-Indexing-Using-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/06/09/Singificant-queries-speedup-from-Hudi-Column-Stats-Index-and-Data-Skipping-features/index.html b/content/cn/blog/2022/06/09/Singificant-queries-speedup-from-Hudi-Column-Stats-Index-and-Data-Skipping-features/index.html index 17e9334ef6545..d79bde1bef592 100644 --- a/content/cn/blog/2022/06/09/Singificant-queries-speedup-from-Hudi-Column-Stats-Index-and-Data-Skipping-features/index.html +++ b/content/cn/blog/2022/06/09/Singificant-queries-speedup-from-Hudi-Column-Stats-Index-and-Data-Skipping-features/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/06/29/Apache-Hudi-vs-Delta-Lake-transparent-tpc-ds-lakehouse-performance-benchmarks/index.html b/content/cn/blog/2022/06/29/Apache-Hudi-vs-Delta-Lake-transparent-tpc-ds-lakehouse-performance-benchmarks/index.html index 49cfdd2f4de92..c308f244944f0 100644 --- a/content/cn/blog/2022/06/29/Apache-Hudi-vs-Delta-Lake-transparent-tpc-ds-lakehouse-performance-benchmarks/index.html +++ b/content/cn/blog/2022/06/29/Apache-Hudi-vs-Delta-Lake-transparent-tpc-ds-lakehouse-performance-benchmarks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/07/11/build-open-lakehouse-using-apache-hudi-and-dbt/index.html b/content/cn/blog/2022/07/11/build-open-lakehouse-using-apache-hudi-and-dbt/index.html index dbaa104ad840e..b1a2c3481f9b7 100644 --- a/content/cn/blog/2022/07/11/build-open-lakehouse-using-apache-hudi-and-dbt/index.html +++ b/content/cn/blog/2022/07/11/build-open-lakehouse-using-apache-hudi-and-dbt/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/08/09/How-NerdWallet-uses-AWS-and-Apache-Hudi-to-build-a-serverless-real-time-analytics-platform/index.html b/content/cn/blog/2022/08/09/How-NerdWallet-uses-AWS-and-Apache-Hudi-to-build-a-serverless-real-time-analytics-platform/index.html index 4db22b29e5341..069d0342207f7 100644 --- a/content/cn/blog/2022/08/09/How-NerdWallet-uses-AWS-and-Apache-Hudi-to-build-a-serverless-real-time-analytics-platform/index.html +++ b/content/cn/blog/2022/08/09/How-NerdWallet-uses-AWS-and-Apache-Hudi-to-build-a-serverless-real-time-analytics-platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/08/12/Use-Flink-Hudi-to-Build-a-Streaming-Data-Lake-Platform/index.html b/content/cn/blog/2022/08/12/Use-Flink-Hudi-to-Build-a-Streaming-Data-Lake-Platform/index.html index bb500d4f6571e..9976d680b2f5b 100644 --- a/content/cn/blog/2022/08/12/Use-Flink-Hudi-to-Build-a-Streaming-Data-Lake-Platform/index.html +++ b/content/cn/blog/2022/08/12/Use-Flink-Hudi-to-Build-a-Streaming-Data-Lake-Platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/08/24/Implementation-of-SCD-2-with-Apache-Hudi-and-Spark/index.html b/content/cn/blog/2022/08/24/Implementation-of-SCD-2-with-Apache-Hudi-and-Spark/index.html index 85c877395275f..0f67eaf37fc27 100644 --- a/content/cn/blog/2022/08/24/Implementation-of-SCD-2-with-Apache-Hudi-and-Spark/index.html +++ b/content/cn/blog/2022/08/24/Implementation-of-SCD-2-with-Apache-Hudi-and-Spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/08/25/Data-Lake-Lakehouse-Guide-Powered-by-Data-Lake-Table-Formats-Delta-Lake-Iceberg-Hudi/index.html b/content/cn/blog/2022/08/25/Data-Lake-Lakehouse-Guide-Powered-by-Data-Lake-Table-Formats-Delta-Lake-Iceberg-Hudi/index.html index 99b7833ee91ad..237050681f7bb 100644 --- a/content/cn/blog/2022/08/25/Data-Lake-Lakehouse-Guide-Powered-by-Data-Lake-Table-Formats-Delta-Lake-Iceberg-Hudi/index.html +++ b/content/cn/blog/2022/08/25/Data-Lake-Lakehouse-Guide-Powered-by-Data-Lake-Table-Formats-Delta-Lake-Iceberg-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/09/20/Building-Streaming-Data-Lakes-with-Hudi-and-MinIO/index.html b/content/cn/blog/2022/09/20/Building-Streaming-Data-Lakes-with-Hudi-and-MinIO/index.html index 61a6c2fe034ae..8d82815e05d14 100644 --- a/content/cn/blog/2022/09/20/Building-Streaming-Data-Lakes-with-Hudi-and-MinIO/index.html +++ b/content/cn/blog/2022/09/20/Building-Streaming-Data-Lakes-with-Hudi-and-MinIO/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/09/28/Data-processing-with-Spark-time-traveling/index.html b/content/cn/blog/2022/09/28/Data-processing-with-Spark-time-traveling/index.html index 5f43aaa5fe97a..81b2c9f9b9238 100644 --- a/content/cn/blog/2022/09/28/Data-processing-with-Spark-time-traveling/index.html +++ b/content/cn/blog/2022/09/28/Data-processing-with-Spark-time-traveling/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/10/06/Ingest-streaming-data-to-Apache-Hudi-using-AWS-Glue-and-DeltaStreamer/index.html b/content/cn/blog/2022/10/06/Ingest-streaming-data-to-Apache-Hudi-using-AWS-Glue-and-DeltaStreamer/index.html index e5a2e561eae95..535fa481cbc92 100644 --- a/content/cn/blog/2022/10/06/Ingest-streaming-data-to-Apache-Hudi-using-AWS-Glue-and-DeltaStreamer/index.html +++ b/content/cn/blog/2022/10/06/Ingest-streaming-data-to-Apache-Hudi-using-AWS-Glue-and-DeltaStreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/10/08/what-why-and-how-apache-hudis-bloom-index/index.html b/content/cn/blog/2022/10/08/what-why-and-how-apache-hudis-bloom-index/index.html index 41ce6d952f8ff..945c19c629182 100644 --- a/content/cn/blog/2022/10/08/what-why-and-how-apache-hudis-bloom-index/index.html +++ b/content/cn/blog/2022/10/08/what-why-and-how-apache-hudis-bloom-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/10/17/Get-started-with-Apache-Hudi-using-AWS/index.html b/content/cn/blog/2022/10/17/Get-started-with-Apache-Hudi-using-AWS/index.html index cd220786cdea4..bc6f3e4d5c98f 100644 --- a/content/cn/blog/2022/10/17/Get-started-with-Apache-Hudi-using-AWS/index.html +++ b/content/cn/blog/2022/10/17/Get-started-with-Apache-Hudi-using-AWS/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/11/10/How-Hudl-built-a-cost-optimized-AWS-Glue-pipeline-with-Apache-Hudi-datasets/index.html b/content/cn/blog/2022/11/10/How-Hudl-built-a-cost-optimized-AWS-Glue-pipeline-with-Apache-Hudi-datasets/index.html index e7c7fb29c1b2b..ac7c93a56d49e 100644 --- a/content/cn/blog/2022/11/10/How-Hudl-built-a-cost-optimized-AWS-Glue-pipeline-with-Apache-Hudi-datasets/index.html +++ b/content/cn/blog/2022/11/10/How-Hudl-built-a-cost-optimized-AWS-Glue-pipeline-with-Apache-Hudi-datasets/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/11/22/Build-your-Apache-Hudi-data-lake-on-AWS-using-Amazon-EMR-Part-1/index.html b/content/cn/blog/2022/11/22/Build-your-Apache-Hudi-data-lake-on-AWS-using-Amazon-EMR-Part-1/index.html index 807c552818a9a..ca761659dde67 100644 --- a/content/cn/blog/2022/11/22/Build-your-Apache-Hudi-data-lake-on-AWS-using-Amazon-EMR-Part-1/index.html +++ b/content/cn/blog/2022/11/22/Build-your-Apache-Hudi-data-lake-on-AWS-using-Amazon-EMR-Part-1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/12/01/Run-apache-hudi-at-scale-on-aws/index.html b/content/cn/blog/2022/12/01/Run-apache-hudi-at-scale-on-aws/index.html index f4d7e42611f86..a09171b8bd400 100644 --- a/content/cn/blog/2022/12/01/Run-apache-hudi-at-scale-on-aws/index.html +++ b/content/cn/blog/2022/12/01/Run-apache-hudi-at-scale-on-aws/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/12/19/Build-Your-First-Hudi-Lakehouse-with-AWS-Glue-and-AWS-S3/index.html b/content/cn/blog/2022/12/19/Build-Your-First-Hudi-Lakehouse-with-AWS-Glue-and-AWS-S3/index.html index 17bb87550dfce..4566157276d58 100644 --- a/content/cn/blog/2022/12/19/Build-Your-First-Hudi-Lakehouse-with-AWS-Glue-and-AWS-S3/index.html +++ b/content/cn/blog/2022/12/19/Build-Your-First-Hudi-Lakehouse-with-AWS-Glue-and-AWS-S3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2022/12/29/Apache-Hudi-2022-A-Year-In-Review/index.html b/content/cn/blog/2022/12/29/Apache-Hudi-2022-A-Year-In-Review/index.html index 2bb343ba5817a..1fb46f8612751 100644 --- a/content/cn/blog/2022/12/29/Apache-Hudi-2022-A-Year-In-Review/index.html +++ b/content/cn/blog/2022/12/29/Apache-Hudi-2022-A-Year-In-Review/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/01/11/Apache-Hudi-vs-Delta-Lake-vs-Apache-Iceberg-Lakehouse-Feature-Comparison/index.html b/content/cn/blog/2023/01/11/Apache-Hudi-vs-Delta-Lake-vs-Apache-Iceberg-Lakehouse-Feature-Comparison/index.html index 2fa6a50263ab2..fb5eb8c90e02d 100644 --- a/content/cn/blog/2023/01/11/Apache-Hudi-vs-Delta-Lake-vs-Apache-Iceberg-Lakehouse-Feature-Comparison/index.html +++ b/content/cn/blog/2023/01/11/Apache-Hudi-vs-Delta-Lake-vs-Apache-Iceberg-Lakehouse-Feature-Comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/01/27/Introducing-native-support-for-Apache-Hudi-Delta-Lake-Apache-Iceberg-on-AWS-Glue-for-Apache-Spark/index.html b/content/cn/blog/2023/01/27/Introducing-native-support-for-Apache-Hudi-Delta-Lake-Apache-Iceberg-on-AWS-Glue-for-Apache-Spark/index.html index acd4c1f10df04..60668dd9183ad 100644 --- a/content/cn/blog/2023/01/27/Introducing-native-support-for-Apache-Hudi-Delta-Lake-Apache-Iceberg-on-AWS-Glue-for-Apache-Spark/index.html +++ b/content/cn/blog/2023/01/27/Introducing-native-support-for-Apache-Hudi-Delta-Lake-Apache-Iceberg-on-AWS-Glue-for-Apache-Spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/02/07/automate-schema-evolution-at-scale-with-apache-hudi-in-aws-glue/index.html b/content/cn/blog/2023/02/07/automate-schema-evolution-at-scale-with-apache-hudi-in-aws-glue/index.html index 8d7bfaeb01350..8a30248a2d88d 100644 --- a/content/cn/blog/2023/02/07/automate-schema-evolution-at-scale-with-apache-hudi-in-aws-glue/index.html +++ b/content/cn/blog/2023/02/07/automate-schema-evolution-at-scale-with-apache-hudi-in-aws-glue/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/02/12/table-service-deployment-models-in-apache-hudi/index.html b/content/cn/blog/2023/02/12/table-service-deployment-models-in-apache-hudi/index.html index ab7781bb0c755..a200fb3e5945f 100644 --- a/content/cn/blog/2023/02/12/table-service-deployment-models-in-apache-hudi/index.html +++ b/content/cn/blog/2023/02/12/table-service-deployment-models-in-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/02/19/bulk-insert-sort-modes-with-apache-hudi/index.html b/content/cn/blog/2023/02/19/bulk-insert-sort-modes-with-apache-hudi/index.html index 55c9ca7f4fb3b..2f2c6b12f9cb0 100644 --- a/content/cn/blog/2023/02/19/bulk-insert-sort-modes-with-apache-hudi/index.html +++ b/content/cn/blog/2023/02/19/bulk-insert-sort-modes-with-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/02/22/Getting-Started-Manage-your-Hudi-tables-with-the-admin-Hudi-CLI-tool/index.html b/content/cn/blog/2023/02/22/Getting-Started-Manage-your-Hudi-tables-with-the-admin-Hudi-CLI-tool/index.html index 9b7428757e007..802a29ff491aa 100644 --- a/content/cn/blog/2023/02/22/Getting-Started-Manage-your-Hudi-tables-with-the-admin-Hudi-CLI-tool/index.html +++ b/content/cn/blog/2023/02/22/Getting-Started-Manage-your-Hudi-tables-with-the-admin-Hudi-CLI-tool/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/03/16/Setting-Uber-Transactional-Data-Lake-in-Motion-with-Incremental-ETL-Using-Apache-Hudi/index.html b/content/cn/blog/2023/03/16/Setting-Uber-Transactional-Data-Lake-in-Motion-with-Incremental-ETL-Using-Apache-Hudi/index.html index 8de2de075935e..41f9b929afb3e 100644 --- a/content/cn/blog/2023/03/16/Setting-Uber-Transactional-Data-Lake-in-Motion-with-Incremental-ETL-Using-Apache-Hudi/index.html +++ b/content/cn/blog/2023/03/16/Setting-Uber-Transactional-Data-Lake-in-Motion-with-Incremental-ETL-Using-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/03/17/introduction-to-apache-hudi/index.html b/content/cn/blog/2023/03/17/introduction-to-apache-hudi/index.html index e51e2128e217d..2fd94891b8bef 100644 --- a/content/cn/blog/2023/03/17/introduction-to-apache-hudi/index.html +++ b/content/cn/blog/2023/03/17/introduction-to-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/03/20/Introducing-native-support-for-Apache Hudi-Delta-Lake-and-Apache-Iceberg-on-AWS-Glue-for-Apache-Spark-Part-2-AWS-Glue-Studio-Visual-Editor/index.html b/content/cn/blog/2023/03/20/Introducing-native-support-for-Apache Hudi-Delta-Lake-and-Apache-Iceberg-on-AWS-Glue-for-Apache-Spark-Part-2-AWS-Glue-Studio-Visual-Editor/index.html index 16ba1aec2679c..c555f7c7c9fa2 100644 --- a/content/cn/blog/2023/03/20/Introducing-native-support-for-Apache Hudi-Delta-Lake-and-Apache-Iceberg-on-AWS-Glue-for-Apache-Spark-Part-2-AWS-Glue-Studio-Visual-Editor/index.html +++ b/content/cn/blog/2023/03/20/Introducing-native-support-for-Apache Hudi-Delta-Lake-and-Apache-Iceberg-on-AWS-Glue-for-Apache-Spark-Part-2-AWS-Glue-Studio-Visual-Editor/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/03/23/Spark-ETL-Chapter-8-with-Lakehouse-Apache-HUDI/index.html b/content/cn/blog/2023/03/23/Spark-ETL-Chapter-8-with-Lakehouse-Apache-HUDI/index.html index 1e122b052d288..b22ccd0895235 100644 --- a/content/cn/blog/2023/03/23/Spark-ETL-Chapter-8-with-Lakehouse-Apache-HUDI/index.html +++ b/content/cn/blog/2023/03/23/Spark-ETL-Chapter-8-with-Lakehouse-Apache-HUDI/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/04/02/global-vs-non-global-index-in-apache-hudi/index.html b/content/cn/blog/2023/04/02/global-vs-non-global-index-in-apache-hudi/index.html index badd2a0657fa9..d7612cc3ce21b 100644 --- a/content/cn/blog/2023/04/02/global-vs-non-global-index-in-apache-hudi/index.html +++ b/content/cn/blog/2023/04/02/global-vs-non-global-index-in-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/04/07/Speed-up-your-write-latencies-using-Bucket-Index-in-Apache-Hudi/index.html b/content/cn/blog/2023/04/07/Speed-up-your-write-latencies-using-Bucket-Index-in-Apache-Hudi/index.html index 4cb652deb1663..49558bb727caa 100644 --- a/content/cn/blog/2023/04/07/Speed-up-your-write-latencies-using-Bucket-Index-in-Apache-Hudi/index.html +++ b/content/cn/blog/2023/04/07/Speed-up-your-write-latencies-using-Bucket-Index-in-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/04/18/getting-started-incrementally-process-data-with-apache-hudi/index.html b/content/cn/blog/2023/04/18/getting-started-incrementally-process-data-with-apache-hudi/index.html index 95bd55aa686d1..04943ccb8ac8e 100644 --- a/content/cn/blog/2023/04/18/getting-started-incrementally-process-data-with-apache-hudi/index.html +++ b/content/cn/blog/2023/04/18/getting-started-incrementally-process-data-with-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/04/26/the-lakehouse-trifecta/index.html b/content/cn/blog/2023/04/26/the-lakehouse-trifecta/index.html index d4002621b9b16..a17042f5a9e05 100644 --- a/content/cn/blog/2023/04/26/the-lakehouse-trifecta/index.html +++ b/content/cn/blog/2023/04/26/the-lakehouse-trifecta/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/04/29/can-you-concurrently-write-data-to-apache-hudi-w-o-any-lock-provider/index.html b/content/cn/blog/2023/04/29/can-you-concurrently-write-data-to-apache-hudi-w-o-any-lock-provider/index.html index 29fd43f8c3bd7..7bd3b0e863e1d 100644 --- a/content/cn/blog/2023/04/29/can-you-concurrently-write-data-to-apache-hudi-w-o-any-lock-provider/index.html +++ b/content/cn/blog/2023/04/29/can-you-concurrently-write-data-to-apache-hudi-w-o-any-lock-provider/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/05/02/intro-to-hudi-and-flink/index.html b/content/cn/blog/2023/05/02/intro-to-hudi-and-flink/index.html index 4bb864686a2f7..dff610490e982 100644 --- a/content/cn/blog/2023/05/02/intro-to-hudi-and-flink/index.html +++ b/content/cn/blog/2023/05/02/intro-to-hudi-and-flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/05/03/lakehouse-at-fortune-1-scale/index.html b/content/cn/blog/2023/05/03/lakehouse-at-fortune-1-scale/index.html index ed32e142a9aab..93c49323dbd5e 100644 --- a/content/cn/blog/2023/05/03/lakehouse-at-fortune-1-scale/index.html +++ b/content/cn/blog/2023/05/03/lakehouse-at-fortune-1-scale/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/05/09/amazon-athena-apache-hudi/index.html b/content/cn/blog/2023/05/09/amazon-athena-apache-hudi/index.html index e8e527ab6fbf1..cc411eab58904 100644 --- a/content/cn/blog/2023/05/09/amazon-athena-apache-hudi/index.html +++ b/content/cn/blog/2023/05/09/amazon-athena-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/05/10/top-3-things-you-can-do-to-get-fast-upsert-performance-in-apache-hudi/index.html b/content/cn/blog/2023/05/10/top-3-things-you-can-do-to-get-fast-upsert-performance-in-apache-hudi/index.html index 7cc28b569788b..83d907590c220 100644 --- a/content/cn/blog/2023/05/10/top-3-things-you-can-do-to-get-fast-upsert-performance-in-apache-hudi/index.html +++ b/content/cn/blog/2023/05/10/top-3-things-you-can-do-to-get-fast-upsert-performance-in-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/05/12/ingesting-data-to-apache-hudi-using-spark-sql/index.html b/content/cn/blog/2023/05/12/ingesting-data-to-apache-hudi-using-spark-sql/index.html index 8324ae15532c6..2d715a22d9b83 100644 --- a/content/cn/blog/2023/05/12/ingesting-data-to-apache-hudi-using-spark-sql/index.html +++ b/content/cn/blog/2023/05/12/ingesting-data-to-apache-hudi-using-spark-sql/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/05/16/how-zoom-implemented-streaming-log-ingestion-and-efficient-gdpr-deletes-using-apache-hudi-on-amazon-emr/index.html b/content/cn/blog/2023/05/16/how-zoom-implemented-streaming-log-ingestion-and-efficient-gdpr-deletes-using-apache-hudi-on-amazon-emr/index.html index 899258cb7b83f..4f0193ac8991a 100644 --- a/content/cn/blog/2023/05/16/how-zoom-implemented-streaming-log-ingestion-and-efficient-gdpr-deletes-using-apache-hudi-on-amazon-emr/index.html +++ b/content/cn/blog/2023/05/16/how-zoom-implemented-streaming-log-ingestion-and-efficient-gdpr-deletes-using-apache-hudi-on-amazon-emr/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/05/19/hudi-metafields-demystified/index.html b/content/cn/blog/2023/05/19/hudi-metafields-demystified/index.html index 7aa726886b196..17f82760c3ac7 100644 --- a/content/cn/blog/2023/05/19/hudi-metafields-demystified/index.html +++ b/content/cn/blog/2023/05/19/hudi-metafields-demystified/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/05/29/different-query-types-with-apache-hudi/index.html b/content/cn/blog/2023/05/29/different-query-types-with-apache-hudi/index.html index 461031858a504..0bb05220b1dfa 100644 --- a/content/cn/blog/2023/05/29/different-query-types-with-apache-hudi/index.html +++ b/content/cn/blog/2023/05/29/different-query-types-with-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/06/03/text-based-search-from-elastic-search-to-vector-search/index.html b/content/cn/blog/2023/06/03/text-based-search-from-elastic-search-to-vector-search/index.html index 69240801fba4e..ab48d719d61c1 100644 --- a/content/cn/blog/2023/06/03/text-based-search-from-elastic-search-to-vector-search/index.html +++ b/content/cn/blog/2023/06/03/text-based-search-from-elastic-search-to-vector-search/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/06/11/cleaner-and-archival-in-apache-hudi/index.html b/content/cn/blog/2023/06/11/cleaner-and-archival-in-apache-hudi/index.html index 8fec1dcb9574c..87d3744f7c4ed 100644 --- a/content/cn/blog/2023/06/11/cleaner-and-archival-in-apache-hudi/index.html +++ b/content/cn/blog/2023/06/11/cleaner-and-archival-in-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/06/16/Exploring-New-Frontiers-How-Apache-Flink-Apache-Hudi-and-Presto-Power-New-Insights-at-Scale/index.html b/content/cn/blog/2023/06/16/Exploring-New-Frontiers-How-Apache-Flink-Apache-Hudi-and-Presto-Power-New-Insights-at-Scale/index.html index e2d50477a6e96..cc39c8d4d265f 100644 --- a/content/cn/blog/2023/06/16/Exploring-New-Frontiers-How-Apache-Flink-Apache-Hudi-and-Presto-Power-New-Insights-at-Scale/index.html +++ b/content/cn/blog/2023/06/16/Exploring-New-Frontiers-How-Apache-Flink-Apache-Hudi-and-Presto-Power-New-Insights-at-Scale/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/06/20/How-to-query-data-in-Apache-Hudi-using-StarRocks/index.html b/content/cn/blog/2023/06/20/How-to-query-data-in-Apache-Hudi-using-StarRocks/index.html index 91f674b89f585..a7cae659e7df8 100644 --- a/content/cn/blog/2023/06/20/How-to-query-data-in-Apache-Hudi-using-StarRocks/index.html +++ b/content/cn/blog/2023/06/20/How-to-query-data-in-Apache-Hudi-using-StarRocks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/06/20/timeline-server-in-apache-hudi/index.html b/content/cn/blog/2023/06/20/timeline-server-in-apache-hudi/index.html index bc8328afedb39..7a0f5033ec295 100644 --- a/content/cn/blog/2023/06/20/timeline-server-in-apache-hudi/index.html +++ b/content/cn/blog/2023/06/20/timeline-server-in-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/06/24/multi-writer-support-in-apache-hudi/index.html b/content/cn/blog/2023/06/24/multi-writer-support-in-apache-hudi/index.html index b236a514c743f..c83953bf39ab9 100644 --- a/content/cn/blog/2023/06/24/multi-writer-support-in-apache-hudi/index.html +++ b/content/cn/blog/2023/06/24/multi-writer-support-in-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/06/26/Unlimited-Big-Data-Exchange-A-Wonderful-Review-of-Apache-DolphinScheduler-and-Hudi-Hangzhou-Meetup/index.html b/content/cn/blog/2023/06/26/Unlimited-Big-Data-Exchange-A-Wonderful-Review-of-Apache-DolphinScheduler-and-Hudi-Hangzhou-Meetup/index.html index 917881e809bae..22c00ff4e534e 100644 --- a/content/cn/blog/2023/06/26/Unlimited-Big-Data-Exchange-A-Wonderful-Review-of-Apache-DolphinScheduler-and-Hudi-Hangzhou-Meetup/index.html +++ b/content/cn/blog/2023/06/26/Unlimited-Big-Data-Exchange-A-Wonderful-Review-of-Apache-DolphinScheduler-and-Hudi-Hangzhou-Meetup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/06/30/What-about-Apache-Hudi-Apache-Iceberg-and-Delta-Lake/index.html b/content/cn/blog/2023/06/30/What-about-Apache-Hudi-Apache-Iceberg-and-Delta-Lake/index.html index ecc0aebc64dfb..a6c0634de4e3f 100644 --- a/content/cn/blog/2023/06/30/What-about-Apache-Hudi-Apache-Iceberg-and-Delta-Lake/index.html +++ b/content/cn/blog/2023/06/30/What-about-Apache-Hudi-Apache-Iceberg-and-Delta-Lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/07/01/monitoring-table-size-stats/index.html b/content/cn/blog/2023/07/01/monitoring-table-size-stats/index.html index 8912dd50bf38e..5fc351ed2b2e1 100644 --- a/content/cn/blog/2023/07/01/monitoring-table-size-stats/index.html +++ b/content/cn/blog/2023/07/01/monitoring-table-size-stats/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/07/02/Hudi-Best-Practices-Handling-Failed-Inserts-Upserts-with-Error-Tables/index.html b/content/cn/blog/2023/07/02/Hudi-Best-Practices-Handling-Failed-Inserts-Upserts-with-Error-Tables/index.html index 38c042c470ca9..a00dbd6e6bc96 100644 --- a/content/cn/blog/2023/07/02/Hudi-Best-Practices-Handling-Failed-Inserts-Upserts-with-Error-Tables/index.html +++ b/content/cn/blog/2023/07/02/Hudi-Best-Practices-Handling-Failed-Inserts-Upserts-with-Error-Tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/07/07/Skip-rocks-and-files-Turbocharge-Trino-queries-with-Hudi-multi-modal-indexing-subsystem/index.html b/content/cn/blog/2023/07/07/Skip-rocks-and-files-Turbocharge-Trino-queries-with-Hudi-multi-modal-indexing-subsystem/index.html index 61bbca5154f86..b4d45bf88053c 100644 --- a/content/cn/blog/2023/07/07/Skip-rocks-and-files-Turbocharge-Trino-queries-with-Hudi-multi-modal-indexing-subsystem/index.html +++ b/content/cn/blog/2023/07/07/Skip-rocks-and-files-Turbocharge-Trino-queries-with-Hudi-multi-modal-indexing-subsystem/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/07/08/Quickly-start-using-Apache-Hudi-on-AWS-EMR/index.html b/content/cn/blog/2023/07/08/Quickly-start-using-Apache-Hudi-on-AWS-EMR/index.html index 34440b9d20d91..37e4be4591ae5 100644 --- a/content/cn/blog/2023/07/08/Quickly-start-using-Apache-Hudi-on-AWS-EMR/index.html +++ b/content/cn/blog/2023/07/08/Quickly-start-using-Apache-Hudi-on-AWS-EMR/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/07/09/Hoodie-Timeline-Foundational-pillar-for-ACID-transactions/index.html b/content/cn/blog/2023/07/09/Hoodie-Timeline-Foundational-pillar-for-ACID-transactions/index.html index 7acfd621ba788..b4f799ff2d324 100644 --- a/content/cn/blog/2023/07/09/Hoodie-Timeline-Foundational-pillar-for-ACID-transactions/index.html +++ b/content/cn/blog/2023/07/09/Hoodie-Timeline-Foundational-pillar-for-ACID-transactions/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/07/20/Backfilling-Apache-Hudi-Tables-in-Production-Techniques-and-Approaches-Using-AWS-Glue-by-Job-Target-LLC/index.html b/content/cn/blog/2023/07/20/Backfilling-Apache-Hudi-Tables-in-Production-Techniques-and-Approaches-Using-AWS-Glue-by-Job-Target-LLC/index.html index 80f9bd89e8272..83975dad98270 100644 --- a/content/cn/blog/2023/07/20/Backfilling-Apache-Hudi-Tables-in-Production-Techniques-and-Approaches-Using-AWS-Glue-by-Job-Target-LLC/index.html +++ b/content/cn/blog/2023/07/20/Backfilling-Apache-Hudi-Tables-in-Production-Techniques-and-Approaches-Using-AWS-Glue-by-Job-Target-LLC/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/07/21/AWS-Glue-Crawlers-now-supports-Apache-Hudi-Tables/index.html b/content/cn/blog/2023/07/21/AWS-Glue-Crawlers-now-supports-Apache-Hudi-Tables/index.html index 1bae300d38eda..0d7b39515a81a 100644 --- a/content/cn/blog/2023/07/21/AWS-Glue-Crawlers-now-supports-Apache-Hudi-Tables/index.html +++ b/content/cn/blog/2023/07/21/AWS-Glue-Crawlers-now-supports-Apache-Hudi-Tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/07/27/Apache-Hudi-Revolutionizing-Big-Data-Management-for-Real-Time-Analytics/index.html b/content/cn/blog/2023/07/27/Apache-Hudi-Revolutionizing-Big-Data-Management-for-Real-Time-Analytics/index.html index ad7d5d446b190..098cb21e4c52f 100644 --- a/content/cn/blog/2023/07/27/Apache-Hudi-Revolutionizing-Big-Data-Management-for-Real-Time-Analytics/index.html +++ b/content/cn/blog/2023/07/27/Apache-Hudi-Revolutionizing-Big-Data-Management-for-Real-Time-Analytics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/08/03/Apache-Hudi-on-AWS-Glue-A-Step-by-Step-Guide/index.html b/content/cn/blog/2023/08/03/Apache-Hudi-on-AWS-Glue-A-Step-by-Step-Guide/index.html index 0a506d0f0eed7..7290cc6d903e9 100644 --- a/content/cn/blog/2023/08/03/Apache-Hudi-on-AWS-Glue-A-Step-by-Step-Guide/index.html +++ b/content/cn/blog/2023/08/03/Apache-Hudi-on-AWS-Glue-A-Step-by-Step-Guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/08/03/Create-an-Apache-Hudi-based-near-real-time-transactional-data lake-using-AWS-DMS-Amazon-Kinesis-AWS-Glue-streaming-ETL-and-data-visualization-using-Amazon-QuickSight/index.html b/content/cn/blog/2023/08/03/Create-an-Apache-Hudi-based-near-real-time-transactional-data lake-using-AWS-DMS-Amazon-Kinesis-AWS-Glue-streaming-ETL-and-data-visualization-using-Amazon-QuickSight/index.html index 8ea855050e5a9..2e6bd4bb1ba74 100644 --- a/content/cn/blog/2023/08/03/Create-an-Apache-Hudi-based-near-real-time-transactional-data lake-using-AWS-DMS-Amazon-Kinesis-AWS-Glue-streaming-ETL-and-data-visualization-using-Amazon-QuickSight/index.html +++ b/content/cn/blog/2023/08/03/Create-an-Apache-Hudi-based-near-real-time-transactional-data lake-using-AWS-DMS-Amazon-Kinesis-AWS-Glue-streaming-ETL-and-data-visualization-using-Amazon-QuickSight/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/08/03/Data-lake-Table-formats-Apache-Iceberg-vs-Apache-Hudi-vs-Delta-lake/index.html b/content/cn/blog/2023/08/03/Data-lake-Table-formats-Apache-Iceberg-vs-Apache-Hudi-vs-Delta-lake/index.html index 16be0f81ddb7a..73c05477feda6 100644 --- a/content/cn/blog/2023/08/03/Data-lake-Table-formats-Apache-Iceberg-vs-Apache-Hudi-vs-Delta-lake/index.html +++ b/content/cn/blog/2023/08/03/Data-lake-Table-formats-Apache-Iceberg-vs-Apache-Hudi-vs-Delta-lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/08/05/Data-Lakehouse-Architecture-for-Big-Data-with-Apache-Hudi/index.html b/content/cn/blog/2023/08/05/Data-Lakehouse-Architecture-for-Big-Data-with-Apache-Hudi/index.html index e29895b927b60..66ee51ae99ac8 100644 --- a/content/cn/blog/2023/08/05/Data-Lakehouse-Architecture-for-Big-Data-with-Apache-Hudi/index.html +++ b/content/cn/blog/2023/08/05/Data-Lakehouse-Architecture-for-Big-Data-with-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/08/09/Lakehouse-Trifecta-Delta-Lake-Apache-Iceberg-and-Apache-Hudi/index.html b/content/cn/blog/2023/08/09/Lakehouse-Trifecta-Delta-Lake-Apache-Iceberg-and-Apache-Hudi/index.html index 7b697aa34885f..52a2885c0018c 100644 --- a/content/cn/blog/2023/08/09/Lakehouse-Trifecta-Delta-Lake-Apache-Iceberg-and-Apache-Hudi/index.html +++ b/content/cn/blog/2023/08/09/Lakehouse-Trifecta-Delta-Lake-Apache-Iceberg-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/08/22/Exploring-various-storage-types-in-Apache-Hudi/index.html b/content/cn/blog/2023/08/22/Exploring-various-storage-types-in-Apache-Hudi/index.html index b4964eac856f3..c6b5c16ccf74e 100644 --- a/content/cn/blog/2023/08/22/Exploring-various-storage-types-in-Apache-Hudi/index.html +++ b/content/cn/blog/2023/08/22/Exploring-various-storage-types-in-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/08/25/Delta-Hudi-Iceberg-Which-is-most-popular/index.html b/content/cn/blog/2023/08/25/Delta-Hudi-Iceberg-Which-is-most-popular/index.html index 7972c6fe6d299..1820e2338aead 100644 --- a/content/cn/blog/2023/08/25/Delta-Hudi-Iceberg-Which-is-most-popular/index.html +++ b/content/cn/blog/2023/08/25/Delta-Hudi-Iceberg-Which-is-most-popular/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/08/28/Apache-Hudi-From-Zero-To-One/index.html b/content/cn/blog/2023/08/28/Apache-Hudi-From-Zero-To-One/index.html index c8c5c0b3820ba..d0dd146d4546c 100644 --- a/content/cn/blog/2023/08/28/Apache-Hudi-From-Zero-To-One/index.html +++ b/content/cn/blog/2023/08/28/Apache-Hudi-From-Zero-To-One/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/08/28/Delta-Hudi-Iceberg-A-Benchmark-Compilation/index.html b/content/cn/blog/2023/08/28/Delta-Hudi-Iceberg-A-Benchmark-Compilation/index.html index bc4fab3432b45..925302591d427 100644 --- a/content/cn/blog/2023/08/28/Delta-Hudi-Iceberg-A-Benchmark-Compilation/index.html +++ b/content/cn/blog/2023/08/28/Delta-Hudi-Iceberg-A-Benchmark-Compilation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/08/31/Incremental-Queries-with-Apache-Hudi-and-Apache-Flink/index.html b/content/cn/blog/2023/08/31/Incremental-Queries-with-Apache-Hudi-and-Apache-Flink/index.html index 0a3892fe72e68..de7fc0bd8f2e3 100644 --- a/content/cn/blog/2023/08/31/Incremental-Queries-with-Apache-Hudi-and-Apache-Flink/index.html +++ b/content/cn/blog/2023/08/31/Incremental-Queries-with-Apache-Hudi-and-Apache-Flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/09/06/Apache-Hudi-From-Zero-To-One-blog-2/index.html b/content/cn/blog/2023/09/06/Apache-Hudi-From-Zero-To-One-blog-2/index.html index 47df103957f2e..925ce7749ba3c 100644 --- a/content/cn/blog/2023/09/06/Apache-Hudi-From-Zero-To-One-blog-2/index.html +++ b/content/cn/blog/2023/09/06/Apache-Hudi-From-Zero-To-One-blog-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/09/06/Lakehouse-or-Warehouse-Part-1-of-2/index.html b/content/cn/blog/2023/09/06/Lakehouse-or-Warehouse-Part-1-of-2/index.html index f54f073c396c4..c8e4e6f67ef7b 100644 --- a/content/cn/blog/2023/09/06/Lakehouse-or-Warehouse-Part-1-of-2/index.html +++ b/content/cn/blog/2023/09/06/Lakehouse-or-Warehouse-Part-1-of-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/09/10/Demystifying-Copy-on-Write-in-Apache-Hudi-Understanding-Read-and-Write-Operations/index.html b/content/cn/blog/2023/09/10/Demystifying-Copy-on-Write-in-Apache-Hudi-Understanding-Read-and-Write-Operations/index.html index d310c94a39112..e999f563338f2 100644 --- a/content/cn/blog/2023/09/10/Demystifying-Copy-on-Write-in-Apache-Hudi-Understanding-Read-and-Write-Operations/index.html +++ b/content/cn/blog/2023/09/10/Demystifying-Copy-on-Write-in-Apache-Hudi-Understanding-Read-and-Write-Operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/09/12/Lakehouse-or-Warehouse-Part-2-of-2/index.html b/content/cn/blog/2023/09/12/Lakehouse-or-Warehouse-Part-2-of-2/index.html index c287f0b652b98..5b663cf5161e2 100644 --- a/content/cn/blog/2023/09/12/Lakehouse-or-Warehouse-Part-2-of-2/index.html +++ b/content/cn/blog/2023/09/12/Lakehouse-or-Warehouse-Part-2-of-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/09/13/Simplify-operational-data-processing-in-data-lakes-using-AWS-Glue-and-Apache-Hudi/index.html b/content/cn/blog/2023/09/13/Simplify-operational-data-processing-in-data-lakes-using-AWS-Glue-and-Apache-Hudi/index.html index 0eb49e494f920..123935cdf63b5 100644 --- a/content/cn/blog/2023/09/13/Simplify-operational-data-processing-in-data-lakes-using-AWS-Glue-and-Apache-Hudi/index.html +++ b/content/cn/blog/2023/09/13/Simplify-operational-data-processing-in-data-lakes-using-AWS-Glue-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/09/15/Apache-Hudi-From-Zero-To-One-blog-3/index.html b/content/cn/blog/2023/09/15/Apache-Hudi-From-Zero-To-One-blog-3/index.html index 4e2901948adf7..f06c3239cc74c 100644 --- a/content/cn/blog/2023/09/15/Apache-Hudi-From-Zero-To-One-blog-3/index.html +++ b/content/cn/blog/2023/09/15/Apache-Hudi-From-Zero-To-One-blog-3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/09/19/A-Beginners-Guide-to-Apache-Hudi-with-PySpark-Part-1-of-2/index.html b/content/cn/blog/2023/09/19/A-Beginners-Guide-to-Apache-Hudi-with-PySpark-Part-1-of-2/index.html index 5420fd94e1f23..8ec34c88af355 100644 --- a/content/cn/blog/2023/09/19/A-Beginners-Guide-to-Apache-Hudi-with-PySpark-Part-1-of-2/index.html +++ b/content/cn/blog/2023/09/19/A-Beginners-Guide-to-Apache-Hudi-with-PySpark-Part-1-of-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/09/22/Exploring-the-Architecture-of-Apache-Iceberg-Delta-Lake-and-Apache-Hudi/index.html b/content/cn/blog/2023/09/22/Exploring-the-Architecture-of-Apache-Iceberg-Delta-Lake-and-Apache-Hudi/index.html index 67013a8b2adcb..153af4bf51985 100644 --- a/content/cn/blog/2023/09/22/Exploring-the-Architecture-of-Apache-Iceberg-Delta-Lake-and-Apache-Hudi/index.html +++ b/content/cn/blog/2023/09/22/Exploring-the-Architecture-of-Apache-Iceberg-Delta-Lake-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/09/27/Apache-Hudi-From-Zero-To-One-blog-4/index.html b/content/cn/blog/2023/09/27/Apache-Hudi-From-Zero-To-One-blog-4/index.html index 220d82767139f..2dcce90d7c3f9 100644 --- a/content/cn/blog/2023/09/27/Apache-Hudi-From-Zero-To-One-blog-4/index.html +++ b/content/cn/blog/2023/09/27/Apache-Hudi-From-Zero-To-One-blog-4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/10/06/Apache-Hudi-Copy-on-Write-CoW-Table/index.html b/content/cn/blog/2023/10/06/Apache-Hudi-Copy-on-Write-CoW-Table/index.html index d579d76370010..90a000f7ba9a0 100644 --- a/content/cn/blog/2023/10/06/Apache-Hudi-Copy-on-Write-CoW-Table/index.html +++ b/content/cn/blog/2023/10/06/Apache-Hudi-Copy-on-Write-CoW-Table/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/10/11/starrocks-query-performance-with-apache-hudi-and-onehouse/index.html b/content/cn/blog/2023/10/11/starrocks-query-performance-with-apache-hudi-and-onehouse/index.html index a709d2482d578..3e7cbe0bbcfb1 100644 --- a/content/cn/blog/2023/10/11/starrocks-query-performance-with-apache-hudi-and-onehouse/index.html +++ b/content/cn/blog/2023/10/11/starrocks-query-performance-with-apache-hudi-and-onehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/10/17/Get-started-with-Apache-Hudi-using-AWS-Glue-by-implementing-key-design-concepts-Part-1/index.html b/content/cn/blog/2023/10/17/Get-started-with-Apache-Hudi-using-AWS-Glue-by-implementing-key-design-concepts-Part-1/index.html index 3eb022ad3c934..6176058626e72 100644 --- a/content/cn/blog/2023/10/17/Get-started-with-Apache-Hudi-using-AWS-Glue-by-implementing-key-design-concepts-Part-1/index.html +++ b/content/cn/blog/2023/10/17/Get-started-with-Apache-Hudi-using-AWS-Glue-by-implementing-key-design-concepts-Part-1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/10/18/Apache-Hudi-From-Zero-To-One-blog-5/index.html b/content/cn/blog/2023/10/18/Apache-Hudi-From-Zero-To-One-blog-5/index.html index 51075cd0e17f6..13c8c996bb685 100644 --- a/content/cn/blog/2023/10/18/Apache-Hudi-From-Zero-To-One-blog-5/index.html +++ b/content/cn/blog/2023/10/18/Apache-Hudi-From-Zero-To-One-blog-5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/10/19/load-data-incrementally-from-transactional-data-lakes-to-data-warehouses/index.html b/content/cn/blog/2023/10/19/load-data-incrementally-from-transactional-data-lakes-to-data-warehouses/index.html index f0ae8f0afac4f..0fb96c3245b5b 100644 --- a/content/cn/blog/2023/10/19/load-data-incrementally-from-transactional-data-lakes-to-data-warehouses/index.html +++ b/content/cn/blog/2023/10/19/load-data-incrementally-from-transactional-data-lakes-to-data-warehouses/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/10/20/Its-Time-for-the-Universal-Data-Lakehouse/index.html b/content/cn/blog/2023/10/20/Its-Time-for-the-Universal-Data-Lakehouse/index.html index f91773de0b544..c35afa1a9740f 100644 --- a/content/cn/blog/2023/10/20/Its-Time-for-the-Universal-Data-Lakehouse/index.html +++ b/content/cn/blog/2023/10/20/Its-Time-for-the-Universal-Data-Lakehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/10/22/Tipico-Facilitates-Faster-Data-Access-with-a-Modern-Data-Strategy-on-AWS/index.html b/content/cn/blog/2023/10/22/Tipico-Facilitates-Faster-Data-Access-with-a-Modern-Data-Strategy-on-AWS/index.html index d6ac57293b1ad..a5312c9f8a9b1 100644 --- a/content/cn/blog/2023/10/22/Tipico-Facilitates-Faster-Data-Access-with-a-Modern-Data-Strategy-on-AWS/index.html +++ b/content/cn/blog/2023/10/22/Tipico-Facilitates-Faster-Data-Access-with-a-Modern-Data-Strategy-on-AWS/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/10/29/UPSERT-Performance-Evaluation-of-Hudi-0-14-and-Spark-3-4-1-Record-Level-Index-Global-Bloom-Global-Simple-Indexes/index.html b/content/cn/blog/2023/10/29/UPSERT-Performance-Evaluation-of-Hudi-0-14-and-Spark-3-4-1-Record-Level-Index-Global-Bloom-Global-Simple-Indexes/index.html index fe78d6566b18f..41958736aefa3 100644 --- a/content/cn/blog/2023/10/29/UPSERT-Performance-Evaluation-of-Hudi-0-14-and-Spark-3-4-1-Record-Level-Index-Global-Bloom-Global-Simple-Indexes/index.html +++ b/content/cn/blog/2023/10/29/UPSERT-Performance-Evaluation-of-Hudi-0-14-and-Spark-3-4-1-Record-Level-Index-Global-Bloom-Global-Simple-Indexes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/11/01/record-level-index/index.html b/content/cn/blog/2023/11/01/record-level-index/index.html index 967c43f4514fc..d5e1128c44674 100644 --- a/content/cn/blog/2023/11/01/record-level-index/index.html +++ b/content/cn/blog/2023/11/01/record-level-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/11/13/Apache-Hudi-From-Zero-To-One-blog-6/index.html b/content/cn/blog/2023/11/13/Apache-Hudi-From-Zero-To-One-blog-6/index.html index 4ff111a6270c1..0e8c7a71e3c02 100644 --- a/content/cn/blog/2023/11/13/Apache-Hudi-From-Zero-To-One-blog-6/index.html +++ b/content/cn/blog/2023/11/13/Apache-Hudi-From-Zero-To-One-blog-6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/11/19/Hudi-Streamer-DeltaStreamer-Hands-On-Guide-Local-Ingestion-from-Parquet-Source/index.html b/content/cn/blog/2023/11/19/Hudi-Streamer-DeltaStreamer-Hands-On-Guide-Local-Ingestion-from-Parquet-Source/index.html index 81ba74ba40eb4..23f17e06dcffe 100644 --- a/content/cn/blog/2023/11/19/Hudi-Streamer-DeltaStreamer-Hands-On-Guide-Local-Ingestion-from-Parquet-Source/index.html +++ b/content/cn/blog/2023/11/19/Hudi-Streamer-DeltaStreamer-Hands-On-Guide-Local-Ingestion-from-Parquet-Source/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/11/22/Introducing-Apache-Hudi-support-with-AWS-Glue-crawlers/index.html b/content/cn/blog/2023/11/22/Introducing-Apache-Hudi-support-with-AWS-Glue-crawlers/index.html index ed74e032870a3..718150400bf61 100644 --- a/content/cn/blog/2023/11/22/Introducing-Apache-Hudi-support-with-AWS-Glue-crawlers/index.html +++ b/content/cn/blog/2023/11/22/Introducing-Apache-Hudi-support-with-AWS-Glue-crawlers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/11/26/Real-Time-Data-Processing-with-Postgres-Debezium-Kafka-Schema-Registry-and-DeltaStreamer-Guide-for-Begineers/index.html b/content/cn/blog/2023/11/26/Real-Time-Data-Processing-with-Postgres-Debezium-Kafka-Schema-Registry-and-DeltaStreamer-Guide-for-Begineers/index.html index 64a3cb25d7341..a6ca21da83bc9 100644 --- a/content/cn/blog/2023/11/26/Real-Time-Data-Processing-with-Postgres-Debezium-Kafka-Schema-Registry-and-DeltaStreamer-Guide-for-Begineers/index.html +++ b/content/cn/blog/2023/11/26/Real-Time-Data-Processing-with-Postgres-Debezium-Kafka-Schema-Registry-and-DeltaStreamer-Guide-for-Begineers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/11/28/Apache-Hudi-Part-1-History-Getting-Started/index.html b/content/cn/blog/2023/11/28/Apache-Hudi-Part-1-History-Getting-Started/index.html index 45d3f74b2b345..d259e22cf330e 100644 --- a/content/cn/blog/2023/11/28/Apache-Hudi-Part-1-History-Getting-Started/index.html +++ b/content/cn/blog/2023/11/28/Apache-Hudi-Part-1-History-Getting-Started/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/11/30/Mastering-Data-Lakes-A-Deep-Dive-into-MINIO-Hudi-and-Delta-Streamer/index.html b/content/cn/blog/2023/11/30/Mastering-Data-Lakes-A-Deep-Dive-into-MINIO-Hudi-and-Delta-Streamer/index.html index ce7f246b8a348..505864f418398 100644 --- a/content/cn/blog/2023/11/30/Mastering-Data-Lakes-A-Deep-Dive-into-MINIO-Hudi-and-Delta-Streamer/index.html +++ b/content/cn/blog/2023/11/30/Mastering-Data-Lakes-A-Deep-Dive-into-MINIO-Hudi-and-Delta-Streamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/12/01/Getting-started-with-Apache-Hudi/index.html b/content/cn/blog/2023/12/01/Getting-started-with-Apache-Hudi/index.html index 808b942e49e6f..0e84ba6c8c834 100644 --- a/content/cn/blog/2023/12/01/Getting-started-with-Apache-Hudi/index.html +++ b/content/cn/blog/2023/12/01/Getting-started-with-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/12/06/Apache-Hudi-From-Zero-To-One-blog-7/index.html b/content/cn/blog/2023/12/06/Apache-Hudi-From-Zero-To-One-blog-7/index.html index 14cfece61f360..535d66f084e63 100644 --- a/content/cn/blog/2023/12/06/Apache-Hudi-From-Zero-To-One-blog-7/index.html +++ b/content/cn/blog/2023/12/06/Apache-Hudi-From-Zero-To-One-blog-7/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/12/09/Getting-started-with-Apache-Hudi/index.html b/content/cn/blog/2023/12/09/Getting-started-with-Apache-Hudi/index.html index 2d7ef27a7c272..8af4e0a1350c3 100644 --- a/content/cn/blog/2023/12/09/Getting-started-with-Apache-Hudi/index.html +++ b/content/cn/blog/2023/12/09/Getting-started-with-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/12/13/what-is-apache-hudi/index.html b/content/cn/blog/2023/12/13/what-is-apache-hudi/index.html index 8f8ad66f78ea4..1009a01bdbc74 100644 --- a/content/cn/blog/2023/12/13/what-is-apache-hudi/index.html +++ b/content/cn/blog/2023/12/13/what-is-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2023/12/28/apache-hudi-2023-a-year-in-review/index.html b/content/cn/blog/2023/12/28/apache-hudi-2023-a-year-in-review/index.html index 6c0d2b4958ab0..fb65b945dfdc3 100644 --- a/content/cn/blog/2023/12/28/apache-hudi-2023-a-year-in-review/index.html +++ b/content/cn/blog/2023/12/28/apache-hudi-2023-a-year-in-review/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/01/01/From-Data-lake-to-Microservices-Unleashing-the-Power-of-Apache-Hudi-Record-Level-Index-with-FastAPI-and-Spark-Connect/index.html b/content/cn/blog/2024/01/01/From-Data-lake-to-Microservices-Unleashing-the-Power-of-Apache-Hudi-Record-Level-Index-with-FastAPI-and-Spark-Connect/index.html index bd86e3a35fd26..bb8cb6d3a7bb8 100644 --- a/content/cn/blog/2024/01/01/From-Data-lake-to-Microservices-Unleashing-the-Power-of-Apache-Hudi-Record-Level-Index-with-FastAPI-and-Spark-Connect/index.html +++ b/content/cn/blog/2024/01/01/From-Data-lake-to-Microservices-Unleashing-the-Power-of-Apache-Hudi-Record-Level-Index-with-FastAPI-and-Spark-Connect/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/01/02/Build-a-federated-query-solution-with-Apache-Doris-Apache-Flink-and-Apache-Hudi/index.html b/content/cn/blog/2024/01/02/Build-a-federated-query-solution-with-Apache-Doris-Apache-Flink-and-Apache-Hudi/index.html index 88ac6ffbf32a3..c1939de1caeb4 100644 --- a/content/cn/blog/2024/01/02/Build-a-federated-query-solution-with-Apache-Doris-Apache-Flink-and-Apache-Hudi/index.html +++ b/content/cn/blog/2024/01/02/Build-a-federated-query-solution-with-Apache-Doris-Apache-Flink-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/01/05/Small-Talk-about-Apache-Hudi/index.html b/content/cn/blog/2024/01/05/Small-Talk-about-Apache-Hudi/index.html index 37bd50c0053cc..12cdf37902de6 100644 --- a/content/cn/blog/2024/01/05/Small-Talk-about-Apache-Hudi/index.html +++ b/content/cn/blog/2024/01/05/Small-Talk-about-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/01/09/introduction-to-apache-hudi/index.html b/content/cn/blog/2024/01/09/introduction-to-apache-hudi/index.html index f0e132ce1d5c5..3c9f3cd3ee43c 100644 --- a/content/cn/blog/2024/01/09/introduction-to-apache-hudi/index.html +++ b/content/cn/blog/2024/01/09/introduction-to-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/01/11/In-House-Data-Lake-with-CDC-Processing-Hudi-Docker/index.html b/content/cn/blog/2024/01/11/In-House-Data-Lake-with-CDC-Processing-Hudi-Docker/index.html index 3f74dba39ace6..c8640abd08d8e 100644 --- a/content/cn/blog/2024/01/11/In-House-Data-Lake-with-CDC-Processing-Hudi-Docker/index.html +++ b/content/cn/blog/2024/01/11/In-House-Data-Lake-with-CDC-Processing-Hudi-Docker/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/01/17/Enforce-fine-grained-access-control-on-Open-Table-Formats-via-Amazon-EMR-integrated-with-AWS-Lake-Formation/index.html b/content/cn/blog/2024/01/17/Enforce-fine-grained-access-control-on-Open-Table-Formats-via-Amazon-EMR-integrated-with-AWS-Lake-Formation/index.html index c6f28b2c8217e..edaaa4acf4823 100644 --- a/content/cn/blog/2024/01/17/Enforce-fine-grained-access-control-on-Open-Table-Formats-via-Amazon-EMR-integrated-with-AWS-Lake-Formation/index.html +++ b/content/cn/blog/2024/01/17/Enforce-fine-grained-access-control-on-Open-Table-Formats-via-Amazon-EMR-integrated-with-AWS-Lake-Formation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/01/18/Deleting-Items-from-Apache-Hudi-using-Delta-Streamer-in-UPSERT-Mode-with-Kafka-Avro-Messages/index.html b/content/cn/blog/2024/01/18/Deleting-Items-from-Apache-Hudi-using-Delta-Streamer-in-UPSERT-Mode-with-Kafka-Avro-Messages/index.html index 1db6b4e27172f..8a8a64e7b8ff6 100644 --- a/content/cn/blog/2024/01/18/Deleting-Items-from-Apache-Hudi-using-Delta-Streamer-in-UPSERT-Mode-with-Kafka-Avro-Messages/index.html +++ b/content/cn/blog/2024/01/18/Deleting-Items-from-Apache-Hudi-using-Delta-Streamer-in-UPSERT-Mode-with-Kafka-Avro-Messages/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/01/20/Data-Engineering-Bootstrapping-Data-lake-with-Apache-Hudi/index.html b/content/cn/blog/2024/01/20/Data-Engineering-Bootstrapping-Data-lake-with-Apache-Hudi/index.html index a68c41d4f4f41..4edc71a283b9c 100644 --- a/content/cn/blog/2024/01/20/Data-Engineering-Bootstrapping-Data-lake-with-Apache-Hudi/index.html +++ b/content/cn/blog/2024/01/20/Data-Engineering-Bootstrapping-Data-lake-with-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/01/20/Learn-How-to-Move-Data-From-MongoDB-to-Apache-Hudi-Using-PySpark/index.html b/content/cn/blog/2024/01/20/Learn-How-to-Move-Data-From-MongoDB-to-Apache-Hudi-Using-PySpark/index.html index 9b165437daac8..f0f816eacf5fc 100644 --- a/content/cn/blog/2024/01/20/Learn-How-to-Move-Data-From-MongoDB-to-Apache-Hudi-Using-PySpark/index.html +++ b/content/cn/blog/2024/01/20/Learn-How-to-Move-Data-From-MongoDB-to-Apache-Hudi-Using-PySpark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/01/24/Use-Amazon-Athena-with-Spark-SQL-for-your-open-source-transactional-table-formats/index.html b/content/cn/blog/2024/01/24/Use-Amazon-Athena-with-Spark-SQL-for-your-open-source-transactional-table-formats/index.html index 704d7ea060157..868e0d2ce2068 100644 --- a/content/cn/blog/2024/01/24/Use-Amazon-Athena-with-Spark-SQL-for-your-open-source-transactional-table-formats/index.html +++ b/content/cn/blog/2024/01/24/Use-Amazon-Athena-with-Spark-SQL-for-your-open-source-transactional-table-formats/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/01/30/Leverage-Partition-Paths-of-your-data-lake-tables-to-Optimize-Data-Retrieval-Costs-on-the-cloud/index.html b/content/cn/blog/2024/01/30/Leverage-Partition-Paths-of-your-data-lake-tables-to-Optimize-Data-Retrieval-Costs-on-the-cloud/index.html index 9ec47fc3b1515..9703ff4b2835e 100644 --- a/content/cn/blog/2024/01/30/Leverage-Partition-Paths-of-your-data-lake-tables-to-Optimize-Data-Retrieval-Costs-on-the-cloud/index.html +++ b/content/cn/blog/2024/01/30/Leverage-Partition-Paths-of-your-data-lake-tables-to-Optimize-Data-Retrieval-Costs-on-the-cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/02/04/Apache-Hudi-Managing-Partition-on-a-petabyte-scale-table/index.html b/content/cn/blog/2024/02/04/Apache-Hudi-Managing-Partition-on-a-petabyte-scale-table/index.html index f35b5ab8576b9..5f99cbf4255ba 100644 --- a/content/cn/blog/2024/02/04/Apache-Hudi-Managing-Partition-on-a-petabyte-scale-table/index.html +++ b/content/cn/blog/2024/02/04/Apache-Hudi-Managing-Partition-on-a-petabyte-scale-table/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/02/06/Building-an-Open-Source-Data-Lake-House-with-Hudi-Postgres-Hive-Metastore-Minio-and-StarRocks/index.html b/content/cn/blog/2024/02/06/Building-an-Open-Source-Data-Lake-House-with-Hudi-Postgres-Hive-Metastore-Minio-and-StarRocks/index.html index a01d50094f7ca..4b09f64a86bf8 100644 --- a/content/cn/blog/2024/02/06/Building-an-Open-Source-Data-Lake-House-with-Hudi-Postgres-Hive-Metastore-Minio-and-StarRocks/index.html +++ b/content/cn/blog/2024/02/06/Building-an-Open-Source-Data-Lake-House-with-Hudi-Postgres-Hive-Metastore-Minio-and-StarRocks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/02/06/Combine-Transactional-Integrity-and-Data-Lake-Operations-with-YugabyteDB-and-Apache-Hudi/index.html b/content/cn/blog/2024/02/06/Combine-Transactional-Integrity-and-Data-Lake-Operations-with-YugabyteDB-and-Apache-Hudi/index.html index 09c42e448417d..e4c2426ce61f7 100644 --- a/content/cn/blog/2024/02/06/Combine-Transactional-Integrity-and-Data-Lake-Operations-with-YugabyteDB-and-Apache-Hudi/index.html +++ b/content/cn/blog/2024/02/06/Combine-Transactional-Integrity-and-Data-Lake-Operations-with-YugabyteDB-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/02/12/How-a-POC-became-a-production-ready-Hudi-data-lakehouse-through-close-team-collaboration/index.html b/content/cn/blog/2024/02/12/How-a-POC-became-a-production-ready-Hudi-data-lakehouse-through-close-team-collaboration/index.html index 9fa1544d49af1..81017c2487cff 100644 --- a/content/cn/blog/2024/02/12/How-a-POC-became-a-production-ready-Hudi-data-lakehouse-through-close-team-collaboration/index.html +++ b/content/cn/blog/2024/02/12/How-a-POC-became-a-production-ready-Hudi-data-lakehouse-through-close-team-collaboration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/02/23/Enabling-near-real-time-data-analytics-on-the-data-lake/index.html b/content/cn/blog/2024/02/23/Enabling-near-real-time-data-analytics-on-the-data-lake/index.html index 08e351781e1ca..4de5c2dac80d0 100644 --- a/content/cn/blog/2024/02/23/Enabling-near-real-time-data-analytics-on-the-data-lake/index.html +++ b/content/cn/blog/2024/02/23/Enabling-near-real-time-data-analytics-on-the-data-lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/02/27/Building-Data-Lakes-on-AWS-with-Kafka-Connect-Debezium-Apicurio-Registry-and-Apache-Hudi/index.html b/content/cn/blog/2024/02/27/Building-Data-Lakes-on-AWS-with-Kafka-Connect-Debezium-Apicurio-Registry-and-Apache-Hudi/index.html index 111f01f3fed25..13db339c579c1 100644 --- a/content/cn/blog/2024/02/27/Building-Data-Lakes-on-AWS-with-Kafka-Connect-Debezium-Apicurio-Registry-and-Apache-Hudi/index.html +++ b/content/cn/blog/2024/02/27/Building-Data-Lakes-on-AWS-with-Kafka-Connect-Debezium-Apicurio-Registry-and-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/02/27/empowering-data-driven-excellence-how-the-bluestone-data-platform-embraced-data-mesh-for-success/index.html b/content/cn/blog/2024/02/27/empowering-data-driven-excellence-how-the-bluestone-data-platform-embraced-data-mesh-for-success/index.html index 688d0a2c97005..00537bbeea602 100644 --- a/content/cn/blog/2024/02/27/empowering-data-driven-excellence-how-the-bluestone-data-platform-embraced-data-mesh-for-success/index.html +++ b/content/cn/blog/2024/02/27/empowering-data-driven-excellence-how-the-bluestone-data-platform-embraced-data-mesh-for-success/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/03/05/Apache-Hudi-From-Zero-To-One-blog-9/index.html b/content/cn/blog/2024/03/05/Apache-Hudi-From-Zero-To-One-blog-9/index.html index 725fc0436cc3c..81e4578b14f4c 100644 --- a/content/cn/blog/2024/03/05/Apache-Hudi-From-Zero-To-One-blog-9/index.html +++ b/content/cn/blog/2024/03/05/Apache-Hudi-From-Zero-To-One-blog-9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/03/10/navigating-the-future-the-evolutionary-journey-of-upstoxs-data-platform/index.html b/content/cn/blog/2024/03/10/navigating-the-future-the-evolutionary-journey-of-upstoxs-data-platform/index.html index b8089c51f5e33..6390866f3af98 100644 --- a/content/cn/blog/2024/03/10/navigating-the-future-the-evolutionary-journey-of-upstoxs-data-platform/index.html +++ b/content/cn/blog/2024/03/10/navigating-the-future-the-evolutionary-journey-of-upstoxs-data-platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/03/14/Modern-Datalakes-with-Hudi--MinIO--and-HMS/index.html b/content/cn/blog/2024/03/14/Modern-Datalakes-with-Hudi--MinIO--and-HMS/index.html index 08075d8230e79..54da1db481057 100644 --- a/content/cn/blog/2024/03/14/Modern-Datalakes-with-Hudi--MinIO--and-HMS/index.html +++ b/content/cn/blog/2024/03/14/Modern-Datalakes-with-Hudi--MinIO--and-HMS/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/03/16/Open-Table-Formats-part-1-Apache-Hudi-Hadoop-Upserts-Deletes-and-Incrementals/index.html b/content/cn/blog/2024/03/16/Open-Table-Formats-part-1-Apache-Hudi-Hadoop-Upserts-Deletes-and-Incrementals/index.html index 5d077f78313cd..0687ca3e03197 100644 --- a/content/cn/blog/2024/03/16/Open-Table-Formats-part-1-Apache-Hudi-Hadoop-Upserts-Deletes-and-Incrementals/index.html +++ b/content/cn/blog/2024/03/16/Open-Table-Formats-part-1-Apache-Hudi-Hadoop-Upserts-Deletes-and-Incrementals/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/03/22/data-lake-cost-optimisation-strategies/index.html b/content/cn/blog/2024/03/22/data-lake-cost-optimisation-strategies/index.html index cfcb099980da3..6422b41a3416a 100644 --- a/content/cn/blog/2024/03/22/data-lake-cost-optimisation-strategies/index.html +++ b/content/cn/blog/2024/03/22/data-lake-cost-optimisation-strategies/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/03/23/options-on-kafka-sink-to-open-table-formats-apache-iceberg-and-apache-hudi/index.html b/content/cn/blog/2024/03/23/options-on-kafka-sink-to-open-table-formats-apache-iceberg-and-apache-hudi/index.html index 8832a2ec18983..485fa444375ac 100644 --- a/content/cn/blog/2024/03/23/options-on-kafka-sink-to-open-table-formats-apache-iceberg-and-apache-hudi/index.html +++ b/content/cn/blog/2024/03/23/options-on-kafka-sink-to-open-table-formats-apache-iceberg-and-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/03/30/record-level-indexing-apache-hudi-delivers-70-faster-point/index.html b/content/cn/blog/2024/03/30/record-level-indexing-apache-hudi-delivers-70-faster-point/index.html index c82614477deeb..0b25c73ca02fc 100644 --- a/content/cn/blog/2024/03/30/record-level-indexing-apache-hudi-delivers-70-faster-point/index.html +++ b/content/cn/blog/2024/03/30/record-level-indexing-apache-hudi-delivers-70-faster-point/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/04/03/hands-on-guide-reading-data-from-hudi-tables-joining-delta/index.html b/content/cn/blog/2024/04/03/hands-on-guide-reading-data-from-hudi-tables-joining-delta/index.html index 65b45fb75ac1c..652772aa5030c 100644 --- a/content/cn/blog/2024/04/03/hands-on-guide-reading-data-from-hudi-tables-joining-delta/index.html +++ b/content/cn/blog/2024/04/03/hands-on-guide-reading-data-from-hudi-tables-joining-delta/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/04/21/build-real-time-streaming-pipeline-with-kinesis-apache-flink-and-apache-hudi/index.html b/content/cn/blog/2024/04/21/build-real-time-streaming-pipeline-with-kinesis-apache-flink-and-apache-hudi/index.html index 9e2d2cdee65a4..61e3b229513a4 100644 --- a/content/cn/blog/2024/04/21/build-real-time-streaming-pipeline-with-kinesis-apache-flink-and-apache-hudi/index.html +++ b/content/cn/blog/2024/04/21/build-real-time-streaming-pipeline-with-kinesis-apache-flink-and-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-1/index.html b/content/cn/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-1/index.html index 8b2573ae88aa5..0878f0f90bb74 100644 --- a/content/cn/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-1/index.html +++ b/content/cn/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-2/index.html b/content/cn/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-2/index.html index 7f74caf1241f9..01ae70ba80d07 100644 --- a/content/cn/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-2/index.html +++ b/content/cn/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-3/index.html b/content/cn/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-3/index.html index bff8e80541232..b07fb8a36c6fa 100644 --- a/content/cn/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-3/index.html +++ b/content/cn/blog/2024/04/24/understanding-apache-hudi-consistency-model-part-3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/04/25/apache-hudi-vs-apache-iceberg-a-comprehensive-comparison/index.html b/content/cn/blog/2024/04/25/apache-hudi-vs-apache-iceberg-a-comprehensive-comparison/index.html index 61a0902616d4a..adca06b3b7e2c 100644 --- a/content/cn/blog/2024/04/25/apache-hudi-vs-apache-iceberg-a-comprehensive-comparison/index.html +++ b/content/cn/blog/2024/04/25/apache-hudi-vs-apache-iceberg-a-comprehensive-comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/05/02/how-query-apache-hudi-tables-python-using-daft-spark-free/index.html b/content/cn/blog/2024/05/02/how-query-apache-hudi-tables-python-using-daft-spark-free/index.html index 7f03b94ebb3ba..ad10d9b783a2b 100644 --- a/content/cn/blog/2024/05/02/how-query-apache-hudi-tables-python-using-daft-spark-free/index.html +++ b/content/cn/blog/2024/05/02/how-query-apache-hudi-tables-python-using-daft-spark-free/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/05/07/learn-how-read-hudi-data-aws-glue-ray-using-daft-spark/index.html b/content/cn/blog/2024/05/07/learn-how-read-hudi-data-aws-glue-ray-using-daft-spark/index.html index 984e78592114c..2fd8924691b4f 100644 --- a/content/cn/blog/2024/05/07/learn-how-read-hudi-data-aws-glue-ray-using-daft-spark/index.html +++ b/content/cn/blog/2024/05/07/learn-how-read-hudi-data-aws-glue-ray-using-daft-spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/05/10/building-analytical-apps-on-the-lakehouse-using-apache-hudi-daft-streamlit/index.html b/content/cn/blog/2024/05/10/building-analytical-apps-on-the-lakehouse-using-apache-hudi-daft-streamlit/index.html index b5c42df791fcd..b7a91bad545a0 100644 --- a/content/cn/blog/2024/05/10/building-analytical-apps-on-the-lakehouse-using-apache-hudi-daft-streamlit/index.html +++ b/content/cn/blog/2024/05/10/building-analytical-apps-on-the-lakehouse-using-apache-hudi-daft-streamlit/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/05/19/apache-hudi-on-aws-glue/index.html b/content/cn/blog/2024/05/19/apache-hudi-on-aws-glue/index.html index 964fb242e4f79..af71f22cceb5b 100644 --- a/content/cn/blog/2024/05/19/apache-hudi-on-aws-glue/index.html +++ b/content/cn/blog/2024/05/19/apache-hudi-on-aws-glue/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/05/22/use-aws-data-exchange-to-seamlessly-share-apache-hudi-datasets/index.html b/content/cn/blog/2024/05/22/use-aws-data-exchange-to-seamlessly-share-apache-hudi-datasets/index.html index ee012823c6d10..1bf9768f817f4 100644 --- a/content/cn/blog/2024/05/22/use-aws-data-exchange-to-seamlessly-share-apache-hudi-datasets/index.html +++ b/content/cn/blog/2024/05/22/use-aws-data-exchange-to-seamlessly-share-apache-hudi-datasets/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/05/27/apache-hudi-vs-delta-lake-choosing-the-right-tool-for-your-data-lake-on-aws/index.html b/content/cn/blog/2024/05/27/apache-hudi-vs-delta-lake-choosing-the-right-tool-for-your-data-lake-on-aws/index.html index 5e8bde08454ef..e91436cc0d78f 100644 --- a/content/cn/blog/2024/05/27/apache-hudi-vs-delta-lake-choosing-the-right-tool-for-your-data-lake-on-aws/index.html +++ b/content/cn/blog/2024/05/27/apache-hudi-vs-delta-lake-choosing-the-right-tool-for-your-data-lake-on-aws/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/06/07/apache-hudi-a-deep-dive-with-python-code-examples/index.html b/content/cn/blog/2024/06/07/apache-hudi-a-deep-dive-with-python-code-examples/index.html index 028870a0ec846..9a0d31716cf70 100644 --- a/content/cn/blog/2024/06/07/apache-hudi-a-deep-dive-with-python-code-examples/index.html +++ b/content/cn/blog/2024/06/07/apache-hudi-a-deep-dive-with-python-code-examples/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/06/18/how-to-use-apache-hudi-with-databricks/index.html b/content/cn/blog/2024/06/18/how-to-use-apache-hudi-with-databricks/index.html index 59824a13e8cfd..86b86976353be 100644 --- a/content/cn/blog/2024/06/18/how-to-use-apache-hudi-with-databricks/index.html +++ b/content/cn/blog/2024/06/18/how-to-use-apache-hudi-with-databricks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/07/11/what-is-a-data-lakehouse/index.html b/content/cn/blog/2024/07/11/what-is-a-data-lakehouse/index.html index 1032a93317ecf..e4724705ca20c 100644 --- a/content/cn/blog/2024/07/11/what-is-a-data-lakehouse/index.html +++ b/content/cn/blog/2024/07/11/what-is-a-data-lakehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/07/30/data-lake-cdc/index.html b/content/cn/blog/2024/07/30/data-lake-cdc/index.html index e10fcbe1386b0..984be56b364e4 100644 --- a/content/cn/blog/2024/07/30/data-lake-cdc/index.html +++ b/content/cn/blog/2024/07/30/data-lake-cdc/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/07/31/hudi-file-formats/index.html b/content/cn/blog/2024/07/31/hudi-file-formats/index.html index 9974be4f4dbc9..7c59fbcd02d2a 100644 --- a/content/cn/blog/2024/07/31/hudi-file-formats/index.html +++ b/content/cn/blog/2024/07/31/hudi-file-formats/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/09/04/developer-guide-how-to-submit-hudi-pyspark-python-jobs-to-emr-serverless/index.html b/content/cn/blog/2024/09/04/developer-guide-how-to-submit-hudi-pyspark-python-jobs-to-emr-serverless/index.html index a530294e59a6b..65e51049d3f4b 100644 --- a/content/cn/blog/2024/09/04/developer-guide-how-to-submit-hudi-pyspark-python-jobs-to-emr-serverless/index.html +++ b/content/cn/blog/2024/09/04/developer-guide-how-to-submit-hudi-pyspark-python-jobs-to-emr-serverless/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/09/09/use-apache-hudi-tables-in-athena-for-spark/index.html b/content/cn/blog/2024/09/09/use-apache-hudi-tables-in-athena-for-spark/index.html index 42da9e41389c3..e0426bc96e52d 100644 --- a/content/cn/blog/2024/09/09/use-apache-hudi-tables-in-athena-for-spark/index.html +++ b/content/cn/blog/2024/09/09/use-apache-hudi-tables-in-athena-for-spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/09/11/comparing-apache-hudi-apache-iceberg-and-delta-lake/index.html b/content/cn/blog/2024/09/11/comparing-apache-hudi-apache-iceberg-and-delta-lake/index.html index 21c21d20e1b4c..eb80621d14f91 100644 --- a/content/cn/blog/2024/09/11/comparing-apache-hudi-apache-iceberg-and-delta-lake/index.html +++ b/content/cn/blog/2024/09/11/comparing-apache-hudi-apache-iceberg-and-delta-lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/09/14/Ubers-Big-Data-Revolution-From-MySQL-to-Hadoop-and-Beyond/index.html b/content/cn/blog/2024/09/14/Ubers-Big-Data-Revolution-From-MySQL-to-Hadoop-and-Beyond/index.html index c028944308a22..adc5ae334613f 100644 --- a/content/cn/blog/2024/09/14/Ubers-Big-Data-Revolution-From-MySQL-to-Hadoop-and-Beyond/index.html +++ b/content/cn/blog/2024/09/14/Ubers-Big-Data-Revolution-From-MySQL-to-Hadoop-and-Beyond/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/09/17/how-apache-hudi-transformed-yuno-s-data-lake/index.html b/content/cn/blog/2024/09/17/how-apache-hudi-transformed-yuno-s-data-lake/index.html index 95f7b01d08253..c1d70c85b4dc6 100644 --- a/content/cn/blog/2024/09/17/how-apache-hudi-transformed-yuno-s-data-lake/index.html +++ b/content/cn/blog/2024/09/17/how-apache-hudi-transformed-yuno-s-data-lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/09/22/hands-on-with-apache-hudi-and-spark/index.html b/content/cn/blog/2024/09/22/hands-on-with-apache-hudi-and-spark/index.html index 1dc0012370c4f..d54a461c66338 100644 --- a/content/cn/blog/2024/09/22/hands-on-with-apache-hudi-and-spark/index.html +++ b/content/cn/blog/2024/09/22/hands-on-with-apache-hudi-and-spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/09/24/hudi-iceberg-and-delta-lake-data-lake-table-formats-compared/index.html b/content/cn/blog/2024/09/24/hudi-iceberg-and-delta-lake-data-lake-table-formats-compared/index.html index e95feddb13a1e..3c7179a0143f8 100644 --- a/content/cn/blog/2024/09/24/hudi-iceberg-and-delta-lake-data-lake-table-formats-compared/index.html +++ b/content/cn/blog/2024/09/24/hudi-iceberg-and-delta-lake-data-lake-table-formats-compared/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/09/30/change-query-support-in-apache-hudi-0-15/index.html b/content/cn/blog/2024/09/30/change-query-support-in-apache-hudi-0-15/index.html index a9055f26c1e3c..e944a51573f3c 100644 --- a/content/cn/blog/2024/09/30/change-query-support-in-apache-hudi-0-15/index.html +++ b/content/cn/blog/2024/09/30/change-query-support-in-apache-hudi-0-15/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/10/02/apache-hudi-spark-and-minio-hands-on-lab-in-docker/index.html b/content/cn/blog/2024/10/02/apache-hudi-spark-and-minio-hands-on-lab-in-docker/index.html index 837f766a85952..26cab182a440a 100644 --- a/content/cn/blog/2024/10/02/apache-hudi-spark-and-minio-hands-on-lab-in-docker/index.html +++ b/content/cn/blog/2024/10/02/apache-hudi-spark-and-minio-hands-on-lab-in-docker/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/10/07/iceberg-vs-delta-lake-vs-hudi-a-comparative-look-at-lakehouse-architectures/index.html b/content/cn/blog/2024/10/07/iceberg-vs-delta-lake-vs-hudi-a-comparative-look-at-lakehouse-architectures/index.html index b740b7055dd03..b772a8b98fc11 100644 --- a/content/cn/blog/2024/10/07/iceberg-vs-delta-lake-vs-hudi-a-comparative-look-at-lakehouse-architectures/index.html +++ b/content/cn/blog/2024/10/07/iceberg-vs-delta-lake-vs-hudi-a-comparative-look-at-lakehouse-architectures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/10/07/mastering-slowly-changing-dimensions-with-apache-hudi-and-spark-sql/index.html b/content/cn/blog/2024/10/07/mastering-slowly-changing-dimensions-with-apache-hudi-and-spark-sql/index.html index 43a9b5f81e3c3..c0424091e9cb9 100644 --- a/content/cn/blog/2024/10/07/mastering-slowly-changing-dimensions-with-apache-hudi-and-spark-sql/index.html +++ b/content/cn/blog/2024/10/07/mastering-slowly-changing-dimensions-with-apache-hudi-and-spark-sql/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/10/14/streaming-dynamodb-data-into-a-hudi-table-aws-glue-in-action/index.html b/content/cn/blog/2024/10/14/streaming-dynamodb-data-into-a-hudi-table-aws-glue-in-action/index.html index ce446d8f5f71a..d5f09afc2ac11 100644 --- a/content/cn/blog/2024/10/14/streaming-dynamodb-data-into-a-hudi-table-aws-glue-in-action/index.html +++ b/content/cn/blog/2024/10/14/streaming-dynamodb-data-into-a-hudi-table-aws-glue-in-action/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/10/22/exploring-time-travel-queries-in-apache-hudi/index.html b/content/cn/blog/2024/10/22/exploring-time-travel-queries-in-apache-hudi/index.html index 280c3fabf315a..12fdba66c4f82 100644 --- a/content/cn/blog/2024/10/22/exploring-time-travel-queries-in-apache-hudi/index.html +++ b/content/cn/blog/2024/10/22/exploring-time-travel-queries-in-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/10/23/Using-Apache-Hudi-with-Apache-Flink/index.html b/content/cn/blog/2024/10/23/Using-Apache-Hudi-with-Apache-Flink/index.html index 66e6c4974f2e2..b6cf35b59b7eb 100644 --- a/content/cn/blog/2024/10/23/Using-Apache-Hudi-with-Apache-Flink/index.html +++ b/content/cn/blog/2024/10/23/Using-Apache-Hudi-with-Apache-Flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/10/23/mastering-open-table-formats-a-guide-to-apache-iceberg-hudi-and-delta-lake/index.html b/content/cn/blog/2024/10/23/mastering-open-table-formats-a-guide-to-apache-iceberg-hudi-and-delta-lake/index.html index 14df89bfb525b..204bd2a286987 100644 --- a/content/cn/blog/2024/10/23/mastering-open-table-formats-a-guide-to-apache-iceberg-hudi-and-delta-lake/index.html +++ b/content/cn/blog/2024/10/23/mastering-open-table-formats-a-guide-to-apache-iceberg-hudi-and-delta-lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/10/26/moving-large-tables-from-snowflake-to-s3-using-the-copy-into-command-and-hudi/index.html b/content/cn/blog/2024/10/26/moving-large-tables-from-snowflake-to-s3-using-the-copy-into-command-and-hudi/index.html index 39cac6ded4398..d1dad4340fa89 100644 --- a/content/cn/blog/2024/10/26/moving-large-tables-from-snowflake-to-s3-using-the-copy-into-command-and-hudi/index.html +++ b/content/cn/blog/2024/10/26/moving-large-tables-from-snowflake-to-s3-using-the-copy-into-command-and-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/10/27/I-spent-5-hours-exploring-the-story-behind-Apache-Hudi/index.html b/content/cn/blog/2024/10/27/I-spent-5-hours-exploring-the-story-behind-Apache-Hudi/index.html index 3bc1df95496f4..f8a401f782276 100644 --- a/content/cn/blog/2024/10/27/I-spent-5-hours-exploring-the-story-behind-Apache-Hudi/index.html +++ b/content/cn/blog/2024/10/27/I-spent-5-hours-exploring-the-story-behind-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/11/12/record-level-indexing-in-apache-hudi/index.html b/content/cn/blog/2024/11/12/record-level-indexing-in-apache-hudi/index.html index b987bbc062546..b28b204aef046 100644 --- a/content/cn/blog/2024/11/12/record-level-indexing-in-apache-hudi/index.html +++ b/content/cn/blog/2024/11/12/record-level-indexing-in-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/11/12/storing-200-billion-entities-notions/index.html b/content/cn/blog/2024/11/12/storing-200-billion-entities-notions/index.html index 17d02d7043292..a48090646007a 100644 --- a/content/cn/blog/2024/11/12/storing-200-billion-entities-notions/index.html +++ b/content/cn/blog/2024/11/12/storing-200-billion-entities-notions/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/11/12/understanding-cow-and-mor-in-apache-hudi/index.html b/content/cn/blog/2024/11/12/understanding-cow-and-mor-in-apache-hudi/index.html index 4e060157bdfca..ee33a9e0f2b95 100644 --- a/content/cn/blog/2024/11/12/understanding-cow-and-mor-in-apache-hudi/index.html +++ b/content/cn/blog/2024/11/12/understanding-cow-and-mor-in-apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/11/19/automated-small-file-handling/index.html b/content/cn/blog/2024/11/19/automated-small-file-handling/index.html index 0ea5880143add..db4be820dd3b9 100644 --- a/content/cn/blog/2024/11/19/automated-small-file-handling/index.html +++ b/content/cn/blog/2024/11/19/automated-small-file-handling/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/12/06/non-blocking-concurrency-control/index.html b/content/cn/blog/2024/12/06/non-blocking-concurrency-control/index.html index a266fb0ddd22a..06b83d73d75dd 100644 --- a/content/cn/blog/2024/12/06/non-blocking-concurrency-control/index.html +++ b/content/cn/blog/2024/12/06/non-blocking-concurrency-control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/12/16/announcing-hudi-1-0-0/index.html b/content/cn/blog/2024/12/16/announcing-hudi-1-0-0/index.html index aca99596f7feb..192ad4be87b16 100644 --- a/content/cn/blog/2024/12/16/announcing-hudi-1-0-0/index.html +++ b/content/cn/blog/2024/12/16/announcing-hudi-1-0-0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/2024/12/29/apache-hudi-2024-a-year-in-review/index.html b/content/cn/blog/2024/12/29/apache-hudi-2024-a-year-in-review/index.html index 72607a41158b8..7887db994333a 100644 --- a/content/cn/blog/2024/12/29/apache-hudi-2024-a-year-in-review/index.html +++ b/content/cn/blog/2024/12/29/apache-hudi-2024-a-year-in-review/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/archive/index.html b/content/cn/blog/archive/index.html index f7a72dd199901..84de0613d8ee3 100644 --- a/content/cn/blog/archive/index.html +++ b/content/cn/blog/archive/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/index.html b/content/cn/blog/index.html index c7b2b2364f9b7..36d1b946277a8 100644 --- a/content/cn/blog/index.html +++ b/content/cn/blog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/10/index.html b/content/cn/blog/page/10/index.html index f35ea1e85a46e..069764ae850d1 100644 --- a/content/cn/blog/page/10/index.html +++ b/content/cn/blog/page/10/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/11/index.html b/content/cn/blog/page/11/index.html index 3baaf48819f78..ed02f65f7b45f 100644 --- a/content/cn/blog/page/11/index.html +++ b/content/cn/blog/page/11/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/12/index.html b/content/cn/blog/page/12/index.html index 6de52a1f4c911..ae5980ec8c2f4 100644 --- a/content/cn/blog/page/12/index.html +++ b/content/cn/blog/page/12/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/13/index.html b/content/cn/blog/page/13/index.html index 3c374b9b6aaed..5b99ac47913dd 100644 --- a/content/cn/blog/page/13/index.html +++ b/content/cn/blog/page/13/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/14/index.html b/content/cn/blog/page/14/index.html index f5798be79267f..86633e0b88368 100644 --- a/content/cn/blog/page/14/index.html +++ b/content/cn/blog/page/14/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/15/index.html b/content/cn/blog/page/15/index.html index 4b9b552ce33c2..3b83b2b7f89a1 100644 --- a/content/cn/blog/page/15/index.html +++ b/content/cn/blog/page/15/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/16/index.html b/content/cn/blog/page/16/index.html index 6aba9b496aa8a..f90893147e608 100644 --- a/content/cn/blog/page/16/index.html +++ b/content/cn/blog/page/16/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/17/index.html b/content/cn/blog/page/17/index.html index ce0033aba1dee..21a01fc30d9b8 100644 --- a/content/cn/blog/page/17/index.html +++ b/content/cn/blog/page/17/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/18/index.html b/content/cn/blog/page/18/index.html index 868f7e9bc5499..e95ff3f4b60e6 100644 --- a/content/cn/blog/page/18/index.html +++ b/content/cn/blog/page/18/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/19/index.html b/content/cn/blog/page/19/index.html index 86c95c41a4c9d..c8ee81856d7ba 100644 --- a/content/cn/blog/page/19/index.html +++ b/content/cn/blog/page/19/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/2/index.html b/content/cn/blog/page/2/index.html index c738406e4bcbf..10b2b95723b2c 100644 --- a/content/cn/blog/page/2/index.html +++ b/content/cn/blog/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/20/index.html b/content/cn/blog/page/20/index.html index ebfe469e9798d..2069044b3e64f 100644 --- a/content/cn/blog/page/20/index.html +++ b/content/cn/blog/page/20/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/21/index.html b/content/cn/blog/page/21/index.html index 079b6e93c652b..b5a56740eb32b 100644 --- a/content/cn/blog/page/21/index.html +++ b/content/cn/blog/page/21/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/3/index.html b/content/cn/blog/page/3/index.html index 89d8ad5353681..f3e1453f03d5b 100644 --- a/content/cn/blog/page/3/index.html +++ b/content/cn/blog/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/4/index.html b/content/cn/blog/page/4/index.html index b98508e803e02..f27ef6bcca2fa 100644 --- a/content/cn/blog/page/4/index.html +++ b/content/cn/blog/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/5/index.html b/content/cn/blog/page/5/index.html index 08e7a244870ee..261d2c1395597 100644 --- a/content/cn/blog/page/5/index.html +++ b/content/cn/blog/page/5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/6/index.html b/content/cn/blog/page/6/index.html index cb9411d0147e3..5eab6e55123e9 100644 --- a/content/cn/blog/page/6/index.html +++ b/content/cn/blog/page/6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/7/index.html b/content/cn/blog/page/7/index.html index 3f79e2e6de7e6..78fbb8fc48789 100644 --- a/content/cn/blog/page/7/index.html +++ b/content/cn/blog/page/7/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/8/index.html b/content/cn/blog/page/8/index.html index 258132b14beea..221b2a6e10e37 100644 --- a/content/cn/blog/page/8/index.html +++ b/content/cn/blog/page/8/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/page/9/index.html b/content/cn/blog/page/9/index.html index 2407aa6d5918c..f26fa0207a38f 100644 --- a/content/cn/blog/page/9/index.html +++ b/content/cn/blog/page/9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/streaming-data-lake-platform/index.html b/content/cn/blog/streaming-data-lake-platform/index.html index 1979f3ca46f7c..82afb46f80376 100644 --- a/content/cn/blog/streaming-data-lake-platform/index.html +++ b/content/cn/blog/streaming-data-lake-platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/access-control/index.html b/content/cn/blog/tags/access-control/index.html index c1fe9cfa22f0f..3d3ba632955d5 100644 --- a/content/cn/blog/tags/access-control/index.html +++ b/content/cn/blog/tags/access-control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/acid/index.html b/content/cn/blog/tags/acid/index.html index 01cfd706846ef..8c2c64bf940b4 100644 --- a/content/cn/blog/tags/acid/index.html +++ b/content/cn/blog/tags/acid/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/active-timeline/index.html b/content/cn/blog/tags/active-timeline/index.html index dd7f8cf186e14..eae2b0606bd21 100644 --- a/content/cn/blog/tags/active-timeline/index.html +++ b/content/cn/blog/tags/active-timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/airbyte/index.html b/content/cn/blog/tags/airbyte/index.html index 921bc29eece26..cc1e2bc887562 100644 --- a/content/cn/blog/tags/airbyte/index.html +++ b/content/cn/blog/tags/airbyte/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/alibabacloud/index.html b/content/cn/blog/tags/alibabacloud/index.html index 7f91ab8aa48f7..147b7593844fd 100644 --- a/content/cn/blog/tags/alibabacloud/index.html +++ b/content/cn/blog/tags/alibabacloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/amazon-athena/index.html b/content/cn/blog/tags/amazon-athena/index.html index fd1149f803869..183c4d62704d8 100644 --- a/content/cn/blog/tags/amazon-athena/index.html +++ b/content/cn/blog/tags/amazon-athena/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/amazon-dynamodb/index.html b/content/cn/blog/tags/amazon-dynamodb/index.html index 4f4f84abc3c79..49e27341a40b3 100644 --- a/content/cn/blog/tags/amazon-dynamodb/index.html +++ b/content/cn/blog/tags/amazon-dynamodb/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/amazon-eks/index.html b/content/cn/blog/tags/amazon-eks/index.html index 1017ff9cdb2a3..a706eea1a3c53 100644 --- a/content/cn/blog/tags/amazon-eks/index.html +++ b/content/cn/blog/tags/amazon-eks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/amazon-emr/index.html b/content/cn/blog/tags/amazon-emr/index.html index 4e1c3f3240d26..2a509084954a4 100644 --- a/content/cn/blog/tags/amazon-emr/index.html +++ b/content/cn/blog/tags/amazon-emr/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/amazon-kinesis/index.html b/content/cn/blog/tags/amazon-kinesis/index.html index 987c7ed77d080..098a8849a5b85 100644 --- a/content/cn/blog/tags/amazon-kinesis/index.html +++ b/content/cn/blog/tags/amazon-kinesis/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/amazon-mks/index.html b/content/cn/blog/tags/amazon-mks/index.html index e410da4b7f88a..771a2f3e68319 100644 --- a/content/cn/blog/tags/amazon-mks/index.html +++ b/content/cn/blog/tags/amazon-mks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/amazon-rds/index.html b/content/cn/blog/tags/amazon-rds/index.html index 311ae2a37537a..ebee9372e997f 100644 --- a/content/cn/blog/tags/amazon-rds/index.html +++ b/content/cn/blog/tags/amazon-rds/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/amazon-redshift/index.html b/content/cn/blog/tags/amazon-redshift/index.html index f70087c13aa3e..50cb5d2ef2342 100644 --- a/content/cn/blog/tags/amazon-redshift/index.html +++ b/content/cn/blog/tags/amazon-redshift/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/amazon-s-3/index.html b/content/cn/blog/tags/amazon-s-3/index.html index 9f9cdbe5e3f4f..0227e1a8e476c 100644 --- a/content/cn/blog/tags/amazon-s-3/index.html +++ b/content/cn/blog/tags/amazon-s-3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/amazon-sagemaker/index.html b/content/cn/blog/tags/amazon-sagemaker/index.html index e6aad3e0ba76c..c97fab996dd57 100644 --- a/content/cn/blog/tags/amazon-sagemaker/index.html +++ b/content/cn/blog/tags/amazon-sagemaker/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/amazon-spark/index.html b/content/cn/blog/tags/amazon-spark/index.html index a9ba904267996..cf8f6c6e8e6a1 100644 --- a/content/cn/blog/tags/amazon-spark/index.html +++ b/content/cn/blog/tags/amazon-spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/amazon/index.html b/content/cn/blog/tags/amazon/index.html index c6316bd05321b..654af17aba3d5 100644 --- a/content/cn/blog/tags/amazon/index.html +++ b/content/cn/blog/tags/amazon/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/amazon/page/2/index.html b/content/cn/blog/tags/amazon/page/2/index.html index 677cbd50f87a0..2e3d269d0bb62 100644 --- a/content/cn/blog/tags/amazon/page/2/index.html +++ b/content/cn/blog/tags/amazon/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/amazon/page/3/index.html b/content/cn/blog/tags/amazon/page/3/index.html index dca146e7f20a2..cba21377e9d6f 100644 --- a/content/cn/blog/tags/amazon/page/3/index.html +++ b/content/cn/blog/tags/amazon/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/analytics-at-scale/index.html b/content/cn/blog/tags/analytics-at-scale/index.html index eb8cac171ace5..0e6d490e027c2 100644 --- a/content/cn/blog/tags/analytics-at-scale/index.html +++ b/content/cn/blog/tags/analytics-at-scale/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/analyticsinsight/index.html b/content/cn/blog/tags/analyticsinsight/index.html index 1016186ffb07c..1294751708dcb 100644 --- a/content/cn/blog/tags/analyticsinsight/index.html +++ b/content/cn/blog/tags/analyticsinsight/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/antstack/index.html b/content/cn/blog/tags/antstack/index.html index 6e336c0aa32e9..38c4eb470a99a 100644 --- a/content/cn/blog/tags/antstack/index.html +++ b/content/cn/blog/tags/antstack/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-avro/index.html b/content/cn/blog/tags/apache-avro/index.html index 05b677535cecd..74d7bdbd807fc 100644 --- a/content/cn/blog/tags/apache-avro/index.html +++ b/content/cn/blog/tags/apache-avro/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-dolphin-scheduler/index.html b/content/cn/blog/tags/apache-dolphin-scheduler/index.html index e60285528d163..9ae2e98eca0c2 100644 --- a/content/cn/blog/tags/apache-dolphin-scheduler/index.html +++ b/content/cn/blog/tags/apache-dolphin-scheduler/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-doris/index.html b/content/cn/blog/tags/apache-doris/index.html index 1f152b4083c3c..47508534de4d5 100644 --- a/content/cn/blog/tags/apache-doris/index.html +++ b/content/cn/blog/tags/apache-doris/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-flink/index.html b/content/cn/blog/tags/apache-flink/index.html index f780d0044297f..ef95021ead775 100644 --- a/content/cn/blog/tags/apache-flink/index.html +++ b/content/cn/blog/tags/apache-flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-hive/index.html b/content/cn/blog/tags/apache-hive/index.html index 3f74036169867..da0e12f9f1cc1 100644 --- a/content/cn/blog/tags/apache-hive/index.html +++ b/content/cn/blog/tags/apache-hive/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-hudi-blogs/index.html b/content/cn/blog/tags/apache-hudi-blogs/index.html index 60d677171d699..c23808742328e 100644 --- a/content/cn/blog/tags/apache-hudi-blogs/index.html +++ b/content/cn/blog/tags/apache-hudi-blogs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-hudi/index.html b/content/cn/blog/tags/apache-hudi/index.html index e8f3318d77313..540047471cc5c 100644 --- a/content/cn/blog/tags/apache-hudi/index.html +++ b/content/cn/blog/tags/apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-hudi/page/10/index.html b/content/cn/blog/tags/apache-hudi/page/10/index.html index e42a54a15084c..f63dec2bf2c0b 100644 --- a/content/cn/blog/tags/apache-hudi/page/10/index.html +++ b/content/cn/blog/tags/apache-hudi/page/10/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-hudi/page/11/index.html b/content/cn/blog/tags/apache-hudi/page/11/index.html index 9b591537f6ec7..0e29f4bfae499 100644 --- a/content/cn/blog/tags/apache-hudi/page/11/index.html +++ b/content/cn/blog/tags/apache-hudi/page/11/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-hudi/page/12/index.html b/content/cn/blog/tags/apache-hudi/page/12/index.html index 1a5fde16fa308..aab497455268d 100644 --- a/content/cn/blog/tags/apache-hudi/page/12/index.html +++ b/content/cn/blog/tags/apache-hudi/page/12/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-hudi/page/2/index.html b/content/cn/blog/tags/apache-hudi/page/2/index.html index 06569b734ed46..6222ae86e6372 100644 --- a/content/cn/blog/tags/apache-hudi/page/2/index.html +++ b/content/cn/blog/tags/apache-hudi/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-hudi/page/3/index.html b/content/cn/blog/tags/apache-hudi/page/3/index.html index af25fad9079b8..d6ca0e48a28cc 100644 --- a/content/cn/blog/tags/apache-hudi/page/3/index.html +++ b/content/cn/blog/tags/apache-hudi/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-hudi/page/4/index.html b/content/cn/blog/tags/apache-hudi/page/4/index.html index 9ae9972fcdbce..ed6d5db5663f5 100644 --- a/content/cn/blog/tags/apache-hudi/page/4/index.html +++ b/content/cn/blog/tags/apache-hudi/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-hudi/page/5/index.html b/content/cn/blog/tags/apache-hudi/page/5/index.html index 80958d919cd12..4a2e027ed1af8 100644 --- a/content/cn/blog/tags/apache-hudi/page/5/index.html +++ b/content/cn/blog/tags/apache-hudi/page/5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-hudi/page/6/index.html b/content/cn/blog/tags/apache-hudi/page/6/index.html index 6a4fa8d179ce6..c9d69d2c1fbd1 100644 --- a/content/cn/blog/tags/apache-hudi/page/6/index.html +++ b/content/cn/blog/tags/apache-hudi/page/6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-hudi/page/7/index.html b/content/cn/blog/tags/apache-hudi/page/7/index.html index 11341b28e95c1..2061af31d2268 100644 --- a/content/cn/blog/tags/apache-hudi/page/7/index.html +++ b/content/cn/blog/tags/apache-hudi/page/7/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-hudi/page/8/index.html b/content/cn/blog/tags/apache-hudi/page/8/index.html index 07d99b20c85c4..051a6aa403eb7 100644 --- a/content/cn/blog/tags/apache-hudi/page/8/index.html +++ b/content/cn/blog/tags/apache-hudi/page/8/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-hudi/page/9/index.html b/content/cn/blog/tags/apache-hudi/page/9/index.html index c85b656d6fe38..2a19dc60de7ec 100644 --- a/content/cn/blog/tags/apache-hudi/page/9/index.html +++ b/content/cn/blog/tags/apache-hudi/page/9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-iceberg/index.html b/content/cn/blog/tags/apache-iceberg/index.html index 72f9c7fa1b73a..b2a01f5667a54 100644 --- a/content/cn/blog/tags/apache-iceberg/index.html +++ b/content/cn/blog/tags/apache-iceberg/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-kafka/index.html b/content/cn/blog/tags/apache-kafka/index.html index 89b7848ba2972..e8c00d5957e8b 100644 --- a/content/cn/blog/tags/apache-kafka/index.html +++ b/content/cn/blog/tags/apache-kafka/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-orc/index.html b/content/cn/blog/tags/apache-orc/index.html index f9969c79ff791..db290bd120e37 100644 --- a/content/cn/blog/tags/apache-orc/index.html +++ b/content/cn/blog/tags/apache-orc/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-parquet/index.html b/content/cn/blog/tags/apache-parquet/index.html index e9456fa2cf8dd..e066b3bbb9433 100644 --- a/content/cn/blog/tags/apache-parquet/index.html +++ b/content/cn/blog/tags/apache-parquet/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-spark/index.html b/content/cn/blog/tags/apache-spark/index.html index 03e837e3a3e87..63fa1a8668bc8 100644 --- a/content/cn/blog/tags/apache-spark/index.html +++ b/content/cn/blog/tags/apache-spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-spark/page/2/index.html b/content/cn/blog/tags/apache-spark/page/2/index.html index ce3cdd160e9d1..304465e5723aa 100644 --- a/content/cn/blog/tags/apache-spark/page/2/index.html +++ b/content/cn/blog/tags/apache-spark/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache-zeppelin/index.html b/content/cn/blog/tags/apache-zeppelin/index.html index 3085143547188..6a4ce877e78a2 100644 --- a/content/cn/blog/tags/apache-zeppelin/index.html +++ b/content/cn/blog/tags/apache-zeppelin/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apache/index.html b/content/cn/blog/tags/apache/index.html index 9fb02662fbb73..c65d6f6362ecc 100644 --- a/content/cn/blog/tags/apache/index.html +++ b/content/cn/blog/tags/apache/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apcache-spark/index.html b/content/cn/blog/tags/apcache-spark/index.html index 28d1d9a9b3530..4f4a72d13c80e 100644 --- a/content/cn/blog/tags/apcache-spark/index.html +++ b/content/cn/blog/tags/apcache-spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/apicurio-registry/index.html b/content/cn/blog/tags/apicurio-registry/index.html index 752f3356e4749..f8ab7a179638f 100644 --- a/content/cn/blog/tags/apicurio-registry/index.html +++ b/content/cn/blog/tags/apicurio-registry/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/architecture/index.html b/content/cn/blog/tags/architecture/index.html index cc686cfe90763..654f1b653d748 100644 --- a/content/cn/blog/tags/architecture/index.html +++ b/content/cn/blog/tags/architecture/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/archival-timeline/index.html b/content/cn/blog/tags/archival-timeline/index.html index e6ac560eb8fa8..8fcb98f69010a 100644 --- a/content/cn/blog/tags/archival-timeline/index.html +++ b/content/cn/blog/tags/archival-timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/async-indexing/index.html b/content/cn/blog/tags/async-indexing/index.html index ca7e93f9785d8..0ab94e503d116 100644 --- a/content/cn/blog/tags/async-indexing/index.html +++ b/content/cn/blog/tags/async-indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/athena/index.html b/content/cn/blog/tags/athena/index.html index 7856b1737d3af..fe663b1f2bd15 100644 --- a/content/cn/blog/tags/athena/index.html +++ b/content/cn/blog/tags/athena/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/aws-athena/index.html b/content/cn/blog/tags/aws-athena/index.html index 18360dd543847..4073aec7844e7 100644 --- a/content/cn/blog/tags/aws-athena/index.html +++ b/content/cn/blog/tags/aws-athena/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/aws-cloud-9/index.html b/content/cn/blog/tags/aws-cloud-9/index.html index 945d6c8b7c402..2cfaec53b4e42 100644 --- a/content/cn/blog/tags/aws-cloud-9/index.html +++ b/content/cn/blog/tags/aws-cloud-9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/aws-data-exchange/index.html b/content/cn/blog/tags/aws-data-exchange/index.html index 78fc726f3b719..e9b6bd87d4171 100644 --- a/content/cn/blog/tags/aws-data-exchange/index.html +++ b/content/cn/blog/tags/aws-data-exchange/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/aws-emr/index.html b/content/cn/blog/tags/aws-emr/index.html index 4b04e203b5dc5..b78ba5a4d7efa 100644 --- a/content/cn/blog/tags/aws-emr/index.html +++ b/content/cn/blog/tags/aws-emr/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/aws-glue-crawlers/index.html b/content/cn/blog/tags/aws-glue-crawlers/index.html index 2d3909c5e8713..47ca8e1d72bfe 100644 --- a/content/cn/blog/tags/aws-glue-crawlers/index.html +++ b/content/cn/blog/tags/aws-glue-crawlers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/aws-glue/index.html b/content/cn/blog/tags/aws-glue/index.html index 3c8f9cc82568f..b273779349559 100644 --- a/content/cn/blog/tags/aws-glue/index.html +++ b/content/cn/blog/tags/aws-glue/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/aws-glue/page/2/index.html b/content/cn/blog/tags/aws-glue/page/2/index.html index fb131e45b7bb0..e4e653ed0c065 100644 --- a/content/cn/blog/tags/aws-glue/page/2/index.html +++ b/content/cn/blog/tags/aws-glue/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/aws-lake-formation/index.html b/content/cn/blog/tags/aws-lake-formation/index.html index 503b2c3278d05..21afdc1758ae1 100644 --- a/content/cn/blog/tags/aws-lake-formation/index.html +++ b/content/cn/blog/tags/aws-lake-formation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/aws-s-3/index.html b/content/cn/blog/tags/aws-s-3/index.html index 223e609149e93..ac2a39cf0bb9d 100644 --- a/content/cn/blog/tags/aws-s-3/index.html +++ b/content/cn/blog/tags/aws-s-3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/aws/index.html b/content/cn/blog/tags/aws/index.html index 8b536ac6101f4..88a2d9ac949ba 100644 --- a/content/cn/blog/tags/aws/index.html +++ b/content/cn/blog/tags/aws/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/backfilling/index.html b/content/cn/blog/tags/backfilling/index.html index b1c3db010b4d9..fffe7bacc3e05 100644 --- a/content/cn/blog/tags/backfilling/index.html +++ b/content/cn/blog/tags/backfilling/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/beginner/index.html b/content/cn/blog/tags/beginner/index.html index 2ce02dce2addb..441cc3cda24ef 100644 --- a/content/cn/blog/tags/beginner/index.html +++ b/content/cn/blog/tags/beginner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/beginner/page/2/index.html b/content/cn/blog/tags/beginner/page/2/index.html index 858b63e4eece0..8699b027dbc17 100644 --- a/content/cn/blog/tags/beginner/page/2/index.html +++ b/content/cn/blog/tags/beginner/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/best-practices/index.html b/content/cn/blog/tags/best-practices/index.html index 3c188d1e0929a..ec748d7a9ea76 100644 --- a/content/cn/blog/tags/best-practices/index.html +++ b/content/cn/blog/tags/best-practices/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/big-data/index.html b/content/cn/blog/tags/big-data/index.html index 3b4b04015a8a9..5ca5735e50870 100644 --- a/content/cn/blog/tags/big-data/index.html +++ b/content/cn/blog/tags/big-data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/bigdata/index.html b/content/cn/blog/tags/bigdata/index.html index 163d8e69f3458..d535b8def4629 100644 --- a/content/cn/blog/tags/bigdata/index.html +++ b/content/cn/blog/tags/bigdata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/blog/index.html b/content/cn/blog/tags/blog/index.html index 4311d9a6b18e9..9fff09f20cbc7 100644 --- a/content/cn/blog/tags/blog/index.html +++ b/content/cn/blog/tags/blog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/blog/page/10/index.html b/content/cn/blog/tags/blog/page/10/index.html index 36111bf5921e9..c0a646d2d0818 100644 --- a/content/cn/blog/tags/blog/page/10/index.html +++ b/content/cn/blog/tags/blog/page/10/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/blog/page/11/index.html b/content/cn/blog/tags/blog/page/11/index.html index 294482b6baf08..c2419a90750c1 100644 --- a/content/cn/blog/tags/blog/page/11/index.html +++ b/content/cn/blog/tags/blog/page/11/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/blog/page/12/index.html b/content/cn/blog/tags/blog/page/12/index.html index dbb1cbe937784..7b8b63c562dec 100644 --- a/content/cn/blog/tags/blog/page/12/index.html +++ b/content/cn/blog/tags/blog/page/12/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/blog/page/2/index.html b/content/cn/blog/tags/blog/page/2/index.html index ab2e8d064c422..166dc4c21aadc 100644 --- a/content/cn/blog/tags/blog/page/2/index.html +++ b/content/cn/blog/tags/blog/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/blog/page/3/index.html b/content/cn/blog/tags/blog/page/3/index.html index 22167889054ff..237b1d361c0a0 100644 --- a/content/cn/blog/tags/blog/page/3/index.html +++ b/content/cn/blog/tags/blog/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/blog/page/4/index.html b/content/cn/blog/tags/blog/page/4/index.html index 3b22f891c9ca6..fde00cffcc121 100644 --- a/content/cn/blog/tags/blog/page/4/index.html +++ b/content/cn/blog/tags/blog/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/blog/page/5/index.html b/content/cn/blog/tags/blog/page/5/index.html index ac6694208879b..c75c053123d0e 100644 --- a/content/cn/blog/tags/blog/page/5/index.html +++ b/content/cn/blog/tags/blog/page/5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/blog/page/6/index.html b/content/cn/blog/tags/blog/page/6/index.html index 35f8d3bee22f0..e2de1b936f21b 100644 --- a/content/cn/blog/tags/blog/page/6/index.html +++ b/content/cn/blog/tags/blog/page/6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/blog/page/7/index.html b/content/cn/blog/tags/blog/page/7/index.html index 3f453d59cf524..66cd037bef535 100644 --- a/content/cn/blog/tags/blog/page/7/index.html +++ b/content/cn/blog/tags/blog/page/7/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/blog/page/8/index.html b/content/cn/blog/tags/blog/page/8/index.html index 239cdcdf906d8..29a5543377a21 100644 --- a/content/cn/blog/tags/blog/page/8/index.html +++ b/content/cn/blog/tags/blog/page/8/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/blog/page/9/index.html b/content/cn/blog/tags/blog/page/9/index.html index 6ee621d4b1c51..6ccf914dc0585 100644 --- a/content/cn/blog/tags/blog/page/9/index.html +++ b/content/cn/blog/tags/blog/page/9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/bloom-index/index.html b/content/cn/blog/tags/bloom-index/index.html index edd2eb68297a4..64baf8ae6de5f 100644 --- a/content/cn/blog/tags/bloom-index/index.html +++ b/content/cn/blog/tags/bloom-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/bloom/index.html b/content/cn/blog/tags/bloom/index.html index 2df1f63409196..910e48f0eb1c6 100644 --- a/content/cn/blog/tags/bloom/index.html +++ b/content/cn/blog/tags/bloom/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/bootstrap/index.html b/content/cn/blog/tags/bootstrap/index.html index 6e3c2724aa11d..56ea2f82a3ee8 100644 --- a/content/cn/blog/tags/bootstrap/index.html +++ b/content/cn/blog/tags/bootstrap/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/bucket-index/index.html b/content/cn/blog/tags/bucket-index/index.html index a046af34781bd..e00bc9ae28334 100644 --- a/content/cn/blog/tags/bucket-index/index.html +++ b/content/cn/blog/tags/bucket-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/bulk-insert/index.html b/content/cn/blog/tags/bulk-insert/index.html index 4c7395f8221f9..8a146d1390fc0 100644 --- a/content/cn/blog/tags/bulk-insert/index.html +++ b/content/cn/blog/tags/bulk-insert/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/bytearray/index.html b/content/cn/blog/tags/bytearray/index.html index f05854d060509..dfbc6f0c9d79a 100644 --- a/content/cn/blog/tags/bytearray/index.html +++ b/content/cn/blog/tags/bytearray/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/bytebytego/index.html b/content/cn/blog/tags/bytebytego/index.html index bdd2df09a5afe..4d58578938035 100644 --- a/content/cn/blog/tags/bytebytego/index.html +++ b/content/cn/blog/tags/bytebytego/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/caching/index.html b/content/cn/blog/tags/caching/index.html index cb19a13fc28b1..d3161b3428d5e 100644 --- a/content/cn/blog/tags/caching/index.html +++ b/content/cn/blog/tags/caching/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/case-study/index.html b/content/cn/blog/tags/case-study/index.html index be6f139abe3f7..44cd500fa92b4 100644 --- a/content/cn/blog/tags/case-study/index.html +++ b/content/cn/blog/tags/case-study/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/cdc/index.html b/content/cn/blog/tags/cdc/index.html index cac1f81793a3b..63a83e14a3979 100644 --- a/content/cn/blog/tags/cdc/index.html +++ b/content/cn/blog/tags/cdc/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/change-data-capture/index.html b/content/cn/blog/tags/change-data-capture/index.html index e41adf2e74e0b..604eb5db8b2de 100644 --- a/content/cn/blog/tags/change-data-capture/index.html +++ b/content/cn/blog/tags/change-data-capture/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/cleaner/index.html b/content/cn/blog/tags/cleaner/index.html index 5fd1f0be5e201..e10219bcbdd39 100644 --- a/content/cn/blog/tags/cleaner/index.html +++ b/content/cn/blog/tags/cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/cleaning/index.html b/content/cn/blog/tags/cleaning/index.html index 9fb067310440f..32d4d37b91d88 100644 --- a/content/cn/blog/tags/cleaning/index.html +++ b/content/cn/blog/tags/cleaning/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/cloudthat/index.html b/content/cn/blog/tags/cloudthat/index.html index 615415e305ef4..05217905e42ac 100644 --- a/content/cn/blog/tags/cloudthat/index.html +++ b/content/cn/blog/tags/cloudthat/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/clustering/index.html b/content/cn/blog/tags/clustering/index.html index 2b4728519f148..ae64f9266a9be 100644 --- a/content/cn/blog/tags/clustering/index.html +++ b/content/cn/blog/tags/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/code-sample/index.html b/content/cn/blog/tags/code-sample/index.html index 4053e6ba4a5fd..eb84d50b05513 100644 --- a/content/cn/blog/tags/code-sample/index.html +++ b/content/cn/blog/tags/code-sample/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/commits/index.html b/content/cn/blog/tags/commits/index.html index 0d4131cc38893..115477b10f002 100644 --- a/content/cn/blog/tags/commits/index.html +++ b/content/cn/blog/tags/commits/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/community/index.html b/content/cn/blog/tags/community/index.html index 676eee0eb17e2..f5b17565eb5b0 100644 --- a/content/cn/blog/tags/community/index.html +++ b/content/cn/blog/tags/community/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/compaction/index.html b/content/cn/blog/tags/compaction/index.html index 893d12a51e32e..b282e9cde3ab4 100644 --- a/content/cn/blog/tags/compaction/index.html +++ b/content/cn/blog/tags/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/comparison/index.html b/content/cn/blog/tags/comparison/index.html index df84c86fae5cc..6afb5fbd4115c 100644 --- a/content/cn/blog/tags/comparison/index.html +++ b/content/cn/blog/tags/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/comparison/page/2/index.html b/content/cn/blog/tags/comparison/page/2/index.html index 93bdc2348f922..13ba78bb5bbf0 100644 --- a/content/cn/blog/tags/comparison/page/2/index.html +++ b/content/cn/blog/tags/comparison/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/compression/index.html b/content/cn/blog/tags/compression/index.html index eb6e4e2d010a2..f93422d3e09cc 100644 --- a/content/cn/blog/tags/compression/index.html +++ b/content/cn/blog/tags/compression/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/concurrency-control/index.html b/content/cn/blog/tags/concurrency-control/index.html index b88ec4167c0a8..1fb3892aa591c 100644 --- a/content/cn/blog/tags/concurrency-control/index.html +++ b/content/cn/blog/tags/concurrency-control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/concurrency/index.html b/content/cn/blog/tags/concurrency/index.html index 31ed09ccfa3a4..d2536862de19b 100644 --- a/content/cn/blog/tags/concurrency/index.html +++ b/content/cn/blog/tags/concurrency/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/conference/index.html b/content/cn/blog/tags/conference/index.html index 9627cbba0484a..96bbe6b695b40 100644 --- a/content/cn/blog/tags/conference/index.html +++ b/content/cn/blog/tags/conference/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/consistency/index.html b/content/cn/blog/tags/consistency/index.html index ad9b7699de0b4..404e793bf1fa3 100644 --- a/content/cn/blog/tags/consistency/index.html +++ b/content/cn/blog/tags/consistency/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/cost-efficiency/index.html b/content/cn/blog/tags/cost-efficiency/index.html index b1f7fc4e673bf..631ce4488415b 100644 --- a/content/cn/blog/tags/cost-efficiency/index.html +++ b/content/cn/blog/tags/cost-efficiency/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/cost-optimization/index.html b/content/cn/blog/tags/cost-optimization/index.html index a5dd27b71886c..8d914a4867c5d 100644 --- a/content/cn/blog/tags/cost-optimization/index.html +++ b/content/cn/blog/tags/cost-optimization/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/cost/index.html b/content/cn/blog/tags/cost/index.html index 5620c1e4b3b91..f23236c4f0215 100644 --- a/content/cn/blog/tags/cost/index.html +++ b/content/cn/blog/tags/cost/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/cow/index.html b/content/cn/blog/tags/cow/index.html index 9d1e2261b6a93..39bc957d8e0fc 100644 --- a/content/cn/blog/tags/cow/index.html +++ b/content/cn/blog/tags/cow/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/daft/index.html b/content/cn/blog/tags/daft/index.html index 656a803ab9b0c..bba5dea5babdc 100644 --- a/content/cn/blog/tags/daft/index.html +++ b/content/cn/blog/tags/daft/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/data-lake/index.html b/content/cn/blog/tags/data-lake/index.html index 9d2a4eea28936..7e1c731075baf 100644 --- a/content/cn/blog/tags/data-lake/index.html +++ b/content/cn/blog/tags/data-lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/data-lakehouse/index.html b/content/cn/blog/tags/data-lakehouse/index.html index 61fbe3474a6f8..1b1b964699c18 100644 --- a/content/cn/blog/tags/data-lakehouse/index.html +++ b/content/cn/blog/tags/data-lakehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/data-mesh/index.html b/content/cn/blog/tags/data-mesh/index.html index e7710dc4dd0a9..56ce2ef2396d7 100644 --- a/content/cn/blog/tags/data-mesh/index.html +++ b/content/cn/blog/tags/data-mesh/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/data-platform/index.html b/content/cn/blog/tags/data-platform/index.html index 0fff5c6af298d..0db7efa472970 100644 --- a/content/cn/blog/tags/data-platform/index.html +++ b/content/cn/blog/tags/data-platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/data-processing/index.html b/content/cn/blog/tags/data-processing/index.html index 0e65d6cf456cc..69c4b59e75987 100644 --- a/content/cn/blog/tags/data-processing/index.html +++ b/content/cn/blog/tags/data-processing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/data-sahring/index.html b/content/cn/blog/tags/data-sahring/index.html index f7305cb01dc52..5b99db256037e 100644 --- a/content/cn/blog/tags/data-sahring/index.html +++ b/content/cn/blog/tags/data-sahring/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/data-skipping/index.html b/content/cn/blog/tags/data-skipping/index.html index 04592aaebc4b6..204cd13232a1d 100644 --- a/content/cn/blog/tags/data-skipping/index.html +++ b/content/cn/blog/tags/data-skipping/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/data-warehouse/index.html b/content/cn/blog/tags/data-warehouse/index.html index 727b5838a85f7..67c8f548885b0 100644 --- a/content/cn/blog/tags/data-warehouse/index.html +++ b/content/cn/blog/tags/data-warehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/databricks/index.html b/content/cn/blog/tags/databricks/index.html index b51a0dd4c662c..8a5983276d2a9 100644 --- a/content/cn/blog/tags/databricks/index.html +++ b/content/cn/blog/tags/databricks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/datalake-platform/index.html b/content/cn/blog/tags/datalake-platform/index.html index a118ed4ddc73d..78c0a9965a044 100644 --- a/content/cn/blog/tags/datalake-platform/index.html +++ b/content/cn/blog/tags/datalake-platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/datalake/index.html b/content/cn/blog/tags/datalake/index.html index 1d1f3464f0055..da910021e9a05 100644 --- a/content/cn/blog/tags/datalake/index.html +++ b/content/cn/blog/tags/datalake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/datumagic/index.html b/content/cn/blog/tags/datumagic/index.html index 19e00efd45ab9..8bd924cb144b9 100644 --- a/content/cn/blog/tags/datumagic/index.html +++ b/content/cn/blog/tags/datumagic/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/dbta/index.html b/content/cn/blog/tags/dbta/index.html index 8c81a958d60cc..27f643a458f5b 100644 --- a/content/cn/blog/tags/dbta/index.html +++ b/content/cn/blog/tags/dbta/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/debezium/index.html b/content/cn/blog/tags/debezium/index.html index 6fc324e08f8d3..7d0022703af35 100644 --- a/content/cn/blog/tags/debezium/index.html +++ b/content/cn/blog/tags/debezium/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/deep-dive/index.html b/content/cn/blog/tags/deep-dive/index.html index 527bbe16b94c3..a2fdce766b633 100644 --- a/content/cn/blog/tags/deep-dive/index.html +++ b/content/cn/blog/tags/deep-dive/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/defogdata/index.html b/content/cn/blog/tags/defogdata/index.html index 349b77ffb6d72..41ad148eabaf6 100644 --- a/content/cn/blog/tags/defogdata/index.html +++ b/content/cn/blog/tags/defogdata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/delete-partition/index.html b/content/cn/blog/tags/delete-partition/index.html index 7ef04fd05a076..da35ace5cee32 100644 --- a/content/cn/blog/tags/delete-partition/index.html +++ b/content/cn/blog/tags/delete-partition/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/delete/index.html b/content/cn/blog/tags/delete/index.html index a1b78b4816ae7..2523be2325e37 100644 --- a/content/cn/blog/tags/delete/index.html +++ b/content/cn/blog/tags/delete/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/deletes/index.html b/content/cn/blog/tags/deletes/index.html index cac3a4231c48e..fbef3c228416a 100644 --- a/content/cn/blog/tags/deletes/index.html +++ b/content/cn/blog/tags/deletes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/delta-lake/index.html b/content/cn/blog/tags/delta-lake/index.html index 59d568beb49b7..ac03f86d8adc7 100644 --- a/content/cn/blog/tags/delta-lake/index.html +++ b/content/cn/blog/tags/delta-lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/delta-lake/page/2/index.html b/content/cn/blog/tags/delta-lake/page/2/index.html index 2c5dc806af6fe..b833da7c72372 100644 --- a/content/cn/blog/tags/delta-lake/page/2/index.html +++ b/content/cn/blog/tags/delta-lake/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/delta/index.html b/content/cn/blog/tags/delta/index.html index f727b598a84ba..37a26b2733450 100644 --- a/content/cn/blog/tags/delta/index.html +++ b/content/cn/blog/tags/delta/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/deltastreamer/index.html b/content/cn/blog/tags/deltastreamer/index.html index b5398880a34d4..0bf25562f1b5f 100644 --- a/content/cn/blog/tags/deltastreamer/index.html +++ b/content/cn/blog/tags/deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/deployment/index.html b/content/cn/blog/tags/deployment/index.html index 6bace1e3ec13f..62fdad3694621 100644 --- a/content/cn/blog/tags/deployment/index.html +++ b/content/cn/blog/tags/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/design/index.html b/content/cn/blog/tags/design/index.html index 69ebf82b40bfe..eb0900ab1ae4b 100644 --- a/content/cn/blog/tags/design/index.html +++ b/content/cn/blog/tags/design/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/design/page/2/index.html b/content/cn/blog/tags/design/page/2/index.html index 8db6531947939..0eb3ddde9e9dd 100644 --- a/content/cn/blog/tags/design/page/2/index.html +++ b/content/cn/blog/tags/design/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/det/index.html b/content/cn/blog/tags/det/index.html index 4e4c59b610532..d8cdca084350c 100644 --- a/content/cn/blog/tags/det/index.html +++ b/content/cn/blog/tags/det/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/dev-to/index.html b/content/cn/blog/tags/dev-to/index.html index be793f9a9ea80..c08215a566238 100644 --- a/content/cn/blog/tags/dev-to/index.html +++ b/content/cn/blog/tags/dev-to/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/developpaper/index.html b/content/cn/blog/tags/developpaper/index.html index 149d04ba79823..fd93864bacf72 100644 --- a/content/cn/blog/tags/developpaper/index.html +++ b/content/cn/blog/tags/developpaper/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/devgenius/index.html b/content/cn/blog/tags/devgenius/index.html index 2e9f61826d682..ce85fc8e49417 100644 --- a/content/cn/blog/tags/devgenius/index.html +++ b/content/cn/blog/tags/devgenius/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/diva-portal/index.html b/content/cn/blog/tags/diva-portal/index.html index 67932119d0175..eed9f732e3957 100644 --- a/content/cn/blog/tags/diva-portal/index.html +++ b/content/cn/blog/tags/diva-portal/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/docker/index.html b/content/cn/blog/tags/docker/index.html index 9eaf871f443d2..f27700eb5ffdd 100644 --- a/content/cn/blog/tags/docker/index.html +++ b/content/cn/blog/tags/docker/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/dremio/index.html b/content/cn/blog/tags/dremio/index.html index 3a9dd27ad9d62..6053698efbde7 100644 --- a/content/cn/blog/tags/dremio/index.html +++ b/content/cn/blog/tags/dremio/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/dzone/index.html b/content/cn/blog/tags/dzone/index.html index 28b14739c80ea..720a8b5079b55 100644 --- a/content/cn/blog/tags/dzone/index.html +++ b/content/cn/blog/tags/dzone/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/etl/index.html b/content/cn/blog/tags/etl/index.html index a81b5beb68e0f..abd33f083cd3e 100644 --- a/content/cn/blog/tags/etl/index.html +++ b/content/cn/blog/tags/etl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/fast-api/index.html b/content/cn/blog/tags/fast-api/index.html index 24ad93e9bc1b7..2a0f0f5be62bf 100644 --- a/content/cn/blog/tags/fast-api/index.html +++ b/content/cn/blog/tags/fast-api/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/feature-store/index.html b/content/cn/blog/tags/feature-store/index.html index e0506dd2ad409..b09d1cd4dac7d 100644 --- a/content/cn/blog/tags/feature-store/index.html +++ b/content/cn/blog/tags/feature-store/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/fiel-sizing/index.html b/content/cn/blog/tags/fiel-sizing/index.html index b9c13803d6f41..de56b2b64fee2 100644 --- a/content/cn/blog/tags/fiel-sizing/index.html +++ b/content/cn/blog/tags/fiel-sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/file-sizing/index.html b/content/cn/blog/tags/file-sizing/index.html index efc4b6c2c43da..d60dcaa61a69a 100644 --- a/content/cn/blog/tags/file-sizing/index.html +++ b/content/cn/blog/tags/file-sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/file-system-view/index.html b/content/cn/blog/tags/file-system-view/index.html index 4be7e066abd21..1ef8d875f15f4 100644 --- a/content/cn/blog/tags/file-system-view/index.html +++ b/content/cn/blog/tags/file-system-view/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/flink/index.html b/content/cn/blog/tags/flink/index.html index 8461a2659ba02..121a5fd9251bc 100644 --- a/content/cn/blog/tags/flink/index.html +++ b/content/cn/blog/tags/flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/forefathers/index.html b/content/cn/blog/tags/forefathers/index.html index 39173cfe70b55..acb7be9d0da41 100644 --- a/content/cn/blog/tags/forefathers/index.html +++ b/content/cn/blog/tags/forefathers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/gdpr-deletion/index.html b/content/cn/blog/tags/gdpr-deletion/index.html index 60c3b21a9a789..836d225c1c38b 100644 --- a/content/cn/blog/tags/gdpr-deletion/index.html +++ b/content/cn/blog/tags/gdpr-deletion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/getting-started/index.html b/content/cn/blog/tags/getting-started/index.html index be785bc137302..64e2fd1a7e328 100644 --- a/content/cn/blog/tags/getting-started/index.html +++ b/content/cn/blog/tags/getting-started/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/glue-crawler/index.html b/content/cn/blog/tags/glue-crawler/index.html index 758ae1b8c154c..fa0117800ce1f 100644 --- a/content/cn/blog/tags/glue-crawler/index.html +++ b/content/cn/blog/tags/glue-crawler/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/glue-studio/index.html b/content/cn/blog/tags/glue-studio/index.html index 4935411a0d1ab..446b62ae1bad8 100644 --- a/content/cn/blog/tags/glue-studio/index.html +++ b/content/cn/blog/tags/glue-studio/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/google-scholar/index.html b/content/cn/blog/tags/google-scholar/index.html index 1748dd0d42fd0..1e50366e03d61 100644 --- a/content/cn/blog/tags/google-scholar/index.html +++ b/content/cn/blog/tags/google-scholar/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/grab/index.html b/content/cn/blog/tags/grab/index.html index 7abbe8275cc5b..c195f186f44e0 100644 --- a/content/cn/blog/tags/grab/index.html +++ b/content/cn/blog/tags/grab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/grofers/index.html b/content/cn/blog/tags/grofers/index.html index 30dd8f7685d8a..5fb004ed61c82 100644 --- a/content/cn/blog/tags/grofers/index.html +++ b/content/cn/blog/tags/grofers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/guide/index.html b/content/cn/blog/tags/guide/index.html index 165fe9837e7e2..3f351d8f932c8 100644 --- a/content/cn/blog/tags/guide/index.html +++ b/content/cn/blog/tags/guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/halodoc/index.html b/content/cn/blog/tags/halodoc/index.html index 7bf68f7ed6049..c74f8c99ee21e 100644 --- a/content/cn/blog/tags/halodoc/index.html +++ b/content/cn/blog/tags/halodoc/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/harshdaiya/index.html b/content/cn/blog/tags/harshdaiya/index.html index 1aa7b68c376cd..4e171402c1815 100644 --- a/content/cn/blog/tags/harshdaiya/index.html +++ b/content/cn/blog/tags/harshdaiya/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/hbase-index/index.html b/content/cn/blog/tags/hbase-index/index.html index a8b3254eb4ba0..c7d655900ffca 100644 --- a/content/cn/blog/tags/hbase-index/index.html +++ b/content/cn/blog/tags/hbase-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/hive-metastore/index.html b/content/cn/blog/tags/hive-metastore/index.html index 2fa8031ca52c7..6685807e86148 100644 --- a/content/cn/blog/tags/hive-metastore/index.html +++ b/content/cn/blog/tags/hive-metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/hms/index.html b/content/cn/blog/tags/hms/index.html index 94f69cc82bb20..bcbe35ef8e698 100644 --- a/content/cn/blog/tags/hms/index.html +++ b/content/cn/blog/tags/hms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/hopsworks/index.html b/content/cn/blog/tags/hopsworks/index.html index 7d1e296ccacb5..3e666946ffc4f 100644 --- a/content/cn/blog/tags/hopsworks/index.html +++ b/content/cn/blog/tags/hopsworks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/how-to/index.html b/content/cn/blog/tags/how-to/index.html index 984478b3f9e3a..f9b975855e8f5 100644 --- a/content/cn/blog/tags/how-to/index.html +++ b/content/cn/blog/tags/how-to/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/how-to/page/2/index.html b/content/cn/blog/tags/how-to/page/2/index.html index b5155524f202b..342844dde6147 100644 --- a/content/cn/blog/tags/how-to/page/2/index.html +++ b/content/cn/blog/tags/how-to/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/how-to/page/3/index.html b/content/cn/blog/tags/how-to/page/3/index.html index dddd3a82eb2af..fafe8b02f65f6 100644 --- a/content/cn/blog/tags/how-to/page/3/index.html +++ b/content/cn/blog/tags/how-to/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/how-to/page/4/index.html b/content/cn/blog/tags/how-to/page/4/index.html index d89b782b2649a..fe929f4ed607c 100644 --- a/content/cn/blog/tags/how-to/page/4/index.html +++ b/content/cn/blog/tags/how-to/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/how-to/page/5/index.html b/content/cn/blog/tags/how-to/page/5/index.html index 833f49856931a..15b61bce25a46 100644 --- a/content/cn/blog/tags/how-to/page/5/index.html +++ b/content/cn/blog/tags/how-to/page/5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/hudi-cli/index.html b/content/cn/blog/tags/hudi-cli/index.html index df7ddd7c8bf4e..c517f5be5bd5c 100644 --- a/content/cn/blog/tags/hudi-cli/index.html +++ b/content/cn/blog/tags/hudi-cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/hudi-streamer/index.html b/content/cn/blog/tags/hudi-streamer/index.html index 7e7a3c89fccc0..5a40937b40fea 100644 --- a/content/cn/blog/tags/hudi-streamer/index.html +++ b/content/cn/blog/tags/hudi-streamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/hudi/index.html b/content/cn/blog/tags/hudi/index.html index 2b2ff67ef5c08..9cecda59c011f 100644 --- a/content/cn/blog/tags/hudi/index.html +++ b/content/cn/blog/tags/hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/iceberg/index.html b/content/cn/blog/tags/iceberg/index.html index 236120ebfda8b..7a7ac22f660cd 100644 --- a/content/cn/blog/tags/iceberg/index.html +++ b/content/cn/blog/tags/iceberg/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/incremental-etl/index.html b/content/cn/blog/tags/incremental-etl/index.html index d9c4b6f5f8d0f..f41160d57ce31 100644 --- a/content/cn/blog/tags/incremental-etl/index.html +++ b/content/cn/blog/tags/incremental-etl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/incremental-processing/index.html b/content/cn/blog/tags/incremental-processing/index.html index a1fc39b180e01..cbd36beaa0b3a 100644 --- a/content/cn/blog/tags/incremental-processing/index.html +++ b/content/cn/blog/tags/incremental-processing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/incremental-processing/page/2/index.html b/content/cn/blog/tags/incremental-processing/page/2/index.html index b01f9bc1af882..80455c7e9a91c 100644 --- a/content/cn/blog/tags/incremental-processing/page/2/index.html +++ b/content/cn/blog/tags/incremental-processing/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/incremental-query/index.html b/content/cn/blog/tags/incremental-query/index.html index 5556bae2e45c7..a5e97f8278df6 100644 --- a/content/cn/blog/tags/incremental-query/index.html +++ b/content/cn/blog/tags/incremental-query/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/incremental-updates/index.html b/content/cn/blog/tags/incremental-updates/index.html index 7245a33c20e19..ccb28a2cb2905 100644 --- a/content/cn/blog/tags/incremental-updates/index.html +++ b/content/cn/blog/tags/incremental-updates/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/index.html b/content/cn/blog/tags/index.html index 8a262164d2992..3c66bd076ba7d 100644 --- a/content/cn/blog/tags/index.html +++ b/content/cn/blog/tags/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/indexing/index.html b/content/cn/blog/tags/indexing/index.html index e8be551e10606..797c7cbb9cc6e 100644 --- a/content/cn/blog/tags/indexing/index.html +++ b/content/cn/blog/tags/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/inserts/index.html b/content/cn/blog/tags/inserts/index.html index f6bb1538c4ec7..d5dff9e3a6e64 100644 --- a/content/cn/blog/tags/inserts/index.html +++ b/content/cn/blog/tags/inserts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/intermediate/index.html b/content/cn/blog/tags/intermediate/index.html index fc37b279119aa..277bb306b4bb9 100644 --- a/content/cn/blog/tags/intermediate/index.html +++ b/content/cn/blog/tags/intermediate/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/interoperability/index.html b/content/cn/blog/tags/interoperability/index.html index 5c504def2a379..63ecbbc47869a 100644 --- a/content/cn/blog/tags/interoperability/index.html +++ b/content/cn/blog/tags/interoperability/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/introduction/index.html b/content/cn/blog/tags/introduction/index.html index 2c0fa95045aa5..1c3f8ae6d3230 100644 --- a/content/cn/blog/tags/introduction/index.html +++ b/content/cn/blog/tags/introduction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/itnext/index.html b/content/cn/blog/tags/itnext/index.html index 7492318063dc2..6541b26755776 100644 --- a/content/cn/blog/tags/itnext/index.html +++ b/content/cn/blog/tags/itnext/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/jack-vanlightly/index.html b/content/cn/blog/tags/jack-vanlightly/index.html index d0d47a4d7525d..9813c3d1341eb 100644 --- a/content/cn/blog/tags/jack-vanlightly/index.html +++ b/content/cn/blog/tags/jack-vanlightly/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/kafka-connect/index.html b/content/cn/blog/tags/kafka-connect/index.html index 45fddf08d2029..08eb2677afa97 100644 --- a/content/cn/blog/tags/kafka-connect/index.html +++ b/content/cn/blog/tags/kafka-connect/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/key-generators/index.html b/content/cn/blog/tags/key-generators/index.html index 1cb875202a474..261f0e50e472d 100644 --- a/content/cn/blog/tags/key-generators/index.html +++ b/content/cn/blog/tags/key-generators/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/lakefs/index.html b/content/cn/blog/tags/lakefs/index.html index ffb5c920cb425..52655d8c41298 100644 --- a/content/cn/blog/tags/lakefs/index.html +++ b/content/cn/blog/tags/lakefs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/lakehouse/index.html b/content/cn/blog/tags/lakehouse/index.html index 31af41797c3f1..31981e1b1ec6d 100644 --- a/content/cn/blog/tags/lakehouse/index.html +++ b/content/cn/blog/tags/lakehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/leboncoin-tech-blog/index.html b/content/cn/blog/tags/leboncoin-tech-blog/index.html index c9847a7681106..52781235d9477 100644 --- a/content/cn/blog/tags/leboncoin-tech-blog/index.html +++ b/content/cn/blog/tags/leboncoin-tech-blog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/linkedin/index.html b/content/cn/blog/tags/linkedin/index.html index f5a4a6a899e66..6d468ccae3595 100644 --- a/content/cn/blog/tags/linkedin/index.html +++ b/content/cn/blog/tags/linkedin/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/linkedin/page/2/index.html b/content/cn/blog/tags/linkedin/page/2/index.html index 702201e4cc3fa..62ddbd1d58fcf 100644 --- a/content/cn/blog/tags/linkedin/page/2/index.html +++ b/content/cn/blog/tags/linkedin/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/lock-provider/index.html b/content/cn/blog/tags/lock-provider/index.html index 64c8f30204132..6045bb9eff9d5 100644 --- a/content/cn/blog/tags/lock-provider/index.html +++ b/content/cn/blog/tags/lock-provider/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/logicalclocks/index.html b/content/cn/blog/tags/logicalclocks/index.html index af6d167e003be..10601d952ab55 100644 --- a/content/cn/blog/tags/logicalclocks/index.html +++ b/content/cn/blog/tags/logicalclocks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/markers/index.html b/content/cn/blog/tags/markers/index.html index 22803be6a2695..5f8800a818844 100644 --- a/content/cn/blog/tags/markers/index.html +++ b/content/cn/blog/tags/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/medallion-architecture/index.html b/content/cn/blog/tags/medallion-architecture/index.html index 2f61e2a19974e..005e20f49a4a2 100644 --- a/content/cn/blog/tags/medallion-architecture/index.html +++ b/content/cn/blog/tags/medallion-architecture/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/medium/index.html b/content/cn/blog/tags/medium/index.html index 9b194c10b5895..304a638abfb64 100644 --- a/content/cn/blog/tags/medium/index.html +++ b/content/cn/blog/tags/medium/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/medium/page/2/index.html b/content/cn/blog/tags/medium/page/2/index.html index 602fc05dfb780..959bf01acefaf 100644 --- a/content/cn/blog/tags/medium/page/2/index.html +++ b/content/cn/blog/tags/medium/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/medium/page/3/index.html b/content/cn/blog/tags/medium/page/3/index.html index 5b017ee3d0230..ef7d207828b0a 100644 --- a/content/cn/blog/tags/medium/page/3/index.html +++ b/content/cn/blog/tags/medium/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/medium/page/4/index.html b/content/cn/blog/tags/medium/page/4/index.html index a2be3b5a3d035..88aa9774376bf 100644 --- a/content/cn/blog/tags/medium/page/4/index.html +++ b/content/cn/blog/tags/medium/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/meetup/index.html b/content/cn/blog/tags/meetup/index.html index 3d25a4c857ab4..712fcaaf51d12 100644 --- a/content/cn/blog/tags/meetup/index.html +++ b/content/cn/blog/tags/meetup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/metadata/index.html b/content/cn/blog/tags/metadata/index.html index e9e71afed4c4b..4648419b793ba 100644 --- a/content/cn/blog/tags/metadata/index.html +++ b/content/cn/blog/tags/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/metafields/index.html b/content/cn/blog/tags/metafields/index.html index b74ef92ab47e6..5559cddd7c99a 100644 --- a/content/cn/blog/tags/metafields/index.html +++ b/content/cn/blog/tags/metafields/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/metrics/index.html b/content/cn/blog/tags/metrics/index.html index 03127d19dc31c..0e6732687c3df 100644 --- a/content/cn/blog/tags/metrics/index.html +++ b/content/cn/blog/tags/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/migration/index.html b/content/cn/blog/tags/migration/index.html index f9418e03beb8e..1a988c7b69a83 100644 --- a/content/cn/blog/tags/migration/index.html +++ b/content/cn/blog/tags/migration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/min/index.html b/content/cn/blog/tags/min/index.html index 57b71fa77acbe..bab84ce169ea2 100644 --- a/content/cn/blog/tags/min/index.html +++ b/content/cn/blog/tags/min/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/minio/index.html b/content/cn/blog/tags/minio/index.html index 86d5337ee3f2c..38cd4c3dec5d8 100644 --- a/content/cn/blog/tags/minio/index.html +++ b/content/cn/blog/tags/minio/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/mino/index.html b/content/cn/blog/tags/mino/index.html index ce3792a7f0c2e..f7ec79e4768a9 100644 --- a/content/cn/blog/tags/mino/index.html +++ b/content/cn/blog/tags/mino/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/mlops/index.html b/content/cn/blog/tags/mlops/index.html index 6d9b73a604ede..58b301c9ce660 100644 --- a/content/cn/blog/tags/mlops/index.html +++ b/content/cn/blog/tags/mlops/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/modern-data-architecture/index.html b/content/cn/blog/tags/modern-data-architecture/index.html index aa9cc8d08074d..7068af5b104c8 100644 --- a/content/cn/blog/tags/modern-data-architecture/index.html +++ b/content/cn/blog/tags/modern-data-architecture/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/mongodb/index.html b/content/cn/blog/tags/mongodb/index.html index cbf24176ba5f5..8db8b1beaaffd 100644 --- a/content/cn/blog/tags/mongodb/index.html +++ b/content/cn/blog/tags/mongodb/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/monotonic-timestamp/index.html b/content/cn/blog/tags/monotonic-timestamp/index.html index d4158ad5a2946..38a0284ef9213 100644 --- a/content/cn/blog/tags/monotonic-timestamp/index.html +++ b/content/cn/blog/tags/monotonic-timestamp/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/mor/index.html b/content/cn/blog/tags/mor/index.html index 54a364da18f68..fb39715e97b48 100644 --- a/content/cn/blog/tags/mor/index.html +++ b/content/cn/blog/tags/mor/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/multi-deltastreamer/index.html b/content/cn/blog/tags/multi-deltastreamer/index.html index fea50aaa94e07..0560d69f350a7 100644 --- a/content/cn/blog/tags/multi-deltastreamer/index.html +++ b/content/cn/blog/tags/multi-deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/multi-modal-indexing/index.html b/content/cn/blog/tags/multi-modal-indexing/index.html index 8c3a501dba6da..9c6951bf92e95 100644 --- a/content/cn/blog/tags/multi-modal-indexing/index.html +++ b/content/cn/blog/tags/multi-modal-indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/multi-writer/index.html b/content/cn/blog/tags/multi-writer/index.html index 77a2c8ce1d2f7..ac6a458f9d3d9 100644 --- a/content/cn/blog/tags/multi-writer/index.html +++ b/content/cn/blog/tags/multi-writer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/near-real-time-analytics/index.html b/content/cn/blog/tags/near-real-time-analytics/index.html index 77418dd16544d..aa9dc989d6063 100644 --- a/content/cn/blog/tags/near-real-time-analytics/index.html +++ b/content/cn/blog/tags/near-real-time-analytics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/onehouse/index.html b/content/cn/blog/tags/onehouse/index.html index 20df5ec97edc8..e5ba69dc5bc06 100644 --- a/content/cn/blog/tags/onehouse/index.html +++ b/content/cn/blog/tags/onehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/onehouse/page/2/index.html b/content/cn/blog/tags/onehouse/page/2/index.html index b70b1992d9c94..9a5d4154100d6 100644 --- a/content/cn/blog/tags/onehouse/page/2/index.html +++ b/content/cn/blog/tags/onehouse/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/open-architecture/index.html b/content/cn/blog/tags/open-architecture/index.html index 9c01f9be1c36c..f8681f9ce456a 100644 --- a/content/cn/blog/tags/open-architecture/index.html +++ b/content/cn/blog/tags/open-architecture/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/opstree/index.html b/content/cn/blog/tags/opstree/index.html index 597cd03c50f86..883de3e19729d 100644 --- a/content/cn/blog/tags/opstree/index.html +++ b/content/cn/blog/tags/opstree/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/optimization/index.html b/content/cn/blog/tags/optimization/index.html index 17e553cd5bdd5..859c0a525968c 100644 --- a/content/cn/blog/tags/optimization/index.html +++ b/content/cn/blog/tags/optimization/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/oreilly/index.html b/content/cn/blog/tags/oreilly/index.html index 755e3a5f5e39f..ea2095606812e 100644 --- a/content/cn/blog/tags/oreilly/index.html +++ b/content/cn/blog/tags/oreilly/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/partition/index.html b/content/cn/blog/tags/partition/index.html index e417a95207519..7907a313f8579 100644 --- a/content/cn/blog/tags/partition/index.html +++ b/content/cn/blog/tags/partition/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/performance/index.html b/content/cn/blog/tags/performance/index.html index 4c1616e1274af..454ff91f291a8 100644 --- a/content/cn/blog/tags/performance/index.html +++ b/content/cn/blog/tags/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/postgres/index.html b/content/cn/blog/tags/postgres/index.html index 96bf820abb26a..fae7d4be87075 100644 --- a/content/cn/blog/tags/postgres/index.html +++ b/content/cn/blog/tags/postgres/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/postgresql/index.html b/content/cn/blog/tags/postgresql/index.html index a23bb48dc6594..510901f4a2157 100644 --- a/content/cn/blog/tags/postgresql/index.html +++ b/content/cn/blog/tags/postgresql/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/presto/index.html b/content/cn/blog/tags/presto/index.html index d762ae5a98a93..556d6c2c5a80f 100644 --- a/content/cn/blog/tags/presto/index.html +++ b/content/cn/blog/tags/presto/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/prestocon/index.html b/content/cn/blog/tags/prestocon/index.html index b9609b1b648ca..bcd226cda6d3e 100644 --- a/content/cn/blog/tags/prestocon/index.html +++ b/content/cn/blog/tags/prestocon/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/prestodb/index.html b/content/cn/blog/tags/prestodb/index.html index 74687a5ba5f97..017314dd81dc8 100644 --- a/content/cn/blog/tags/prestodb/index.html +++ b/content/cn/blog/tags/prestodb/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/programmer/index.html b/content/cn/blog/tags/programmer/index.html index d19e6b8e2d02c..a568dcbf8c405 100644 --- a/content/cn/blog/tags/programmer/index.html +++ b/content/cn/blog/tags/programmer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/pyspark/index.html b/content/cn/blog/tags/pyspark/index.html index 3db9ff9bd0bfe..74ffea4fd9091 100644 --- a/content/cn/blog/tags/pyspark/index.html +++ b/content/cn/blog/tags/pyspark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/python/index.html b/content/cn/blog/tags/python/index.html index 062162f27c137..62ce004c96f3c 100644 --- a/content/cn/blog/tags/python/index.html +++ b/content/cn/blog/tags/python/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/queries/index.html b/content/cn/blog/tags/queries/index.html index b03f8bff58595..71231a4610476 100644 --- a/content/cn/blog/tags/queries/index.html +++ b/content/cn/blog/tags/queries/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/query-performance/index.html b/content/cn/blog/tags/query-performance/index.html index ac7c3b830d8ed..25d61377eaf84 100644 --- a/content/cn/blog/tags/query-performance/index.html +++ b/content/cn/blog/tags/query-performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/querying/index.html b/content/cn/blog/tags/querying/index.html index c480052c76c88..eb695316b4806 100644 --- a/content/cn/blog/tags/querying/index.html +++ b/content/cn/blog/tags/querying/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/ray/index.html b/content/cn/blog/tags/ray/index.html index 825f8c864e26e..3391d97ff7ea6 100644 --- a/content/cn/blog/tags/ray/index.html +++ b/content/cn/blog/tags/ray/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/read-optimized-query/index.html b/content/cn/blog/tags/read-optimized-query/index.html index 38bd8d6f5e98f..724e2f0c74b4f 100644 --- a/content/cn/blog/tags/read-optimized-query/index.html +++ b/content/cn/blog/tags/read-optimized-query/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/reads/index.html b/content/cn/blog/tags/reads/index.html index db938333cecca..4f16ce0bd77c6 100644 --- a/content/cn/blog/tags/reads/index.html +++ b/content/cn/blog/tags/reads/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/real-time-datalake/index.html b/content/cn/blog/tags/real-time-datalake/index.html index 9d79db5c14e42..f25ba4b52e12c 100644 --- a/content/cn/blog/tags/real-time-datalake/index.html +++ b/content/cn/blog/tags/real-time-datalake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/real-time-query/index.html b/content/cn/blog/tags/real-time-query/index.html index e21a4b5ae3153..0f6d02bad983b 100644 --- a/content/cn/blog/tags/real-time-query/index.html +++ b/content/cn/blog/tags/real-time-query/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/record-index/index.html b/content/cn/blog/tags/record-index/index.html index fe2789345591a..d5d0ce43ea993 100644 --- a/content/cn/blog/tags/record-index/index.html +++ b/content/cn/blog/tags/record-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/record-level-index/index.html b/content/cn/blog/tags/record-level-index/index.html index fa49a9fb6fd83..fc4faa58bd1f8 100644 --- a/content/cn/blog/tags/record-level-index/index.html +++ b/content/cn/blog/tags/record-level-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/release/index.html b/content/cn/blog/tags/release/index.html index e4a90767611f9..18901728490cb 100644 --- a/content/cn/blog/tags/release/index.html +++ b/content/cn/blog/tags/release/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/risingwave/index.html b/content/cn/blog/tags/risingwave/index.html index 2ffc32c39840e..5873041ab63eb 100644 --- a/content/cn/blog/tags/risingwave/index.html +++ b/content/cn/blog/tags/risingwave/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/robinhood/index.html b/content/cn/blog/tags/robinhood/index.html index 64fff1bb90f0d..93074930613a8 100644 --- a/content/cn/blog/tags/robinhood/index.html +++ b/content/cn/blog/tags/robinhood/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/rtinsights/index.html b/content/cn/blog/tags/rtinsights/index.html index 84be67473d6bc..eec98fc47d034 100644 --- a/content/cn/blog/tags/rtinsights/index.html +++ b/content/cn/blog/tags/rtinsights/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/scd-1/index.html b/content/cn/blog/tags/scd-1/index.html index cccb51f44345d..a12f672187457 100644 --- a/content/cn/blog/tags/scd-1/index.html +++ b/content/cn/blog/tags/scd-1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/scd-2/index.html b/content/cn/blog/tags/scd-2/index.html index e2c9e8d8d1c33..784584abfdb52 100644 --- a/content/cn/blog/tags/scd-2/index.html +++ b/content/cn/blog/tags/scd-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/scd-3/index.html b/content/cn/blog/tags/scd-3/index.html index d7e2510486ab2..30415f140d293 100644 --- a/content/cn/blog/tags/scd-3/index.html +++ b/content/cn/blog/tags/scd-3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/schema-evolution/index.html b/content/cn/blog/tags/schema-evolution/index.html index 5263272f40a65..89cdff6c47a4f 100644 --- a/content/cn/blog/tags/schema-evolution/index.html +++ b/content/cn/blog/tags/schema-evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/schema/index.html b/content/cn/blog/tags/schema/index.html index 05e235361e070..d94ba65d490e4 100644 --- a/content/cn/blog/tags/schema/index.html +++ b/content/cn/blog/tags/schema/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/selectfrom/index.html b/content/cn/blog/tags/selectfrom/index.html index 605901ebb7fb0..8f2e61594025b 100644 --- a/content/cn/blog/tags/selectfrom/index.html +++ b/content/cn/blog/tags/selectfrom/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/snapshot-exporter/index.html b/content/cn/blog/tags/snapshot-exporter/index.html index f8194b96121b4..edda6a6158b33 100644 --- a/content/cn/blog/tags/snapshot-exporter/index.html +++ b/content/cn/blog/tags/snapshot-exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/snapshot-query/index.html b/content/cn/blog/tags/snapshot-query/index.html index 1e11850fe7c35..0d0706261322c 100644 --- a/content/cn/blog/tags/snapshot-query/index.html +++ b/content/cn/blog/tags/snapshot-query/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/space-filling-curves/index.html b/content/cn/blog/tags/space-filling-curves/index.html index 249ad155ab407..74c8d8bbed658 100644 --- a/content/cn/blog/tags/space-filling-curves/index.html +++ b/content/cn/blog/tags/space-filling-curves/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/spark-sql/index.html b/content/cn/blog/tags/spark-sql/index.html index 06566ac70dace..3e2ddf6b0e06d 100644 --- a/content/cn/blog/tags/spark-sql/index.html +++ b/content/cn/blog/tags/spark-sql/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/sql-transformer/index.html b/content/cn/blog/tags/sql-transformer/index.html index d6ca5439610b2..56dd2b5bb8ee4 100644 --- a/content/cn/blog/tags/sql-transformer/index.html +++ b/content/cn/blog/tags/sql-transformer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/starrocks/index.html b/content/cn/blog/tags/starrocks/index.html index 5491fd035a537..d0d9d17b49e8e 100644 --- a/content/cn/blog/tags/starrocks/index.html +++ b/content/cn/blog/tags/starrocks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/storage-spec/index.html b/content/cn/blog/tags/storage-spec/index.html index 42d58c8580a58..1c816e7de5c8f 100644 --- a/content/cn/blog/tags/storage-spec/index.html +++ b/content/cn/blog/tags/storage-spec/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/storage-types/index.html b/content/cn/blog/tags/storage-types/index.html index 14b5af2bf214e..db407dbf317b3 100644 --- a/content/cn/blog/tags/storage-types/index.html +++ b/content/cn/blog/tags/storage-types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/storage/index.html b/content/cn/blog/tags/storage/index.html index e59d63a8221ec..9a52935a4b0b7 100644 --- a/content/cn/blog/tags/storage/index.html +++ b/content/cn/blog/tags/storage/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/streaming-ingestion/index.html b/content/cn/blog/tags/streaming-ingestion/index.html index e7cab800f41f7..b48e3b600ff5c 100644 --- a/content/cn/blog/tags/streaming-ingestion/index.html +++ b/content/cn/blog/tags/streaming-ingestion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/streaming/index.html b/content/cn/blog/tags/streaming/index.html index e5fddc32f0ed8..b21319091bc3d 100644 --- a/content/cn/blog/tags/streaming/index.html +++ b/content/cn/blog/tags/streaming/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/streamlit/index.html b/content/cn/blog/tags/streamlit/index.html index a9c8c97db81ea..af277df0414d1 100644 --- a/content/cn/blog/tags/streamlit/index.html +++ b/content/cn/blog/tags/streamlit/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/substack/index.html b/content/cn/blog/tags/substack/index.html index 39ae361a6035d..6ea64960bf667 100644 --- a/content/cn/blog/tags/substack/index.html +++ b/content/cn/blog/tags/substack/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/table-formats/index.html b/content/cn/blog/tags/table-formats/index.html index bc21849564470..e6feed78cc910 100644 --- a/content/cn/blog/tags/table-formats/index.html +++ b/content/cn/blog/tags/table-formats/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/table-service/index.html b/content/cn/blog/tags/table-service/index.html index fbdfa027711aa..eefd0c5f7a41a 100644 --- a/content/cn/blog/tags/table-service/index.html +++ b/content/cn/blog/tags/table-service/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/table-services/index.html b/content/cn/blog/tags/table-services/index.html index 3aff76ba95ad4..b4d77e90f182e 100644 --- a/content/cn/blog/tags/table-services/index.html +++ b/content/cn/blog/tags/table-services/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/table-size-stats/index.html b/content/cn/blog/tags/table-size-stats/index.html index 086511ef56bdf..8ff343b02e88c 100644 --- a/content/cn/blog/tags/table-size-stats/index.html +++ b/content/cn/blog/tags/table-size-stats/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/techtarget/index.html b/content/cn/blog/tags/techtarget/index.html index 5a039c9395915..3aecf1ba17519 100644 --- a/content/cn/blog/tags/techtarget/index.html +++ b/content/cn/blog/tags/techtarget/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/time-travel-query/index.html b/content/cn/blog/tags/time-travel-query/index.html index e5809a21f42d0..00e306cbb5790 100644 --- a/content/cn/blog/tags/time-travel-query/index.html +++ b/content/cn/blog/tags/time-travel-query/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/timeline-server/index.html b/content/cn/blog/tags/timeline-server/index.html index bc8e6564a35aa..e20a3e583ee54 100644 --- a/content/cn/blog/tags/timeline-server/index.html +++ b/content/cn/blog/tags/timeline-server/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/timeline/index.html b/content/cn/blog/tags/timeline/index.html index 05aaf65776584..baa90ae4c1480 100644 --- a/content/cn/blog/tags/timeline/index.html +++ b/content/cn/blog/tags/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/timestamp-as-of-query/index.html b/content/cn/blog/tags/timestamp-as-of-query/index.html index 390131b6894b0..dabbab5224937 100644 --- a/content/cn/blog/tags/timestamp-as-of-query/index.html +++ b/content/cn/blog/tags/timestamp-as-of-query/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/timestamp-collision/index.html b/content/cn/blog/tags/timestamp-collision/index.html index d9b6c5c38a69c..72b1d28e8d07a 100644 --- a/content/cn/blog/tags/timestamp-collision/index.html +++ b/content/cn/blog/tags/timestamp-collision/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/tla-specification/index.html b/content/cn/blog/tags/tla-specification/index.html index 59811e37ca545..4aa84e9163a18 100644 --- a/content/cn/blog/tags/tla-specification/index.html +++ b/content/cn/blog/tags/tla-specification/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/towardsdatascience/index.html b/content/cn/blog/tags/towardsdatascience/index.html index 44be531474d83..6ed3a30062e3d 100644 --- a/content/cn/blog/tags/towardsdatascience/index.html +++ b/content/cn/blog/tags/towardsdatascience/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/transactions/index.html b/content/cn/blog/tags/transactions/index.html index 152c19d71b4ff..28ba0bc5d004d 100644 --- a/content/cn/blog/tags/transactions/index.html +++ b/content/cn/blog/tags/transactions/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/trino/index.html b/content/cn/blog/tags/trino/index.html index 91750da20c573..da5434a35a991 100644 --- a/content/cn/blog/tags/trino/index.html +++ b/content/cn/blog/tags/trino/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/uber/index.html b/content/cn/blog/tags/uber/index.html index 975fc187e73d6..05dc32650c0e4 100644 --- a/content/cn/blog/tags/uber/index.html +++ b/content/cn/blog/tags/uber/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/upsert/index.html b/content/cn/blog/tags/upsert/index.html index 6f6f8b99a32b3..a0b19fa98d17b 100644 --- a/content/cn/blog/tags/upsert/index.html +++ b/content/cn/blog/tags/upsert/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/upserts/index.html b/content/cn/blog/tags/upserts/index.html index a98e5d3f69dd8..7b355974bcce2 100644 --- a/content/cn/blog/tags/upserts/index.html +++ b/content/cn/blog/tags/upserts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/upstox-engineering/index.html b/content/cn/blog/tags/upstox-engineering/index.html index 4aab7bb10b4ef..bfeedbb20287f 100644 --- a/content/cn/blog/tags/upstox-engineering/index.html +++ b/content/cn/blog/tags/upstox-engineering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/use-case/index.html b/content/cn/blog/tags/use-case/index.html index d5299d196ff9f..e4c6d8b6c828b 100644 --- a/content/cn/blog/tags/use-case/index.html +++ b/content/cn/blog/tags/use-case/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/use-case/page/2/index.html b/content/cn/blog/tags/use-case/page/2/index.html index 632500567d7a1..e2859adaa7ce9 100644 --- a/content/cn/blog/tags/use-case/page/2/index.html +++ b/content/cn/blog/tags/use-case/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/use-case/page/3/index.html b/content/cn/blog/tags/use-case/page/3/index.html index e97f5e979296c..618b97699d947 100644 --- a/content/cn/blog/tags/use-case/page/3/index.html +++ b/content/cn/blog/tags/use-case/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/vector-search/index.html b/content/cn/blog/tags/vector-search/index.html index 1232746209842..b84a26e686048 100644 --- a/content/cn/blog/tags/vector-search/index.html +++ b/content/cn/blog/tags/vector-search/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/venturebeat/index.html b/content/cn/blog/tags/venturebeat/index.html index bb0cd2b6755b4..da949d4cc7cd9 100644 --- a/content/cn/blog/tags/venturebeat/index.html +++ b/content/cn/blog/tags/venturebeat/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/walmartglobaltech/index.html b/content/cn/blog/tags/walmartglobaltech/index.html index 3542d3a5c7b53..02327e6d5bec5 100644 --- a/content/cn/blog/tags/walmartglobaltech/index.html +++ b/content/cn/blog/tags/walmartglobaltech/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/writes/index.html b/content/cn/blog/tags/writes/index.html index 1c780f69409a2..e19276615f65a 100644 --- a/content/cn/blog/tags/writes/index.html +++ b/content/cn/blog/tags/writes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/xenonstack/index.html b/content/cn/blog/tags/xenonstack/index.html index 27fdf4bcc2ec8..1679cd69e6943 100644 --- a/content/cn/blog/tags/xenonstack/index.html +++ b/content/cn/blog/tags/xenonstack/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/y-uno/index.html b/content/cn/blog/tags/y-uno/index.html index cae491fa337fe..73dba9dd80d3f 100644 --- a/content/cn/blog/tags/y-uno/index.html +++ b/content/cn/blog/tags/y-uno/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/yahoo/index.html b/content/cn/blog/tags/yahoo/index.html index a4656668f722e..14386770c4734 100644 --- a/content/cn/blog/tags/yahoo/index.html +++ b/content/cn/blog/tags/yahoo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/blog/tags/yugabyte/index.html b/content/cn/blog/tags/yugabyte/index.html index ace02b872449f..c3142ee44d122 100644 --- a/content/cn/blog/tags/yugabyte/index.html +++ b/content/cn/blog/tags/yugabyte/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/community/get-involved/index.html b/content/cn/community/get-involved/index.html index 5e3663663cc24..3903a24ca8fb9 100644 --- a/content/cn/community/get-involved/index.html +++ b/content/cn/community/get-involved/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/community/office_hours/index.html b/content/cn/community/office_hours/index.html index 85b7fc93248a3..83fc8739c2b66 100644 --- a/content/cn/community/office_hours/index.html +++ b/content/cn/community/office_hours/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/community/syncs/index.html b/content/cn/community/syncs/index.html index ef6e0e940dfd8..c0a6d4af663e2 100644 --- a/content/cn/community/syncs/index.html +++ b/content/cn/community/syncs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/community/team/index.html b/content/cn/community/team/index.html index 70ce6a918c24c..8f71385b7f2ad 100644 --- a/content/cn/community/team/index.html +++ b/content/cn/community/team/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/contribute/developer-setup/index.html b/content/cn/contribute/developer-setup/index.html index beae567dbdd6f..0709d08b07fed 100644 --- a/content/cn/contribute/developer-setup/index.html +++ b/content/cn/contribute/developer-setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/contribute/how-to-contribute/index.html b/content/cn/contribute/how-to-contribute/index.html index 4eb87b8517196..5f8a42d74e647 100644 --- a/content/cn/contribute/how-to-contribute/index.html +++ b/content/cn/contribute/how-to-contribute/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/contribute/report-security-issues/index.html b/content/cn/contribute/report-security-issues/index.html index 2353c7529b406..11e55a1088361 100644 --- a/content/cn/contribute/report-security-issues/index.html +++ b/content/cn/contribute/report-security-issues/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/contribute/rfc-process/index.html b/content/cn/contribute/rfc-process/index.html index f36bce037abe5..fbb1339f917d4 100644 --- a/content/cn/contribute/rfc-process/index.html +++ b/content/cn/contribute/rfc-process/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/azure_hoodie/index.html b/content/cn/docs/0.10.0/azure_hoodie/index.html index 416708ac3c892..d599c147f2199 100644 --- a/content/cn/docs/0.10.0/azure_hoodie/index.html +++ b/content/cn/docs/0.10.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/bos_hoodie/index.html b/content/cn/docs/0.10.0/bos_hoodie/index.html index cff9fc5f78e33..485e9493bdcee 100644 --- a/content/cn/docs/0.10.0/bos_hoodie/index.html +++ b/content/cn/docs/0.10.0/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/cli/index.html b/content/cn/docs/0.10.0/cli/index.html index b786978408339..a0135948a0f5c 100644 --- a/content/cn/docs/0.10.0/cli/index.html +++ b/content/cn/docs/0.10.0/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/cloud/index.html b/content/cn/docs/0.10.0/cloud/index.html index 8658f4069f28c..dd48aeb0d73fb 100644 --- a/content/cn/docs/0.10.0/cloud/index.html +++ b/content/cn/docs/0.10.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/clustering/index.html b/content/cn/docs/0.10.0/clustering/index.html index 77c00eab4a35d..7cad150b987fd 100644 --- a/content/cn/docs/0.10.0/clustering/index.html +++ b/content/cn/docs/0.10.0/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/compaction/index.html b/content/cn/docs/0.10.0/compaction/index.html index 72cdc3ec700b9..669e0021d24c3 100644 --- a/content/cn/docs/0.10.0/compaction/index.html +++ b/content/cn/docs/0.10.0/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/comparison/index.html b/content/cn/docs/0.10.0/comparison/index.html index f2ae40079d504..eadfbf99a2632 100644 --- a/content/cn/docs/0.10.0/comparison/index.html +++ b/content/cn/docs/0.10.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/concepts/index.html b/content/cn/docs/0.10.0/concepts/index.html index 1313fd847160c..0ad096383abda 100644 --- a/content/cn/docs/0.10.0/concepts/index.html +++ b/content/cn/docs/0.10.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/concurrency_control/index.html b/content/cn/docs/0.10.0/concurrency_control/index.html index 74643f4452fd2..d5a9e16fd17e7 100644 --- a/content/cn/docs/0.10.0/concurrency_control/index.html +++ b/content/cn/docs/0.10.0/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/configurations/index.html b/content/cn/docs/0.10.0/configurations/index.html index 8458751f2257e..9245f7e1a7f8e 100644 --- a/content/cn/docs/0.10.0/configurations/index.html +++ b/content/cn/docs/0.10.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/cos_hoodie/index.html b/content/cn/docs/0.10.0/cos_hoodie/index.html index 389113e4453bc..112c9e1d9e326 100644 --- a/content/cn/docs/0.10.0/cos_hoodie/index.html +++ b/content/cn/docs/0.10.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/deployment/index.html b/content/cn/docs/0.10.0/deployment/index.html index 66af2153b4bd9..5fb3544676aa0 100644 --- a/content/cn/docs/0.10.0/deployment/index.html +++ b/content/cn/docs/0.10.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/docker_demo/index.html b/content/cn/docs/0.10.0/docker_demo/index.html index db9dc9e919289..78d4c7df3cdde 100644 --- a/content/cn/docs/0.10.0/docker_demo/index.html +++ b/content/cn/docs/0.10.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/faq/index.html b/content/cn/docs/0.10.0/faq/index.html index 3161311a9d6b7..f67c864823f74 100644 --- a/content/cn/docs/0.10.0/faq/index.html +++ b/content/cn/docs/0.10.0/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/file_layouts/index.html b/content/cn/docs/0.10.0/file_layouts/index.html index cb908276dd862..e51418cfea13d 100644 --- a/content/cn/docs/0.10.0/file_layouts/index.html +++ b/content/cn/docs/0.10.0/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/file_sizing/index.html b/content/cn/docs/0.10.0/file_sizing/index.html index 491b586466e9e..464f279b7d6e1 100644 --- a/content/cn/docs/0.10.0/file_sizing/index.html +++ b/content/cn/docs/0.10.0/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/flink-quick-start-guide/index.html b/content/cn/docs/0.10.0/flink-quick-start-guide/index.html index a2f56df54ae47..255f333b96c59 100644 --- a/content/cn/docs/0.10.0/flink-quick-start-guide/index.html +++ b/content/cn/docs/0.10.0/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/flink_configuration/index.html b/content/cn/docs/0.10.0/flink_configuration/index.html index 566fe83e6188a..205de034358fa 100644 --- a/content/cn/docs/0.10.0/flink_configuration/index.html +++ b/content/cn/docs/0.10.0/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/gcs_hoodie/index.html b/content/cn/docs/0.10.0/gcs_hoodie/index.html index 9b7e24cb98e48..f62322552c5cc 100644 --- a/content/cn/docs/0.10.0/gcs_hoodie/index.html +++ b/content/cn/docs/0.10.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/hoodie_cleaner/index.html b/content/cn/docs/0.10.0/hoodie_cleaner/index.html index 795514d229082..e4de089466f16 100644 --- a/content/cn/docs/0.10.0/hoodie_cleaner/index.html +++ b/content/cn/docs/0.10.0/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/hoodie_deltastreamer/index.html b/content/cn/docs/0.10.0/hoodie_deltastreamer/index.html index ac7512cf5682c..e8544c7dea80c 100644 --- a/content/cn/docs/0.10.0/hoodie_deltastreamer/index.html +++ b/content/cn/docs/0.10.0/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/ibm_cos_hoodie/index.html b/content/cn/docs/0.10.0/ibm_cos_hoodie/index.html index bf7e79c8a047d..a66619af6366a 100644 --- a/content/cn/docs/0.10.0/ibm_cos_hoodie/index.html +++ b/content/cn/docs/0.10.0/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/indexing/index.html b/content/cn/docs/0.10.0/indexing/index.html index 07765ad9e6db3..db55063a5bb09 100644 --- a/content/cn/docs/0.10.0/indexing/index.html +++ b/content/cn/docs/0.10.0/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/jfs_hoodie/index.html b/content/cn/docs/0.10.0/jfs_hoodie/index.html index edac9591eb517..d8bff042815f7 100644 --- a/content/cn/docs/0.10.0/jfs_hoodie/index.html +++ b/content/cn/docs/0.10.0/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/key_generation/index.html b/content/cn/docs/0.10.0/key_generation/index.html index 44b9d74695976..e0c3b1451ec89 100644 --- a/content/cn/docs/0.10.0/key_generation/index.html +++ b/content/cn/docs/0.10.0/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/markers/index.html b/content/cn/docs/0.10.0/markers/index.html index 3f827648b6dc6..f424c166b8663 100644 --- a/content/cn/docs/0.10.0/markers/index.html +++ b/content/cn/docs/0.10.0/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/metadata/index.html b/content/cn/docs/0.10.0/metadata/index.html index c8ff29f8db866..3dbbc6e2e93ea 100644 --- a/content/cn/docs/0.10.0/metadata/index.html +++ b/content/cn/docs/0.10.0/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/metrics/index.html b/content/cn/docs/0.10.0/metrics/index.html index cdc4864f5615d..9e0186dbab2c3 100644 --- a/content/cn/docs/0.10.0/metrics/index.html +++ b/content/cn/docs/0.10.0/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/migration_guide/index.html b/content/cn/docs/0.10.0/migration_guide/index.html index 4608e558d6b7c..882cdf51f0ab7 100644 --- a/content/cn/docs/0.10.0/migration_guide/index.html +++ b/content/cn/docs/0.10.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/oss_hoodie/index.html b/content/cn/docs/0.10.0/oss_hoodie/index.html index 3212898319b55..ee4b033894021 100644 --- a/content/cn/docs/0.10.0/oss_hoodie/index.html +++ b/content/cn/docs/0.10.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/overview/index.html b/content/cn/docs/0.10.0/overview/index.html index b17e55bd35481..bf1d0f1d19d3d 100644 --- a/content/cn/docs/0.10.0/overview/index.html +++ b/content/cn/docs/0.10.0/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/performance/index.html b/content/cn/docs/0.10.0/performance/index.html index fb2cbb7e252bd..9f3cd658ff1e4 100644 --- a/content/cn/docs/0.10.0/performance/index.html +++ b/content/cn/docs/0.10.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/precommit_validator/index.html b/content/cn/docs/0.10.0/precommit_validator/index.html index 8dc372e4dc5ba..c7993c4e11db6 100644 --- a/content/cn/docs/0.10.0/precommit_validator/index.html +++ b/content/cn/docs/0.10.0/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/privacy/index.html b/content/cn/docs/0.10.0/privacy/index.html index aac8c124b7111..46c3c17db0e68 100644 --- a/content/cn/docs/0.10.0/privacy/index.html +++ b/content/cn/docs/0.10.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/query_engine_setup/index.html b/content/cn/docs/0.10.0/query_engine_setup/index.html index 8ebe343e9e4ce..f2f34cecaa0c0 100644 --- a/content/cn/docs/0.10.0/query_engine_setup/index.html +++ b/content/cn/docs/0.10.0/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/querying_data/index.html b/content/cn/docs/0.10.0/querying_data/index.html index bb99f2761566c..f1f5a52dcebd7 100644 --- a/content/cn/docs/0.10.0/querying_data/index.html +++ b/content/cn/docs/0.10.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/quick-start-guide/index.html b/content/cn/docs/0.10.0/quick-start-guide/index.html index 951df53c1b8ab..464abf22e54a2 100644 --- a/content/cn/docs/0.10.0/quick-start-guide/index.html +++ b/content/cn/docs/0.10.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/s3_hoodie/index.html b/content/cn/docs/0.10.0/s3_hoodie/index.html index 4f05c5eeeaffe..b2ab401dfbdfd 100644 --- a/content/cn/docs/0.10.0/s3_hoodie/index.html +++ b/content/cn/docs/0.10.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/schema_evolution/index.html b/content/cn/docs/0.10.0/schema_evolution/index.html index 2c654cafce8bb..24b49bdcbf94a 100644 --- a/content/cn/docs/0.10.0/schema_evolution/index.html +++ b/content/cn/docs/0.10.0/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/snapshot_exporter/index.html b/content/cn/docs/0.10.0/snapshot_exporter/index.html index 5b2d6ee5edccc..00e121f429235 100644 --- a/content/cn/docs/0.10.0/snapshot_exporter/index.html +++ b/content/cn/docs/0.10.0/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/structure/index.html b/content/cn/docs/0.10.0/structure/index.html index 86412554f5140..03ef2eaf52627 100644 --- a/content/cn/docs/0.10.0/structure/index.html +++ b/content/cn/docs/0.10.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/syncing_metastore/index.html b/content/cn/docs/0.10.0/syncing_metastore/index.html index a0eda801961f9..def3561232537 100644 --- a/content/cn/docs/0.10.0/syncing_metastore/index.html +++ b/content/cn/docs/0.10.0/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/table_management/index.html b/content/cn/docs/0.10.0/table_management/index.html index 6dd9283c9f868..5e6bbbb3b153f 100644 --- a/content/cn/docs/0.10.0/table_management/index.html +++ b/content/cn/docs/0.10.0/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/table_types/index.html b/content/cn/docs/0.10.0/table_types/index.html index b8a07c5b93c66..744f10ce0eeff 100644 --- a/content/cn/docs/0.10.0/table_types/index.html +++ b/content/cn/docs/0.10.0/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/timeline/index.html b/content/cn/docs/0.10.0/timeline/index.html index ed212443ea12b..f658f844b31b1 100644 --- a/content/cn/docs/0.10.0/timeline/index.html +++ b/content/cn/docs/0.10.0/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/transforms/index.html b/content/cn/docs/0.10.0/transforms/index.html index f137e13507a9a..3f89e05f62948 100644 --- a/content/cn/docs/0.10.0/transforms/index.html +++ b/content/cn/docs/0.10.0/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/troubleshooting/index.html b/content/cn/docs/0.10.0/troubleshooting/index.html index e6a7120d9174f..ada1ff1176e54 100644 --- a/content/cn/docs/0.10.0/troubleshooting/index.html +++ b/content/cn/docs/0.10.0/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/use_cases/index.html b/content/cn/docs/0.10.0/use_cases/index.html index 4bed9ffedb668..be1df266ee562 100644 --- a/content/cn/docs/0.10.0/use_cases/index.html +++ b/content/cn/docs/0.10.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/write_operations/index.html b/content/cn/docs/0.10.0/write_operations/index.html index fd2757b064032..bab912d904e79 100644 --- a/content/cn/docs/0.10.0/write_operations/index.html +++ b/content/cn/docs/0.10.0/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.0/writing_data/index.html b/content/cn/docs/0.10.0/writing_data/index.html index fbfd49ace7030..99b830317b1aa 100644 --- a/content/cn/docs/0.10.0/writing_data/index.html +++ b/content/cn/docs/0.10.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/azure_hoodie/index.html b/content/cn/docs/0.10.1/azure_hoodie/index.html index 261dc60e29cdf..043ecf8d87aaa 100644 --- a/content/cn/docs/0.10.1/azure_hoodie/index.html +++ b/content/cn/docs/0.10.1/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/bos_hoodie/index.html b/content/cn/docs/0.10.1/bos_hoodie/index.html index 41f9a9a2f6d3f..5f76119fc9f22 100644 --- a/content/cn/docs/0.10.1/bos_hoodie/index.html +++ b/content/cn/docs/0.10.1/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/cli/index.html b/content/cn/docs/0.10.1/cli/index.html index a9a047c82bb96..76f2ebef0cbe1 100644 --- a/content/cn/docs/0.10.1/cli/index.html +++ b/content/cn/docs/0.10.1/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/cloud/index.html b/content/cn/docs/0.10.1/cloud/index.html index a706750fb4c18..6becb0ac00666 100644 --- a/content/cn/docs/0.10.1/cloud/index.html +++ b/content/cn/docs/0.10.1/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/clustering/index.html b/content/cn/docs/0.10.1/clustering/index.html index cef9b660ecbf6..ff5c8a1db174b 100644 --- a/content/cn/docs/0.10.1/clustering/index.html +++ b/content/cn/docs/0.10.1/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/compaction/index.html b/content/cn/docs/0.10.1/compaction/index.html index e3ffd2ba66df4..9405e459297cf 100644 --- a/content/cn/docs/0.10.1/compaction/index.html +++ b/content/cn/docs/0.10.1/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/comparison/index.html b/content/cn/docs/0.10.1/comparison/index.html index 6fc4de8bf84c3..6ff3c13773bfd 100644 --- a/content/cn/docs/0.10.1/comparison/index.html +++ b/content/cn/docs/0.10.1/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/concepts/index.html b/content/cn/docs/0.10.1/concepts/index.html index ea07e35841726..f3f38cc3b5129 100644 --- a/content/cn/docs/0.10.1/concepts/index.html +++ b/content/cn/docs/0.10.1/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/concurrency_control/index.html b/content/cn/docs/0.10.1/concurrency_control/index.html index f1865e64cfc3c..349a217bb9ab8 100644 --- a/content/cn/docs/0.10.1/concurrency_control/index.html +++ b/content/cn/docs/0.10.1/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/configurations/index.html b/content/cn/docs/0.10.1/configurations/index.html index 589a8fff44afc..a2395b7a782fc 100644 --- a/content/cn/docs/0.10.1/configurations/index.html +++ b/content/cn/docs/0.10.1/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/cos_hoodie/index.html b/content/cn/docs/0.10.1/cos_hoodie/index.html index 7f1fdc5d0d5a0..4e48598b3d174 100644 --- a/content/cn/docs/0.10.1/cos_hoodie/index.html +++ b/content/cn/docs/0.10.1/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/deployment/index.html b/content/cn/docs/0.10.1/deployment/index.html index 39e8abe5611f3..6aeac63efaf68 100644 --- a/content/cn/docs/0.10.1/deployment/index.html +++ b/content/cn/docs/0.10.1/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/docker_demo/index.html b/content/cn/docs/0.10.1/docker_demo/index.html index d655bd9886a99..45060dcddfc1c 100644 --- a/content/cn/docs/0.10.1/docker_demo/index.html +++ b/content/cn/docs/0.10.1/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/faq/index.html b/content/cn/docs/0.10.1/faq/index.html index 8b74a9ed6f671..4ada2fa285465 100644 --- a/content/cn/docs/0.10.1/faq/index.html +++ b/content/cn/docs/0.10.1/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/file_layouts/index.html b/content/cn/docs/0.10.1/file_layouts/index.html index 9872f33372803..e932bd5f291e9 100644 --- a/content/cn/docs/0.10.1/file_layouts/index.html +++ b/content/cn/docs/0.10.1/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/file_sizing/index.html b/content/cn/docs/0.10.1/file_sizing/index.html index 191441165559a..7c88bb6fe559e 100644 --- a/content/cn/docs/0.10.1/file_sizing/index.html +++ b/content/cn/docs/0.10.1/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/flink-quick-start-guide/index.html b/content/cn/docs/0.10.1/flink-quick-start-guide/index.html index 4c28a4053204c..b568195a15491 100644 --- a/content/cn/docs/0.10.1/flink-quick-start-guide/index.html +++ b/content/cn/docs/0.10.1/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/flink_configuration/index.html b/content/cn/docs/0.10.1/flink_configuration/index.html index d9f8b39dd06d1..6efd19e6198a2 100644 --- a/content/cn/docs/0.10.1/flink_configuration/index.html +++ b/content/cn/docs/0.10.1/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/gcs_hoodie/index.html b/content/cn/docs/0.10.1/gcs_hoodie/index.html index 7c195928fa8ec..97cbf973e8832 100644 --- a/content/cn/docs/0.10.1/gcs_hoodie/index.html +++ b/content/cn/docs/0.10.1/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/hoodie_cleaner/index.html b/content/cn/docs/0.10.1/hoodie_cleaner/index.html index 3678cbc429200..b2df4fc206e2b 100644 --- a/content/cn/docs/0.10.1/hoodie_cleaner/index.html +++ b/content/cn/docs/0.10.1/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/hoodie_deltastreamer/index.html b/content/cn/docs/0.10.1/hoodie_deltastreamer/index.html index ce62024238423..ab5e96fdada69 100644 --- a/content/cn/docs/0.10.1/hoodie_deltastreamer/index.html +++ b/content/cn/docs/0.10.1/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/ibm_cos_hoodie/index.html b/content/cn/docs/0.10.1/ibm_cos_hoodie/index.html index 2634f24d2f1e8..fbb35508d1990 100644 --- a/content/cn/docs/0.10.1/ibm_cos_hoodie/index.html +++ b/content/cn/docs/0.10.1/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/indexing/index.html b/content/cn/docs/0.10.1/indexing/index.html index 7196c9985ed4f..42f5845a4e72e 100644 --- a/content/cn/docs/0.10.1/indexing/index.html +++ b/content/cn/docs/0.10.1/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/jfs_hoodie/index.html b/content/cn/docs/0.10.1/jfs_hoodie/index.html index 883033bfd9427..d9449e8ef5f2b 100644 --- a/content/cn/docs/0.10.1/jfs_hoodie/index.html +++ b/content/cn/docs/0.10.1/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/key_generation/index.html b/content/cn/docs/0.10.1/key_generation/index.html index d56ff30636e28..22009e8e62b7e 100644 --- a/content/cn/docs/0.10.1/key_generation/index.html +++ b/content/cn/docs/0.10.1/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/markers/index.html b/content/cn/docs/0.10.1/markers/index.html index f15bf836a67a0..e8b16a84c34f6 100644 --- a/content/cn/docs/0.10.1/markers/index.html +++ b/content/cn/docs/0.10.1/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/metadata/index.html b/content/cn/docs/0.10.1/metadata/index.html index fc51eba25f0dd..8a1cd32a301ea 100644 --- a/content/cn/docs/0.10.1/metadata/index.html +++ b/content/cn/docs/0.10.1/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/metrics/index.html b/content/cn/docs/0.10.1/metrics/index.html index f2c1a3224c1df..89ec79fac2dfb 100644 --- a/content/cn/docs/0.10.1/metrics/index.html +++ b/content/cn/docs/0.10.1/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/migration_guide/index.html b/content/cn/docs/0.10.1/migration_guide/index.html index b8a9a2cba4e6c..d77c8e5793b51 100644 --- a/content/cn/docs/0.10.1/migration_guide/index.html +++ b/content/cn/docs/0.10.1/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/oss_hoodie/index.html b/content/cn/docs/0.10.1/oss_hoodie/index.html index 0784fc4afe445..83b1948d5d6a9 100644 --- a/content/cn/docs/0.10.1/oss_hoodie/index.html +++ b/content/cn/docs/0.10.1/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/overview/index.html b/content/cn/docs/0.10.1/overview/index.html index 2c0d9f79c52b3..ea61e8d86cb84 100644 --- a/content/cn/docs/0.10.1/overview/index.html +++ b/content/cn/docs/0.10.1/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/performance/index.html b/content/cn/docs/0.10.1/performance/index.html index da73ceb1b2c1b..b5b2e37c8a2f7 100644 --- a/content/cn/docs/0.10.1/performance/index.html +++ b/content/cn/docs/0.10.1/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/precommit_validator/index.html b/content/cn/docs/0.10.1/precommit_validator/index.html index 7e6c1cd8992df..998abe24a5cf5 100644 --- a/content/cn/docs/0.10.1/precommit_validator/index.html +++ b/content/cn/docs/0.10.1/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/privacy/index.html b/content/cn/docs/0.10.1/privacy/index.html index 1fbbb31de7ed5..097536feb1f27 100644 --- a/content/cn/docs/0.10.1/privacy/index.html +++ b/content/cn/docs/0.10.1/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/query_engine_setup/index.html b/content/cn/docs/0.10.1/query_engine_setup/index.html index 0a27d484e5e87..8f753198cf8d5 100644 --- a/content/cn/docs/0.10.1/query_engine_setup/index.html +++ b/content/cn/docs/0.10.1/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/querying_data/index.html b/content/cn/docs/0.10.1/querying_data/index.html index 2ee0e05ad8c99..72233d3815a46 100644 --- a/content/cn/docs/0.10.1/querying_data/index.html +++ b/content/cn/docs/0.10.1/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/quick-start-guide/index.html b/content/cn/docs/0.10.1/quick-start-guide/index.html index 35001195366b9..43ba0f1561cbe 100644 --- a/content/cn/docs/0.10.1/quick-start-guide/index.html +++ b/content/cn/docs/0.10.1/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/s3_hoodie/index.html b/content/cn/docs/0.10.1/s3_hoodie/index.html index 6b5d191b89604..d9d18ac56006f 100644 --- a/content/cn/docs/0.10.1/s3_hoodie/index.html +++ b/content/cn/docs/0.10.1/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/schema_evolution/index.html b/content/cn/docs/0.10.1/schema_evolution/index.html index 46b5c7c9b0fcd..860099104d254 100644 --- a/content/cn/docs/0.10.1/schema_evolution/index.html +++ b/content/cn/docs/0.10.1/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/snapshot_exporter/index.html b/content/cn/docs/0.10.1/snapshot_exporter/index.html index ebfd7ed6cfc39..9e079798e33b6 100644 --- a/content/cn/docs/0.10.1/snapshot_exporter/index.html +++ b/content/cn/docs/0.10.1/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/structure/index.html b/content/cn/docs/0.10.1/structure/index.html index adf6a98ca67f9..84ea478928c61 100644 --- a/content/cn/docs/0.10.1/structure/index.html +++ b/content/cn/docs/0.10.1/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/syncing_metastore/index.html b/content/cn/docs/0.10.1/syncing_metastore/index.html index 83567cf34d771..dd4309a0c8f50 100644 --- a/content/cn/docs/0.10.1/syncing_metastore/index.html +++ b/content/cn/docs/0.10.1/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/table_management/index.html b/content/cn/docs/0.10.1/table_management/index.html index 402297f513b9a..8ab0c1c2326b5 100644 --- a/content/cn/docs/0.10.1/table_management/index.html +++ b/content/cn/docs/0.10.1/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/table_types/index.html b/content/cn/docs/0.10.1/table_types/index.html index e9d27ca3d379f..8ad3b16e954b9 100644 --- a/content/cn/docs/0.10.1/table_types/index.html +++ b/content/cn/docs/0.10.1/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/timeline/index.html b/content/cn/docs/0.10.1/timeline/index.html index 768c37f0576d6..737fa1cb153ea 100644 --- a/content/cn/docs/0.10.1/timeline/index.html +++ b/content/cn/docs/0.10.1/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/transforms/index.html b/content/cn/docs/0.10.1/transforms/index.html index d586c4dee495d..6e9f1fb33c535 100644 --- a/content/cn/docs/0.10.1/transforms/index.html +++ b/content/cn/docs/0.10.1/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/troubleshooting/index.html b/content/cn/docs/0.10.1/troubleshooting/index.html index b01e82f45d61d..efa936624777a 100644 --- a/content/cn/docs/0.10.1/troubleshooting/index.html +++ b/content/cn/docs/0.10.1/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/tuning-guide/index.html b/content/cn/docs/0.10.1/tuning-guide/index.html index 5a0c91e1bc5cf..54edfbb16d5f5 100644 --- a/content/cn/docs/0.10.1/tuning-guide/index.html +++ b/content/cn/docs/0.10.1/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/use_cases/index.html b/content/cn/docs/0.10.1/use_cases/index.html index c07f9d29bf67d..e5d05a295d320 100644 --- a/content/cn/docs/0.10.1/use_cases/index.html +++ b/content/cn/docs/0.10.1/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/write_operations/index.html b/content/cn/docs/0.10.1/write_operations/index.html index 9f6c663bfcfe5..e0ea09d4e5cc6 100644 --- a/content/cn/docs/0.10.1/write_operations/index.html +++ b/content/cn/docs/0.10.1/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.10.1/writing_data/index.html b/content/cn/docs/0.10.1/writing_data/index.html index 7384ad247c016..b15d73a8169b0 100644 --- a/content/cn/docs/0.10.1/writing_data/index.html +++ b/content/cn/docs/0.10.1/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/azure_hoodie/index.html b/content/cn/docs/0.11.0/azure_hoodie/index.html index 2d35d058380be..7f0c166c498a5 100644 --- a/content/cn/docs/0.11.0/azure_hoodie/index.html +++ b/content/cn/docs/0.11.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/bos_hoodie/index.html b/content/cn/docs/0.11.0/bos_hoodie/index.html index 6c067989278c7..458ea17622a5b 100644 --- a/content/cn/docs/0.11.0/bos_hoodie/index.html +++ b/content/cn/docs/0.11.0/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/cli/index.html b/content/cn/docs/0.11.0/cli/index.html index ad4dfeedc8dc4..5eb00b34f6a6f 100644 --- a/content/cn/docs/0.11.0/cli/index.html +++ b/content/cn/docs/0.11.0/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/cloud/index.html b/content/cn/docs/0.11.0/cloud/index.html index 43069401a1962..41a3c9acdc8b3 100644 --- a/content/cn/docs/0.11.0/cloud/index.html +++ b/content/cn/docs/0.11.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/clustering/index.html b/content/cn/docs/0.11.0/clustering/index.html index 39ffe6ac59753..27f154799cd3f 100644 --- a/content/cn/docs/0.11.0/clustering/index.html +++ b/content/cn/docs/0.11.0/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/compaction/index.html b/content/cn/docs/0.11.0/compaction/index.html index a1f173177c106..49299d8165a82 100644 --- a/content/cn/docs/0.11.0/compaction/index.html +++ b/content/cn/docs/0.11.0/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/comparison/index.html b/content/cn/docs/0.11.0/comparison/index.html index 33fe7c48663a0..ea822c94f4e45 100644 --- a/content/cn/docs/0.11.0/comparison/index.html +++ b/content/cn/docs/0.11.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/concepts/index.html b/content/cn/docs/0.11.0/concepts/index.html index 1f5a7c5b9cf41..927aac4208946 100644 --- a/content/cn/docs/0.11.0/concepts/index.html +++ b/content/cn/docs/0.11.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/concurrency_control/index.html b/content/cn/docs/0.11.0/concurrency_control/index.html index a13d607438061..21ca9788ceb16 100644 --- a/content/cn/docs/0.11.0/concurrency_control/index.html +++ b/content/cn/docs/0.11.0/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/configurations/index.html b/content/cn/docs/0.11.0/configurations/index.html index f19f8c9ecec58..c63e4a3666d04 100644 --- a/content/cn/docs/0.11.0/configurations/index.html +++ b/content/cn/docs/0.11.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/cos_hoodie/index.html b/content/cn/docs/0.11.0/cos_hoodie/index.html index d09d5f74f6e64..d189cd46ea17a 100644 --- a/content/cn/docs/0.11.0/cos_hoodie/index.html +++ b/content/cn/docs/0.11.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/deployment/index.html b/content/cn/docs/0.11.0/deployment/index.html index 3798b5e5a297a..7bfc757821aa7 100644 --- a/content/cn/docs/0.11.0/deployment/index.html +++ b/content/cn/docs/0.11.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/disaster_recovery/index.html b/content/cn/docs/0.11.0/disaster_recovery/index.html index 43d15c5e8a1ff..63cecbed26186 100644 --- a/content/cn/docs/0.11.0/disaster_recovery/index.html +++ b/content/cn/docs/0.11.0/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/docker_demo/index.html b/content/cn/docs/0.11.0/docker_demo/index.html index 0e9088db0acff..b6a5893a2eef5 100644 --- a/content/cn/docs/0.11.0/docker_demo/index.html +++ b/content/cn/docs/0.11.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/encryption/index.html b/content/cn/docs/0.11.0/encryption/index.html index c0d26c753ded6..78ca37ace9cea 100644 --- a/content/cn/docs/0.11.0/encryption/index.html +++ b/content/cn/docs/0.11.0/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/faq/index.html b/content/cn/docs/0.11.0/faq/index.html index 991e8fa34cce1..c24e66e208255 100644 --- a/content/cn/docs/0.11.0/faq/index.html +++ b/content/cn/docs/0.11.0/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/file_layouts/index.html b/content/cn/docs/0.11.0/file_layouts/index.html index d1c09a290d38b..e49c129374944 100644 --- a/content/cn/docs/0.11.0/file_layouts/index.html +++ b/content/cn/docs/0.11.0/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/file_sizing/index.html b/content/cn/docs/0.11.0/file_sizing/index.html index 70776ce680de9..6f9eeed5ca35c 100644 --- a/content/cn/docs/0.11.0/file_sizing/index.html +++ b/content/cn/docs/0.11.0/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/flink-quick-start-guide/index.html b/content/cn/docs/0.11.0/flink-quick-start-guide/index.html index af47b935a7fa8..d8b1096f30a75 100644 --- a/content/cn/docs/0.11.0/flink-quick-start-guide/index.html +++ b/content/cn/docs/0.11.0/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/flink_configuration/index.html b/content/cn/docs/0.11.0/flink_configuration/index.html index 3f3d903f0c6d3..fd828612aec6e 100644 --- a/content/cn/docs/0.11.0/flink_configuration/index.html +++ b/content/cn/docs/0.11.0/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/gcp_bigquery/index.html b/content/cn/docs/0.11.0/gcp_bigquery/index.html index 5c8cba7b92aef..52d63c7d22c97 100644 --- a/content/cn/docs/0.11.0/gcp_bigquery/index.html +++ b/content/cn/docs/0.11.0/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/gcs_hoodie/index.html b/content/cn/docs/0.11.0/gcs_hoodie/index.html index 0abd47eb788b8..3d7afb68a2b8e 100644 --- a/content/cn/docs/0.11.0/gcs_hoodie/index.html +++ b/content/cn/docs/0.11.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/hoodie_cleaner/index.html b/content/cn/docs/0.11.0/hoodie_cleaner/index.html index 55f8e7092235e..e5d90e8e9bdde 100644 --- a/content/cn/docs/0.11.0/hoodie_cleaner/index.html +++ b/content/cn/docs/0.11.0/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/hoodie_deltastreamer/index.html b/content/cn/docs/0.11.0/hoodie_deltastreamer/index.html index 12bc09687fcfd..2dad315b1d592 100644 --- a/content/cn/docs/0.11.0/hoodie_deltastreamer/index.html +++ b/content/cn/docs/0.11.0/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/ibm_cos_hoodie/index.html b/content/cn/docs/0.11.0/ibm_cos_hoodie/index.html index b9a0b62c41fa7..0b8c2430902e7 100644 --- a/content/cn/docs/0.11.0/ibm_cos_hoodie/index.html +++ b/content/cn/docs/0.11.0/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/indexing/index.html b/content/cn/docs/0.11.0/indexing/index.html index 3b127603f887d..f5cd53bdfee14 100644 --- a/content/cn/docs/0.11.0/indexing/index.html +++ b/content/cn/docs/0.11.0/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/jfs_hoodie/index.html b/content/cn/docs/0.11.0/jfs_hoodie/index.html index b324761b4dc26..69ff6704f1146 100644 --- a/content/cn/docs/0.11.0/jfs_hoodie/index.html +++ b/content/cn/docs/0.11.0/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/key_generation/index.html b/content/cn/docs/0.11.0/key_generation/index.html index c8d9843282047..b9802a7b61177 100644 --- a/content/cn/docs/0.11.0/key_generation/index.html +++ b/content/cn/docs/0.11.0/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/markers/index.html b/content/cn/docs/0.11.0/markers/index.html index 85338157ef7ee..72ddee5865f0d 100644 --- a/content/cn/docs/0.11.0/markers/index.html +++ b/content/cn/docs/0.11.0/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/metadata/index.html b/content/cn/docs/0.11.0/metadata/index.html index 0c87cc9346878..2558f5fab1b96 100644 --- a/content/cn/docs/0.11.0/metadata/index.html +++ b/content/cn/docs/0.11.0/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/metadata_indexing/index.html b/content/cn/docs/0.11.0/metadata_indexing/index.html index 7e14892d9fde5..99b92dce6b6c2 100644 --- a/content/cn/docs/0.11.0/metadata_indexing/index.html +++ b/content/cn/docs/0.11.0/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/metrics/index.html b/content/cn/docs/0.11.0/metrics/index.html index c1b340dfcd1fb..c79ec56697415 100644 --- a/content/cn/docs/0.11.0/metrics/index.html +++ b/content/cn/docs/0.11.0/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/migration_guide/index.html b/content/cn/docs/0.11.0/migration_guide/index.html index 2ec1bd10fd253..9580cbfd44cf6 100644 --- a/content/cn/docs/0.11.0/migration_guide/index.html +++ b/content/cn/docs/0.11.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/oss_hoodie/index.html b/content/cn/docs/0.11.0/oss_hoodie/index.html index df52d5637fc07..a46493bae899c 100644 --- a/content/cn/docs/0.11.0/oss_hoodie/index.html +++ b/content/cn/docs/0.11.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/overview/index.html b/content/cn/docs/0.11.0/overview/index.html index b5ebdb19a4d66..e1ab063758d84 100644 --- a/content/cn/docs/0.11.0/overview/index.html +++ b/content/cn/docs/0.11.0/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/performance/index.html b/content/cn/docs/0.11.0/performance/index.html index 095c224f2cbdb..f9c805796f799 100644 --- a/content/cn/docs/0.11.0/performance/index.html +++ b/content/cn/docs/0.11.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/precommit_validator/index.html b/content/cn/docs/0.11.0/precommit_validator/index.html index b3fe999cf7716..ed43438b5c0d2 100644 --- a/content/cn/docs/0.11.0/precommit_validator/index.html +++ b/content/cn/docs/0.11.0/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/privacy/index.html b/content/cn/docs/0.11.0/privacy/index.html index 77d7e2a090cc0..dce7c77c1ac65 100644 --- a/content/cn/docs/0.11.0/privacy/index.html +++ b/content/cn/docs/0.11.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/procedures/index.html b/content/cn/docs/0.11.0/procedures/index.html index 1343d87192991..84fa204b15b01 100644 --- a/content/cn/docs/0.11.0/procedures/index.html +++ b/content/cn/docs/0.11.0/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/query_engine_setup/index.html b/content/cn/docs/0.11.0/query_engine_setup/index.html index f696d9660225a..ff8fdeb81c9ce 100644 --- a/content/cn/docs/0.11.0/query_engine_setup/index.html +++ b/content/cn/docs/0.11.0/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/querying_data/index.html b/content/cn/docs/0.11.0/querying_data/index.html index c425103c4fb29..60f6ebef454b1 100644 --- a/content/cn/docs/0.11.0/querying_data/index.html +++ b/content/cn/docs/0.11.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/quick-start-guide/index.html b/content/cn/docs/0.11.0/quick-start-guide/index.html index 93449b1478480..11deb3dd9a44c 100644 --- a/content/cn/docs/0.11.0/quick-start-guide/index.html +++ b/content/cn/docs/0.11.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/s3_hoodie/index.html b/content/cn/docs/0.11.0/s3_hoodie/index.html index 2088346273a7a..545471d367799 100644 --- a/content/cn/docs/0.11.0/s3_hoodie/index.html +++ b/content/cn/docs/0.11.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/schema_evolution/index.html b/content/cn/docs/0.11.0/schema_evolution/index.html index 753ab8e9da65f..3872c30cab690 100644 --- a/content/cn/docs/0.11.0/schema_evolution/index.html +++ b/content/cn/docs/0.11.0/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/snapshot_exporter/index.html b/content/cn/docs/0.11.0/snapshot_exporter/index.html index 498eaf7380104..a929eb88f53af 100644 --- a/content/cn/docs/0.11.0/snapshot_exporter/index.html +++ b/content/cn/docs/0.11.0/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/structure/index.html b/content/cn/docs/0.11.0/structure/index.html index 994059104e3de..6e3769dae11b1 100644 --- a/content/cn/docs/0.11.0/structure/index.html +++ b/content/cn/docs/0.11.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/syncing_aws_glue_data_catalog/index.html b/content/cn/docs/0.11.0/syncing_aws_glue_data_catalog/index.html index 856930307e93a..f8a75d5e5f512 100644 --- a/content/cn/docs/0.11.0/syncing_aws_glue_data_catalog/index.html +++ b/content/cn/docs/0.11.0/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/syncing_datahub/index.html b/content/cn/docs/0.11.0/syncing_datahub/index.html index 270afe78ad338..5bd748e40f782 100644 --- a/content/cn/docs/0.11.0/syncing_datahub/index.html +++ b/content/cn/docs/0.11.0/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/syncing_metastore/index.html b/content/cn/docs/0.11.0/syncing_metastore/index.html index b60bd78eb8213..39df0278dd4d6 100644 --- a/content/cn/docs/0.11.0/syncing_metastore/index.html +++ b/content/cn/docs/0.11.0/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/table_management/index.html b/content/cn/docs/0.11.0/table_management/index.html index acf4f5bc5e7fe..d8a1dadd99002 100644 --- a/content/cn/docs/0.11.0/table_management/index.html +++ b/content/cn/docs/0.11.0/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/table_types/index.html b/content/cn/docs/0.11.0/table_types/index.html index 88bfdcdea686e..c9604093a91c0 100644 --- a/content/cn/docs/0.11.0/table_types/index.html +++ b/content/cn/docs/0.11.0/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/timeline/index.html b/content/cn/docs/0.11.0/timeline/index.html index c65fd6d0610b6..6ec5d1672e232 100644 --- a/content/cn/docs/0.11.0/timeline/index.html +++ b/content/cn/docs/0.11.0/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/transforms/index.html b/content/cn/docs/0.11.0/transforms/index.html index 4b87f02b0660e..473978499a82b 100644 --- a/content/cn/docs/0.11.0/transforms/index.html +++ b/content/cn/docs/0.11.0/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/troubleshooting/index.html b/content/cn/docs/0.11.0/troubleshooting/index.html index 6fb496055366a..8337e0017b3f4 100644 --- a/content/cn/docs/0.11.0/troubleshooting/index.html +++ b/content/cn/docs/0.11.0/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/tuning-guide/index.html b/content/cn/docs/0.11.0/tuning-guide/index.html index 951fbb8ce7582..684ead9fedb76 100644 --- a/content/cn/docs/0.11.0/tuning-guide/index.html +++ b/content/cn/docs/0.11.0/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/use_cases/index.html b/content/cn/docs/0.11.0/use_cases/index.html index 91265ce7af842..aad1e831884bb 100644 --- a/content/cn/docs/0.11.0/use_cases/index.html +++ b/content/cn/docs/0.11.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/write_operations/index.html b/content/cn/docs/0.11.0/write_operations/index.html index 5cbc250695677..19ad421e551cf 100644 --- a/content/cn/docs/0.11.0/write_operations/index.html +++ b/content/cn/docs/0.11.0/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.0/writing_data/index.html b/content/cn/docs/0.11.0/writing_data/index.html index aa69570164b0c..b4e2c26df47c7 100644 --- a/content/cn/docs/0.11.0/writing_data/index.html +++ b/content/cn/docs/0.11.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/azure_hoodie/index.html b/content/cn/docs/0.11.1/azure_hoodie/index.html index 1903b47994e96..cd2dafc5fe70c 100644 --- a/content/cn/docs/0.11.1/azure_hoodie/index.html +++ b/content/cn/docs/0.11.1/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/basic_configurations/index.html b/content/cn/docs/0.11.1/basic_configurations/index.html index c04ef205b661d..35c136c47edbb 100644 --- a/content/cn/docs/0.11.1/basic_configurations/index.html +++ b/content/cn/docs/0.11.1/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/bos_hoodie/index.html b/content/cn/docs/0.11.1/bos_hoodie/index.html index 8a487368b208e..efd8fadd31b83 100644 --- a/content/cn/docs/0.11.1/bos_hoodie/index.html +++ b/content/cn/docs/0.11.1/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/cli/index.html b/content/cn/docs/0.11.1/cli/index.html index be116ed9ccf32..8950531619348 100644 --- a/content/cn/docs/0.11.1/cli/index.html +++ b/content/cn/docs/0.11.1/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/cloud/index.html b/content/cn/docs/0.11.1/cloud/index.html index e15b74604e1c8..9921bab6204be 100644 --- a/content/cn/docs/0.11.1/cloud/index.html +++ b/content/cn/docs/0.11.1/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/clustering/index.html b/content/cn/docs/0.11.1/clustering/index.html index 2d7b0d5473081..44d64ef74a74e 100644 --- a/content/cn/docs/0.11.1/clustering/index.html +++ b/content/cn/docs/0.11.1/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/compaction/index.html b/content/cn/docs/0.11.1/compaction/index.html index 6bdcd6efd3977..3411a55dbd642 100644 --- a/content/cn/docs/0.11.1/compaction/index.html +++ b/content/cn/docs/0.11.1/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/comparison/index.html b/content/cn/docs/0.11.1/comparison/index.html index 88d634678dcf2..1814ff7efea9f 100644 --- a/content/cn/docs/0.11.1/comparison/index.html +++ b/content/cn/docs/0.11.1/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/concepts/index.html b/content/cn/docs/0.11.1/concepts/index.html index 1d05c37cb4c59..7e91cfc33a33b 100644 --- a/content/cn/docs/0.11.1/concepts/index.html +++ b/content/cn/docs/0.11.1/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/concurrency_control/index.html b/content/cn/docs/0.11.1/concurrency_control/index.html index ba8ffbdd0fd8c..b502c2a188ada 100644 --- a/content/cn/docs/0.11.1/concurrency_control/index.html +++ b/content/cn/docs/0.11.1/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/configurations/index.html b/content/cn/docs/0.11.1/configurations/index.html index ad319ab721ed5..1b94cbd7a7743 100644 --- a/content/cn/docs/0.11.1/configurations/index.html +++ b/content/cn/docs/0.11.1/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/cos_hoodie/index.html b/content/cn/docs/0.11.1/cos_hoodie/index.html index 2f0e7d7b0b9ae..0aee3d61bc7ae 100644 --- a/content/cn/docs/0.11.1/cos_hoodie/index.html +++ b/content/cn/docs/0.11.1/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/deployment/index.html b/content/cn/docs/0.11.1/deployment/index.html index 9479b61dfed46..86e29c61203d1 100644 --- a/content/cn/docs/0.11.1/deployment/index.html +++ b/content/cn/docs/0.11.1/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/disaster_recovery/index.html b/content/cn/docs/0.11.1/disaster_recovery/index.html index 2c22193f28fee..29f141d4523e9 100644 --- a/content/cn/docs/0.11.1/disaster_recovery/index.html +++ b/content/cn/docs/0.11.1/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/docker_demo/index.html b/content/cn/docs/0.11.1/docker_demo/index.html index c302d1c01ad9e..d10cc84fa3df7 100644 --- a/content/cn/docs/0.11.1/docker_demo/index.html +++ b/content/cn/docs/0.11.1/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/encryption/index.html b/content/cn/docs/0.11.1/encryption/index.html index 4e277ea0fafca..7f11fc312a136 100644 --- a/content/cn/docs/0.11.1/encryption/index.html +++ b/content/cn/docs/0.11.1/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/faq/index.html b/content/cn/docs/0.11.1/faq/index.html index 75ee0921ffb66..38d641c73e210 100644 --- a/content/cn/docs/0.11.1/faq/index.html +++ b/content/cn/docs/0.11.1/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/file_layouts/index.html b/content/cn/docs/0.11.1/file_layouts/index.html index 8e10131266322..c9787b8873404 100644 --- a/content/cn/docs/0.11.1/file_layouts/index.html +++ b/content/cn/docs/0.11.1/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/file_sizing/index.html b/content/cn/docs/0.11.1/file_sizing/index.html index 9e03961a2d76b..3535ebd124191 100644 --- a/content/cn/docs/0.11.1/file_sizing/index.html +++ b/content/cn/docs/0.11.1/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/flink-quick-start-guide/index.html b/content/cn/docs/0.11.1/flink-quick-start-guide/index.html index 74b89a3b4c1c4..96cc15aeeb22f 100644 --- a/content/cn/docs/0.11.1/flink-quick-start-guide/index.html +++ b/content/cn/docs/0.11.1/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/flink_configuration/index.html b/content/cn/docs/0.11.1/flink_configuration/index.html index 45c501a618261..7a3e5a19c917a 100644 --- a/content/cn/docs/0.11.1/flink_configuration/index.html +++ b/content/cn/docs/0.11.1/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/gcp_bigquery/index.html b/content/cn/docs/0.11.1/gcp_bigquery/index.html index e7e48e9bfba71..bc854b7a0f710 100644 --- a/content/cn/docs/0.11.1/gcp_bigquery/index.html +++ b/content/cn/docs/0.11.1/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/gcs_hoodie/index.html b/content/cn/docs/0.11.1/gcs_hoodie/index.html index 5e6af2b7ccc62..06381a611914c 100644 --- a/content/cn/docs/0.11.1/gcs_hoodie/index.html +++ b/content/cn/docs/0.11.1/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/hoodie_cleaner/index.html b/content/cn/docs/0.11.1/hoodie_cleaner/index.html index ba1a935cba0d5..33938dc148a91 100644 --- a/content/cn/docs/0.11.1/hoodie_cleaner/index.html +++ b/content/cn/docs/0.11.1/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/hoodie_deltastreamer/index.html b/content/cn/docs/0.11.1/hoodie_deltastreamer/index.html index 88523b2fce111..2c88b684021c4 100644 --- a/content/cn/docs/0.11.1/hoodie_deltastreamer/index.html +++ b/content/cn/docs/0.11.1/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/ibm_cos_hoodie/index.html b/content/cn/docs/0.11.1/ibm_cos_hoodie/index.html index 3192959ce371c..c45062089ecd9 100644 --- a/content/cn/docs/0.11.1/ibm_cos_hoodie/index.html +++ b/content/cn/docs/0.11.1/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/indexing/index.html b/content/cn/docs/0.11.1/indexing/index.html index 97e977f231949..a7bc5445fbbfb 100644 --- a/content/cn/docs/0.11.1/indexing/index.html +++ b/content/cn/docs/0.11.1/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/jfs_hoodie/index.html b/content/cn/docs/0.11.1/jfs_hoodie/index.html index e2ef66b50a93b..3c5b0abd5638d 100644 --- a/content/cn/docs/0.11.1/jfs_hoodie/index.html +++ b/content/cn/docs/0.11.1/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/key_generation/index.html b/content/cn/docs/0.11.1/key_generation/index.html index 134aaa618ca46..13b57b68541c7 100644 --- a/content/cn/docs/0.11.1/key_generation/index.html +++ b/content/cn/docs/0.11.1/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/markers/index.html b/content/cn/docs/0.11.1/markers/index.html index bbeb4b8c9d89a..75c16ed2b23d4 100644 --- a/content/cn/docs/0.11.1/markers/index.html +++ b/content/cn/docs/0.11.1/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/metadata/index.html b/content/cn/docs/0.11.1/metadata/index.html index 2437f7b48838e..0ff7bfc2dee2a 100644 --- a/content/cn/docs/0.11.1/metadata/index.html +++ b/content/cn/docs/0.11.1/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/metadata_indexing/index.html b/content/cn/docs/0.11.1/metadata_indexing/index.html index d6aa3d1b0765c..ce6551c5eeabc 100644 --- a/content/cn/docs/0.11.1/metadata_indexing/index.html +++ b/content/cn/docs/0.11.1/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/metrics/index.html b/content/cn/docs/0.11.1/metrics/index.html index 60e30436d88fb..3810a92648cb4 100644 --- a/content/cn/docs/0.11.1/metrics/index.html +++ b/content/cn/docs/0.11.1/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/migration_guide/index.html b/content/cn/docs/0.11.1/migration_guide/index.html index 23e474231d100..44b657d04ba5f 100644 --- a/content/cn/docs/0.11.1/migration_guide/index.html +++ b/content/cn/docs/0.11.1/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/oss_hoodie/index.html b/content/cn/docs/0.11.1/oss_hoodie/index.html index b4660443d3b9e..e0f84192f61eb 100644 --- a/content/cn/docs/0.11.1/oss_hoodie/index.html +++ b/content/cn/docs/0.11.1/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/overview/index.html b/content/cn/docs/0.11.1/overview/index.html index 3d1fd180a4751..deeea3e57529d 100644 --- a/content/cn/docs/0.11.1/overview/index.html +++ b/content/cn/docs/0.11.1/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/performance/index.html b/content/cn/docs/0.11.1/performance/index.html index e56e3e8ca0e23..e06a75d35992a 100644 --- a/content/cn/docs/0.11.1/performance/index.html +++ b/content/cn/docs/0.11.1/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/precommit_validator/index.html b/content/cn/docs/0.11.1/precommit_validator/index.html index 88ae7679d593f..d2094c040887d 100644 --- a/content/cn/docs/0.11.1/precommit_validator/index.html +++ b/content/cn/docs/0.11.1/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/privacy/index.html b/content/cn/docs/0.11.1/privacy/index.html index 260e8f43ecd3c..980c4f7c3da35 100644 --- a/content/cn/docs/0.11.1/privacy/index.html +++ b/content/cn/docs/0.11.1/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/procedures/index.html b/content/cn/docs/0.11.1/procedures/index.html index c08703e78f421..0ad66a0305fab 100644 --- a/content/cn/docs/0.11.1/procedures/index.html +++ b/content/cn/docs/0.11.1/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/query_engine_setup/index.html b/content/cn/docs/0.11.1/query_engine_setup/index.html index 08bce3c491d14..158a87da49c12 100644 --- a/content/cn/docs/0.11.1/query_engine_setup/index.html +++ b/content/cn/docs/0.11.1/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/querying_data/index.html b/content/cn/docs/0.11.1/querying_data/index.html index 6edcfc0615d7b..6645903562f2e 100644 --- a/content/cn/docs/0.11.1/querying_data/index.html +++ b/content/cn/docs/0.11.1/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/quick-start-guide/index.html b/content/cn/docs/0.11.1/quick-start-guide/index.html index ea0be7bb70e9e..c2452e80d4485 100644 --- a/content/cn/docs/0.11.1/quick-start-guide/index.html +++ b/content/cn/docs/0.11.1/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/s3_hoodie/index.html b/content/cn/docs/0.11.1/s3_hoodie/index.html index acfcafe1618b6..44c503924d3e8 100644 --- a/content/cn/docs/0.11.1/s3_hoodie/index.html +++ b/content/cn/docs/0.11.1/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/schema_evolution/index.html b/content/cn/docs/0.11.1/schema_evolution/index.html index 04984db033882..a3783136c36d4 100644 --- a/content/cn/docs/0.11.1/schema_evolution/index.html +++ b/content/cn/docs/0.11.1/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/snapshot_exporter/index.html b/content/cn/docs/0.11.1/snapshot_exporter/index.html index dfd9a6c34cc8f..3785210842700 100644 --- a/content/cn/docs/0.11.1/snapshot_exporter/index.html +++ b/content/cn/docs/0.11.1/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/structure/index.html b/content/cn/docs/0.11.1/structure/index.html index 1e1a7eb1e13d6..b054add693c64 100644 --- a/content/cn/docs/0.11.1/structure/index.html +++ b/content/cn/docs/0.11.1/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/syncing_aws_glue_data_catalog/index.html b/content/cn/docs/0.11.1/syncing_aws_glue_data_catalog/index.html index 73379a4612aaf..13176b8f6f01a 100644 --- a/content/cn/docs/0.11.1/syncing_aws_glue_data_catalog/index.html +++ b/content/cn/docs/0.11.1/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/syncing_datahub/index.html b/content/cn/docs/0.11.1/syncing_datahub/index.html index cdfde8181b8f3..4b17ece30e7a7 100644 --- a/content/cn/docs/0.11.1/syncing_datahub/index.html +++ b/content/cn/docs/0.11.1/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/syncing_metastore/index.html b/content/cn/docs/0.11.1/syncing_metastore/index.html index 234252b92a51e..009f990398024 100644 --- a/content/cn/docs/0.11.1/syncing_metastore/index.html +++ b/content/cn/docs/0.11.1/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/table_management/index.html b/content/cn/docs/0.11.1/table_management/index.html index addec6943f479..474f55b0c6616 100644 --- a/content/cn/docs/0.11.1/table_management/index.html +++ b/content/cn/docs/0.11.1/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/table_types/index.html b/content/cn/docs/0.11.1/table_types/index.html index 7cd120f5810fb..76d82c9a3d7a6 100644 --- a/content/cn/docs/0.11.1/table_types/index.html +++ b/content/cn/docs/0.11.1/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/timeline/index.html b/content/cn/docs/0.11.1/timeline/index.html index 58c01c1e4d761..94fd0078c6250 100644 --- a/content/cn/docs/0.11.1/timeline/index.html +++ b/content/cn/docs/0.11.1/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/transforms/index.html b/content/cn/docs/0.11.1/transforms/index.html index 4960bda12863d..aa39db544dc81 100644 --- a/content/cn/docs/0.11.1/transforms/index.html +++ b/content/cn/docs/0.11.1/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/troubleshooting/index.html b/content/cn/docs/0.11.1/troubleshooting/index.html index 124a29fdee517..fa4a53118f1c8 100644 --- a/content/cn/docs/0.11.1/troubleshooting/index.html +++ b/content/cn/docs/0.11.1/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/tuning-guide/index.html b/content/cn/docs/0.11.1/tuning-guide/index.html index 9ed243da69c5c..75c9944c309e2 100644 --- a/content/cn/docs/0.11.1/tuning-guide/index.html +++ b/content/cn/docs/0.11.1/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/use_cases/index.html b/content/cn/docs/0.11.1/use_cases/index.html index 5c7db308b18d1..09feed5abf73b 100644 --- a/content/cn/docs/0.11.1/use_cases/index.html +++ b/content/cn/docs/0.11.1/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/write_operations/index.html b/content/cn/docs/0.11.1/write_operations/index.html index 9d02f93fe15ec..9e4f5656e57ff 100644 --- a/content/cn/docs/0.11.1/write_operations/index.html +++ b/content/cn/docs/0.11.1/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.11.1/writing_data/index.html b/content/cn/docs/0.11.1/writing_data/index.html index 8d3be86ff3ad4..9af2ca8d5f21d 100644 --- a/content/cn/docs/0.11.1/writing_data/index.html +++ b/content/cn/docs/0.11.1/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/azure_hoodie/index.html b/content/cn/docs/0.12.0/azure_hoodie/index.html index 0ae924df860b6..218b59d81b771 100644 --- a/content/cn/docs/0.12.0/azure_hoodie/index.html +++ b/content/cn/docs/0.12.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/basic_configurations/index.html b/content/cn/docs/0.12.0/basic_configurations/index.html index 94b70017daf04..30990dcedadba 100644 --- a/content/cn/docs/0.12.0/basic_configurations/index.html +++ b/content/cn/docs/0.12.0/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/bos_hoodie/index.html b/content/cn/docs/0.12.0/bos_hoodie/index.html index 27a9052474ae3..b5753548c57b7 100644 --- a/content/cn/docs/0.12.0/bos_hoodie/index.html +++ b/content/cn/docs/0.12.0/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/cli/index.html b/content/cn/docs/0.12.0/cli/index.html index bcc3466e16947..412e4260aea44 100644 --- a/content/cn/docs/0.12.0/cli/index.html +++ b/content/cn/docs/0.12.0/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/cloud/index.html b/content/cn/docs/0.12.0/cloud/index.html index 9ecd1b534fa57..ae954c774742e 100644 --- a/content/cn/docs/0.12.0/cloud/index.html +++ b/content/cn/docs/0.12.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/clustering/index.html b/content/cn/docs/0.12.0/clustering/index.html index 90cf8f06169f6..37a395f655957 100644 --- a/content/cn/docs/0.12.0/clustering/index.html +++ b/content/cn/docs/0.12.0/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/compaction/index.html b/content/cn/docs/0.12.0/compaction/index.html index fafb14e448487..c14654e79885d 100644 --- a/content/cn/docs/0.12.0/compaction/index.html +++ b/content/cn/docs/0.12.0/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/comparison/index.html b/content/cn/docs/0.12.0/comparison/index.html index 67788d2d59fef..7b4a4c19c2943 100644 --- a/content/cn/docs/0.12.0/comparison/index.html +++ b/content/cn/docs/0.12.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/concepts/index.html b/content/cn/docs/0.12.0/concepts/index.html index 3aeb4c21a372e..4a7ff9c112fb0 100644 --- a/content/cn/docs/0.12.0/concepts/index.html +++ b/content/cn/docs/0.12.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/concurrency_control/index.html b/content/cn/docs/0.12.0/concurrency_control/index.html index 59da5cf6980d4..4508d7af47439 100644 --- a/content/cn/docs/0.12.0/concurrency_control/index.html +++ b/content/cn/docs/0.12.0/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/configurations/index.html b/content/cn/docs/0.12.0/configurations/index.html index 271b3b61bed99..fdd1079d89509 100644 --- a/content/cn/docs/0.12.0/configurations/index.html +++ b/content/cn/docs/0.12.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/cos_hoodie/index.html b/content/cn/docs/0.12.0/cos_hoodie/index.html index 554a3619a7948..1cb3722efd802 100644 --- a/content/cn/docs/0.12.0/cos_hoodie/index.html +++ b/content/cn/docs/0.12.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/deployment/index.html b/content/cn/docs/0.12.0/deployment/index.html index 7d914822304cc..1369b96004fcb 100644 --- a/content/cn/docs/0.12.0/deployment/index.html +++ b/content/cn/docs/0.12.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/disaster_recovery/index.html b/content/cn/docs/0.12.0/disaster_recovery/index.html index 8fc352357fe00..828595805d83f 100644 --- a/content/cn/docs/0.12.0/disaster_recovery/index.html +++ b/content/cn/docs/0.12.0/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/docker_demo/index.html b/content/cn/docs/0.12.0/docker_demo/index.html index c08b3b002e6aa..16f1914a8f0ec 100644 --- a/content/cn/docs/0.12.0/docker_demo/index.html +++ b/content/cn/docs/0.12.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/encryption/index.html b/content/cn/docs/0.12.0/encryption/index.html index 8e3cd0860cb4b..ef7e5fad9e622 100644 --- a/content/cn/docs/0.12.0/encryption/index.html +++ b/content/cn/docs/0.12.0/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/faq/index.html b/content/cn/docs/0.12.0/faq/index.html index 271e215ef7463..f7ed404756dea 100644 --- a/content/cn/docs/0.12.0/faq/index.html +++ b/content/cn/docs/0.12.0/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/file_layouts/index.html b/content/cn/docs/0.12.0/file_layouts/index.html index 6c6c0811548f8..312aca67db2d8 100644 --- a/content/cn/docs/0.12.0/file_layouts/index.html +++ b/content/cn/docs/0.12.0/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/file_sizing/index.html b/content/cn/docs/0.12.0/file_sizing/index.html index 632adc544175d..23f46d169ad49 100644 --- a/content/cn/docs/0.12.0/file_sizing/index.html +++ b/content/cn/docs/0.12.0/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/flink-quick-start-guide/index.html b/content/cn/docs/0.12.0/flink-quick-start-guide/index.html index 688c1f2a5d29f..4131bd23a788b 100644 --- a/content/cn/docs/0.12.0/flink-quick-start-guide/index.html +++ b/content/cn/docs/0.12.0/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/flink_configuration/index.html b/content/cn/docs/0.12.0/flink_configuration/index.html index 3fc0dfd5bc9fa..c6aa6ae9c174f 100644 --- a/content/cn/docs/0.12.0/flink_configuration/index.html +++ b/content/cn/docs/0.12.0/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/gcp_bigquery/index.html b/content/cn/docs/0.12.0/gcp_bigquery/index.html index cc4bcdddd91f8..0f06eb147a224 100644 --- a/content/cn/docs/0.12.0/gcp_bigquery/index.html +++ b/content/cn/docs/0.12.0/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/gcs_hoodie/index.html b/content/cn/docs/0.12.0/gcs_hoodie/index.html index 255c188d4b3c5..9fd27d30dd93b 100644 --- a/content/cn/docs/0.12.0/gcs_hoodie/index.html +++ b/content/cn/docs/0.12.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/hoodie_cleaner/index.html b/content/cn/docs/0.12.0/hoodie_cleaner/index.html index 01fc11641f4ba..47213d01cbe03 100644 --- a/content/cn/docs/0.12.0/hoodie_cleaner/index.html +++ b/content/cn/docs/0.12.0/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/hoodie_deltastreamer/index.html b/content/cn/docs/0.12.0/hoodie_deltastreamer/index.html index 1b687ae7a87b7..a2c1197afb98f 100644 --- a/content/cn/docs/0.12.0/hoodie_deltastreamer/index.html +++ b/content/cn/docs/0.12.0/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/ibm_cos_hoodie/index.html b/content/cn/docs/0.12.0/ibm_cos_hoodie/index.html index 4b57861e8ecac..f390abafb2a72 100644 --- a/content/cn/docs/0.12.0/ibm_cos_hoodie/index.html +++ b/content/cn/docs/0.12.0/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/indexing/index.html b/content/cn/docs/0.12.0/indexing/index.html index ddf6efe1ca68d..b1a0d8494892a 100644 --- a/content/cn/docs/0.12.0/indexing/index.html +++ b/content/cn/docs/0.12.0/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/jfs_hoodie/index.html b/content/cn/docs/0.12.0/jfs_hoodie/index.html index 008789638b8ee..b57a5c341df0e 100644 --- a/content/cn/docs/0.12.0/jfs_hoodie/index.html +++ b/content/cn/docs/0.12.0/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/key_generation/index.html b/content/cn/docs/0.12.0/key_generation/index.html index dd2fd36d974c4..2044b635dd186 100644 --- a/content/cn/docs/0.12.0/key_generation/index.html +++ b/content/cn/docs/0.12.0/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/markers/index.html b/content/cn/docs/0.12.0/markers/index.html index c0f7842e97972..584a2c0f12011 100644 --- a/content/cn/docs/0.12.0/markers/index.html +++ b/content/cn/docs/0.12.0/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/metadata/index.html b/content/cn/docs/0.12.0/metadata/index.html index 8219d2d4b442b..375bbec23aaa4 100644 --- a/content/cn/docs/0.12.0/metadata/index.html +++ b/content/cn/docs/0.12.0/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/metadata_indexing/index.html b/content/cn/docs/0.12.0/metadata_indexing/index.html index aa29d5274ac18..d73784adaf27b 100644 --- a/content/cn/docs/0.12.0/metadata_indexing/index.html +++ b/content/cn/docs/0.12.0/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/metrics/index.html b/content/cn/docs/0.12.0/metrics/index.html index 9381d0a30f30a..1b260d209a279 100644 --- a/content/cn/docs/0.12.0/metrics/index.html +++ b/content/cn/docs/0.12.0/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/migration_guide/index.html b/content/cn/docs/0.12.0/migration_guide/index.html index 207f21486fff8..af2ade497b4ee 100644 --- a/content/cn/docs/0.12.0/migration_guide/index.html +++ b/content/cn/docs/0.12.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/oci_hoodie/index.html b/content/cn/docs/0.12.0/oci_hoodie/index.html index 50ef3274e4734..8a7219c6df65b 100644 --- a/content/cn/docs/0.12.0/oci_hoodie/index.html +++ b/content/cn/docs/0.12.0/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/oss_hoodie/index.html b/content/cn/docs/0.12.0/oss_hoodie/index.html index 2e1bd419a36aa..e989e9b3f02c0 100644 --- a/content/cn/docs/0.12.0/oss_hoodie/index.html +++ b/content/cn/docs/0.12.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/overview/index.html b/content/cn/docs/0.12.0/overview/index.html index 06af97c86b6f7..5458aceacd283 100644 --- a/content/cn/docs/0.12.0/overview/index.html +++ b/content/cn/docs/0.12.0/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/performance/index.html b/content/cn/docs/0.12.0/performance/index.html index f6b7e00f3c45f..26bc8796bcbb9 100644 --- a/content/cn/docs/0.12.0/performance/index.html +++ b/content/cn/docs/0.12.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/precommit_validator/index.html b/content/cn/docs/0.12.0/precommit_validator/index.html index b931f0cccfc97..794559d0cdd9a 100644 --- a/content/cn/docs/0.12.0/precommit_validator/index.html +++ b/content/cn/docs/0.12.0/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/privacy/index.html b/content/cn/docs/0.12.0/privacy/index.html index 48fc497724337..6ad293bbba91b 100644 --- a/content/cn/docs/0.12.0/privacy/index.html +++ b/content/cn/docs/0.12.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/procedures/index.html b/content/cn/docs/0.12.0/procedures/index.html index f8a5558ea9056..7f89ae1b5025e 100644 --- a/content/cn/docs/0.12.0/procedures/index.html +++ b/content/cn/docs/0.12.0/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/query_engine_setup/index.html b/content/cn/docs/0.12.0/query_engine_setup/index.html index c19c5ba380f3e..b41c9947c3614 100644 --- a/content/cn/docs/0.12.0/query_engine_setup/index.html +++ b/content/cn/docs/0.12.0/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/querying_data/index.html b/content/cn/docs/0.12.0/querying_data/index.html index 4d046c978c0cd..be42f60448921 100644 --- a/content/cn/docs/0.12.0/querying_data/index.html +++ b/content/cn/docs/0.12.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/quick-start-guide/index.html b/content/cn/docs/0.12.0/quick-start-guide/index.html index a3ee13fe96e39..710f0220c5637 100644 --- a/content/cn/docs/0.12.0/quick-start-guide/index.html +++ b/content/cn/docs/0.12.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/s3_hoodie/index.html b/content/cn/docs/0.12.0/s3_hoodie/index.html index 03911e851b9ed..e35619f66e76c 100644 --- a/content/cn/docs/0.12.0/s3_hoodie/index.html +++ b/content/cn/docs/0.12.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/schema_evolution/index.html b/content/cn/docs/0.12.0/schema_evolution/index.html index 9aeb9ffc03017..220073769c3af 100644 --- a/content/cn/docs/0.12.0/schema_evolution/index.html +++ b/content/cn/docs/0.12.0/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/snapshot_exporter/index.html b/content/cn/docs/0.12.0/snapshot_exporter/index.html index 6d0ae0c3ed0c8..f2d2746c7d974 100644 --- a/content/cn/docs/0.12.0/snapshot_exporter/index.html +++ b/content/cn/docs/0.12.0/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/structure/index.html b/content/cn/docs/0.12.0/structure/index.html index 8a451e3867eb8..080ba7734a096 100644 --- a/content/cn/docs/0.12.0/structure/index.html +++ b/content/cn/docs/0.12.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/syncing_aws_glue_data_catalog/index.html b/content/cn/docs/0.12.0/syncing_aws_glue_data_catalog/index.html index 8dd97bfb2c518..e73f4688f2dc3 100644 --- a/content/cn/docs/0.12.0/syncing_aws_glue_data_catalog/index.html +++ b/content/cn/docs/0.12.0/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/syncing_datahub/index.html b/content/cn/docs/0.12.0/syncing_datahub/index.html index b08b2382ecf3e..446dba0801c19 100644 --- a/content/cn/docs/0.12.0/syncing_datahub/index.html +++ b/content/cn/docs/0.12.0/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/syncing_metastore/index.html b/content/cn/docs/0.12.0/syncing_metastore/index.html index f2cf7ae06829b..892b2f2bec41c 100644 --- a/content/cn/docs/0.12.0/syncing_metastore/index.html +++ b/content/cn/docs/0.12.0/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/table_management/index.html b/content/cn/docs/0.12.0/table_management/index.html index b7909bd931350..958ecb0a069eb 100644 --- a/content/cn/docs/0.12.0/table_management/index.html +++ b/content/cn/docs/0.12.0/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/table_types/index.html b/content/cn/docs/0.12.0/table_types/index.html index e209f013388f3..9789e60ea4e97 100644 --- a/content/cn/docs/0.12.0/table_types/index.html +++ b/content/cn/docs/0.12.0/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/timeline/index.html b/content/cn/docs/0.12.0/timeline/index.html index c43a6e8e2194f..0a757625a774d 100644 --- a/content/cn/docs/0.12.0/timeline/index.html +++ b/content/cn/docs/0.12.0/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/transforms/index.html b/content/cn/docs/0.12.0/transforms/index.html index 13ca02a69f81a..9a4f3a23406be 100644 --- a/content/cn/docs/0.12.0/transforms/index.html +++ b/content/cn/docs/0.12.0/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/troubleshooting/index.html b/content/cn/docs/0.12.0/troubleshooting/index.html index 0c6abc07ffd6d..46c42d4ff9545 100644 --- a/content/cn/docs/0.12.0/troubleshooting/index.html +++ b/content/cn/docs/0.12.0/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/tuning-guide/index.html b/content/cn/docs/0.12.0/tuning-guide/index.html index a95fe5a494c01..7d62e3d37666f 100644 --- a/content/cn/docs/0.12.0/tuning-guide/index.html +++ b/content/cn/docs/0.12.0/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/use_cases/index.html b/content/cn/docs/0.12.0/use_cases/index.html index 9f01ed12f3cd1..92019bc0c8b7f 100644 --- a/content/cn/docs/0.12.0/use_cases/index.html +++ b/content/cn/docs/0.12.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/write_operations/index.html b/content/cn/docs/0.12.0/write_operations/index.html index 9db93bbeb10e4..2e20f2307d655 100644 --- a/content/cn/docs/0.12.0/write_operations/index.html +++ b/content/cn/docs/0.12.0/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.0/writing_data/index.html b/content/cn/docs/0.12.0/writing_data/index.html index 4135e5af393aa..26c2a7faaa30d 100644 --- a/content/cn/docs/0.12.0/writing_data/index.html +++ b/content/cn/docs/0.12.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/azure_hoodie/index.html b/content/cn/docs/0.12.1/azure_hoodie/index.html index b5ffc2da67d64..2710cc2bdd20b 100644 --- a/content/cn/docs/0.12.1/azure_hoodie/index.html +++ b/content/cn/docs/0.12.1/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/basic_configurations/index.html b/content/cn/docs/0.12.1/basic_configurations/index.html index b77e7fb393280..f787875be5df2 100644 --- a/content/cn/docs/0.12.1/basic_configurations/index.html +++ b/content/cn/docs/0.12.1/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/bos_hoodie/index.html b/content/cn/docs/0.12.1/bos_hoodie/index.html index 0031ddf0861af..0837850149dc2 100644 --- a/content/cn/docs/0.12.1/bos_hoodie/index.html +++ b/content/cn/docs/0.12.1/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/cli/index.html b/content/cn/docs/0.12.1/cli/index.html index 4f94ce54aac94..b5e13ee605ca5 100644 --- a/content/cn/docs/0.12.1/cli/index.html +++ b/content/cn/docs/0.12.1/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/cloud/index.html b/content/cn/docs/0.12.1/cloud/index.html index d4b26b7188e20..db766a63713c6 100644 --- a/content/cn/docs/0.12.1/cloud/index.html +++ b/content/cn/docs/0.12.1/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/clustering/index.html b/content/cn/docs/0.12.1/clustering/index.html index 303d7bf68a68b..6263ad819fecc 100644 --- a/content/cn/docs/0.12.1/clustering/index.html +++ b/content/cn/docs/0.12.1/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/compaction/index.html b/content/cn/docs/0.12.1/compaction/index.html index 97100ba9561ba..57e0733c489c6 100644 --- a/content/cn/docs/0.12.1/compaction/index.html +++ b/content/cn/docs/0.12.1/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/comparison/index.html b/content/cn/docs/0.12.1/comparison/index.html index d0ec0322b036a..febf3a4ad2cd4 100644 --- a/content/cn/docs/0.12.1/comparison/index.html +++ b/content/cn/docs/0.12.1/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/concepts/index.html b/content/cn/docs/0.12.1/concepts/index.html index 39aaff7a0a9a7..89fb53e9dbc71 100644 --- a/content/cn/docs/0.12.1/concepts/index.html +++ b/content/cn/docs/0.12.1/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/concurrency_control/index.html b/content/cn/docs/0.12.1/concurrency_control/index.html index 9a12b39756d7a..8c8999c39e63a 100644 --- a/content/cn/docs/0.12.1/concurrency_control/index.html +++ b/content/cn/docs/0.12.1/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/configurations/index.html b/content/cn/docs/0.12.1/configurations/index.html index 371a0acb2985f..ab289b07bb1c6 100644 --- a/content/cn/docs/0.12.1/configurations/index.html +++ b/content/cn/docs/0.12.1/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/cos_hoodie/index.html b/content/cn/docs/0.12.1/cos_hoodie/index.html index 4fd957e89e4cc..7d8b8cf4d39c4 100644 --- a/content/cn/docs/0.12.1/cos_hoodie/index.html +++ b/content/cn/docs/0.12.1/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/deployment/index.html b/content/cn/docs/0.12.1/deployment/index.html index 65a420a7e4c9a..67ceb286d618e 100644 --- a/content/cn/docs/0.12.1/deployment/index.html +++ b/content/cn/docs/0.12.1/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/disaster_recovery/index.html b/content/cn/docs/0.12.1/disaster_recovery/index.html index f1e51754af9d7..336d6b736417b 100644 --- a/content/cn/docs/0.12.1/disaster_recovery/index.html +++ b/content/cn/docs/0.12.1/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/docker_demo/index.html b/content/cn/docs/0.12.1/docker_demo/index.html index 51ff4ebc40928..496d631ead187 100644 --- a/content/cn/docs/0.12.1/docker_demo/index.html +++ b/content/cn/docs/0.12.1/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/encryption/index.html b/content/cn/docs/0.12.1/encryption/index.html index 5e4b12b17eef6..e624c589c2250 100644 --- a/content/cn/docs/0.12.1/encryption/index.html +++ b/content/cn/docs/0.12.1/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/faq/index.html b/content/cn/docs/0.12.1/faq/index.html index 15bca42115e80..eff96c243968c 100644 --- a/content/cn/docs/0.12.1/faq/index.html +++ b/content/cn/docs/0.12.1/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/file_layouts/index.html b/content/cn/docs/0.12.1/file_layouts/index.html index 7c16074a0b763..86b9dc789bdb9 100644 --- a/content/cn/docs/0.12.1/file_layouts/index.html +++ b/content/cn/docs/0.12.1/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/file_sizing/index.html b/content/cn/docs/0.12.1/file_sizing/index.html index 77be8b1850057..a53fabbafd76e 100644 --- a/content/cn/docs/0.12.1/file_sizing/index.html +++ b/content/cn/docs/0.12.1/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/flink-quick-start-guide/index.html b/content/cn/docs/0.12.1/flink-quick-start-guide/index.html index ed5fc66d5169d..dea24cb20a91e 100644 --- a/content/cn/docs/0.12.1/flink-quick-start-guide/index.html +++ b/content/cn/docs/0.12.1/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/flink_configuration/index.html b/content/cn/docs/0.12.1/flink_configuration/index.html index c58839c838741..fdb08aadae854 100644 --- a/content/cn/docs/0.12.1/flink_configuration/index.html +++ b/content/cn/docs/0.12.1/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/gcp_bigquery/index.html b/content/cn/docs/0.12.1/gcp_bigquery/index.html index 9527c39f2beed..f20f60e014f7b 100644 --- a/content/cn/docs/0.12.1/gcp_bigquery/index.html +++ b/content/cn/docs/0.12.1/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/gcs_hoodie/index.html b/content/cn/docs/0.12.1/gcs_hoodie/index.html index de284319ff0de..8cbd1144e3417 100644 --- a/content/cn/docs/0.12.1/gcs_hoodie/index.html +++ b/content/cn/docs/0.12.1/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/hoodie_cleaner/index.html b/content/cn/docs/0.12.1/hoodie_cleaner/index.html index 4c87bd6c5c1e4..4a5f666c16aca 100644 --- a/content/cn/docs/0.12.1/hoodie_cleaner/index.html +++ b/content/cn/docs/0.12.1/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/hoodie_deltastreamer/index.html b/content/cn/docs/0.12.1/hoodie_deltastreamer/index.html index 97f0b654d391a..7f92e9c6c90a1 100644 --- a/content/cn/docs/0.12.1/hoodie_deltastreamer/index.html +++ b/content/cn/docs/0.12.1/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/ibm_cos_hoodie/index.html b/content/cn/docs/0.12.1/ibm_cos_hoodie/index.html index 97764f9b9ac9e..104c31ff8a793 100644 --- a/content/cn/docs/0.12.1/ibm_cos_hoodie/index.html +++ b/content/cn/docs/0.12.1/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/indexing/index.html b/content/cn/docs/0.12.1/indexing/index.html index a7d0e1ba616fd..041f01dbecad1 100644 --- a/content/cn/docs/0.12.1/indexing/index.html +++ b/content/cn/docs/0.12.1/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/jfs_hoodie/index.html b/content/cn/docs/0.12.1/jfs_hoodie/index.html index ee94d73e5d549..3029f20824c5e 100644 --- a/content/cn/docs/0.12.1/jfs_hoodie/index.html +++ b/content/cn/docs/0.12.1/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/key_generation/index.html b/content/cn/docs/0.12.1/key_generation/index.html index bbedc61360e4f..bc5608a03d553 100644 --- a/content/cn/docs/0.12.1/key_generation/index.html +++ b/content/cn/docs/0.12.1/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/markers/index.html b/content/cn/docs/0.12.1/markers/index.html index 3685917166068..f6e44ff9b076c 100644 --- a/content/cn/docs/0.12.1/markers/index.html +++ b/content/cn/docs/0.12.1/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/metadata/index.html b/content/cn/docs/0.12.1/metadata/index.html index cfd2f07c91ac0..90cfaca429637 100644 --- a/content/cn/docs/0.12.1/metadata/index.html +++ b/content/cn/docs/0.12.1/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/metadata_indexing/index.html b/content/cn/docs/0.12.1/metadata_indexing/index.html index 1b1207f4fd7ba..1b60607a4ea31 100644 --- a/content/cn/docs/0.12.1/metadata_indexing/index.html +++ b/content/cn/docs/0.12.1/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/metrics/index.html b/content/cn/docs/0.12.1/metrics/index.html index ccec53a0dcb18..dec83adbad2ba 100644 --- a/content/cn/docs/0.12.1/metrics/index.html +++ b/content/cn/docs/0.12.1/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/migration_guide/index.html b/content/cn/docs/0.12.1/migration_guide/index.html index e421d8f67e07c..d1989a8eadff2 100644 --- a/content/cn/docs/0.12.1/migration_guide/index.html +++ b/content/cn/docs/0.12.1/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/oci_hoodie/index.html b/content/cn/docs/0.12.1/oci_hoodie/index.html index da068f0b5d509..742e1903459b7 100644 --- a/content/cn/docs/0.12.1/oci_hoodie/index.html +++ b/content/cn/docs/0.12.1/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/oss_hoodie/index.html b/content/cn/docs/0.12.1/oss_hoodie/index.html index daf2542fa70de..ed08599196be8 100644 --- a/content/cn/docs/0.12.1/oss_hoodie/index.html +++ b/content/cn/docs/0.12.1/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/overview/index.html b/content/cn/docs/0.12.1/overview/index.html index 3630ae865b6d7..d05670cb8bb3d 100644 --- a/content/cn/docs/0.12.1/overview/index.html +++ b/content/cn/docs/0.12.1/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/performance/index.html b/content/cn/docs/0.12.1/performance/index.html index 28942ed930223..0d6ef1251347e 100644 --- a/content/cn/docs/0.12.1/performance/index.html +++ b/content/cn/docs/0.12.1/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/precommit_validator/index.html b/content/cn/docs/0.12.1/precommit_validator/index.html index 6a188aba490d4..1ce6ac5d91b2f 100644 --- a/content/cn/docs/0.12.1/precommit_validator/index.html +++ b/content/cn/docs/0.12.1/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/privacy/index.html b/content/cn/docs/0.12.1/privacy/index.html index f586d3e1f9d9c..f267bcd1bd2bc 100644 --- a/content/cn/docs/0.12.1/privacy/index.html +++ b/content/cn/docs/0.12.1/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/procedures/index.html b/content/cn/docs/0.12.1/procedures/index.html index 6d88670bd6351..1a25b721d2c62 100644 --- a/content/cn/docs/0.12.1/procedures/index.html +++ b/content/cn/docs/0.12.1/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/query_engine_setup/index.html b/content/cn/docs/0.12.1/query_engine_setup/index.html index e7f12cfbbd702..758cf22a9598e 100644 --- a/content/cn/docs/0.12.1/query_engine_setup/index.html +++ b/content/cn/docs/0.12.1/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/querying_data/index.html b/content/cn/docs/0.12.1/querying_data/index.html index b5666103be397..30148304ed9bf 100644 --- a/content/cn/docs/0.12.1/querying_data/index.html +++ b/content/cn/docs/0.12.1/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/quick-start-guide/index.html b/content/cn/docs/0.12.1/quick-start-guide/index.html index d41128f8a9994..571551d00b69b 100644 --- a/content/cn/docs/0.12.1/quick-start-guide/index.html +++ b/content/cn/docs/0.12.1/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/s3_hoodie/index.html b/content/cn/docs/0.12.1/s3_hoodie/index.html index 471c5a584aeef..57a584e4b972c 100644 --- a/content/cn/docs/0.12.1/s3_hoodie/index.html +++ b/content/cn/docs/0.12.1/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/schema_evolution/index.html b/content/cn/docs/0.12.1/schema_evolution/index.html index e7d3fdce7620c..b46ffc2c96439 100644 --- a/content/cn/docs/0.12.1/schema_evolution/index.html +++ b/content/cn/docs/0.12.1/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/snapshot_exporter/index.html b/content/cn/docs/0.12.1/snapshot_exporter/index.html index f1d3a411a9b04..e2cbdd97684dd 100644 --- a/content/cn/docs/0.12.1/snapshot_exporter/index.html +++ b/content/cn/docs/0.12.1/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/structure/index.html b/content/cn/docs/0.12.1/structure/index.html index 6f7dbead385c7..bbc27249addac 100644 --- a/content/cn/docs/0.12.1/structure/index.html +++ b/content/cn/docs/0.12.1/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/syncing_aws_glue_data_catalog/index.html b/content/cn/docs/0.12.1/syncing_aws_glue_data_catalog/index.html index 1e11e86ee225a..bc0b3c70aa0cc 100644 --- a/content/cn/docs/0.12.1/syncing_aws_glue_data_catalog/index.html +++ b/content/cn/docs/0.12.1/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/syncing_datahub/index.html b/content/cn/docs/0.12.1/syncing_datahub/index.html index 02738c234167f..ac562fc2f7b7f 100644 --- a/content/cn/docs/0.12.1/syncing_datahub/index.html +++ b/content/cn/docs/0.12.1/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/syncing_metastore/index.html b/content/cn/docs/0.12.1/syncing_metastore/index.html index ee3093a00d844..3ef2fffa7d226 100644 --- a/content/cn/docs/0.12.1/syncing_metastore/index.html +++ b/content/cn/docs/0.12.1/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/table_management/index.html b/content/cn/docs/0.12.1/table_management/index.html index 58afdacfc5767..fdf95a40c3ba1 100644 --- a/content/cn/docs/0.12.1/table_management/index.html +++ b/content/cn/docs/0.12.1/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/table_types/index.html b/content/cn/docs/0.12.1/table_types/index.html index a506136d35bbe..43a442039e29f 100644 --- a/content/cn/docs/0.12.1/table_types/index.html +++ b/content/cn/docs/0.12.1/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/timeline/index.html b/content/cn/docs/0.12.1/timeline/index.html index adbb5c6c727f5..b73f320daced6 100644 --- a/content/cn/docs/0.12.1/timeline/index.html +++ b/content/cn/docs/0.12.1/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/transforms/index.html b/content/cn/docs/0.12.1/transforms/index.html index cef04b37a641e..2a3c7c433f654 100644 --- a/content/cn/docs/0.12.1/transforms/index.html +++ b/content/cn/docs/0.12.1/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/troubleshooting/index.html b/content/cn/docs/0.12.1/troubleshooting/index.html index a74263fa8cd9d..62126881afb7f 100644 --- a/content/cn/docs/0.12.1/troubleshooting/index.html +++ b/content/cn/docs/0.12.1/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/tuning-guide/index.html b/content/cn/docs/0.12.1/tuning-guide/index.html index aff103125b1fc..35e8ac7feee43 100644 --- a/content/cn/docs/0.12.1/tuning-guide/index.html +++ b/content/cn/docs/0.12.1/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/use_cases/index.html b/content/cn/docs/0.12.1/use_cases/index.html index 2c6bee01aff8b..b63eb7ee3b2f1 100644 --- a/content/cn/docs/0.12.1/use_cases/index.html +++ b/content/cn/docs/0.12.1/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/write_operations/index.html b/content/cn/docs/0.12.1/write_operations/index.html index 3b5f767312700..661e9e5b760e6 100644 --- a/content/cn/docs/0.12.1/write_operations/index.html +++ b/content/cn/docs/0.12.1/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.1/writing_data/index.html b/content/cn/docs/0.12.1/writing_data/index.html index 434285950b4e9..f32ffa315b96d 100644 --- a/content/cn/docs/0.12.1/writing_data/index.html +++ b/content/cn/docs/0.12.1/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/azure_hoodie/index.html b/content/cn/docs/0.12.2/azure_hoodie/index.html index 5b02700ae9bc2..a389c1d72c478 100644 --- a/content/cn/docs/0.12.2/azure_hoodie/index.html +++ b/content/cn/docs/0.12.2/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/basic_configurations/index.html b/content/cn/docs/0.12.2/basic_configurations/index.html index 6087fb6975464..3eb65b6a48364 100644 --- a/content/cn/docs/0.12.2/basic_configurations/index.html +++ b/content/cn/docs/0.12.2/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/bos_hoodie/index.html b/content/cn/docs/0.12.2/bos_hoodie/index.html index df428fbe3f4df..15e835efc93b6 100644 --- a/content/cn/docs/0.12.2/bos_hoodie/index.html +++ b/content/cn/docs/0.12.2/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/cli/index.html b/content/cn/docs/0.12.2/cli/index.html index 54efd7d6e8be7..eb6c27a8b0d26 100644 --- a/content/cn/docs/0.12.2/cli/index.html +++ b/content/cn/docs/0.12.2/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/cloud/index.html b/content/cn/docs/0.12.2/cloud/index.html index 80a01f2e923e9..ee76f363c54a0 100644 --- a/content/cn/docs/0.12.2/cloud/index.html +++ b/content/cn/docs/0.12.2/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/clustering/index.html b/content/cn/docs/0.12.2/clustering/index.html index d2be7efe535de..2a4b26c070bb0 100644 --- a/content/cn/docs/0.12.2/clustering/index.html +++ b/content/cn/docs/0.12.2/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/compaction/index.html b/content/cn/docs/0.12.2/compaction/index.html index 9224d0655cbdf..7881e3a1437e2 100644 --- a/content/cn/docs/0.12.2/compaction/index.html +++ b/content/cn/docs/0.12.2/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/comparison/index.html b/content/cn/docs/0.12.2/comparison/index.html index 7ccad8b3bc389..ca653c41a9fd4 100644 --- a/content/cn/docs/0.12.2/comparison/index.html +++ b/content/cn/docs/0.12.2/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/concepts/index.html b/content/cn/docs/0.12.2/concepts/index.html index d5e74efb1796d..5a9aaf05c388b 100644 --- a/content/cn/docs/0.12.2/concepts/index.html +++ b/content/cn/docs/0.12.2/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/concurrency_control/index.html b/content/cn/docs/0.12.2/concurrency_control/index.html index 54a6d13d9f6fe..4462015a7c7c5 100644 --- a/content/cn/docs/0.12.2/concurrency_control/index.html +++ b/content/cn/docs/0.12.2/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/configurations/index.html b/content/cn/docs/0.12.2/configurations/index.html index 52b51dd3c8fb3..43d7ee31e3de4 100644 --- a/content/cn/docs/0.12.2/configurations/index.html +++ b/content/cn/docs/0.12.2/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/cos_hoodie/index.html b/content/cn/docs/0.12.2/cos_hoodie/index.html index 79b4752f857e6..f05c46f6a23f3 100644 --- a/content/cn/docs/0.12.2/cos_hoodie/index.html +++ b/content/cn/docs/0.12.2/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/deployment/index.html b/content/cn/docs/0.12.2/deployment/index.html index 83043ffb1c3e5..223ef2ce942fb 100644 --- a/content/cn/docs/0.12.2/deployment/index.html +++ b/content/cn/docs/0.12.2/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/disaster_recovery/index.html b/content/cn/docs/0.12.2/disaster_recovery/index.html index 04e8f41dc76e7..91a6f4bf148ff 100644 --- a/content/cn/docs/0.12.2/disaster_recovery/index.html +++ b/content/cn/docs/0.12.2/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/docker_demo/index.html b/content/cn/docs/0.12.2/docker_demo/index.html index f6ca46be2c157..000fac045d54e 100644 --- a/content/cn/docs/0.12.2/docker_demo/index.html +++ b/content/cn/docs/0.12.2/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/encryption/index.html b/content/cn/docs/0.12.2/encryption/index.html index 5e54fd68c1609..0eed7658b101f 100644 --- a/content/cn/docs/0.12.2/encryption/index.html +++ b/content/cn/docs/0.12.2/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/faq/index.html b/content/cn/docs/0.12.2/faq/index.html index 9245d5a7b0794..639df3c28bbb5 100644 --- a/content/cn/docs/0.12.2/faq/index.html +++ b/content/cn/docs/0.12.2/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/file_layouts/index.html b/content/cn/docs/0.12.2/file_layouts/index.html index 4f42dac919f7f..6b04d897e5bb3 100644 --- a/content/cn/docs/0.12.2/file_layouts/index.html +++ b/content/cn/docs/0.12.2/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/file_sizing/index.html b/content/cn/docs/0.12.2/file_sizing/index.html index c9f6eaffe8f5d..319cf3c63aca5 100644 --- a/content/cn/docs/0.12.2/file_sizing/index.html +++ b/content/cn/docs/0.12.2/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/flink-quick-start-guide/index.html b/content/cn/docs/0.12.2/flink-quick-start-guide/index.html index e0a0272cb8126..82757641cd504 100644 --- a/content/cn/docs/0.12.2/flink-quick-start-guide/index.html +++ b/content/cn/docs/0.12.2/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/flink_configuration/index.html b/content/cn/docs/0.12.2/flink_configuration/index.html index c28a8c035c5fb..cb83a8d1d6a70 100644 --- a/content/cn/docs/0.12.2/flink_configuration/index.html +++ b/content/cn/docs/0.12.2/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/gcp_bigquery/index.html b/content/cn/docs/0.12.2/gcp_bigquery/index.html index ff6f8c4e2fafa..6587219cb41dd 100644 --- a/content/cn/docs/0.12.2/gcp_bigquery/index.html +++ b/content/cn/docs/0.12.2/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/gcs_hoodie/index.html b/content/cn/docs/0.12.2/gcs_hoodie/index.html index 08fd31908a41c..3759b35b0ee68 100644 --- a/content/cn/docs/0.12.2/gcs_hoodie/index.html +++ b/content/cn/docs/0.12.2/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/hoodie_cleaner/index.html b/content/cn/docs/0.12.2/hoodie_cleaner/index.html index 442182852812f..c8689c2316b0b 100644 --- a/content/cn/docs/0.12.2/hoodie_cleaner/index.html +++ b/content/cn/docs/0.12.2/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/hoodie_deltastreamer/index.html b/content/cn/docs/0.12.2/hoodie_deltastreamer/index.html index 1d9b6a0946ecb..686a7def72b00 100644 --- a/content/cn/docs/0.12.2/hoodie_deltastreamer/index.html +++ b/content/cn/docs/0.12.2/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/ibm_cos_hoodie/index.html b/content/cn/docs/0.12.2/ibm_cos_hoodie/index.html index 5c441e10e4fdf..a84d310d4fdbf 100644 --- a/content/cn/docs/0.12.2/ibm_cos_hoodie/index.html +++ b/content/cn/docs/0.12.2/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/indexing/index.html b/content/cn/docs/0.12.2/indexing/index.html index a58c7b3753d32..690028e885990 100644 --- a/content/cn/docs/0.12.2/indexing/index.html +++ b/content/cn/docs/0.12.2/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/jfs_hoodie/index.html b/content/cn/docs/0.12.2/jfs_hoodie/index.html index 20baf432a1992..e0a4024b730cb 100644 --- a/content/cn/docs/0.12.2/jfs_hoodie/index.html +++ b/content/cn/docs/0.12.2/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/key_generation/index.html b/content/cn/docs/0.12.2/key_generation/index.html index 0b4df8c1f7192..9c2b6ea2331c7 100644 --- a/content/cn/docs/0.12.2/key_generation/index.html +++ b/content/cn/docs/0.12.2/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/markers/index.html b/content/cn/docs/0.12.2/markers/index.html index 4f11383f1a924..ae89d9f4b51fd 100644 --- a/content/cn/docs/0.12.2/markers/index.html +++ b/content/cn/docs/0.12.2/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/metadata/index.html b/content/cn/docs/0.12.2/metadata/index.html index a665693e60b22..c1804ef8e51a6 100644 --- a/content/cn/docs/0.12.2/metadata/index.html +++ b/content/cn/docs/0.12.2/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/metadata_indexing/index.html b/content/cn/docs/0.12.2/metadata_indexing/index.html index 393e82d391163..c7a9638b39fc9 100644 --- a/content/cn/docs/0.12.2/metadata_indexing/index.html +++ b/content/cn/docs/0.12.2/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/metrics/index.html b/content/cn/docs/0.12.2/metrics/index.html index b4915977c523b..63a529625a01b 100644 --- a/content/cn/docs/0.12.2/metrics/index.html +++ b/content/cn/docs/0.12.2/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/migration_guide/index.html b/content/cn/docs/0.12.2/migration_guide/index.html index ad486780a5549..7252c92068ba4 100644 --- a/content/cn/docs/0.12.2/migration_guide/index.html +++ b/content/cn/docs/0.12.2/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/oci_hoodie/index.html b/content/cn/docs/0.12.2/oci_hoodie/index.html index 890d8f66ab587..212140b9833d5 100644 --- a/content/cn/docs/0.12.2/oci_hoodie/index.html +++ b/content/cn/docs/0.12.2/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/oss_hoodie/index.html b/content/cn/docs/0.12.2/oss_hoodie/index.html index 6b66a27b842a9..a17856a4ec2a6 100644 --- a/content/cn/docs/0.12.2/oss_hoodie/index.html +++ b/content/cn/docs/0.12.2/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/overview/index.html b/content/cn/docs/0.12.2/overview/index.html index 7f97966d11875..841d3b7c0101a 100644 --- a/content/cn/docs/0.12.2/overview/index.html +++ b/content/cn/docs/0.12.2/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/performance/index.html b/content/cn/docs/0.12.2/performance/index.html index 389142d821446..130a697f04456 100644 --- a/content/cn/docs/0.12.2/performance/index.html +++ b/content/cn/docs/0.12.2/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/precommit_validator/index.html b/content/cn/docs/0.12.2/precommit_validator/index.html index c61920d1fcc98..a4be0811a66b3 100644 --- a/content/cn/docs/0.12.2/precommit_validator/index.html +++ b/content/cn/docs/0.12.2/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/privacy/index.html b/content/cn/docs/0.12.2/privacy/index.html index 83a59850218eb..bae0354359ffd 100644 --- a/content/cn/docs/0.12.2/privacy/index.html +++ b/content/cn/docs/0.12.2/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/procedures/index.html b/content/cn/docs/0.12.2/procedures/index.html index 19b779c0bcd23..42b8316119623 100644 --- a/content/cn/docs/0.12.2/procedures/index.html +++ b/content/cn/docs/0.12.2/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/query_engine_setup/index.html b/content/cn/docs/0.12.2/query_engine_setup/index.html index 60d6dcd2613bb..6a1f5f14bde32 100644 --- a/content/cn/docs/0.12.2/query_engine_setup/index.html +++ b/content/cn/docs/0.12.2/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/querying_data/index.html b/content/cn/docs/0.12.2/querying_data/index.html index 18018e1e11e62..3978c427b5cde 100644 --- a/content/cn/docs/0.12.2/querying_data/index.html +++ b/content/cn/docs/0.12.2/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/quick-start-guide/index.html b/content/cn/docs/0.12.2/quick-start-guide/index.html index 66aad7be4d5cd..d06d59c307a0c 100644 --- a/content/cn/docs/0.12.2/quick-start-guide/index.html +++ b/content/cn/docs/0.12.2/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/s3_hoodie/index.html b/content/cn/docs/0.12.2/s3_hoodie/index.html index 914072d4c4f0f..a13a9307798c3 100644 --- a/content/cn/docs/0.12.2/s3_hoodie/index.html +++ b/content/cn/docs/0.12.2/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/schema_evolution/index.html b/content/cn/docs/0.12.2/schema_evolution/index.html index 48343f123dbf9..812ad5e1a7337 100644 --- a/content/cn/docs/0.12.2/schema_evolution/index.html +++ b/content/cn/docs/0.12.2/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/snapshot_exporter/index.html b/content/cn/docs/0.12.2/snapshot_exporter/index.html index ccb3f78aa7f7d..0b2493ca56963 100644 --- a/content/cn/docs/0.12.2/snapshot_exporter/index.html +++ b/content/cn/docs/0.12.2/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/structure/index.html b/content/cn/docs/0.12.2/structure/index.html index 2d7f84ee25ea7..bd585893a5a5f 100644 --- a/content/cn/docs/0.12.2/structure/index.html +++ b/content/cn/docs/0.12.2/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/syncing_aws_glue_data_catalog/index.html b/content/cn/docs/0.12.2/syncing_aws_glue_data_catalog/index.html index 83a5a47ccd667..9a27a0ab28594 100644 --- a/content/cn/docs/0.12.2/syncing_aws_glue_data_catalog/index.html +++ b/content/cn/docs/0.12.2/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/syncing_datahub/index.html b/content/cn/docs/0.12.2/syncing_datahub/index.html index bc9277830e124..144c420201c16 100644 --- a/content/cn/docs/0.12.2/syncing_datahub/index.html +++ b/content/cn/docs/0.12.2/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/syncing_metastore/index.html b/content/cn/docs/0.12.2/syncing_metastore/index.html index 037ba6e9079d1..e4ff8423957ff 100644 --- a/content/cn/docs/0.12.2/syncing_metastore/index.html +++ b/content/cn/docs/0.12.2/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/table_management/index.html b/content/cn/docs/0.12.2/table_management/index.html index ed95b800ee674..3679ab0622df5 100644 --- a/content/cn/docs/0.12.2/table_management/index.html +++ b/content/cn/docs/0.12.2/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/table_types/index.html b/content/cn/docs/0.12.2/table_types/index.html index 3c3f53a8f7b79..37ea121643e98 100644 --- a/content/cn/docs/0.12.2/table_types/index.html +++ b/content/cn/docs/0.12.2/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/timeline/index.html b/content/cn/docs/0.12.2/timeline/index.html index 3659f2a17a5c0..c635b0fe52c49 100644 --- a/content/cn/docs/0.12.2/timeline/index.html +++ b/content/cn/docs/0.12.2/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/transforms/index.html b/content/cn/docs/0.12.2/transforms/index.html index fe7bd9c7f7fac..66ef833e4b6c0 100644 --- a/content/cn/docs/0.12.2/transforms/index.html +++ b/content/cn/docs/0.12.2/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/troubleshooting/index.html b/content/cn/docs/0.12.2/troubleshooting/index.html index d6800c2233abd..2c2e7275285db 100644 --- a/content/cn/docs/0.12.2/troubleshooting/index.html +++ b/content/cn/docs/0.12.2/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/tuning-guide/index.html b/content/cn/docs/0.12.2/tuning-guide/index.html index 9515c3619bd75..dd924a1620778 100644 --- a/content/cn/docs/0.12.2/tuning-guide/index.html +++ b/content/cn/docs/0.12.2/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/use_cases/index.html b/content/cn/docs/0.12.2/use_cases/index.html index 2f09d942fc748..9ed2a89917c7e 100644 --- a/content/cn/docs/0.12.2/use_cases/index.html +++ b/content/cn/docs/0.12.2/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/write_operations/index.html b/content/cn/docs/0.12.2/write_operations/index.html index 9b8a7fb3a96b0..e696269ecaab6 100644 --- a/content/cn/docs/0.12.2/write_operations/index.html +++ b/content/cn/docs/0.12.2/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.2/writing_data/index.html b/content/cn/docs/0.12.2/writing_data/index.html index c63929f36fce9..f2029eb649598 100644 --- a/content/cn/docs/0.12.2/writing_data/index.html +++ b/content/cn/docs/0.12.2/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/azure_hoodie/index.html b/content/cn/docs/0.12.3/azure_hoodie/index.html index 35fb8f85e1883..cac8424d3d2f9 100644 --- a/content/cn/docs/0.12.3/azure_hoodie/index.html +++ b/content/cn/docs/0.12.3/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/basic_configurations/index.html b/content/cn/docs/0.12.3/basic_configurations/index.html index edcc5bdb812ad..e0059c744fabb 100644 --- a/content/cn/docs/0.12.3/basic_configurations/index.html +++ b/content/cn/docs/0.12.3/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/bos_hoodie/index.html b/content/cn/docs/0.12.3/bos_hoodie/index.html index 332fa4fb48a9c..44a05fc77debb 100644 --- a/content/cn/docs/0.12.3/bos_hoodie/index.html +++ b/content/cn/docs/0.12.3/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/cli/index.html b/content/cn/docs/0.12.3/cli/index.html index 5bbfc7c7621f4..eced090046b50 100644 --- a/content/cn/docs/0.12.3/cli/index.html +++ b/content/cn/docs/0.12.3/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/cloud/index.html b/content/cn/docs/0.12.3/cloud/index.html index 9127533cc8a86..8c1014a4c02d8 100644 --- a/content/cn/docs/0.12.3/cloud/index.html +++ b/content/cn/docs/0.12.3/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/clustering/index.html b/content/cn/docs/0.12.3/clustering/index.html index 5731919635273..6139aa57bbf05 100644 --- a/content/cn/docs/0.12.3/clustering/index.html +++ b/content/cn/docs/0.12.3/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/compaction/index.html b/content/cn/docs/0.12.3/compaction/index.html index 5aaccd4e3f7a4..2d1ac52678137 100644 --- a/content/cn/docs/0.12.3/compaction/index.html +++ b/content/cn/docs/0.12.3/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/comparison/index.html b/content/cn/docs/0.12.3/comparison/index.html index 5c1d71b97cfa1..69425fa97705e 100644 --- a/content/cn/docs/0.12.3/comparison/index.html +++ b/content/cn/docs/0.12.3/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/concepts/index.html b/content/cn/docs/0.12.3/concepts/index.html index 0c628bf2a40e9..9265a764559b0 100644 --- a/content/cn/docs/0.12.3/concepts/index.html +++ b/content/cn/docs/0.12.3/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/concurrency_control/index.html b/content/cn/docs/0.12.3/concurrency_control/index.html index 3e7d270880376..52063d557fd46 100644 --- a/content/cn/docs/0.12.3/concurrency_control/index.html +++ b/content/cn/docs/0.12.3/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/configurations/index.html b/content/cn/docs/0.12.3/configurations/index.html index 13e4e3868fde6..50fa120bdf76b 100644 --- a/content/cn/docs/0.12.3/configurations/index.html +++ b/content/cn/docs/0.12.3/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/cos_hoodie/index.html b/content/cn/docs/0.12.3/cos_hoodie/index.html index 58772124b919a..0fb0e989c8699 100644 --- a/content/cn/docs/0.12.3/cos_hoodie/index.html +++ b/content/cn/docs/0.12.3/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/deployment/index.html b/content/cn/docs/0.12.3/deployment/index.html index 07f1b44f44c99..e66d8a903a2ac 100644 --- a/content/cn/docs/0.12.3/deployment/index.html +++ b/content/cn/docs/0.12.3/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/disaster_recovery/index.html b/content/cn/docs/0.12.3/disaster_recovery/index.html index 0208fe4da0350..f704f81f30760 100644 --- a/content/cn/docs/0.12.3/disaster_recovery/index.html +++ b/content/cn/docs/0.12.3/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/docker_demo/index.html b/content/cn/docs/0.12.3/docker_demo/index.html index ee39d03041c03..88eaf07312fe2 100644 --- a/content/cn/docs/0.12.3/docker_demo/index.html +++ b/content/cn/docs/0.12.3/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/encryption/index.html b/content/cn/docs/0.12.3/encryption/index.html index fce66ced81843..2b319b4037c46 100644 --- a/content/cn/docs/0.12.3/encryption/index.html +++ b/content/cn/docs/0.12.3/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/faq/index.html b/content/cn/docs/0.12.3/faq/index.html index 60ff466549dc8..9269832facaff 100644 --- a/content/cn/docs/0.12.3/faq/index.html +++ b/content/cn/docs/0.12.3/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/file_layouts/index.html b/content/cn/docs/0.12.3/file_layouts/index.html index 78b41c5d56cd4..4331f9fd037f4 100644 --- a/content/cn/docs/0.12.3/file_layouts/index.html +++ b/content/cn/docs/0.12.3/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/file_sizing/index.html b/content/cn/docs/0.12.3/file_sizing/index.html index a70be8c681578..e109ae22ecf51 100644 --- a/content/cn/docs/0.12.3/file_sizing/index.html +++ b/content/cn/docs/0.12.3/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/flink-quick-start-guide/index.html b/content/cn/docs/0.12.3/flink-quick-start-guide/index.html index 7c6b96db7fd59..1224472ac3c30 100644 --- a/content/cn/docs/0.12.3/flink-quick-start-guide/index.html +++ b/content/cn/docs/0.12.3/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/flink_configuration/index.html b/content/cn/docs/0.12.3/flink_configuration/index.html index fe4b21e323f19..1474690fa8edc 100644 --- a/content/cn/docs/0.12.3/flink_configuration/index.html +++ b/content/cn/docs/0.12.3/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/gcp_bigquery/index.html b/content/cn/docs/0.12.3/gcp_bigquery/index.html index ae677442dd8b8..7849b1d8363d6 100644 --- a/content/cn/docs/0.12.3/gcp_bigquery/index.html +++ b/content/cn/docs/0.12.3/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/gcs_hoodie/index.html b/content/cn/docs/0.12.3/gcs_hoodie/index.html index 2b45e8c01fe41..ff5973edf4268 100644 --- a/content/cn/docs/0.12.3/gcs_hoodie/index.html +++ b/content/cn/docs/0.12.3/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/hoodie_cleaner/index.html b/content/cn/docs/0.12.3/hoodie_cleaner/index.html index 9b95caf64b2b9..4a20bdc28cc50 100644 --- a/content/cn/docs/0.12.3/hoodie_cleaner/index.html +++ b/content/cn/docs/0.12.3/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/hoodie_deltastreamer/index.html b/content/cn/docs/0.12.3/hoodie_deltastreamer/index.html index f91c7ad56fef5..bd93f76d5b94b 100644 --- a/content/cn/docs/0.12.3/hoodie_deltastreamer/index.html +++ b/content/cn/docs/0.12.3/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/ibm_cos_hoodie/index.html b/content/cn/docs/0.12.3/ibm_cos_hoodie/index.html index 40c03fe349e03..21fcb686c3c69 100644 --- a/content/cn/docs/0.12.3/ibm_cos_hoodie/index.html +++ b/content/cn/docs/0.12.3/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/indexing/index.html b/content/cn/docs/0.12.3/indexing/index.html index bd4ad35a17764..1fc635796cff4 100644 --- a/content/cn/docs/0.12.3/indexing/index.html +++ b/content/cn/docs/0.12.3/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/jfs_hoodie/index.html b/content/cn/docs/0.12.3/jfs_hoodie/index.html index c7e84e8db622c..d0c02ac75ed03 100644 --- a/content/cn/docs/0.12.3/jfs_hoodie/index.html +++ b/content/cn/docs/0.12.3/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/key_generation/index.html b/content/cn/docs/0.12.3/key_generation/index.html index f1b86cb88253b..10d6efff3c5bf 100644 --- a/content/cn/docs/0.12.3/key_generation/index.html +++ b/content/cn/docs/0.12.3/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/markers/index.html b/content/cn/docs/0.12.3/markers/index.html index cf124563f7ab6..d7959a68a266c 100644 --- a/content/cn/docs/0.12.3/markers/index.html +++ b/content/cn/docs/0.12.3/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/metadata/index.html b/content/cn/docs/0.12.3/metadata/index.html index 2340ec16628de..170e692033f17 100644 --- a/content/cn/docs/0.12.3/metadata/index.html +++ b/content/cn/docs/0.12.3/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/metadata_indexing/index.html b/content/cn/docs/0.12.3/metadata_indexing/index.html index fcca7dc7a4029..90d67d14c7e44 100644 --- a/content/cn/docs/0.12.3/metadata_indexing/index.html +++ b/content/cn/docs/0.12.3/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/metrics/index.html b/content/cn/docs/0.12.3/metrics/index.html index 247b0de8b3d7b..a70aa5b8bb8f1 100644 --- a/content/cn/docs/0.12.3/metrics/index.html +++ b/content/cn/docs/0.12.3/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/migration_guide/index.html b/content/cn/docs/0.12.3/migration_guide/index.html index 455ab568ffb66..ecfac4671038b 100644 --- a/content/cn/docs/0.12.3/migration_guide/index.html +++ b/content/cn/docs/0.12.3/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/oci_hoodie/index.html b/content/cn/docs/0.12.3/oci_hoodie/index.html index bec48513e3bda..cc643fdcbe679 100644 --- a/content/cn/docs/0.12.3/oci_hoodie/index.html +++ b/content/cn/docs/0.12.3/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/oss_hoodie/index.html b/content/cn/docs/0.12.3/oss_hoodie/index.html index 63b7a3454562c..53e83264e8ad0 100644 --- a/content/cn/docs/0.12.3/oss_hoodie/index.html +++ b/content/cn/docs/0.12.3/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/overview/index.html b/content/cn/docs/0.12.3/overview/index.html index 471028ac30caf..3944fcb163a55 100644 --- a/content/cn/docs/0.12.3/overview/index.html +++ b/content/cn/docs/0.12.3/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/performance/index.html b/content/cn/docs/0.12.3/performance/index.html index 5ff54bc33eef4..c29ad53ba1eb9 100644 --- a/content/cn/docs/0.12.3/performance/index.html +++ b/content/cn/docs/0.12.3/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/precommit_validator/index.html b/content/cn/docs/0.12.3/precommit_validator/index.html index 421aa84047729..0bb83fc7c8a57 100644 --- a/content/cn/docs/0.12.3/precommit_validator/index.html +++ b/content/cn/docs/0.12.3/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/privacy/index.html b/content/cn/docs/0.12.3/privacy/index.html index 3d937ad106494..039e5142808fc 100644 --- a/content/cn/docs/0.12.3/privacy/index.html +++ b/content/cn/docs/0.12.3/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/procedures/index.html b/content/cn/docs/0.12.3/procedures/index.html index fc7bd114a6fb0..a0b7847973397 100644 --- a/content/cn/docs/0.12.3/procedures/index.html +++ b/content/cn/docs/0.12.3/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/query_engine_setup/index.html b/content/cn/docs/0.12.3/query_engine_setup/index.html index d4b40cb2b6732..949f9c827e23b 100644 --- a/content/cn/docs/0.12.3/query_engine_setup/index.html +++ b/content/cn/docs/0.12.3/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/querying_data/index.html b/content/cn/docs/0.12.3/querying_data/index.html index 68a340c022e8e..2cfbbf1037938 100644 --- a/content/cn/docs/0.12.3/querying_data/index.html +++ b/content/cn/docs/0.12.3/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/quick-start-guide/index.html b/content/cn/docs/0.12.3/quick-start-guide/index.html index b2880547e4447..2464bc692ef57 100644 --- a/content/cn/docs/0.12.3/quick-start-guide/index.html +++ b/content/cn/docs/0.12.3/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/s3_hoodie/index.html b/content/cn/docs/0.12.3/s3_hoodie/index.html index 6643504f34d41..c32e5b66d7a5b 100644 --- a/content/cn/docs/0.12.3/s3_hoodie/index.html +++ b/content/cn/docs/0.12.3/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/schema_evolution/index.html b/content/cn/docs/0.12.3/schema_evolution/index.html index d21f95158f4e2..359b2a4919cbb 100644 --- a/content/cn/docs/0.12.3/schema_evolution/index.html +++ b/content/cn/docs/0.12.3/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/snapshot_exporter/index.html b/content/cn/docs/0.12.3/snapshot_exporter/index.html index 12fbc6d3cd93b..363fad14a917b 100644 --- a/content/cn/docs/0.12.3/snapshot_exporter/index.html +++ b/content/cn/docs/0.12.3/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/structure/index.html b/content/cn/docs/0.12.3/structure/index.html index 43ed74a416823..6c1c4d05f02ab 100644 --- a/content/cn/docs/0.12.3/structure/index.html +++ b/content/cn/docs/0.12.3/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/syncing_aws_glue_data_catalog/index.html b/content/cn/docs/0.12.3/syncing_aws_glue_data_catalog/index.html index 89c1643c9d772..ea7090e5226e6 100644 --- a/content/cn/docs/0.12.3/syncing_aws_glue_data_catalog/index.html +++ b/content/cn/docs/0.12.3/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/syncing_datahub/index.html b/content/cn/docs/0.12.3/syncing_datahub/index.html index 04d680e409854..a83b16cc0e2c1 100644 --- a/content/cn/docs/0.12.3/syncing_datahub/index.html +++ b/content/cn/docs/0.12.3/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/syncing_metastore/index.html b/content/cn/docs/0.12.3/syncing_metastore/index.html index b294ddfe70eec..a3b730145dc39 100644 --- a/content/cn/docs/0.12.3/syncing_metastore/index.html +++ b/content/cn/docs/0.12.3/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/table_management/index.html b/content/cn/docs/0.12.3/table_management/index.html index 979dea04a619b..bfc2766c2041c 100644 --- a/content/cn/docs/0.12.3/table_management/index.html +++ b/content/cn/docs/0.12.3/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/table_types/index.html b/content/cn/docs/0.12.3/table_types/index.html index aa825e7175ff5..13b416477466c 100644 --- a/content/cn/docs/0.12.3/table_types/index.html +++ b/content/cn/docs/0.12.3/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/timeline/index.html b/content/cn/docs/0.12.3/timeline/index.html index 970ddb019a5a0..7b6e815a5c37c 100644 --- a/content/cn/docs/0.12.3/timeline/index.html +++ b/content/cn/docs/0.12.3/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/transforms/index.html b/content/cn/docs/0.12.3/transforms/index.html index a98e5db9e9852..09f9c7868d5dc 100644 --- a/content/cn/docs/0.12.3/transforms/index.html +++ b/content/cn/docs/0.12.3/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/troubleshooting/index.html b/content/cn/docs/0.12.3/troubleshooting/index.html index 57ba6754b3e1b..f76e3e1f4d43c 100644 --- a/content/cn/docs/0.12.3/troubleshooting/index.html +++ b/content/cn/docs/0.12.3/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/tuning-guide/index.html b/content/cn/docs/0.12.3/tuning-guide/index.html index d7478ce324ac2..4217a7855222b 100644 --- a/content/cn/docs/0.12.3/tuning-guide/index.html +++ b/content/cn/docs/0.12.3/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/use_cases/index.html b/content/cn/docs/0.12.3/use_cases/index.html index 6c10a777887e1..08a5f5511532d 100644 --- a/content/cn/docs/0.12.3/use_cases/index.html +++ b/content/cn/docs/0.12.3/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/write_operations/index.html b/content/cn/docs/0.12.3/write_operations/index.html index eebfe8656b523..570fa55e111f4 100644 --- a/content/cn/docs/0.12.3/write_operations/index.html +++ b/content/cn/docs/0.12.3/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.12.3/writing_data/index.html b/content/cn/docs/0.12.3/writing_data/index.html index f5777d1ebf92d..97465a9571a7d 100644 --- a/content/cn/docs/0.12.3/writing_data/index.html +++ b/content/cn/docs/0.12.3/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/azure_hoodie/index.html b/content/cn/docs/0.13.0/azure_hoodie/index.html index 4f9332ba0a99e..eb1312333b00f 100644 --- a/content/cn/docs/0.13.0/azure_hoodie/index.html +++ b/content/cn/docs/0.13.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/basic_configurations/index.html b/content/cn/docs/0.13.0/basic_configurations/index.html index e5d1745892a8f..bdd20a4d3ad56 100644 --- a/content/cn/docs/0.13.0/basic_configurations/index.html +++ b/content/cn/docs/0.13.0/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/bos_hoodie/index.html b/content/cn/docs/0.13.0/bos_hoodie/index.html index 6bae757418737..d57710dd98277 100644 --- a/content/cn/docs/0.13.0/bos_hoodie/index.html +++ b/content/cn/docs/0.13.0/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/cli/index.html b/content/cn/docs/0.13.0/cli/index.html index f452219b9b1c6..f71a4b245a893 100644 --- a/content/cn/docs/0.13.0/cli/index.html +++ b/content/cn/docs/0.13.0/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/cloud/index.html b/content/cn/docs/0.13.0/cloud/index.html index 13bd3a0247250..2edb27d6bdede 100644 --- a/content/cn/docs/0.13.0/cloud/index.html +++ b/content/cn/docs/0.13.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/clustering/index.html b/content/cn/docs/0.13.0/clustering/index.html index 2ad52cf4a29a1..b5b3715013850 100644 --- a/content/cn/docs/0.13.0/clustering/index.html +++ b/content/cn/docs/0.13.0/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/compaction/index.html b/content/cn/docs/0.13.0/compaction/index.html index 5a31ef4027c65..f16e3f1cdb568 100644 --- a/content/cn/docs/0.13.0/compaction/index.html +++ b/content/cn/docs/0.13.0/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/comparison/index.html b/content/cn/docs/0.13.0/comparison/index.html index 1f93576e99bd1..a49c41b74b5fb 100644 --- a/content/cn/docs/0.13.0/comparison/index.html +++ b/content/cn/docs/0.13.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/concepts/index.html b/content/cn/docs/0.13.0/concepts/index.html index d20564efd5a78..f12dc9f7db2d6 100644 --- a/content/cn/docs/0.13.0/concepts/index.html +++ b/content/cn/docs/0.13.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/concurrency_control/index.html b/content/cn/docs/0.13.0/concurrency_control/index.html index dcb26fcef9664..e6977a2fc3562 100644 --- a/content/cn/docs/0.13.0/concurrency_control/index.html +++ b/content/cn/docs/0.13.0/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/configurations/index.html b/content/cn/docs/0.13.0/configurations/index.html index 9cd2c1699401d..21fa37619300a 100644 --- a/content/cn/docs/0.13.0/configurations/index.html +++ b/content/cn/docs/0.13.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/cos_hoodie/index.html b/content/cn/docs/0.13.0/cos_hoodie/index.html index c0c4edcc1cc67..8198ff8a597d9 100644 --- a/content/cn/docs/0.13.0/cos_hoodie/index.html +++ b/content/cn/docs/0.13.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/deployment/index.html b/content/cn/docs/0.13.0/deployment/index.html index 95d4c6a1ad099..5f0ac56afd793 100644 --- a/content/cn/docs/0.13.0/deployment/index.html +++ b/content/cn/docs/0.13.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/disaster_recovery/index.html b/content/cn/docs/0.13.0/disaster_recovery/index.html index 06cf6f7a8ad7e..3d35e3517eb24 100644 --- a/content/cn/docs/0.13.0/disaster_recovery/index.html +++ b/content/cn/docs/0.13.0/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/docker_demo/index.html b/content/cn/docs/0.13.0/docker_demo/index.html index 7dad655230529..e354e709e8d75 100644 --- a/content/cn/docs/0.13.0/docker_demo/index.html +++ b/content/cn/docs/0.13.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/encryption/index.html b/content/cn/docs/0.13.0/encryption/index.html index 3a7e05c6d5032..389bfb3da1405 100644 --- a/content/cn/docs/0.13.0/encryption/index.html +++ b/content/cn/docs/0.13.0/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/faq/index.html b/content/cn/docs/0.13.0/faq/index.html index a8ba048ceb1fb..4e36e4fa1c54d 100644 --- a/content/cn/docs/0.13.0/faq/index.html +++ b/content/cn/docs/0.13.0/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/file_layouts/index.html b/content/cn/docs/0.13.0/file_layouts/index.html index d0eaa596eb6ca..c724dc48a857a 100644 --- a/content/cn/docs/0.13.0/file_layouts/index.html +++ b/content/cn/docs/0.13.0/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/file_sizing/index.html b/content/cn/docs/0.13.0/file_sizing/index.html index af3a419f6670c..d52bc91b60903 100644 --- a/content/cn/docs/0.13.0/file_sizing/index.html +++ b/content/cn/docs/0.13.0/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/flink-quick-start-guide/index.html b/content/cn/docs/0.13.0/flink-quick-start-guide/index.html index 26b42d370925f..5c500382d6580 100644 --- a/content/cn/docs/0.13.0/flink-quick-start-guide/index.html +++ b/content/cn/docs/0.13.0/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/flink_configuration/index.html b/content/cn/docs/0.13.0/flink_configuration/index.html index 41ba8827d633e..2ff257c2c3c69 100644 --- a/content/cn/docs/0.13.0/flink_configuration/index.html +++ b/content/cn/docs/0.13.0/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/gcp_bigquery/index.html b/content/cn/docs/0.13.0/gcp_bigquery/index.html index 870c3f78e8c9a..bfcb31704b3ae 100644 --- a/content/cn/docs/0.13.0/gcp_bigquery/index.html +++ b/content/cn/docs/0.13.0/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/gcs_hoodie/index.html b/content/cn/docs/0.13.0/gcs_hoodie/index.html index e7f707ce2a103..35e70301d515d 100644 --- a/content/cn/docs/0.13.0/gcs_hoodie/index.html +++ b/content/cn/docs/0.13.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/hoodie_cleaner/index.html b/content/cn/docs/0.13.0/hoodie_cleaner/index.html index 6d86cadddf8b3..638e82ff12e51 100644 --- a/content/cn/docs/0.13.0/hoodie_cleaner/index.html +++ b/content/cn/docs/0.13.0/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/hoodie_deltastreamer/index.html b/content/cn/docs/0.13.0/hoodie_deltastreamer/index.html index df9eab436ab38..7528c8310c3d3 100644 --- a/content/cn/docs/0.13.0/hoodie_deltastreamer/index.html +++ b/content/cn/docs/0.13.0/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/ibm_cos_hoodie/index.html b/content/cn/docs/0.13.0/ibm_cos_hoodie/index.html index f140ca34906fe..4f21cc65e891f 100644 --- a/content/cn/docs/0.13.0/ibm_cos_hoodie/index.html +++ b/content/cn/docs/0.13.0/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/indexing/index.html b/content/cn/docs/0.13.0/indexing/index.html index ce0d641bd2938..07779012d5ff3 100644 --- a/content/cn/docs/0.13.0/indexing/index.html +++ b/content/cn/docs/0.13.0/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/jfs_hoodie/index.html b/content/cn/docs/0.13.0/jfs_hoodie/index.html index 15c144b67bf0b..e7e0f431393d8 100644 --- a/content/cn/docs/0.13.0/jfs_hoodie/index.html +++ b/content/cn/docs/0.13.0/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/key_generation/index.html b/content/cn/docs/0.13.0/key_generation/index.html index ce758cae44b9d..b24b932f39293 100644 --- a/content/cn/docs/0.13.0/key_generation/index.html +++ b/content/cn/docs/0.13.0/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/markers/index.html b/content/cn/docs/0.13.0/markers/index.html index d303d352b35b6..9ebcc8dfd9299 100644 --- a/content/cn/docs/0.13.0/markers/index.html +++ b/content/cn/docs/0.13.0/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/metadata/index.html b/content/cn/docs/0.13.0/metadata/index.html index c04bf435a6dbd..94361abec51a8 100644 --- a/content/cn/docs/0.13.0/metadata/index.html +++ b/content/cn/docs/0.13.0/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/metadata_indexing/index.html b/content/cn/docs/0.13.0/metadata_indexing/index.html index d31b8a2eea7dd..84020d6874bab 100644 --- a/content/cn/docs/0.13.0/metadata_indexing/index.html +++ b/content/cn/docs/0.13.0/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/metrics/index.html b/content/cn/docs/0.13.0/metrics/index.html index f9b883b0825c3..497c655325d65 100644 --- a/content/cn/docs/0.13.0/metrics/index.html +++ b/content/cn/docs/0.13.0/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/migration_guide/index.html b/content/cn/docs/0.13.0/migration_guide/index.html index 66c4f3e246f6b..44edebc44d012 100644 --- a/content/cn/docs/0.13.0/migration_guide/index.html +++ b/content/cn/docs/0.13.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/oci_hoodie/index.html b/content/cn/docs/0.13.0/oci_hoodie/index.html index 3161310e38daa..3d597156ff428 100644 --- a/content/cn/docs/0.13.0/oci_hoodie/index.html +++ b/content/cn/docs/0.13.0/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/oss_hoodie/index.html b/content/cn/docs/0.13.0/oss_hoodie/index.html index 6f0249445d5cb..0164b8c2e6672 100644 --- a/content/cn/docs/0.13.0/oss_hoodie/index.html +++ b/content/cn/docs/0.13.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/overview/index.html b/content/cn/docs/0.13.0/overview/index.html index 473a438b1eac5..e2793b6cd37d3 100644 --- a/content/cn/docs/0.13.0/overview/index.html +++ b/content/cn/docs/0.13.0/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/performance/index.html b/content/cn/docs/0.13.0/performance/index.html index e68dca72ec739..72e8efec78472 100644 --- a/content/cn/docs/0.13.0/performance/index.html +++ b/content/cn/docs/0.13.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/precommit_validator/index.html b/content/cn/docs/0.13.0/precommit_validator/index.html index f5da07f064a58..732f073c7f10a 100644 --- a/content/cn/docs/0.13.0/precommit_validator/index.html +++ b/content/cn/docs/0.13.0/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/privacy/index.html b/content/cn/docs/0.13.0/privacy/index.html index f9ebf0e3d57db..cc6245817f4b3 100644 --- a/content/cn/docs/0.13.0/privacy/index.html +++ b/content/cn/docs/0.13.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/procedures/index.html b/content/cn/docs/0.13.0/procedures/index.html index e1f63530a03f9..5c8bcd0ae2124 100644 --- a/content/cn/docs/0.13.0/procedures/index.html +++ b/content/cn/docs/0.13.0/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/query_engine_setup/index.html b/content/cn/docs/0.13.0/query_engine_setup/index.html index 815f9014c5df0..ad48e3446e1cc 100644 --- a/content/cn/docs/0.13.0/query_engine_setup/index.html +++ b/content/cn/docs/0.13.0/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/querying_data/index.html b/content/cn/docs/0.13.0/querying_data/index.html index 3b232a1e1b4ac..dce378444d0ad 100644 --- a/content/cn/docs/0.13.0/querying_data/index.html +++ b/content/cn/docs/0.13.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/quick-start-guide/index.html b/content/cn/docs/0.13.0/quick-start-guide/index.html index 00958630a6f43..ea4895e72357a 100644 --- a/content/cn/docs/0.13.0/quick-start-guide/index.html +++ b/content/cn/docs/0.13.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/s3_hoodie/index.html b/content/cn/docs/0.13.0/s3_hoodie/index.html index 4d1595b3de8e3..312e9760f94e5 100644 --- a/content/cn/docs/0.13.0/s3_hoodie/index.html +++ b/content/cn/docs/0.13.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/schema_evolution/index.html b/content/cn/docs/0.13.0/schema_evolution/index.html index d146dd6bddb69..5027ce34bd995 100644 --- a/content/cn/docs/0.13.0/schema_evolution/index.html +++ b/content/cn/docs/0.13.0/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/snapshot_exporter/index.html b/content/cn/docs/0.13.0/snapshot_exporter/index.html index ef932a86f0b69..b3e0d79ad5e2e 100644 --- a/content/cn/docs/0.13.0/snapshot_exporter/index.html +++ b/content/cn/docs/0.13.0/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/structure/index.html b/content/cn/docs/0.13.0/structure/index.html index 6e62eaf4aa264..52df526909b32 100644 --- a/content/cn/docs/0.13.0/structure/index.html +++ b/content/cn/docs/0.13.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/syncing_aws_glue_data_catalog/index.html b/content/cn/docs/0.13.0/syncing_aws_glue_data_catalog/index.html index b84960e78e120..5c42147f4292c 100644 --- a/content/cn/docs/0.13.0/syncing_aws_glue_data_catalog/index.html +++ b/content/cn/docs/0.13.0/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/syncing_datahub/index.html b/content/cn/docs/0.13.0/syncing_datahub/index.html index 4d766a7039e1a..a5e539a3b6512 100644 --- a/content/cn/docs/0.13.0/syncing_datahub/index.html +++ b/content/cn/docs/0.13.0/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/syncing_metastore/index.html b/content/cn/docs/0.13.0/syncing_metastore/index.html index 23cc3ff7c59d4..fcb7d573a2883 100644 --- a/content/cn/docs/0.13.0/syncing_metastore/index.html +++ b/content/cn/docs/0.13.0/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/table_management/index.html b/content/cn/docs/0.13.0/table_management/index.html index edff4d0bf4ba8..0d521dd5f399d 100644 --- a/content/cn/docs/0.13.0/table_management/index.html +++ b/content/cn/docs/0.13.0/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/table_types/index.html b/content/cn/docs/0.13.0/table_types/index.html index 61a182e994d3e..51db85df39ed0 100644 --- a/content/cn/docs/0.13.0/table_types/index.html +++ b/content/cn/docs/0.13.0/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/timeline/index.html b/content/cn/docs/0.13.0/timeline/index.html index 9ff50ae6144cf..3cda5c8298157 100644 --- a/content/cn/docs/0.13.0/timeline/index.html +++ b/content/cn/docs/0.13.0/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/transforms/index.html b/content/cn/docs/0.13.0/transforms/index.html index e9be098b76025..fe8453bf8ea70 100644 --- a/content/cn/docs/0.13.0/transforms/index.html +++ b/content/cn/docs/0.13.0/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/troubleshooting/index.html b/content/cn/docs/0.13.0/troubleshooting/index.html index 7b03c284d8ce7..31341cf5a2a36 100644 --- a/content/cn/docs/0.13.0/troubleshooting/index.html +++ b/content/cn/docs/0.13.0/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/tuning-guide/index.html b/content/cn/docs/0.13.0/tuning-guide/index.html index cf0470c13ef60..73d4368ab25b0 100644 --- a/content/cn/docs/0.13.0/tuning-guide/index.html +++ b/content/cn/docs/0.13.0/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/use_cases/index.html b/content/cn/docs/0.13.0/use_cases/index.html index ac056d469e435..a8881ca522a54 100644 --- a/content/cn/docs/0.13.0/use_cases/index.html +++ b/content/cn/docs/0.13.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/write_operations/index.html b/content/cn/docs/0.13.0/write_operations/index.html index daa73917bfc06..433c2e8fe89fc 100644 --- a/content/cn/docs/0.13.0/write_operations/index.html +++ b/content/cn/docs/0.13.0/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.0/writing_data/index.html b/content/cn/docs/0.13.0/writing_data/index.html index e5595f2598097..644fc9b0c15b1 100644 --- a/content/cn/docs/0.13.0/writing_data/index.html +++ b/content/cn/docs/0.13.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/azure_hoodie/index.html b/content/cn/docs/0.13.1/azure_hoodie/index.html index dbc4cd78f9c35..765e07a5fb5fb 100644 --- a/content/cn/docs/0.13.1/azure_hoodie/index.html +++ b/content/cn/docs/0.13.1/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/basic_configurations/index.html b/content/cn/docs/0.13.1/basic_configurations/index.html index 69cb24a9ef297..29639e5ae832b 100644 --- a/content/cn/docs/0.13.1/basic_configurations/index.html +++ b/content/cn/docs/0.13.1/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/bos_hoodie/index.html b/content/cn/docs/0.13.1/bos_hoodie/index.html index 3a4b539eb1133..02f1cca21acad 100644 --- a/content/cn/docs/0.13.1/bos_hoodie/index.html +++ b/content/cn/docs/0.13.1/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/cli/index.html b/content/cn/docs/0.13.1/cli/index.html index 94293e2c168a2..ea37d78703cf1 100644 --- a/content/cn/docs/0.13.1/cli/index.html +++ b/content/cn/docs/0.13.1/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/cloud/index.html b/content/cn/docs/0.13.1/cloud/index.html index 50a375c9478e8..1d92319dc8999 100644 --- a/content/cn/docs/0.13.1/cloud/index.html +++ b/content/cn/docs/0.13.1/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/clustering/index.html b/content/cn/docs/0.13.1/clustering/index.html index 74aefa59090c3..54d07cc926553 100644 --- a/content/cn/docs/0.13.1/clustering/index.html +++ b/content/cn/docs/0.13.1/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/compaction/index.html b/content/cn/docs/0.13.1/compaction/index.html index 37937f5168dec..78ef9d17bbd33 100644 --- a/content/cn/docs/0.13.1/compaction/index.html +++ b/content/cn/docs/0.13.1/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/comparison/index.html b/content/cn/docs/0.13.1/comparison/index.html index dfb44cfdbfa01..571c1f66592f2 100644 --- a/content/cn/docs/0.13.1/comparison/index.html +++ b/content/cn/docs/0.13.1/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/concepts/index.html b/content/cn/docs/0.13.1/concepts/index.html index 0d62cc186749b..2c8b808218663 100644 --- a/content/cn/docs/0.13.1/concepts/index.html +++ b/content/cn/docs/0.13.1/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/concurrency_control/index.html b/content/cn/docs/0.13.1/concurrency_control/index.html index 595311fb0e8e5..9275bdd078cd9 100644 --- a/content/cn/docs/0.13.1/concurrency_control/index.html +++ b/content/cn/docs/0.13.1/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/configurations/index.html b/content/cn/docs/0.13.1/configurations/index.html index 33314f4ae0e0b..c1132ba57eb22 100644 --- a/content/cn/docs/0.13.1/configurations/index.html +++ b/content/cn/docs/0.13.1/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/cos_hoodie/index.html b/content/cn/docs/0.13.1/cos_hoodie/index.html index ca1ccd87464b1..491a400c6e4f9 100644 --- a/content/cn/docs/0.13.1/cos_hoodie/index.html +++ b/content/cn/docs/0.13.1/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/deployment/index.html b/content/cn/docs/0.13.1/deployment/index.html index 10762b69560a1..3e75b7adb0357 100644 --- a/content/cn/docs/0.13.1/deployment/index.html +++ b/content/cn/docs/0.13.1/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/disaster_recovery/index.html b/content/cn/docs/0.13.1/disaster_recovery/index.html index 84f2d1f298a73..a38eb27833c5e 100644 --- a/content/cn/docs/0.13.1/disaster_recovery/index.html +++ b/content/cn/docs/0.13.1/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/docker_demo/index.html b/content/cn/docs/0.13.1/docker_demo/index.html index b3f7a808209b1..8b35c467f96e6 100644 --- a/content/cn/docs/0.13.1/docker_demo/index.html +++ b/content/cn/docs/0.13.1/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/encryption/index.html b/content/cn/docs/0.13.1/encryption/index.html index 15620ebbafbb1..d67db4df4028b 100644 --- a/content/cn/docs/0.13.1/encryption/index.html +++ b/content/cn/docs/0.13.1/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/faq/index.html b/content/cn/docs/0.13.1/faq/index.html index 7e6e515aedc81..d36350efb9eb4 100644 --- a/content/cn/docs/0.13.1/faq/index.html +++ b/content/cn/docs/0.13.1/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/file_layouts/index.html b/content/cn/docs/0.13.1/file_layouts/index.html index 72d5db70e61bc..ae64821af796c 100644 --- a/content/cn/docs/0.13.1/file_layouts/index.html +++ b/content/cn/docs/0.13.1/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/file_sizing/index.html b/content/cn/docs/0.13.1/file_sizing/index.html index 895d87a39fbbf..16879469383d1 100644 --- a/content/cn/docs/0.13.1/file_sizing/index.html +++ b/content/cn/docs/0.13.1/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/flink-quick-start-guide/index.html b/content/cn/docs/0.13.1/flink-quick-start-guide/index.html index 8f9790bf23954..be21a85950aa6 100644 --- a/content/cn/docs/0.13.1/flink-quick-start-guide/index.html +++ b/content/cn/docs/0.13.1/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/flink_configuration/index.html b/content/cn/docs/0.13.1/flink_configuration/index.html index 74ce2eee77a89..b7935d5f23725 100644 --- a/content/cn/docs/0.13.1/flink_configuration/index.html +++ b/content/cn/docs/0.13.1/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/gcp_bigquery/index.html b/content/cn/docs/0.13.1/gcp_bigquery/index.html index 4194494481b06..c6214fb010f1f 100644 --- a/content/cn/docs/0.13.1/gcp_bigquery/index.html +++ b/content/cn/docs/0.13.1/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/gcs_hoodie/index.html b/content/cn/docs/0.13.1/gcs_hoodie/index.html index b1674cd9bf1b9..11b98673b2ff3 100644 --- a/content/cn/docs/0.13.1/gcs_hoodie/index.html +++ b/content/cn/docs/0.13.1/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/hoodie_cleaner/index.html b/content/cn/docs/0.13.1/hoodie_cleaner/index.html index 83d84b688b8b3..c891405326651 100644 --- a/content/cn/docs/0.13.1/hoodie_cleaner/index.html +++ b/content/cn/docs/0.13.1/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/hoodie_deltastreamer/index.html b/content/cn/docs/0.13.1/hoodie_deltastreamer/index.html index c411311aa4467..5a778e272ce7e 100644 --- a/content/cn/docs/0.13.1/hoodie_deltastreamer/index.html +++ b/content/cn/docs/0.13.1/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/ibm_cos_hoodie/index.html b/content/cn/docs/0.13.1/ibm_cos_hoodie/index.html index 19ebb911da664..cbf75be01acec 100644 --- a/content/cn/docs/0.13.1/ibm_cos_hoodie/index.html +++ b/content/cn/docs/0.13.1/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/indexing/index.html b/content/cn/docs/0.13.1/indexing/index.html index 5f3350335fe1f..68ff334625150 100644 --- a/content/cn/docs/0.13.1/indexing/index.html +++ b/content/cn/docs/0.13.1/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/jfs_hoodie/index.html b/content/cn/docs/0.13.1/jfs_hoodie/index.html index b4c5e1a415aa5..95f272abeffc7 100644 --- a/content/cn/docs/0.13.1/jfs_hoodie/index.html +++ b/content/cn/docs/0.13.1/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/key_generation/index.html b/content/cn/docs/0.13.1/key_generation/index.html index d7e9b3e6d5d72..4fc37df94b205 100644 --- a/content/cn/docs/0.13.1/key_generation/index.html +++ b/content/cn/docs/0.13.1/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/markers/index.html b/content/cn/docs/0.13.1/markers/index.html index 8402e3e5b1ab9..83292132d1a5d 100644 --- a/content/cn/docs/0.13.1/markers/index.html +++ b/content/cn/docs/0.13.1/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/metadata/index.html b/content/cn/docs/0.13.1/metadata/index.html index e7a2638bdcf29..10756543174aa 100644 --- a/content/cn/docs/0.13.1/metadata/index.html +++ b/content/cn/docs/0.13.1/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/metadata_indexing/index.html b/content/cn/docs/0.13.1/metadata_indexing/index.html index c3d86cb8cd2d9..91eea97a4c678 100644 --- a/content/cn/docs/0.13.1/metadata_indexing/index.html +++ b/content/cn/docs/0.13.1/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/metrics/index.html b/content/cn/docs/0.13.1/metrics/index.html index 0f4cf391ccedc..65ba96c27f402 100644 --- a/content/cn/docs/0.13.1/metrics/index.html +++ b/content/cn/docs/0.13.1/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/migration_guide/index.html b/content/cn/docs/0.13.1/migration_guide/index.html index 6feca3df148d9..5d14eaefe2802 100644 --- a/content/cn/docs/0.13.1/migration_guide/index.html +++ b/content/cn/docs/0.13.1/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/oci_hoodie/index.html b/content/cn/docs/0.13.1/oci_hoodie/index.html index 053661a6a0392..f882f684d439f 100644 --- a/content/cn/docs/0.13.1/oci_hoodie/index.html +++ b/content/cn/docs/0.13.1/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/oss_hoodie/index.html b/content/cn/docs/0.13.1/oss_hoodie/index.html index 011099f1be94c..6a5b8adbe1d78 100644 --- a/content/cn/docs/0.13.1/oss_hoodie/index.html +++ b/content/cn/docs/0.13.1/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/overview/index.html b/content/cn/docs/0.13.1/overview/index.html index 3cd430f310843..a3f1202780696 100644 --- a/content/cn/docs/0.13.1/overview/index.html +++ b/content/cn/docs/0.13.1/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/performance/index.html b/content/cn/docs/0.13.1/performance/index.html index 091d28b02e418..171670ad75922 100644 --- a/content/cn/docs/0.13.1/performance/index.html +++ b/content/cn/docs/0.13.1/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/precommit_validator/index.html b/content/cn/docs/0.13.1/precommit_validator/index.html index f955ead455e50..e757b6f6ab68a 100644 --- a/content/cn/docs/0.13.1/precommit_validator/index.html +++ b/content/cn/docs/0.13.1/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/privacy/index.html b/content/cn/docs/0.13.1/privacy/index.html index 94f4962dd5f17..7f6304ebea8ee 100644 --- a/content/cn/docs/0.13.1/privacy/index.html +++ b/content/cn/docs/0.13.1/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/procedures/index.html b/content/cn/docs/0.13.1/procedures/index.html index a6c985b2332a3..ff95507494ce8 100644 --- a/content/cn/docs/0.13.1/procedures/index.html +++ b/content/cn/docs/0.13.1/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/querying_data/index.html b/content/cn/docs/0.13.1/querying_data/index.html index a32de190f8c66..60fe3aa3ec352 100644 --- a/content/cn/docs/0.13.1/querying_data/index.html +++ b/content/cn/docs/0.13.1/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/quick-start-guide/index.html b/content/cn/docs/0.13.1/quick-start-guide/index.html index df9a1dc585e64..e4956a2b7fa77 100644 --- a/content/cn/docs/0.13.1/quick-start-guide/index.html +++ b/content/cn/docs/0.13.1/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/record_payload/index.html b/content/cn/docs/0.13.1/record_payload/index.html index f0b3c4aa6c5ca..bb84acb1003e4 100644 --- a/content/cn/docs/0.13.1/record_payload/index.html +++ b/content/cn/docs/0.13.1/record_payload/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/s3_hoodie/index.html b/content/cn/docs/0.13.1/s3_hoodie/index.html index 31c21773c9d47..e580718ab34d2 100644 --- a/content/cn/docs/0.13.1/s3_hoodie/index.html +++ b/content/cn/docs/0.13.1/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/schema_evolution/index.html b/content/cn/docs/0.13.1/schema_evolution/index.html index 282431e602c74..08313dcece5ea 100644 --- a/content/cn/docs/0.13.1/schema_evolution/index.html +++ b/content/cn/docs/0.13.1/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/snapshot_exporter/index.html b/content/cn/docs/0.13.1/snapshot_exporter/index.html index 896c31cd03d16..08ce83f4db436 100644 --- a/content/cn/docs/0.13.1/snapshot_exporter/index.html +++ b/content/cn/docs/0.13.1/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/structure/index.html b/content/cn/docs/0.13.1/structure/index.html index 6baa689e7c33c..7cfc679441d7d 100644 --- a/content/cn/docs/0.13.1/structure/index.html +++ b/content/cn/docs/0.13.1/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/syncing_aws_glue_data_catalog/index.html b/content/cn/docs/0.13.1/syncing_aws_glue_data_catalog/index.html index 04e0f0879c9c7..29089e5c9d822 100644 --- a/content/cn/docs/0.13.1/syncing_aws_glue_data_catalog/index.html +++ b/content/cn/docs/0.13.1/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/syncing_datahub/index.html b/content/cn/docs/0.13.1/syncing_datahub/index.html index 35665951a7c71..24d816f6a57c4 100644 --- a/content/cn/docs/0.13.1/syncing_datahub/index.html +++ b/content/cn/docs/0.13.1/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/syncing_metastore/index.html b/content/cn/docs/0.13.1/syncing_metastore/index.html index 60e2aed6e8a27..a93168cae3bc1 100644 --- a/content/cn/docs/0.13.1/syncing_metastore/index.html +++ b/content/cn/docs/0.13.1/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/table_management/index.html b/content/cn/docs/0.13.1/table_management/index.html index 0b598a8ad9ba7..6b824ce7a81b7 100644 --- a/content/cn/docs/0.13.1/table_management/index.html +++ b/content/cn/docs/0.13.1/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/table_types/index.html b/content/cn/docs/0.13.1/table_types/index.html index 5c617e746bc17..d71a5cfa85ed8 100644 --- a/content/cn/docs/0.13.1/table_types/index.html +++ b/content/cn/docs/0.13.1/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/timeline/index.html b/content/cn/docs/0.13.1/timeline/index.html index 7511e545e778e..b2f9c62634b75 100644 --- a/content/cn/docs/0.13.1/timeline/index.html +++ b/content/cn/docs/0.13.1/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/transforms/index.html b/content/cn/docs/0.13.1/transforms/index.html index 6f530a713d41e..c9c889925bcb8 100644 --- a/content/cn/docs/0.13.1/transforms/index.html +++ b/content/cn/docs/0.13.1/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/troubleshooting/index.html b/content/cn/docs/0.13.1/troubleshooting/index.html index 6f1de2c4bc377..2853551b0b4a9 100644 --- a/content/cn/docs/0.13.1/troubleshooting/index.html +++ b/content/cn/docs/0.13.1/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/tuning-guide/index.html b/content/cn/docs/0.13.1/tuning-guide/index.html index db7e9c5cc1567..658bd34c9fb33 100644 --- a/content/cn/docs/0.13.1/tuning-guide/index.html +++ b/content/cn/docs/0.13.1/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/use_cases/index.html b/content/cn/docs/0.13.1/use_cases/index.html index e55e19c80d6c2..41517c2664233 100644 --- a/content/cn/docs/0.13.1/use_cases/index.html +++ b/content/cn/docs/0.13.1/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/write_operations/index.html b/content/cn/docs/0.13.1/write_operations/index.html index b5e3609a7f30a..8af3350c884ff 100644 --- a/content/cn/docs/0.13.1/write_operations/index.html +++ b/content/cn/docs/0.13.1/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.13.1/writing_data/index.html b/content/cn/docs/0.13.1/writing_data/index.html index 5423ea70792e1..da0ea02569eb6 100644 --- a/content/cn/docs/0.13.1/writing_data/index.html +++ b/content/cn/docs/0.13.1/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/azure_hoodie/index.html b/content/cn/docs/0.14.0/azure_hoodie/index.html index 137e65109fef5..ebe1a92c9760e 100644 --- a/content/cn/docs/0.14.0/azure_hoodie/index.html +++ b/content/cn/docs/0.14.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/basic_configurations/index.html b/content/cn/docs/0.14.0/basic_configurations/index.html index 893b7eea3b32b..9f3fa7e37a424 100644 --- a/content/cn/docs/0.14.0/basic_configurations/index.html +++ b/content/cn/docs/0.14.0/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/bos_hoodie/index.html b/content/cn/docs/0.14.0/bos_hoodie/index.html index aaf49ff1750b2..922fe5a73a5de 100644 --- a/content/cn/docs/0.14.0/bos_hoodie/index.html +++ b/content/cn/docs/0.14.0/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/cli/index.html b/content/cn/docs/0.14.0/cli/index.html index c2923f8c314fa..878f27f745645 100644 --- a/content/cn/docs/0.14.0/cli/index.html +++ b/content/cn/docs/0.14.0/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/cloud/index.html b/content/cn/docs/0.14.0/cloud/index.html index 911a3c1ab604b..14cc5d2e4e3ab 100644 --- a/content/cn/docs/0.14.0/cloud/index.html +++ b/content/cn/docs/0.14.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/clustering/index.html b/content/cn/docs/0.14.0/clustering/index.html index 8f79ddcd2f960..ef8da972a623f 100644 --- a/content/cn/docs/0.14.0/clustering/index.html +++ b/content/cn/docs/0.14.0/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/compaction/index.html b/content/cn/docs/0.14.0/compaction/index.html index a02501b1951ed..dafb93a5d16f5 100644 --- a/content/cn/docs/0.14.0/compaction/index.html +++ b/content/cn/docs/0.14.0/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/comparison/index.html b/content/cn/docs/0.14.0/comparison/index.html index b6674638cb418..90c6c20c3b0c6 100644 --- a/content/cn/docs/0.14.0/comparison/index.html +++ b/content/cn/docs/0.14.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/concepts/index.html b/content/cn/docs/0.14.0/concepts/index.html index 83f23db600dd7..48e82f8e715eb 100644 --- a/content/cn/docs/0.14.0/concepts/index.html +++ b/content/cn/docs/0.14.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/concurrency_control/index.html b/content/cn/docs/0.14.0/concurrency_control/index.html index 65f3ed2881b20..0d57eb11e6a50 100644 --- a/content/cn/docs/0.14.0/concurrency_control/index.html +++ b/content/cn/docs/0.14.0/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/configurations/index.html b/content/cn/docs/0.14.0/configurations/index.html index fbf21b28b7814..926a7291f9c0a 100644 --- a/content/cn/docs/0.14.0/configurations/index.html +++ b/content/cn/docs/0.14.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/cos_hoodie/index.html b/content/cn/docs/0.14.0/cos_hoodie/index.html index c403f6844f0a8..dc33226f44bfe 100644 --- a/content/cn/docs/0.14.0/cos_hoodie/index.html +++ b/content/cn/docs/0.14.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/deployment/index.html b/content/cn/docs/0.14.0/deployment/index.html index 812c6d1c3793a..5b2a7ef8bc170 100644 --- a/content/cn/docs/0.14.0/deployment/index.html +++ b/content/cn/docs/0.14.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/disaster_recovery/index.html b/content/cn/docs/0.14.0/disaster_recovery/index.html index d358d167e5f67..3b087a29ab665 100644 --- a/content/cn/docs/0.14.0/disaster_recovery/index.html +++ b/content/cn/docs/0.14.0/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/docker_demo/index.html b/content/cn/docs/0.14.0/docker_demo/index.html index 1e9b83b9c3750..af31436905263 100644 --- a/content/cn/docs/0.14.0/docker_demo/index.html +++ b/content/cn/docs/0.14.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/encryption/index.html b/content/cn/docs/0.14.0/encryption/index.html index 767eb3014e34c..ae11b6184947a 100644 --- a/content/cn/docs/0.14.0/encryption/index.html +++ b/content/cn/docs/0.14.0/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/faq/index.html b/content/cn/docs/0.14.0/faq/index.html index 80f3efff183da..97e29492b4bf4 100644 --- a/content/cn/docs/0.14.0/faq/index.html +++ b/content/cn/docs/0.14.0/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/file_layouts/index.html b/content/cn/docs/0.14.0/file_layouts/index.html index dae9091982e04..e96aaf9fc0158 100644 --- a/content/cn/docs/0.14.0/file_layouts/index.html +++ b/content/cn/docs/0.14.0/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/file_sizing/index.html b/content/cn/docs/0.14.0/file_sizing/index.html index 1a4f70cd40e37..4025b59eadbd1 100644 --- a/content/cn/docs/0.14.0/file_sizing/index.html +++ b/content/cn/docs/0.14.0/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/flink-quick-start-guide/index.html b/content/cn/docs/0.14.0/flink-quick-start-guide/index.html index d6bd69f3a30b9..2a3170a1cc5ad 100644 --- a/content/cn/docs/0.14.0/flink-quick-start-guide/index.html +++ b/content/cn/docs/0.14.0/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/flink_tuning/index.html b/content/cn/docs/0.14.0/flink_tuning/index.html index 35eb613ff590e..7bdad569bcab0 100644 --- a/content/cn/docs/0.14.0/flink_tuning/index.html +++ b/content/cn/docs/0.14.0/flink_tuning/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/gcp_bigquery/index.html b/content/cn/docs/0.14.0/gcp_bigquery/index.html index 07b399822d0a4..0d6caf7db42f7 100644 --- a/content/cn/docs/0.14.0/gcp_bigquery/index.html +++ b/content/cn/docs/0.14.0/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/gcs_hoodie/index.html b/content/cn/docs/0.14.0/gcs_hoodie/index.html index 146e3000dd98b..84b0a8ee98b1e 100644 --- a/content/cn/docs/0.14.0/gcs_hoodie/index.html +++ b/content/cn/docs/0.14.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/hoodie_cleaner/index.html b/content/cn/docs/0.14.0/hoodie_cleaner/index.html index 72944f5b3cdce..e23eaf5658e02 100644 --- a/content/cn/docs/0.14.0/hoodie_cleaner/index.html +++ b/content/cn/docs/0.14.0/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/hoodie_streaming_ingestion/index.html b/content/cn/docs/0.14.0/hoodie_streaming_ingestion/index.html index b42ac6e689aed..c135342450336 100644 --- a/content/cn/docs/0.14.0/hoodie_streaming_ingestion/index.html +++ b/content/cn/docs/0.14.0/hoodie_streaming_ingestion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/ibm_cos_hoodie/index.html b/content/cn/docs/0.14.0/ibm_cos_hoodie/index.html index cc9d9120e51a0..df351f75bae65 100644 --- a/content/cn/docs/0.14.0/ibm_cos_hoodie/index.html +++ b/content/cn/docs/0.14.0/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/indexing/index.html b/content/cn/docs/0.14.0/indexing/index.html index e77c1144af52a..e9a84a6e13dba 100644 --- a/content/cn/docs/0.14.0/indexing/index.html +++ b/content/cn/docs/0.14.0/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/jfs_hoodie/index.html b/content/cn/docs/0.14.0/jfs_hoodie/index.html index 6f284b3e660f7..28580b2e92e4a 100644 --- a/content/cn/docs/0.14.0/jfs_hoodie/index.html +++ b/content/cn/docs/0.14.0/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/key_generation/index.html b/content/cn/docs/0.14.0/key_generation/index.html index 90fc198b77d86..c6e926b389376 100644 --- a/content/cn/docs/0.14.0/key_generation/index.html +++ b/content/cn/docs/0.14.0/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/markers/index.html b/content/cn/docs/0.14.0/markers/index.html index cdb765cd80fa8..87edc1926e4bd 100644 --- a/content/cn/docs/0.14.0/markers/index.html +++ b/content/cn/docs/0.14.0/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/metadata/index.html b/content/cn/docs/0.14.0/metadata/index.html index d310f6832d701..dd300987735ff 100644 --- a/content/cn/docs/0.14.0/metadata/index.html +++ b/content/cn/docs/0.14.0/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/metadata_indexing/index.html b/content/cn/docs/0.14.0/metadata_indexing/index.html index 58bc785ea1b37..0d63baffeba5e 100644 --- a/content/cn/docs/0.14.0/metadata_indexing/index.html +++ b/content/cn/docs/0.14.0/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/metrics/index.html b/content/cn/docs/0.14.0/metrics/index.html index 4042d7a0e9eb4..2053f94bdf378 100644 --- a/content/cn/docs/0.14.0/metrics/index.html +++ b/content/cn/docs/0.14.0/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/migration_guide/index.html b/content/cn/docs/0.14.0/migration_guide/index.html index 1214a480e3a8d..73d81ae27fe15 100644 --- a/content/cn/docs/0.14.0/migration_guide/index.html +++ b/content/cn/docs/0.14.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/oci_hoodie/index.html b/content/cn/docs/0.14.0/oci_hoodie/index.html index a4d219326d295..17c75c4cfe02b 100644 --- a/content/cn/docs/0.14.0/oci_hoodie/index.html +++ b/content/cn/docs/0.14.0/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/oss_hoodie/index.html b/content/cn/docs/0.14.0/oss_hoodie/index.html index ed6a5f8af34e5..3e963331710e2 100644 --- a/content/cn/docs/0.14.0/oss_hoodie/index.html +++ b/content/cn/docs/0.14.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/overview/index.html b/content/cn/docs/0.14.0/overview/index.html index 83b221a582cb2..f74892edd6d33 100644 --- a/content/cn/docs/0.14.0/overview/index.html +++ b/content/cn/docs/0.14.0/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/performance/index.html b/content/cn/docs/0.14.0/performance/index.html index 851ad25bc0b2a..d69b6c5065afe 100644 --- a/content/cn/docs/0.14.0/performance/index.html +++ b/content/cn/docs/0.14.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/precommit_validator/index.html b/content/cn/docs/0.14.0/precommit_validator/index.html index f64ede54c9a1e..2941f8005b88d 100644 --- a/content/cn/docs/0.14.0/precommit_validator/index.html +++ b/content/cn/docs/0.14.0/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/privacy/index.html b/content/cn/docs/0.14.0/privacy/index.html index c43d30ddda364..af7685e7f0a8d 100644 --- a/content/cn/docs/0.14.0/privacy/index.html +++ b/content/cn/docs/0.14.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/procedures/index.html b/content/cn/docs/0.14.0/procedures/index.html index 3c44afcd0c8cf..cd4de7bc9d57c 100644 --- a/content/cn/docs/0.14.0/procedures/index.html +++ b/content/cn/docs/0.14.0/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/querying_data/index.html b/content/cn/docs/0.14.0/querying_data/index.html index 68fcf6cfe3520..004754e0b39b6 100644 --- a/content/cn/docs/0.14.0/querying_data/index.html +++ b/content/cn/docs/0.14.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/quick-start-guide/index.html b/content/cn/docs/0.14.0/quick-start-guide/index.html index 541046f78d844..57fedbc781496 100644 --- a/content/cn/docs/0.14.0/quick-start-guide/index.html +++ b/content/cn/docs/0.14.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/record_payload/index.html b/content/cn/docs/0.14.0/record_payload/index.html index 490e5f971ba1f..63aa18f3b3cd7 100644 --- a/content/cn/docs/0.14.0/record_payload/index.html +++ b/content/cn/docs/0.14.0/record_payload/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/rollbacks/index.html b/content/cn/docs/0.14.0/rollbacks/index.html index 6401a0cd50617..733d14cd77854 100644 --- a/content/cn/docs/0.14.0/rollbacks/index.html +++ b/content/cn/docs/0.14.0/rollbacks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/s3_hoodie/index.html b/content/cn/docs/0.14.0/s3_hoodie/index.html index c9b3dd4ecebe6..b563f2374c059 100644 --- a/content/cn/docs/0.14.0/s3_hoodie/index.html +++ b/content/cn/docs/0.14.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/schema_evolution/index.html b/content/cn/docs/0.14.0/schema_evolution/index.html index d283979c2935e..a335ad3665aac 100644 --- a/content/cn/docs/0.14.0/schema_evolution/index.html +++ b/content/cn/docs/0.14.0/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/snapshot_exporter/index.html b/content/cn/docs/0.14.0/snapshot_exporter/index.html index 863e766f61e9e..b85ab054e9693 100644 --- a/content/cn/docs/0.14.0/snapshot_exporter/index.html +++ b/content/cn/docs/0.14.0/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/sql_ddl/index.html b/content/cn/docs/0.14.0/sql_ddl/index.html index e1c443990ffdd..34441662abdd1 100644 --- a/content/cn/docs/0.14.0/sql_ddl/index.html +++ b/content/cn/docs/0.14.0/sql_ddl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/sql_dml/index.html b/content/cn/docs/0.14.0/sql_dml/index.html index cf4c10a113fb0..6a56f257d8b4e 100644 --- a/content/cn/docs/0.14.0/sql_dml/index.html +++ b/content/cn/docs/0.14.0/sql_dml/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/sql_queries/index.html b/content/cn/docs/0.14.0/sql_queries/index.html index cfd9b6f77400c..ec423a065c308 100644 --- a/content/cn/docs/0.14.0/sql_queries/index.html +++ b/content/cn/docs/0.14.0/sql_queries/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/structure/index.html b/content/cn/docs/0.14.0/structure/index.html index d05cf10d94cf6..902bc53ef170a 100644 --- a/content/cn/docs/0.14.0/structure/index.html +++ b/content/cn/docs/0.14.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/syncing_aws_glue_data_catalog/index.html b/content/cn/docs/0.14.0/syncing_aws_glue_data_catalog/index.html index 9d4321f309fe3..527a9e23b9660 100644 --- a/content/cn/docs/0.14.0/syncing_aws_glue_data_catalog/index.html +++ b/content/cn/docs/0.14.0/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/syncing_datahub/index.html b/content/cn/docs/0.14.0/syncing_datahub/index.html index 2733c884140d2..2bce1d5107cec 100644 --- a/content/cn/docs/0.14.0/syncing_datahub/index.html +++ b/content/cn/docs/0.14.0/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/syncing_metastore/index.html b/content/cn/docs/0.14.0/syncing_metastore/index.html index 010b121d75ec9..97de02a7aec52 100644 --- a/content/cn/docs/0.14.0/syncing_metastore/index.html +++ b/content/cn/docs/0.14.0/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/syncing_xtable/index.html b/content/cn/docs/0.14.0/syncing_xtable/index.html index e98a2904fd146..af61f59eff298 100644 --- a/content/cn/docs/0.14.0/syncing_xtable/index.html +++ b/content/cn/docs/0.14.0/syncing_xtable/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/table_types/index.html b/content/cn/docs/0.14.0/table_types/index.html index 3c0a6ed8dbefa..28623ab60b15a 100644 --- a/content/cn/docs/0.14.0/table_types/index.html +++ b/content/cn/docs/0.14.0/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/timeline/index.html b/content/cn/docs/0.14.0/timeline/index.html index 6b18187c28dee..253d0cc93336b 100644 --- a/content/cn/docs/0.14.0/timeline/index.html +++ b/content/cn/docs/0.14.0/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/transforms/index.html b/content/cn/docs/0.14.0/transforms/index.html index 5b070cde2bf07..7257713d5f97b 100644 --- a/content/cn/docs/0.14.0/transforms/index.html +++ b/content/cn/docs/0.14.0/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/troubleshooting/index.html b/content/cn/docs/0.14.0/troubleshooting/index.html index a24b38df79140..1cb909a856a07 100644 --- a/content/cn/docs/0.14.0/troubleshooting/index.html +++ b/content/cn/docs/0.14.0/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/tuning-guide/index.html b/content/cn/docs/0.14.0/tuning-guide/index.html index fe44f822104a6..8d030098a51ef 100644 --- a/content/cn/docs/0.14.0/tuning-guide/index.html +++ b/content/cn/docs/0.14.0/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/use_cases/index.html b/content/cn/docs/0.14.0/use_cases/index.html index 93dfeb72b7c1f..666ecceee65b6 100644 --- a/content/cn/docs/0.14.0/use_cases/index.html +++ b/content/cn/docs/0.14.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/write_operations/index.html b/content/cn/docs/0.14.0/write_operations/index.html index 61ea050f11f20..510d5f9bc54e3 100644 --- a/content/cn/docs/0.14.0/write_operations/index.html +++ b/content/cn/docs/0.14.0/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.0/writing_data/index.html b/content/cn/docs/0.14.0/writing_data/index.html index 9da1d90a2e191..fb19fc0e63eca 100644 --- a/content/cn/docs/0.14.0/writing_data/index.html +++ b/content/cn/docs/0.14.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/azure_hoodie/index.html b/content/cn/docs/0.14.1/azure_hoodie/index.html index 3916355991944..297d249c36f27 100644 --- a/content/cn/docs/0.14.1/azure_hoodie/index.html +++ b/content/cn/docs/0.14.1/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/basic_configurations/index.html b/content/cn/docs/0.14.1/basic_configurations/index.html index 98ba957118e98..4e4fcf1148679 100644 --- a/content/cn/docs/0.14.1/basic_configurations/index.html +++ b/content/cn/docs/0.14.1/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/bos_hoodie/index.html b/content/cn/docs/0.14.1/bos_hoodie/index.html index 6273c8efa2757..182506ab5cf03 100644 --- a/content/cn/docs/0.14.1/bos_hoodie/index.html +++ b/content/cn/docs/0.14.1/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/cli/index.html b/content/cn/docs/0.14.1/cli/index.html index eb7b6939f573a..573f0095ed699 100644 --- a/content/cn/docs/0.14.1/cli/index.html +++ b/content/cn/docs/0.14.1/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/cloud/index.html b/content/cn/docs/0.14.1/cloud/index.html index 9bc04e5d03294..e5b2a9c994e4d 100644 --- a/content/cn/docs/0.14.1/cloud/index.html +++ b/content/cn/docs/0.14.1/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/clustering/index.html b/content/cn/docs/0.14.1/clustering/index.html index 1e13c24f6e936..0f8ae402932e2 100644 --- a/content/cn/docs/0.14.1/clustering/index.html +++ b/content/cn/docs/0.14.1/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/compaction/index.html b/content/cn/docs/0.14.1/compaction/index.html index be420ac3852b7..1b17a783d762f 100644 --- a/content/cn/docs/0.14.1/compaction/index.html +++ b/content/cn/docs/0.14.1/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/comparison/index.html b/content/cn/docs/0.14.1/comparison/index.html index ce3db0602d2aa..54ea3be362f53 100644 --- a/content/cn/docs/0.14.1/comparison/index.html +++ b/content/cn/docs/0.14.1/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/concepts/index.html b/content/cn/docs/0.14.1/concepts/index.html index 48805b5197988..265d3ed75c887 100644 --- a/content/cn/docs/0.14.1/concepts/index.html +++ b/content/cn/docs/0.14.1/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/concurrency_control/index.html b/content/cn/docs/0.14.1/concurrency_control/index.html index 47a3b5be8804f..1451bc531e62e 100644 --- a/content/cn/docs/0.14.1/concurrency_control/index.html +++ b/content/cn/docs/0.14.1/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/configurations/index.html b/content/cn/docs/0.14.1/configurations/index.html index 87a08a529515a..5fa841a52b034 100644 --- a/content/cn/docs/0.14.1/configurations/index.html +++ b/content/cn/docs/0.14.1/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/cos_hoodie/index.html b/content/cn/docs/0.14.1/cos_hoodie/index.html index 6666e6d5a08e8..ed1246b3f1cde 100644 --- a/content/cn/docs/0.14.1/cos_hoodie/index.html +++ b/content/cn/docs/0.14.1/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/deployment/index.html b/content/cn/docs/0.14.1/deployment/index.html index f83d83fc73124..ff5b710776490 100644 --- a/content/cn/docs/0.14.1/deployment/index.html +++ b/content/cn/docs/0.14.1/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/disaster_recovery/index.html b/content/cn/docs/0.14.1/disaster_recovery/index.html index 9df22a24b9205..8e2d612bd80a7 100644 --- a/content/cn/docs/0.14.1/disaster_recovery/index.html +++ b/content/cn/docs/0.14.1/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/docker_demo/index.html b/content/cn/docs/0.14.1/docker_demo/index.html index de0d95a73a287..58eecc12c9399 100644 --- a/content/cn/docs/0.14.1/docker_demo/index.html +++ b/content/cn/docs/0.14.1/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/encryption/index.html b/content/cn/docs/0.14.1/encryption/index.html index 4161aadb3dad2..59ec8c64e3811 100644 --- a/content/cn/docs/0.14.1/encryption/index.html +++ b/content/cn/docs/0.14.1/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/faq/index.html b/content/cn/docs/0.14.1/faq/index.html index 90f2a5ffe834d..f4ab969f6d9bb 100644 --- a/content/cn/docs/0.14.1/faq/index.html +++ b/content/cn/docs/0.14.1/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/faq_design_and_concepts/index.html b/content/cn/docs/0.14.1/faq_design_and_concepts/index.html index 26fd81c56c8b0..b9456f55a240b 100644 --- a/content/cn/docs/0.14.1/faq_design_and_concepts/index.html +++ b/content/cn/docs/0.14.1/faq_design_and_concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/faq_general/index.html b/content/cn/docs/0.14.1/faq_general/index.html index 6e0e69daf5ddd..8f46bd3798430 100644 --- a/content/cn/docs/0.14.1/faq_general/index.html +++ b/content/cn/docs/0.14.1/faq_general/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/faq_integrations/index.html b/content/cn/docs/0.14.1/faq_integrations/index.html index 3345a20f1dcc2..0801c33328c46 100644 --- a/content/cn/docs/0.14.1/faq_integrations/index.html +++ b/content/cn/docs/0.14.1/faq_integrations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/faq_querying_tables/index.html b/content/cn/docs/0.14.1/faq_querying_tables/index.html index 3910695d645f1..451ba0a1a13dd 100644 --- a/content/cn/docs/0.14.1/faq_querying_tables/index.html +++ b/content/cn/docs/0.14.1/faq_querying_tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/faq_storage/index.html b/content/cn/docs/0.14.1/faq_storage/index.html index dc0e8ca4f7638..4cf21e6a56a61 100644 --- a/content/cn/docs/0.14.1/faq_storage/index.html +++ b/content/cn/docs/0.14.1/faq_storage/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/faq_table_services/index.html b/content/cn/docs/0.14.1/faq_table_services/index.html index 6892d31898110..37ec6eef43e03 100644 --- a/content/cn/docs/0.14.1/faq_table_services/index.html +++ b/content/cn/docs/0.14.1/faq_table_services/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/faq_writing_tables/index.html b/content/cn/docs/0.14.1/faq_writing_tables/index.html index e778343b3ee1a..3ecd77b833777 100644 --- a/content/cn/docs/0.14.1/faq_writing_tables/index.html +++ b/content/cn/docs/0.14.1/faq_writing_tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/file_layouts/index.html b/content/cn/docs/0.14.1/file_layouts/index.html index 586414c75e954..35363becb342d 100644 --- a/content/cn/docs/0.14.1/file_layouts/index.html +++ b/content/cn/docs/0.14.1/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/file_sizing/index.html b/content/cn/docs/0.14.1/file_sizing/index.html index c92aba6b7e908..b58a525b3d7d0 100644 --- a/content/cn/docs/0.14.1/file_sizing/index.html +++ b/content/cn/docs/0.14.1/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/flink-quick-start-guide/index.html b/content/cn/docs/0.14.1/flink-quick-start-guide/index.html index 8d12f89b36e69..c50754fd9ea51 100644 --- a/content/cn/docs/0.14.1/flink-quick-start-guide/index.html +++ b/content/cn/docs/0.14.1/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/flink_tuning/index.html b/content/cn/docs/0.14.1/flink_tuning/index.html index 6d6137a8c301a..b451edb290c29 100644 --- a/content/cn/docs/0.14.1/flink_tuning/index.html +++ b/content/cn/docs/0.14.1/flink_tuning/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/gcp_bigquery/index.html b/content/cn/docs/0.14.1/gcp_bigquery/index.html index 1eb1258407313..50e5e8ea026a7 100644 --- a/content/cn/docs/0.14.1/gcp_bigquery/index.html +++ b/content/cn/docs/0.14.1/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/gcs_hoodie/index.html b/content/cn/docs/0.14.1/gcs_hoodie/index.html index 39dbc8761bbe5..69782f369ece1 100644 --- a/content/cn/docs/0.14.1/gcs_hoodie/index.html +++ b/content/cn/docs/0.14.1/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/hoodie_cleaner/index.html b/content/cn/docs/0.14.1/hoodie_cleaner/index.html index d09314e2df997..dc5c26f9455f3 100644 --- a/content/cn/docs/0.14.1/hoodie_cleaner/index.html +++ b/content/cn/docs/0.14.1/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/hoodie_streaming_ingestion/index.html b/content/cn/docs/0.14.1/hoodie_streaming_ingestion/index.html index 76252c09d00d2..41f958010d495 100644 --- a/content/cn/docs/0.14.1/hoodie_streaming_ingestion/index.html +++ b/content/cn/docs/0.14.1/hoodie_streaming_ingestion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/ibm_cos_hoodie/index.html b/content/cn/docs/0.14.1/ibm_cos_hoodie/index.html index 9184ee5a6a838..7edcc21cd8080 100644 --- a/content/cn/docs/0.14.1/ibm_cos_hoodie/index.html +++ b/content/cn/docs/0.14.1/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/indexing/index.html b/content/cn/docs/0.14.1/indexing/index.html index 90214bb5a8428..f41868b6aaad5 100644 --- a/content/cn/docs/0.14.1/indexing/index.html +++ b/content/cn/docs/0.14.1/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/jfs_hoodie/index.html b/content/cn/docs/0.14.1/jfs_hoodie/index.html index 8adda113f7f6a..22c3bfcf57e2a 100644 --- a/content/cn/docs/0.14.1/jfs_hoodie/index.html +++ b/content/cn/docs/0.14.1/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/key_generation/index.html b/content/cn/docs/0.14.1/key_generation/index.html index c5cf4444c9d10..d207fa3edd0a4 100644 --- a/content/cn/docs/0.14.1/key_generation/index.html +++ b/content/cn/docs/0.14.1/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/markers/index.html b/content/cn/docs/0.14.1/markers/index.html index e8d05a94df080..bba64878963cf 100644 --- a/content/cn/docs/0.14.1/markers/index.html +++ b/content/cn/docs/0.14.1/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/metadata/index.html b/content/cn/docs/0.14.1/metadata/index.html index 15c2281a5dc99..a84d292e5e0fd 100644 --- a/content/cn/docs/0.14.1/metadata/index.html +++ b/content/cn/docs/0.14.1/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/metadata_indexing/index.html b/content/cn/docs/0.14.1/metadata_indexing/index.html index ab93fa96c4b76..3c4c7a6cf4cee 100644 --- a/content/cn/docs/0.14.1/metadata_indexing/index.html +++ b/content/cn/docs/0.14.1/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/metrics/index.html b/content/cn/docs/0.14.1/metrics/index.html index 96f0bc37744a4..4b2ec98a7efa3 100644 --- a/content/cn/docs/0.14.1/metrics/index.html +++ b/content/cn/docs/0.14.1/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/migration_guide/index.html b/content/cn/docs/0.14.1/migration_guide/index.html index 64389ff5c5fc1..45a71052818e1 100644 --- a/content/cn/docs/0.14.1/migration_guide/index.html +++ b/content/cn/docs/0.14.1/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/oci_hoodie/index.html b/content/cn/docs/0.14.1/oci_hoodie/index.html index ff25c472e8ec0..684ef24174f9d 100644 --- a/content/cn/docs/0.14.1/oci_hoodie/index.html +++ b/content/cn/docs/0.14.1/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/oss_hoodie/index.html b/content/cn/docs/0.14.1/oss_hoodie/index.html index 042c8dffc8fc9..edc619c617e21 100644 --- a/content/cn/docs/0.14.1/oss_hoodie/index.html +++ b/content/cn/docs/0.14.1/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/overview/index.html b/content/cn/docs/0.14.1/overview/index.html index 9f896d6c0c6ae..2a890d950a0ed 100644 --- a/content/cn/docs/0.14.1/overview/index.html +++ b/content/cn/docs/0.14.1/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/performance/index.html b/content/cn/docs/0.14.1/performance/index.html index 5ebd07ca115b6..868e03829abf9 100644 --- a/content/cn/docs/0.14.1/performance/index.html +++ b/content/cn/docs/0.14.1/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/precommit_validator/index.html b/content/cn/docs/0.14.1/precommit_validator/index.html index d5a50effdfb72..43397c8c036a5 100644 --- a/content/cn/docs/0.14.1/precommit_validator/index.html +++ b/content/cn/docs/0.14.1/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/privacy/index.html b/content/cn/docs/0.14.1/privacy/index.html index 8c30b3798aefc..aa456742b80d3 100644 --- a/content/cn/docs/0.14.1/privacy/index.html +++ b/content/cn/docs/0.14.1/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/procedures/index.html b/content/cn/docs/0.14.1/procedures/index.html index 6c9f9beea6ea7..426f6ee712d1a 100644 --- a/content/cn/docs/0.14.1/procedures/index.html +++ b/content/cn/docs/0.14.1/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/querying_data/index.html b/content/cn/docs/0.14.1/querying_data/index.html index 4cc3f1b41928b..e2d561c27e50f 100644 --- a/content/cn/docs/0.14.1/querying_data/index.html +++ b/content/cn/docs/0.14.1/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/quick-start-guide/index.html b/content/cn/docs/0.14.1/quick-start-guide/index.html index 817813d558732..1ffbec6174941 100644 --- a/content/cn/docs/0.14.1/quick-start-guide/index.html +++ b/content/cn/docs/0.14.1/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/record_payload/index.html b/content/cn/docs/0.14.1/record_payload/index.html index 555117ec8afe2..459f1fa714ffa 100644 --- a/content/cn/docs/0.14.1/record_payload/index.html +++ b/content/cn/docs/0.14.1/record_payload/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/rollbacks/index.html b/content/cn/docs/0.14.1/rollbacks/index.html index 565d8742614eb..fb0c4973525bd 100644 --- a/content/cn/docs/0.14.1/rollbacks/index.html +++ b/content/cn/docs/0.14.1/rollbacks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/s3_hoodie/index.html b/content/cn/docs/0.14.1/s3_hoodie/index.html index 2c36365fa506e..fb047597fac88 100644 --- a/content/cn/docs/0.14.1/s3_hoodie/index.html +++ b/content/cn/docs/0.14.1/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/schema_evolution/index.html b/content/cn/docs/0.14.1/schema_evolution/index.html index aa1e7a805252f..a6b90cee0de89 100644 --- a/content/cn/docs/0.14.1/schema_evolution/index.html +++ b/content/cn/docs/0.14.1/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/snapshot_exporter/index.html b/content/cn/docs/0.14.1/snapshot_exporter/index.html index d1f0c155a8912..9687f724e4121 100644 --- a/content/cn/docs/0.14.1/snapshot_exporter/index.html +++ b/content/cn/docs/0.14.1/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/sql_ddl/index.html b/content/cn/docs/0.14.1/sql_ddl/index.html index 99c3db95c793d..cbb6ece94fe3e 100644 --- a/content/cn/docs/0.14.1/sql_ddl/index.html +++ b/content/cn/docs/0.14.1/sql_ddl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/sql_dml/index.html b/content/cn/docs/0.14.1/sql_dml/index.html index a8ef65f349986..339ca0b304bb1 100644 --- a/content/cn/docs/0.14.1/sql_dml/index.html +++ b/content/cn/docs/0.14.1/sql_dml/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/sql_queries/index.html b/content/cn/docs/0.14.1/sql_queries/index.html index 4b1cf08af847b..f09b141832d96 100644 --- a/content/cn/docs/0.14.1/sql_queries/index.html +++ b/content/cn/docs/0.14.1/sql_queries/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/structure/index.html b/content/cn/docs/0.14.1/structure/index.html index e38c074c19075..0d4e364d055f7 100644 --- a/content/cn/docs/0.14.1/structure/index.html +++ b/content/cn/docs/0.14.1/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/syncing_aws_glue_data_catalog/index.html b/content/cn/docs/0.14.1/syncing_aws_glue_data_catalog/index.html index c1ef580d788bc..7c6b4fbd27048 100644 --- a/content/cn/docs/0.14.1/syncing_aws_glue_data_catalog/index.html +++ b/content/cn/docs/0.14.1/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/syncing_datahub/index.html b/content/cn/docs/0.14.1/syncing_datahub/index.html index 24308fdd509db..92c8c7c461369 100644 --- a/content/cn/docs/0.14.1/syncing_datahub/index.html +++ b/content/cn/docs/0.14.1/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/syncing_metastore/index.html b/content/cn/docs/0.14.1/syncing_metastore/index.html index 300849f636c70..9dd36ec3e4d77 100644 --- a/content/cn/docs/0.14.1/syncing_metastore/index.html +++ b/content/cn/docs/0.14.1/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/syncing_xtable/index.html b/content/cn/docs/0.14.1/syncing_xtable/index.html index 766ba05663e9a..94cc22101b23d 100644 --- a/content/cn/docs/0.14.1/syncing_xtable/index.html +++ b/content/cn/docs/0.14.1/syncing_xtable/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/table_types/index.html b/content/cn/docs/0.14.1/table_types/index.html index 7159bb67c5f3d..5526afed475d0 100644 --- a/content/cn/docs/0.14.1/table_types/index.html +++ b/content/cn/docs/0.14.1/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/timeline/index.html b/content/cn/docs/0.14.1/timeline/index.html index ab87bddab6173..b3be373c029f3 100644 --- a/content/cn/docs/0.14.1/timeline/index.html +++ b/content/cn/docs/0.14.1/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/transforms/index.html b/content/cn/docs/0.14.1/transforms/index.html index cd7661b47c764..8cea1acf48f57 100644 --- a/content/cn/docs/0.14.1/transforms/index.html +++ b/content/cn/docs/0.14.1/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/troubleshooting/index.html b/content/cn/docs/0.14.1/troubleshooting/index.html index e3456ca1df2e7..b876f92f2a969 100644 --- a/content/cn/docs/0.14.1/troubleshooting/index.html +++ b/content/cn/docs/0.14.1/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/tuning-guide/index.html b/content/cn/docs/0.14.1/tuning-guide/index.html index a6ba9f9381041..1bd5983aaa0f6 100644 --- a/content/cn/docs/0.14.1/tuning-guide/index.html +++ b/content/cn/docs/0.14.1/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/use_cases/index.html b/content/cn/docs/0.14.1/use_cases/index.html index eb6865bb49cd7..61f7407d6fe72 100644 --- a/content/cn/docs/0.14.1/use_cases/index.html +++ b/content/cn/docs/0.14.1/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/write_operations/index.html b/content/cn/docs/0.14.1/write_operations/index.html index 247656493d586..2981b1e8a3807 100644 --- a/content/cn/docs/0.14.1/write_operations/index.html +++ b/content/cn/docs/0.14.1/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.14.1/writing_data/index.html b/content/cn/docs/0.14.1/writing_data/index.html index 2a9e35012f460..9a180c03f4808 100644 --- a/content/cn/docs/0.14.1/writing_data/index.html +++ b/content/cn/docs/0.14.1/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/azure_hoodie/index.html b/content/cn/docs/0.15.0/azure_hoodie/index.html index de3a2ed1c55db..2a8d8fd2ae70a 100644 --- a/content/cn/docs/0.15.0/azure_hoodie/index.html +++ b/content/cn/docs/0.15.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/basic_configurations/index.html b/content/cn/docs/0.15.0/basic_configurations/index.html index 9761d5eb9926c..070a79e90ff47 100644 --- a/content/cn/docs/0.15.0/basic_configurations/index.html +++ b/content/cn/docs/0.15.0/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/bos_hoodie/index.html b/content/cn/docs/0.15.0/bos_hoodie/index.html index ef9e9015ad3cc..f770d8dc31e84 100644 --- a/content/cn/docs/0.15.0/bos_hoodie/index.html +++ b/content/cn/docs/0.15.0/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/cli/index.html b/content/cn/docs/0.15.0/cli/index.html index 7f53a059ad2f7..a44c04f362c12 100644 --- a/content/cn/docs/0.15.0/cli/index.html +++ b/content/cn/docs/0.15.0/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/cloud/index.html b/content/cn/docs/0.15.0/cloud/index.html index 60d9d0d84bbcf..73c1aaaffe67f 100644 --- a/content/cn/docs/0.15.0/cloud/index.html +++ b/content/cn/docs/0.15.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/clustering/index.html b/content/cn/docs/0.15.0/clustering/index.html index 477d10843d85e..85c03ebecaa24 100644 --- a/content/cn/docs/0.15.0/clustering/index.html +++ b/content/cn/docs/0.15.0/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/compaction/index.html b/content/cn/docs/0.15.0/compaction/index.html index 42a369c17b8ea..ab7c7d88241c5 100644 --- a/content/cn/docs/0.15.0/compaction/index.html +++ b/content/cn/docs/0.15.0/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/comparison/index.html b/content/cn/docs/0.15.0/comparison/index.html index fdcf3a683a19c..6fa6d988451d4 100644 --- a/content/cn/docs/0.15.0/comparison/index.html +++ b/content/cn/docs/0.15.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/concepts/index.html b/content/cn/docs/0.15.0/concepts/index.html index c465c520095ef..075883c08896f 100644 --- a/content/cn/docs/0.15.0/concepts/index.html +++ b/content/cn/docs/0.15.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/concurrency_control/index.html b/content/cn/docs/0.15.0/concurrency_control/index.html index 8dc6f12c53446..dcff6be85d546 100644 --- a/content/cn/docs/0.15.0/concurrency_control/index.html +++ b/content/cn/docs/0.15.0/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/configurations/index.html b/content/cn/docs/0.15.0/configurations/index.html index db4ef5662e680..2583f87e36e46 100644 --- a/content/cn/docs/0.15.0/configurations/index.html +++ b/content/cn/docs/0.15.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/cos_hoodie/index.html b/content/cn/docs/0.15.0/cos_hoodie/index.html index 13567d80b1845..ed6943fe3d4c3 100644 --- a/content/cn/docs/0.15.0/cos_hoodie/index.html +++ b/content/cn/docs/0.15.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/deployment/index.html b/content/cn/docs/0.15.0/deployment/index.html index 5fb5f94836962..581fe85cb0d00 100644 --- a/content/cn/docs/0.15.0/deployment/index.html +++ b/content/cn/docs/0.15.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/disaster_recovery/index.html b/content/cn/docs/0.15.0/disaster_recovery/index.html index 587353acd215f..b02e9b12ce2cb 100644 --- a/content/cn/docs/0.15.0/disaster_recovery/index.html +++ b/content/cn/docs/0.15.0/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/docker_demo/index.html b/content/cn/docs/0.15.0/docker_demo/index.html index 2be7e7df65ae6..ac1ad095ac42c 100644 --- a/content/cn/docs/0.15.0/docker_demo/index.html +++ b/content/cn/docs/0.15.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/encryption/index.html b/content/cn/docs/0.15.0/encryption/index.html index ac29f939a4455..a648942e9a823 100644 --- a/content/cn/docs/0.15.0/encryption/index.html +++ b/content/cn/docs/0.15.0/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/faq/index.html b/content/cn/docs/0.15.0/faq/index.html index a1a75d3a5bbea..cf56a0f1ada45 100644 --- a/content/cn/docs/0.15.0/faq/index.html +++ b/content/cn/docs/0.15.0/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/faq_design_and_concepts/index.html b/content/cn/docs/0.15.0/faq_design_and_concepts/index.html index 6f7475034598d..3f0ec8fdd58c9 100644 --- a/content/cn/docs/0.15.0/faq_design_and_concepts/index.html +++ b/content/cn/docs/0.15.0/faq_design_and_concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/faq_general/index.html b/content/cn/docs/0.15.0/faq_general/index.html index 189040f5e4d50..0cef5031b6ff0 100644 --- a/content/cn/docs/0.15.0/faq_general/index.html +++ b/content/cn/docs/0.15.0/faq_general/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/faq_integrations/index.html b/content/cn/docs/0.15.0/faq_integrations/index.html index 6d207d0aeea02..cea3a2bee46fe 100644 --- a/content/cn/docs/0.15.0/faq_integrations/index.html +++ b/content/cn/docs/0.15.0/faq_integrations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/faq_reading_tables/index.html b/content/cn/docs/0.15.0/faq_reading_tables/index.html index 877133c1a1e93..2f63bd523353b 100644 --- a/content/cn/docs/0.15.0/faq_reading_tables/index.html +++ b/content/cn/docs/0.15.0/faq_reading_tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/faq_storage/index.html b/content/cn/docs/0.15.0/faq_storage/index.html index 2a8797cb2c7da..df7cf626d5c36 100644 --- a/content/cn/docs/0.15.0/faq_storage/index.html +++ b/content/cn/docs/0.15.0/faq_storage/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/faq_table_services/index.html b/content/cn/docs/0.15.0/faq_table_services/index.html index bc0965e142977..fd743718673f5 100644 --- a/content/cn/docs/0.15.0/faq_table_services/index.html +++ b/content/cn/docs/0.15.0/faq_table_services/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/faq_writing_tables/index.html b/content/cn/docs/0.15.0/faq_writing_tables/index.html index d70be85a80026..450518a9119d6 100644 --- a/content/cn/docs/0.15.0/faq_writing_tables/index.html +++ b/content/cn/docs/0.15.0/faq_writing_tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/file_layouts/index.html b/content/cn/docs/0.15.0/file_layouts/index.html index 56afd939224e4..adc286b87c992 100644 --- a/content/cn/docs/0.15.0/file_layouts/index.html +++ b/content/cn/docs/0.15.0/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/file_sizing/index.html b/content/cn/docs/0.15.0/file_sizing/index.html index 3a31ab4019dc2..f8d2c30be8902 100644 --- a/content/cn/docs/0.15.0/file_sizing/index.html +++ b/content/cn/docs/0.15.0/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/flink-quick-start-guide/index.html b/content/cn/docs/0.15.0/flink-quick-start-guide/index.html index 91ece4e0e3fa5..7066fa32abcd2 100644 --- a/content/cn/docs/0.15.0/flink-quick-start-guide/index.html +++ b/content/cn/docs/0.15.0/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/flink_tuning/index.html b/content/cn/docs/0.15.0/flink_tuning/index.html index 8df3ea78f7cc1..4af0279ab3148 100644 --- a/content/cn/docs/0.15.0/flink_tuning/index.html +++ b/content/cn/docs/0.15.0/flink_tuning/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/gcp_bigquery/index.html b/content/cn/docs/0.15.0/gcp_bigquery/index.html index 96cc0c1afe112..860ac0acb9cfa 100644 --- a/content/cn/docs/0.15.0/gcp_bigquery/index.html +++ b/content/cn/docs/0.15.0/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/gcs_hoodie/index.html b/content/cn/docs/0.15.0/gcs_hoodie/index.html index 84ca1c4937338..45aec10aa9548 100644 --- a/content/cn/docs/0.15.0/gcs_hoodie/index.html +++ b/content/cn/docs/0.15.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/hoodie_cleaner/index.html b/content/cn/docs/0.15.0/hoodie_cleaner/index.html index 473ff6cfbe055..143d8069b2e25 100644 --- a/content/cn/docs/0.15.0/hoodie_cleaner/index.html +++ b/content/cn/docs/0.15.0/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/hoodie_streaming_ingestion/index.html b/content/cn/docs/0.15.0/hoodie_streaming_ingestion/index.html index fc7c1663262f9..d1b98da04f5af 100644 --- a/content/cn/docs/0.15.0/hoodie_streaming_ingestion/index.html +++ b/content/cn/docs/0.15.0/hoodie_streaming_ingestion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/hudi_stack/index.html b/content/cn/docs/0.15.0/hudi_stack/index.html index cf8169821afd7..f06df16726230 100644 --- a/content/cn/docs/0.15.0/hudi_stack/index.html +++ b/content/cn/docs/0.15.0/hudi_stack/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/ibm_cos_hoodie/index.html b/content/cn/docs/0.15.0/ibm_cos_hoodie/index.html index ca48bcf192562..1c232504ab87d 100644 --- a/content/cn/docs/0.15.0/ibm_cos_hoodie/index.html +++ b/content/cn/docs/0.15.0/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/indexing/index.html b/content/cn/docs/0.15.0/indexing/index.html index 698ac4130cc34..50d1ba2e7c262 100644 --- a/content/cn/docs/0.15.0/indexing/index.html +++ b/content/cn/docs/0.15.0/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/ingestion_flink/index.html b/content/cn/docs/0.15.0/ingestion_flink/index.html index 3e8b6f51f07a0..1187b91d02ae3 100644 --- a/content/cn/docs/0.15.0/ingestion_flink/index.html +++ b/content/cn/docs/0.15.0/ingestion_flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/ingestion_kafka_connect/index.html b/content/cn/docs/0.15.0/ingestion_kafka_connect/index.html index 19e6d11024465..e6d4f35fd6892 100644 --- a/content/cn/docs/0.15.0/ingestion_kafka_connect/index.html +++ b/content/cn/docs/0.15.0/ingestion_kafka_connect/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/jfs_hoodie/index.html b/content/cn/docs/0.15.0/jfs_hoodie/index.html index 5cf0e803b10a2..6afe3fa137268 100644 --- a/content/cn/docs/0.15.0/jfs_hoodie/index.html +++ b/content/cn/docs/0.15.0/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/key_generation/index.html b/content/cn/docs/0.15.0/key_generation/index.html index ac884c516e711..b13a6b700c41b 100644 --- a/content/cn/docs/0.15.0/key_generation/index.html +++ b/content/cn/docs/0.15.0/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/markers/index.html b/content/cn/docs/0.15.0/markers/index.html index ad4c2defc8589..dc282594772e8 100644 --- a/content/cn/docs/0.15.0/markers/index.html +++ b/content/cn/docs/0.15.0/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/metadata/index.html b/content/cn/docs/0.15.0/metadata/index.html index 75803454581b5..5de880a5b3310 100644 --- a/content/cn/docs/0.15.0/metadata/index.html +++ b/content/cn/docs/0.15.0/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/metadata_indexing/index.html b/content/cn/docs/0.15.0/metadata_indexing/index.html index 8401be77b2fe3..7edbf4e3c176e 100644 --- a/content/cn/docs/0.15.0/metadata_indexing/index.html +++ b/content/cn/docs/0.15.0/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/metrics/index.html b/content/cn/docs/0.15.0/metrics/index.html index 5524f5bc9639f..0d99bf23ac464 100644 --- a/content/cn/docs/0.15.0/metrics/index.html +++ b/content/cn/docs/0.15.0/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/migration_guide/index.html b/content/cn/docs/0.15.0/migration_guide/index.html index f79a66c9907d1..8be1cb329d79f 100644 --- a/content/cn/docs/0.15.0/migration_guide/index.html +++ b/content/cn/docs/0.15.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/oci_hoodie/index.html b/content/cn/docs/0.15.0/oci_hoodie/index.html index a77dd394e7bb0..e8d4afc5947b7 100644 --- a/content/cn/docs/0.15.0/oci_hoodie/index.html +++ b/content/cn/docs/0.15.0/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/oss_hoodie/index.html b/content/cn/docs/0.15.0/oss_hoodie/index.html index c0526611031ae..5d72d5082823d 100644 --- a/content/cn/docs/0.15.0/oss_hoodie/index.html +++ b/content/cn/docs/0.15.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/overview/index.html b/content/cn/docs/0.15.0/overview/index.html index c4ce6ea872fc4..528493789f08b 100644 --- a/content/cn/docs/0.15.0/overview/index.html +++ b/content/cn/docs/0.15.0/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/performance/index.html b/content/cn/docs/0.15.0/performance/index.html index f33d33c629824..43a465ef234fd 100644 --- a/content/cn/docs/0.15.0/performance/index.html +++ b/content/cn/docs/0.15.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/platform_services_post_commit_callback/index.html b/content/cn/docs/0.15.0/platform_services_post_commit_callback/index.html index 52189709a8d3c..40d49616bbcb2 100644 --- a/content/cn/docs/0.15.0/platform_services_post_commit_callback/index.html +++ b/content/cn/docs/0.15.0/platform_services_post_commit_callback/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/precommit_validator/index.html b/content/cn/docs/0.15.0/precommit_validator/index.html index 953b49bd11312..284212f8744a8 100644 --- a/content/cn/docs/0.15.0/precommit_validator/index.html +++ b/content/cn/docs/0.15.0/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/privacy/index.html b/content/cn/docs/0.15.0/privacy/index.html index c06275e5bfd2a..394025cde213b 100644 --- a/content/cn/docs/0.15.0/privacy/index.html +++ b/content/cn/docs/0.15.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/procedures/index.html b/content/cn/docs/0.15.0/procedures/index.html index f92b33c4694e5..4ffaa24f7d540 100644 --- a/content/cn/docs/0.15.0/procedures/index.html +++ b/content/cn/docs/0.15.0/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/python-rust-quick-start-guide/index.html b/content/cn/docs/0.15.0/python-rust-quick-start-guide/index.html index 945d0a6984750..a3959f105fb70 100644 --- a/content/cn/docs/0.15.0/python-rust-quick-start-guide/index.html +++ b/content/cn/docs/0.15.0/python-rust-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/querying_data/index.html b/content/cn/docs/0.15.0/querying_data/index.html index dd7c861b8735a..53dd9435dc3d3 100644 --- a/content/cn/docs/0.15.0/querying_data/index.html +++ b/content/cn/docs/0.15.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/quick-start-guide/index.html b/content/cn/docs/0.15.0/quick-start-guide/index.html index b68bc13c9c9c4..d3011b0e6da0a 100644 --- a/content/cn/docs/0.15.0/quick-start-guide/index.html +++ b/content/cn/docs/0.15.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/reading_tables_batch_reads/index.html b/content/cn/docs/0.15.0/reading_tables_batch_reads/index.html index 2efbd5fac3806..c6cc22a38233e 100644 --- a/content/cn/docs/0.15.0/reading_tables_batch_reads/index.html +++ b/content/cn/docs/0.15.0/reading_tables_batch_reads/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/reading_tables_streaming_reads/index.html b/content/cn/docs/0.15.0/reading_tables_streaming_reads/index.html index 893d797f90520..ad152de673c3c 100644 --- a/content/cn/docs/0.15.0/reading_tables_streaming_reads/index.html +++ b/content/cn/docs/0.15.0/reading_tables_streaming_reads/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/record_payload/index.html b/content/cn/docs/0.15.0/record_payload/index.html index 0e61375ecbf77..163e9ffe0809e 100644 --- a/content/cn/docs/0.15.0/record_payload/index.html +++ b/content/cn/docs/0.15.0/record_payload/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/rollbacks/index.html b/content/cn/docs/0.15.0/rollbacks/index.html index 2ab136942315d..ab48279fd7e18 100644 --- a/content/cn/docs/0.15.0/rollbacks/index.html +++ b/content/cn/docs/0.15.0/rollbacks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/s3_hoodie/index.html b/content/cn/docs/0.15.0/s3_hoodie/index.html index 9881286f9c170..1e6b32db2ede3 100644 --- a/content/cn/docs/0.15.0/s3_hoodie/index.html +++ b/content/cn/docs/0.15.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/schema_evolution/index.html b/content/cn/docs/0.15.0/schema_evolution/index.html index 0d5394e4a2bfe..d4307e8ef93d7 100644 --- a/content/cn/docs/0.15.0/schema_evolution/index.html +++ b/content/cn/docs/0.15.0/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/snapshot_exporter/index.html b/content/cn/docs/0.15.0/snapshot_exporter/index.html index 20cde24231cf1..f5e7ac8609ec4 100644 --- a/content/cn/docs/0.15.0/snapshot_exporter/index.html +++ b/content/cn/docs/0.15.0/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/sql_ddl/index.html b/content/cn/docs/0.15.0/sql_ddl/index.html index 9c549e90ba26b..7bffca16bb033 100644 --- a/content/cn/docs/0.15.0/sql_ddl/index.html +++ b/content/cn/docs/0.15.0/sql_ddl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/sql_dml/index.html b/content/cn/docs/0.15.0/sql_dml/index.html index 4f7c30cd9448c..d368453b7a5d1 100644 --- a/content/cn/docs/0.15.0/sql_dml/index.html +++ b/content/cn/docs/0.15.0/sql_dml/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/sql_queries/index.html b/content/cn/docs/0.15.0/sql_queries/index.html index 9cf501772b178..310dc3a9c9aa5 100644 --- a/content/cn/docs/0.15.0/sql_queries/index.html +++ b/content/cn/docs/0.15.0/sql_queries/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/structure/index.html b/content/cn/docs/0.15.0/structure/index.html index 98e809d3c7a26..ed0f080250b9a 100644 --- a/content/cn/docs/0.15.0/structure/index.html +++ b/content/cn/docs/0.15.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/syncing_aws_glue_data_catalog/index.html b/content/cn/docs/0.15.0/syncing_aws_glue_data_catalog/index.html index 0173334166f9d..f9bb189cbca9a 100644 --- a/content/cn/docs/0.15.0/syncing_aws_glue_data_catalog/index.html +++ b/content/cn/docs/0.15.0/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/syncing_datahub/index.html b/content/cn/docs/0.15.0/syncing_datahub/index.html index 1a2720512085f..b4925fbb365df 100644 --- a/content/cn/docs/0.15.0/syncing_datahub/index.html +++ b/content/cn/docs/0.15.0/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/syncing_metastore/index.html b/content/cn/docs/0.15.0/syncing_metastore/index.html index 7eed56bcf0281..c41ca8f61f5fc 100644 --- a/content/cn/docs/0.15.0/syncing_metastore/index.html +++ b/content/cn/docs/0.15.0/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/syncing_xtable/index.html b/content/cn/docs/0.15.0/syncing_xtable/index.html index d5d3b3f320a11..14401dbdbdd31 100644 --- a/content/cn/docs/0.15.0/syncing_xtable/index.html +++ b/content/cn/docs/0.15.0/syncing_xtable/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/table_types/index.html b/content/cn/docs/0.15.0/table_types/index.html index 128030e40b38b..83286b104a05a 100644 --- a/content/cn/docs/0.15.0/table_types/index.html +++ b/content/cn/docs/0.15.0/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/timeline/index.html b/content/cn/docs/0.15.0/timeline/index.html index b0f02b3d5bac2..9c7fa8d390c93 100644 --- a/content/cn/docs/0.15.0/timeline/index.html +++ b/content/cn/docs/0.15.0/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/troubleshooting/index.html b/content/cn/docs/0.15.0/troubleshooting/index.html index 32abd7c37cad4..bdc619aa79034 100644 --- a/content/cn/docs/0.15.0/troubleshooting/index.html +++ b/content/cn/docs/0.15.0/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/tuning-guide/index.html b/content/cn/docs/0.15.0/tuning-guide/index.html index 724ff149f2f29..c512683f29e27 100644 --- a/content/cn/docs/0.15.0/tuning-guide/index.html +++ b/content/cn/docs/0.15.0/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/use_cases/index.html b/content/cn/docs/0.15.0/use_cases/index.html index a504fa4ad0d68..82f3c5e6316ef 100644 --- a/content/cn/docs/0.15.0/use_cases/index.html +++ b/content/cn/docs/0.15.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/write_operations/index.html b/content/cn/docs/0.15.0/write_operations/index.html index cb84ccac2e4cd..239ba55da742a 100644 --- a/content/cn/docs/0.15.0/write_operations/index.html +++ b/content/cn/docs/0.15.0/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/writing_data/index.html b/content/cn/docs/0.15.0/writing_data/index.html index 78c12a828bd66..86986b4ca5705 100644 --- a/content/cn/docs/0.15.0/writing_data/index.html +++ b/content/cn/docs/0.15.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.15.0/writing_tables_streaming_writes/index.html b/content/cn/docs/0.15.0/writing_tables_streaming_writes/index.html index 0c3e680c8a178..363272c93474f 100644 --- a/content/cn/docs/0.15.0/writing_tables_streaming_writes/index.html +++ b/content/cn/docs/0.15.0/writing_tables_streaming_writes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.0/admin_guide/index.html b/content/cn/docs/0.5.0/admin_guide/index.html index 64a02e71d1b10..02dd5e6516111 100644 --- a/content/cn/docs/0.5.0/admin_guide/index.html +++ b/content/cn/docs/0.5.0/admin_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.0/comparison/index.html b/content/cn/docs/0.5.0/comparison/index.html index cc59c0fb59356..eedebddb1973d 100644 --- a/content/cn/docs/0.5.0/comparison/index.html +++ b/content/cn/docs/0.5.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.0/concepts/index.html b/content/cn/docs/0.5.0/concepts/index.html index f40f7ea521fc3..4063650da6fe9 100644 --- a/content/cn/docs/0.5.0/concepts/index.html +++ b/content/cn/docs/0.5.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.0/configurations/index.html b/content/cn/docs/0.5.0/configurations/index.html index 9b4875a5d0747..a445ca80b66e7 100644 --- a/content/cn/docs/0.5.0/configurations/index.html +++ b/content/cn/docs/0.5.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.0/docker_demo/index.html b/content/cn/docs/0.5.0/docker_demo/index.html index 77a06b4c16d5a..86f0fa483cb06 100644 --- a/content/cn/docs/0.5.0/docker_demo/index.html +++ b/content/cn/docs/0.5.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.0/gcs_hoodie/index.html b/content/cn/docs/0.5.0/gcs_hoodie/index.html index 7f6e125be995d..b5462749142b7 100644 --- a/content/cn/docs/0.5.0/gcs_hoodie/index.html +++ b/content/cn/docs/0.5.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.0/migration_guide/index.html b/content/cn/docs/0.5.0/migration_guide/index.html index 104ae4d6248a4..4362f48f9808d 100644 --- a/content/cn/docs/0.5.0/migration_guide/index.html +++ b/content/cn/docs/0.5.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.0/performance/index.html b/content/cn/docs/0.5.0/performance/index.html index f0d5739138bda..12a8eb64bb78b 100644 --- a/content/cn/docs/0.5.0/performance/index.html +++ b/content/cn/docs/0.5.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.0/powered_by/index.html b/content/cn/docs/0.5.0/powered_by/index.html index 4142b6cfda48b..323e8fa7f198e 100644 --- a/content/cn/docs/0.5.0/powered_by/index.html +++ b/content/cn/docs/0.5.0/powered_by/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.0/privacy/index.html b/content/cn/docs/0.5.0/privacy/index.html index e36aa4f791517..c57b5a53ca172 100644 --- a/content/cn/docs/0.5.0/privacy/index.html +++ b/content/cn/docs/0.5.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.0/querying_data/index.html b/content/cn/docs/0.5.0/querying_data/index.html index 953de3cb05501..c1eead24384b2 100644 --- a/content/cn/docs/0.5.0/querying_data/index.html +++ b/content/cn/docs/0.5.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.0/quick-start-guide/index.html b/content/cn/docs/0.5.0/quick-start-guide/index.html index 6cc25704eee99..18589d8584973 100644 --- a/content/cn/docs/0.5.0/quick-start-guide/index.html +++ b/content/cn/docs/0.5.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.0/s3_hoodie/index.html b/content/cn/docs/0.5.0/s3_hoodie/index.html index a057788b4baa9..e6dbd7febdc98 100644 --- a/content/cn/docs/0.5.0/s3_hoodie/index.html +++ b/content/cn/docs/0.5.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.0/structure/index.html b/content/cn/docs/0.5.0/structure/index.html index 470d595492bf5..b93e65ce4d65e 100644 --- a/content/cn/docs/0.5.0/structure/index.html +++ b/content/cn/docs/0.5.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.0/use_cases/index.html b/content/cn/docs/0.5.0/use_cases/index.html index 70e40acc88bb4..15a38ed9c2618 100644 --- a/content/cn/docs/0.5.0/use_cases/index.html +++ b/content/cn/docs/0.5.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.0/writing_data/index.html b/content/cn/docs/0.5.0/writing_data/index.html index 03dbef054ce3e..15529b4ce901b 100644 --- a/content/cn/docs/0.5.0/writing_data/index.html +++ b/content/cn/docs/0.5.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.1/comparison/index.html b/content/cn/docs/0.5.1/comparison/index.html index 80b4ace294beb..bfe37aabbe276 100644 --- a/content/cn/docs/0.5.1/comparison/index.html +++ b/content/cn/docs/0.5.1/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.1/concepts/index.html b/content/cn/docs/0.5.1/concepts/index.html index 4f45f25d326ff..348007a7ab1ad 100644 --- a/content/cn/docs/0.5.1/concepts/index.html +++ b/content/cn/docs/0.5.1/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.1/configurations/index.html b/content/cn/docs/0.5.1/configurations/index.html index 7940d9fae7cb8..f027d62dc154c 100644 --- a/content/cn/docs/0.5.1/configurations/index.html +++ b/content/cn/docs/0.5.1/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.1/deployment/index.html b/content/cn/docs/0.5.1/deployment/index.html index 8c6b588de68a1..bfe1143003031 100644 --- a/content/cn/docs/0.5.1/deployment/index.html +++ b/content/cn/docs/0.5.1/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.1/docker_demo/index.html b/content/cn/docs/0.5.1/docker_demo/index.html index e574a8228cbe7..e6907f65c2663 100644 --- a/content/cn/docs/0.5.1/docker_demo/index.html +++ b/content/cn/docs/0.5.1/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.1/gcs_hoodie/index.html b/content/cn/docs/0.5.1/gcs_hoodie/index.html index ab5d64da6df89..a7e2531b8f9b8 100644 --- a/content/cn/docs/0.5.1/gcs_hoodie/index.html +++ b/content/cn/docs/0.5.1/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.1/migration_guide/index.html b/content/cn/docs/0.5.1/migration_guide/index.html index 85be13b28639f..5fa80813ee9eb 100644 --- a/content/cn/docs/0.5.1/migration_guide/index.html +++ b/content/cn/docs/0.5.1/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.1/performance/index.html b/content/cn/docs/0.5.1/performance/index.html index d734525f2a3c4..646a657c27f55 100644 --- a/content/cn/docs/0.5.1/performance/index.html +++ b/content/cn/docs/0.5.1/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.1/powered_by/index.html b/content/cn/docs/0.5.1/powered_by/index.html index f5d6f697ac155..ab94192b392fb 100644 --- a/content/cn/docs/0.5.1/powered_by/index.html +++ b/content/cn/docs/0.5.1/powered_by/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.1/privacy/index.html b/content/cn/docs/0.5.1/privacy/index.html index 6c0352cc76dbe..be1349648b95b 100644 --- a/content/cn/docs/0.5.1/privacy/index.html +++ b/content/cn/docs/0.5.1/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.1/querying_data/index.html b/content/cn/docs/0.5.1/querying_data/index.html index 92ded08513e46..8d53c0ff1ffda 100644 --- a/content/cn/docs/0.5.1/querying_data/index.html +++ b/content/cn/docs/0.5.1/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.1/quick-start-guide/index.html b/content/cn/docs/0.5.1/quick-start-guide/index.html index 3c032c907f00e..915a894f596f7 100644 --- a/content/cn/docs/0.5.1/quick-start-guide/index.html +++ b/content/cn/docs/0.5.1/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.1/s3_hoodie/index.html b/content/cn/docs/0.5.1/s3_hoodie/index.html index 88de1abb7e57b..a907a9ed53bc4 100644 --- a/content/cn/docs/0.5.1/s3_hoodie/index.html +++ b/content/cn/docs/0.5.1/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.1/structure/index.html b/content/cn/docs/0.5.1/structure/index.html index ecbb3134d6883..71dd7ca22084b 100644 --- a/content/cn/docs/0.5.1/structure/index.html +++ b/content/cn/docs/0.5.1/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.1/use_cases/index.html b/content/cn/docs/0.5.1/use_cases/index.html index fbb70c0f9f99c..4eb10bce92a8d 100644 --- a/content/cn/docs/0.5.1/use_cases/index.html +++ b/content/cn/docs/0.5.1/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.1/writing_data/index.html b/content/cn/docs/0.5.1/writing_data/index.html index 76746b3744143..8d60aaeae8111 100644 --- a/content/cn/docs/0.5.1/writing_data/index.html +++ b/content/cn/docs/0.5.1/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.2/comparison/index.html b/content/cn/docs/0.5.2/comparison/index.html index 5a528d0bebf73..f0a5959c818a9 100644 --- a/content/cn/docs/0.5.2/comparison/index.html +++ b/content/cn/docs/0.5.2/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.2/concepts/index.html b/content/cn/docs/0.5.2/concepts/index.html index 73121c39da140..a5086c6da0f6e 100644 --- a/content/cn/docs/0.5.2/concepts/index.html +++ b/content/cn/docs/0.5.2/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.2/configurations/index.html b/content/cn/docs/0.5.2/configurations/index.html index d558ba936471b..70eacb0a96a80 100644 --- a/content/cn/docs/0.5.2/configurations/index.html +++ b/content/cn/docs/0.5.2/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.2/deployment/index.html b/content/cn/docs/0.5.2/deployment/index.html index 7cb825f31f503..97c8059feafe2 100644 --- a/content/cn/docs/0.5.2/deployment/index.html +++ b/content/cn/docs/0.5.2/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.2/docker_demo/index.html b/content/cn/docs/0.5.2/docker_demo/index.html index c2afbcb4a19aa..1fd003280ec41 100644 --- a/content/cn/docs/0.5.2/docker_demo/index.html +++ b/content/cn/docs/0.5.2/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.2/gcs_hoodie/index.html b/content/cn/docs/0.5.2/gcs_hoodie/index.html index 934e0b4c80279..ea95b5e16637c 100644 --- a/content/cn/docs/0.5.2/gcs_hoodie/index.html +++ b/content/cn/docs/0.5.2/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.2/migration_guide/index.html b/content/cn/docs/0.5.2/migration_guide/index.html index 9f873b20dad49..9d7c97579c33f 100644 --- a/content/cn/docs/0.5.2/migration_guide/index.html +++ b/content/cn/docs/0.5.2/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.2/performance/index.html b/content/cn/docs/0.5.2/performance/index.html index ef0322525178a..a4c94aa323b72 100644 --- a/content/cn/docs/0.5.2/performance/index.html +++ b/content/cn/docs/0.5.2/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.2/powered_by/index.html b/content/cn/docs/0.5.2/powered_by/index.html index 4b6e5e4b4fcbd..6c9570dd56a3d 100644 --- a/content/cn/docs/0.5.2/powered_by/index.html +++ b/content/cn/docs/0.5.2/powered_by/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.2/privacy/index.html b/content/cn/docs/0.5.2/privacy/index.html index 7d6f8b54f501f..b707467f57cb4 100644 --- a/content/cn/docs/0.5.2/privacy/index.html +++ b/content/cn/docs/0.5.2/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.2/querying_data/index.html b/content/cn/docs/0.5.2/querying_data/index.html index 74e336741da20..1305dec735212 100644 --- a/content/cn/docs/0.5.2/querying_data/index.html +++ b/content/cn/docs/0.5.2/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.2/quick-start-guide/index.html b/content/cn/docs/0.5.2/quick-start-guide/index.html index 17f15973c55ee..f8808825ea1e0 100644 --- a/content/cn/docs/0.5.2/quick-start-guide/index.html +++ b/content/cn/docs/0.5.2/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.2/s3_hoodie/index.html b/content/cn/docs/0.5.2/s3_hoodie/index.html index b272b5db774d7..91a02a77e0285 100644 --- a/content/cn/docs/0.5.2/s3_hoodie/index.html +++ b/content/cn/docs/0.5.2/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.2/structure/index.html b/content/cn/docs/0.5.2/structure/index.html index 2a8a6e5c17df2..1b6eb7ef82ab5 100644 --- a/content/cn/docs/0.5.2/structure/index.html +++ b/content/cn/docs/0.5.2/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.2/use_cases/index.html b/content/cn/docs/0.5.2/use_cases/index.html index e706e4d7a5ecd..f1c896a6cf26a 100644 --- a/content/cn/docs/0.5.2/use_cases/index.html +++ b/content/cn/docs/0.5.2/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.2/writing_data/index.html b/content/cn/docs/0.5.2/writing_data/index.html index a0a8648a30b83..0ee33e35c6847 100644 --- a/content/cn/docs/0.5.2/writing_data/index.html +++ b/content/cn/docs/0.5.2/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.3/azure_hoodie/index.html b/content/cn/docs/0.5.3/azure_hoodie/index.html index da5ebb5682588..d8e152e771ee6 100644 --- a/content/cn/docs/0.5.3/azure_hoodie/index.html +++ b/content/cn/docs/0.5.3/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.3/cloud/index.html b/content/cn/docs/0.5.3/cloud/index.html index d8afb65701eaf..0294094005a12 100644 --- a/content/cn/docs/0.5.3/cloud/index.html +++ b/content/cn/docs/0.5.3/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.3/comparison/index.html b/content/cn/docs/0.5.3/comparison/index.html index 80a7a4d080616..c973bdbbd6837 100644 --- a/content/cn/docs/0.5.3/comparison/index.html +++ b/content/cn/docs/0.5.3/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.3/concepts/index.html b/content/cn/docs/0.5.3/concepts/index.html index a8cff32c4400b..c2bfb9d167802 100644 --- a/content/cn/docs/0.5.3/concepts/index.html +++ b/content/cn/docs/0.5.3/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.3/configurations/index.html b/content/cn/docs/0.5.3/configurations/index.html index 188e6e22dd36f..15dedae313105 100644 --- a/content/cn/docs/0.5.3/configurations/index.html +++ b/content/cn/docs/0.5.3/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.3/deployment/index.html b/content/cn/docs/0.5.3/deployment/index.html index 10f0b6435de85..23fe1b9385496 100644 --- a/content/cn/docs/0.5.3/deployment/index.html +++ b/content/cn/docs/0.5.3/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.3/docker_demo/index.html b/content/cn/docs/0.5.3/docker_demo/index.html index 3d3ea87b2b1e4..2e86408afa0ff 100644 --- a/content/cn/docs/0.5.3/docker_demo/index.html +++ b/content/cn/docs/0.5.3/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.3/gcs_hoodie/index.html b/content/cn/docs/0.5.3/gcs_hoodie/index.html index 80b2ebdc7fb37..e8003cf23c6c5 100644 --- a/content/cn/docs/0.5.3/gcs_hoodie/index.html +++ b/content/cn/docs/0.5.3/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.3/migration_guide/index.html b/content/cn/docs/0.5.3/migration_guide/index.html index a09552976ff24..dd2fe5ec2c950 100644 --- a/content/cn/docs/0.5.3/migration_guide/index.html +++ b/content/cn/docs/0.5.3/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.3/oss_hoodie/index.html b/content/cn/docs/0.5.3/oss_hoodie/index.html index b8c9f658cf0af..bbaa741581aad 100644 --- a/content/cn/docs/0.5.3/oss_hoodie/index.html +++ b/content/cn/docs/0.5.3/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.3/performance/index.html b/content/cn/docs/0.5.3/performance/index.html index 4c960c7bbdf27..dab2dd102dd5f 100644 --- a/content/cn/docs/0.5.3/performance/index.html +++ b/content/cn/docs/0.5.3/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.3/powered_by/index.html b/content/cn/docs/0.5.3/powered_by/index.html index 00112496dc5d3..b98e1b76171c0 100644 --- a/content/cn/docs/0.5.3/powered_by/index.html +++ b/content/cn/docs/0.5.3/powered_by/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.3/privacy/index.html b/content/cn/docs/0.5.3/privacy/index.html index 6b0e601023306..fa22294145f32 100644 --- a/content/cn/docs/0.5.3/privacy/index.html +++ b/content/cn/docs/0.5.3/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.3/querying_data/index.html b/content/cn/docs/0.5.3/querying_data/index.html index 634a5a1b6d1ac..7c27598052fb3 100644 --- a/content/cn/docs/0.5.3/querying_data/index.html +++ b/content/cn/docs/0.5.3/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.3/quick-start-guide/index.html b/content/cn/docs/0.5.3/quick-start-guide/index.html index 61cd2adfbceaf..afafb9a48ad72 100644 --- a/content/cn/docs/0.5.3/quick-start-guide/index.html +++ b/content/cn/docs/0.5.3/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.3/s3_hoodie/index.html b/content/cn/docs/0.5.3/s3_hoodie/index.html index 24b0410c649e4..cbc7361e307b6 100644 --- a/content/cn/docs/0.5.3/s3_hoodie/index.html +++ b/content/cn/docs/0.5.3/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.3/structure/index.html b/content/cn/docs/0.5.3/structure/index.html index 86499c4ba4606..3d79ed12bd7c6 100644 --- a/content/cn/docs/0.5.3/structure/index.html +++ b/content/cn/docs/0.5.3/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.3/use_cases/index.html b/content/cn/docs/0.5.3/use_cases/index.html index fe079d6134cc7..f0324ea02b775 100644 --- a/content/cn/docs/0.5.3/use_cases/index.html +++ b/content/cn/docs/0.5.3/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.5.3/writing_data/index.html b/content/cn/docs/0.5.3/writing_data/index.html index cc5380c991bb4..4dff75e246e36 100644 --- a/content/cn/docs/0.5.3/writing_data/index.html +++ b/content/cn/docs/0.5.3/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/1_2_structure/index.html b/content/cn/docs/0.6.0/1_2_structure/index.html index 0662e323f5993..295acf4cf94c0 100644 --- a/content/cn/docs/0.6.0/1_2_structure/index.html +++ b/content/cn/docs/0.6.0/1_2_structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/2_8_metrics/index.html b/content/cn/docs/0.6.0/2_8_metrics/index.html index e08dd1a8c57f8..4c814f6404ae0 100644 --- a/content/cn/docs/0.6.0/2_8_metrics/index.html +++ b/content/cn/docs/0.6.0/2_8_metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/azure_hoodie/index.html b/content/cn/docs/0.6.0/azure_hoodie/index.html index 94afc9ee0f076..e5b1ac3c7f26e 100644 --- a/content/cn/docs/0.6.0/azure_hoodie/index.html +++ b/content/cn/docs/0.6.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/cloud/index.html b/content/cn/docs/0.6.0/cloud/index.html index d68cd240bd635..a2be7876899dd 100644 --- a/content/cn/docs/0.6.0/cloud/index.html +++ b/content/cn/docs/0.6.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/comparison/index.html b/content/cn/docs/0.6.0/comparison/index.html index abd45c05fcf98..926acb8614577 100644 --- a/content/cn/docs/0.6.0/comparison/index.html +++ b/content/cn/docs/0.6.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/concepts/index.html b/content/cn/docs/0.6.0/concepts/index.html index 2c58ab7ba37eb..e6b88b0c6a347 100644 --- a/content/cn/docs/0.6.0/concepts/index.html +++ b/content/cn/docs/0.6.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/configurations/index.html b/content/cn/docs/0.6.0/configurations/index.html index 045d27b88697e..22d9a92ef38b5 100644 --- a/content/cn/docs/0.6.0/configurations/index.html +++ b/content/cn/docs/0.6.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/cos_hoodie/index.html b/content/cn/docs/0.6.0/cos_hoodie/index.html index 628c5cdf11bbe..3867058b0a7ee 100644 --- a/content/cn/docs/0.6.0/cos_hoodie/index.html +++ b/content/cn/docs/0.6.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/deployment/index.html b/content/cn/docs/0.6.0/deployment/index.html index dd10f47a1febe..75d987262fe4b 100644 --- a/content/cn/docs/0.6.0/deployment/index.html +++ b/content/cn/docs/0.6.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/docker_demo/index.html b/content/cn/docs/0.6.0/docker_demo/index.html index 38260f5af2846..1bb5ef2ce91a3 100644 --- a/content/cn/docs/0.6.0/docker_demo/index.html +++ b/content/cn/docs/0.6.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/gcs_hoodie/index.html b/content/cn/docs/0.6.0/gcs_hoodie/index.html index efac48eecc642..17c9fc6ec98ce 100644 --- a/content/cn/docs/0.6.0/gcs_hoodie/index.html +++ b/content/cn/docs/0.6.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/migration_guide/index.html b/content/cn/docs/0.6.0/migration_guide/index.html index 842e00b3d2ad1..1a244451b0116 100644 --- a/content/cn/docs/0.6.0/migration_guide/index.html +++ b/content/cn/docs/0.6.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/oss_hoodie/index.html b/content/cn/docs/0.6.0/oss_hoodie/index.html index 580dcd8cf155b..ee37b768ee73f 100644 --- a/content/cn/docs/0.6.0/oss_hoodie/index.html +++ b/content/cn/docs/0.6.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/performance/index.html b/content/cn/docs/0.6.0/performance/index.html index c82c2d15bd1c7..9f7070071ab75 100644 --- a/content/cn/docs/0.6.0/performance/index.html +++ b/content/cn/docs/0.6.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/powered_by/index.html b/content/cn/docs/0.6.0/powered_by/index.html index f018090e5e46d..09e74e7fdbc3b 100644 --- a/content/cn/docs/0.6.0/powered_by/index.html +++ b/content/cn/docs/0.6.0/powered_by/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/privacy/index.html b/content/cn/docs/0.6.0/privacy/index.html index 334e6c8b491e9..b79e11b23f18f 100644 --- a/content/cn/docs/0.6.0/privacy/index.html +++ b/content/cn/docs/0.6.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/querying_data/index.html b/content/cn/docs/0.6.0/querying_data/index.html index 4cd969ddddc44..60883762451d3 100644 --- a/content/cn/docs/0.6.0/querying_data/index.html +++ b/content/cn/docs/0.6.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/quick-start-guide/index.html b/content/cn/docs/0.6.0/quick-start-guide/index.html index 2e4390cdf6917..8f60dc156c8e2 100644 --- a/content/cn/docs/0.6.0/quick-start-guide/index.html +++ b/content/cn/docs/0.6.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/s3_hoodie/index.html b/content/cn/docs/0.6.0/s3_hoodie/index.html index 9ba4af861c57b..e61f68713eaa3 100644 --- a/content/cn/docs/0.6.0/s3_hoodie/index.html +++ b/content/cn/docs/0.6.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/use_cases/index.html b/content/cn/docs/0.6.0/use_cases/index.html index 1d52a36e1ecd3..08f124aad7fb3 100644 --- a/content/cn/docs/0.6.0/use_cases/index.html +++ b/content/cn/docs/0.6.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.6.0/writing_data/index.html b/content/cn/docs/0.6.0/writing_data/index.html index eabaf4cd2c6c5..35c6bc42cbfe7 100644 --- a/content/cn/docs/0.6.0/writing_data/index.html +++ b/content/cn/docs/0.6.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/azure_hoodie/index.html b/content/cn/docs/0.7.0/azure_hoodie/index.html index e1d77ca6167cc..50e0aee5612e1 100644 --- a/content/cn/docs/0.7.0/azure_hoodie/index.html +++ b/content/cn/docs/0.7.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/cloud/index.html b/content/cn/docs/0.7.0/cloud/index.html index 896390bf1ef2c..0839eef0e2d5a 100644 --- a/content/cn/docs/0.7.0/cloud/index.html +++ b/content/cn/docs/0.7.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/comparison/index.html b/content/cn/docs/0.7.0/comparison/index.html index d1b40e80bcaa5..2f50512a2c23f 100644 --- a/content/cn/docs/0.7.0/comparison/index.html +++ b/content/cn/docs/0.7.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/concepts/index.html b/content/cn/docs/0.7.0/concepts/index.html index 0f6ae18a12612..0def5a1d878db 100644 --- a/content/cn/docs/0.7.0/concepts/index.html +++ b/content/cn/docs/0.7.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/configurations/index.html b/content/cn/docs/0.7.0/configurations/index.html index 52474a080aad3..fe949b659cffb 100644 --- a/content/cn/docs/0.7.0/configurations/index.html +++ b/content/cn/docs/0.7.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/cos_hoodie/index.html b/content/cn/docs/0.7.0/cos_hoodie/index.html index d65b304d07814..24144df4b66e5 100644 --- a/content/cn/docs/0.7.0/cos_hoodie/index.html +++ b/content/cn/docs/0.7.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/deployment/index.html b/content/cn/docs/0.7.0/deployment/index.html index 39c7a33f374c9..1f9323caa9d47 100644 --- a/content/cn/docs/0.7.0/deployment/index.html +++ b/content/cn/docs/0.7.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/docker_demo/index.html b/content/cn/docs/0.7.0/docker_demo/index.html index ba0a875badda6..2eadd1f651287 100644 --- a/content/cn/docs/0.7.0/docker_demo/index.html +++ b/content/cn/docs/0.7.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/gcs_hoodie/index.html b/content/cn/docs/0.7.0/gcs_hoodie/index.html index 7f0f15f3093e8..b37a3b77e5d81 100644 --- a/content/cn/docs/0.7.0/gcs_hoodie/index.html +++ b/content/cn/docs/0.7.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/ibm_cos_hoodie/index.html b/content/cn/docs/0.7.0/ibm_cos_hoodie/index.html index 7aba66b8762ed..8811109838719 100644 --- a/content/cn/docs/0.7.0/ibm_cos_hoodie/index.html +++ b/content/cn/docs/0.7.0/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/metrics/index.html b/content/cn/docs/0.7.0/metrics/index.html index 7e7469dc04fa1..0518c84a1e123 100644 --- a/content/cn/docs/0.7.0/metrics/index.html +++ b/content/cn/docs/0.7.0/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/migration_guide/index.html b/content/cn/docs/0.7.0/migration_guide/index.html index d977c6c65e908..3c3e8da866cba 100644 --- a/content/cn/docs/0.7.0/migration_guide/index.html +++ b/content/cn/docs/0.7.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/oss_hoodie/index.html b/content/cn/docs/0.7.0/oss_hoodie/index.html index 3bb4c27554761..a56b5ec8d74de 100644 --- a/content/cn/docs/0.7.0/oss_hoodie/index.html +++ b/content/cn/docs/0.7.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/overview/index.html b/content/cn/docs/0.7.0/overview/index.html index b38b1e4e9220e..ff8970404e796 100644 --- a/content/cn/docs/0.7.0/overview/index.html +++ b/content/cn/docs/0.7.0/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/performance/index.html b/content/cn/docs/0.7.0/performance/index.html index 12dcbd5c86265..fa5951656b295 100644 --- a/content/cn/docs/0.7.0/performance/index.html +++ b/content/cn/docs/0.7.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/powered_by/index.html b/content/cn/docs/0.7.0/powered_by/index.html index 4fff0e39033cd..0b476033753c3 100644 --- a/content/cn/docs/0.7.0/powered_by/index.html +++ b/content/cn/docs/0.7.0/powered_by/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/privacy/index.html b/content/cn/docs/0.7.0/privacy/index.html index a90d6414d6e4a..3dab63e2d286d 100644 --- a/content/cn/docs/0.7.0/privacy/index.html +++ b/content/cn/docs/0.7.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/querying_data/index.html b/content/cn/docs/0.7.0/querying_data/index.html index bdb08cf5fd4a9..728605eb48f26 100644 --- a/content/cn/docs/0.7.0/querying_data/index.html +++ b/content/cn/docs/0.7.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/quick-start-guide/index.html b/content/cn/docs/0.7.0/quick-start-guide/index.html index 3a0f29d372033..709127415622d 100644 --- a/content/cn/docs/0.7.0/quick-start-guide/index.html +++ b/content/cn/docs/0.7.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/s3_hoodie/index.html b/content/cn/docs/0.7.0/s3_hoodie/index.html index d1f18ac1df524..e37b40e9ddde1 100644 --- a/content/cn/docs/0.7.0/s3_hoodie/index.html +++ b/content/cn/docs/0.7.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/structure/index.html b/content/cn/docs/0.7.0/structure/index.html index 9b8dbab070828..68c5dfaf795bf 100644 --- a/content/cn/docs/0.7.0/structure/index.html +++ b/content/cn/docs/0.7.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/use_cases/index.html b/content/cn/docs/0.7.0/use_cases/index.html index 73682adc38641..619f649596905 100644 --- a/content/cn/docs/0.7.0/use_cases/index.html +++ b/content/cn/docs/0.7.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.7.0/writing_data/index.html b/content/cn/docs/0.7.0/writing_data/index.html index b68070b8ed1b4..5d80669449c0f 100644 --- a/content/cn/docs/0.7.0/writing_data/index.html +++ b/content/cn/docs/0.7.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/azure_hoodie/index.html b/content/cn/docs/0.8.0/azure_hoodie/index.html index a468f648c1354..0342469242ee3 100644 --- a/content/cn/docs/0.8.0/azure_hoodie/index.html +++ b/content/cn/docs/0.8.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/cloud/index.html b/content/cn/docs/0.8.0/cloud/index.html index 292cda4c31615..ec4fea5374f9e 100644 --- a/content/cn/docs/0.8.0/cloud/index.html +++ b/content/cn/docs/0.8.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/comparison/index.html b/content/cn/docs/0.8.0/comparison/index.html index a399b09d4064d..43fe4be0f64cf 100644 --- a/content/cn/docs/0.8.0/comparison/index.html +++ b/content/cn/docs/0.8.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/concepts/index.html b/content/cn/docs/0.8.0/concepts/index.html index 40616185965fa..85a365c41e6a0 100644 --- a/content/cn/docs/0.8.0/concepts/index.html +++ b/content/cn/docs/0.8.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/concurrency_control/index.html b/content/cn/docs/0.8.0/concurrency_control/index.html index 16de015ab953e..9d5092bcd22c5 100644 --- a/content/cn/docs/0.8.0/concurrency_control/index.html +++ b/content/cn/docs/0.8.0/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/configurations/index.html b/content/cn/docs/0.8.0/configurations/index.html index 32b9a74b18b60..309afc6cb3883 100644 --- a/content/cn/docs/0.8.0/configurations/index.html +++ b/content/cn/docs/0.8.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/cos_hoodie/index.html b/content/cn/docs/0.8.0/cos_hoodie/index.html index 0e9900a183064..3ca0ad7e8446a 100644 --- a/content/cn/docs/0.8.0/cos_hoodie/index.html +++ b/content/cn/docs/0.8.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/deployment/index.html b/content/cn/docs/0.8.0/deployment/index.html index 33f2b15f4141d..c4ad9f62f9000 100644 --- a/content/cn/docs/0.8.0/deployment/index.html +++ b/content/cn/docs/0.8.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/docker_demo/index.html b/content/cn/docs/0.8.0/docker_demo/index.html index fb8ab1b44de83..0ca6da76f02c3 100644 --- a/content/cn/docs/0.8.0/docker_demo/index.html +++ b/content/cn/docs/0.8.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/flink-quick-start-guide/index.html b/content/cn/docs/0.8.0/flink-quick-start-guide/index.html index 8a5b89cdf59df..9408f2f524a9a 100644 --- a/content/cn/docs/0.8.0/flink-quick-start-guide/index.html +++ b/content/cn/docs/0.8.0/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/gcs_hoodie/index.html b/content/cn/docs/0.8.0/gcs_hoodie/index.html index 6547513ba60d5..a67cee827bbd6 100644 --- a/content/cn/docs/0.8.0/gcs_hoodie/index.html +++ b/content/cn/docs/0.8.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/ibm_cos_hoodie/index.html b/content/cn/docs/0.8.0/ibm_cos_hoodie/index.html index cdc4310d391e0..6a5e60b508987 100644 --- a/content/cn/docs/0.8.0/ibm_cos_hoodie/index.html +++ b/content/cn/docs/0.8.0/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/metrics/index.html b/content/cn/docs/0.8.0/metrics/index.html index 0357e43012138..0e7062736e4b2 100644 --- a/content/cn/docs/0.8.0/metrics/index.html +++ b/content/cn/docs/0.8.0/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/migration_guide/index.html b/content/cn/docs/0.8.0/migration_guide/index.html index 185eba78bfd13..8a3b10aac5bfd 100644 --- a/content/cn/docs/0.8.0/migration_guide/index.html +++ b/content/cn/docs/0.8.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/oss_hoodie/index.html b/content/cn/docs/0.8.0/oss_hoodie/index.html index 6b03f909b4d8f..afcb25dcf6f5d 100644 --- a/content/cn/docs/0.8.0/oss_hoodie/index.html +++ b/content/cn/docs/0.8.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/overview/index.html b/content/cn/docs/0.8.0/overview/index.html index bc4f8d40c6f93..22a9726fbcfd3 100644 --- a/content/cn/docs/0.8.0/overview/index.html +++ b/content/cn/docs/0.8.0/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/performance/index.html b/content/cn/docs/0.8.0/performance/index.html index 075f051a99741..5a0314fe21bd3 100644 --- a/content/cn/docs/0.8.0/performance/index.html +++ b/content/cn/docs/0.8.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/powered_by/index.html b/content/cn/docs/0.8.0/powered_by/index.html index 941e2414e5ec1..25ad0df51f717 100644 --- a/content/cn/docs/0.8.0/powered_by/index.html +++ b/content/cn/docs/0.8.0/powered_by/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/privacy/index.html b/content/cn/docs/0.8.0/privacy/index.html index d373b017ed3b2..3a5484440bc66 100644 --- a/content/cn/docs/0.8.0/privacy/index.html +++ b/content/cn/docs/0.8.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/querying_data/index.html b/content/cn/docs/0.8.0/querying_data/index.html index 1710154c4d5f7..e4ad8c9f6cd4b 100644 --- a/content/cn/docs/0.8.0/querying_data/index.html +++ b/content/cn/docs/0.8.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/quick-start-guide/index.html b/content/cn/docs/0.8.0/quick-start-guide/index.html index c53b4b9e190e9..ebc2ad4e3f02e 100644 --- a/content/cn/docs/0.8.0/quick-start-guide/index.html +++ b/content/cn/docs/0.8.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/s3_hoodie/index.html b/content/cn/docs/0.8.0/s3_hoodie/index.html index 84c3711f6183e..00e671095a122 100644 --- a/content/cn/docs/0.8.0/s3_hoodie/index.html +++ b/content/cn/docs/0.8.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/structure/index.html b/content/cn/docs/0.8.0/structure/index.html index 1ac0b9185df45..c6cccae642fa8 100644 --- a/content/cn/docs/0.8.0/structure/index.html +++ b/content/cn/docs/0.8.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/use_cases/index.html b/content/cn/docs/0.8.0/use_cases/index.html index 4850243f98c10..7cf01e580ccec 100644 --- a/content/cn/docs/0.8.0/use_cases/index.html +++ b/content/cn/docs/0.8.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.8.0/writing_data/index.html b/content/cn/docs/0.8.0/writing_data/index.html index 26f44ec665bf1..c4183bd8e6fc5 100644 --- a/content/cn/docs/0.8.0/writing_data/index.html +++ b/content/cn/docs/0.8.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/azure_hoodie/index.html b/content/cn/docs/0.9.0/azure_hoodie/index.html index 298d140f372fc..bd650bb3c5878 100644 --- a/content/cn/docs/0.9.0/azure_hoodie/index.html +++ b/content/cn/docs/0.9.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/bos_hoodie/index.html b/content/cn/docs/0.9.0/bos_hoodie/index.html index 2ac4a7f8c950d..47f0b1c547737 100644 --- a/content/cn/docs/0.9.0/bos_hoodie/index.html +++ b/content/cn/docs/0.9.0/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/cli/index.html b/content/cn/docs/0.9.0/cli/index.html index 01100eb3c1b8e..2245e12d962dc 100644 --- a/content/cn/docs/0.9.0/cli/index.html +++ b/content/cn/docs/0.9.0/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/cloud/index.html b/content/cn/docs/0.9.0/cloud/index.html index d0f992f032a76..c9a48036967e5 100644 --- a/content/cn/docs/0.9.0/cloud/index.html +++ b/content/cn/docs/0.9.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/comparison/index.html b/content/cn/docs/0.9.0/comparison/index.html index 3ec64ac320803..9f7c2a88c7e42 100644 --- a/content/cn/docs/0.9.0/comparison/index.html +++ b/content/cn/docs/0.9.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/concepts/index.html b/content/cn/docs/0.9.0/concepts/index.html index d7890b6f220d7..f174dfe91eb95 100644 --- a/content/cn/docs/0.9.0/concepts/index.html +++ b/content/cn/docs/0.9.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/concurrency_control/index.html b/content/cn/docs/0.9.0/concurrency_control/index.html index 3dba97eacbf1a..a50ccabaf948f 100644 --- a/content/cn/docs/0.9.0/concurrency_control/index.html +++ b/content/cn/docs/0.9.0/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/configurations/index.html b/content/cn/docs/0.9.0/configurations/index.html index ba144ef952640..e95fb2cda6072 100644 --- a/content/cn/docs/0.9.0/configurations/index.html +++ b/content/cn/docs/0.9.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/cos_hoodie/index.html b/content/cn/docs/0.9.0/cos_hoodie/index.html index 8c264172040c4..601b65566e844 100644 --- a/content/cn/docs/0.9.0/cos_hoodie/index.html +++ b/content/cn/docs/0.9.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/deployment/index.html b/content/cn/docs/0.9.0/deployment/index.html index 2e43fe2d20303..4c7e20293d2f7 100644 --- a/content/cn/docs/0.9.0/deployment/index.html +++ b/content/cn/docs/0.9.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/docker_demo/index.html b/content/cn/docs/0.9.0/docker_demo/index.html index b56527f781663..b2046e2df6fab 100644 --- a/content/cn/docs/0.9.0/docker_demo/index.html +++ b/content/cn/docs/0.9.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/flink-quick-start-guide/index.html b/content/cn/docs/0.9.0/flink-quick-start-guide/index.html index 82bdfe7cdea35..7f7bd73f41ac8 100644 --- a/content/cn/docs/0.9.0/flink-quick-start-guide/index.html +++ b/content/cn/docs/0.9.0/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/gcs_hoodie/index.html b/content/cn/docs/0.9.0/gcs_hoodie/index.html index 672874b26277e..b4aa449368ed1 100644 --- a/content/cn/docs/0.9.0/gcs_hoodie/index.html +++ b/content/cn/docs/0.9.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/hoodie_deltastreamer/index.html b/content/cn/docs/0.9.0/hoodie_deltastreamer/index.html index 9ce07ee9cf791..c1a0562b7d56c 100644 --- a/content/cn/docs/0.9.0/hoodie_deltastreamer/index.html +++ b/content/cn/docs/0.9.0/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/ibm_cos_hoodie/index.html b/content/cn/docs/0.9.0/ibm_cos_hoodie/index.html index b2b5604d2f9fd..3ae477cdd2eb3 100644 --- a/content/cn/docs/0.9.0/ibm_cos_hoodie/index.html +++ b/content/cn/docs/0.9.0/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/metrics/index.html b/content/cn/docs/0.9.0/metrics/index.html index 7e74b99328d13..381c8f7d4d4df 100644 --- a/content/cn/docs/0.9.0/metrics/index.html +++ b/content/cn/docs/0.9.0/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/migration_guide/index.html b/content/cn/docs/0.9.0/migration_guide/index.html index 9d5cc6ac526bc..ba76cc29fa97d 100644 --- a/content/cn/docs/0.9.0/migration_guide/index.html +++ b/content/cn/docs/0.9.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/oss_hoodie/index.html b/content/cn/docs/0.9.0/oss_hoodie/index.html index c11a1a378ec58..509e00b43d366 100644 --- a/content/cn/docs/0.9.0/oss_hoodie/index.html +++ b/content/cn/docs/0.9.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/overview/index.html b/content/cn/docs/0.9.0/overview/index.html index 94f7853dc4d80..e9f71b85337bd 100644 --- a/content/cn/docs/0.9.0/overview/index.html +++ b/content/cn/docs/0.9.0/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/performance/index.html b/content/cn/docs/0.9.0/performance/index.html index 751900872668d..9c829201a16f5 100644 --- a/content/cn/docs/0.9.0/performance/index.html +++ b/content/cn/docs/0.9.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/privacy/index.html b/content/cn/docs/0.9.0/privacy/index.html index 35d2a075ede68..ce0132e71508b 100644 --- a/content/cn/docs/0.9.0/privacy/index.html +++ b/content/cn/docs/0.9.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/query_engine_setup/index.html b/content/cn/docs/0.9.0/query_engine_setup/index.html index b5db30fbdbbb8..8d2d542efbeaa 100644 --- a/content/cn/docs/0.9.0/query_engine_setup/index.html +++ b/content/cn/docs/0.9.0/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/querying_data/index.html b/content/cn/docs/0.9.0/querying_data/index.html index 120ef2036c1e9..444d0342e1528 100644 --- a/content/cn/docs/0.9.0/querying_data/index.html +++ b/content/cn/docs/0.9.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/quick-start-guide/index.html b/content/cn/docs/0.9.0/quick-start-guide/index.html index a949a2714ae08..f649912e017b0 100644 --- a/content/cn/docs/0.9.0/quick-start-guide/index.html +++ b/content/cn/docs/0.9.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/s3_hoodie/index.html b/content/cn/docs/0.9.0/s3_hoodie/index.html index fdf52373068d6..d39608fe6c318 100644 --- a/content/cn/docs/0.9.0/s3_hoodie/index.html +++ b/content/cn/docs/0.9.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/schema_evolution/index.html b/content/cn/docs/0.9.0/schema_evolution/index.html index b7ba1f99df958..d65e3bc58df2d 100644 --- a/content/cn/docs/0.9.0/schema_evolution/index.html +++ b/content/cn/docs/0.9.0/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/structure/index.html b/content/cn/docs/0.9.0/structure/index.html index 6c6c9d1173b98..3b560f46d8996 100644 --- a/content/cn/docs/0.9.0/structure/index.html +++ b/content/cn/docs/0.9.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/table_types/index.html b/content/cn/docs/0.9.0/table_types/index.html index f2f82321b0c85..91a5547a2f05b 100644 --- a/content/cn/docs/0.9.0/table_types/index.html +++ b/content/cn/docs/0.9.0/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/use_cases/index.html b/content/cn/docs/0.9.0/use_cases/index.html index 402e957ef5c15..217974c7f489f 100644 --- a/content/cn/docs/0.9.0/use_cases/index.html +++ b/content/cn/docs/0.9.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/0.9.0/writing_data/index.html b/content/cn/docs/0.9.0/writing_data/index.html index 10061d19b4b74..f62b8b2c87b1e 100644 --- a/content/cn/docs/0.9.0/writing_data/index.html +++ b/content/cn/docs/0.9.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/azure_hoodie/index.html b/content/cn/docs/azure_hoodie/index.html index 4c23c7506913c..bb3a83ddefa33 100644 --- a/content/cn/docs/azure_hoodie/index.html +++ b/content/cn/docs/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/basic_configurations/index.html b/content/cn/docs/basic_configurations/index.html index e7902bb3ea365..ffcece1cbfc6e 100644 --- a/content/cn/docs/basic_configurations/index.html +++ b/content/cn/docs/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/bos_hoodie/index.html b/content/cn/docs/bos_hoodie/index.html index 1887fdc69f1ad..9277cae1c657e 100644 --- a/content/cn/docs/bos_hoodie/index.html +++ b/content/cn/docs/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/cleaning/index.html b/content/cn/docs/cleaning/index.html index c2be8b1295b08..003a42dd782d0 100644 --- a/content/cn/docs/cleaning/index.html +++ b/content/cn/docs/cleaning/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/cli/index.html b/content/cn/docs/cli/index.html index eaf1aec3db06c..9029035f01b59 100644 --- a/content/cn/docs/cli/index.html +++ b/content/cn/docs/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/cloud/index.html b/content/cn/docs/cloud/index.html index bf9233a9074c4..056410b948402 100644 --- a/content/cn/docs/cloud/index.html +++ b/content/cn/docs/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/clustering/index.html b/content/cn/docs/clustering/index.html index 64cecdbbf4ca0..f4e3539885277 100644 --- a/content/cn/docs/clustering/index.html +++ b/content/cn/docs/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/compaction/index.html b/content/cn/docs/compaction/index.html index 5305f66af461d..1e1bbe8ac8c14 100644 --- a/content/cn/docs/compaction/index.html +++ b/content/cn/docs/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/comparison/index.html b/content/cn/docs/comparison/index.html index 01c43e421eb27..1e04d3907d905 100644 --- a/content/cn/docs/comparison/index.html +++ b/content/cn/docs/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/concepts/index.html b/content/cn/docs/concepts/index.html index 115dc651dda69..cc7e9517ecf90 100644 --- a/content/cn/docs/concepts/index.html +++ b/content/cn/docs/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/concurrency_control/index.html b/content/cn/docs/concurrency_control/index.html index 6bbd85a0e3d3c..377198f259e30 100644 --- a/content/cn/docs/concurrency_control/index.html +++ b/content/cn/docs/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/configurations/index.html b/content/cn/docs/configurations/index.html index 4c2e0a0e3dcb3..92a39e0dc1a78 100644 --- a/content/cn/docs/configurations/index.html +++ b/content/cn/docs/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/cos_hoodie/index.html b/content/cn/docs/cos_hoodie/index.html index 8a9445f51293b..7704912745b69 100644 --- a/content/cn/docs/cos_hoodie/index.html +++ b/content/cn/docs/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/deployment/index.html b/content/cn/docs/deployment/index.html index ad579729792c8..9ec0a42827385 100644 --- a/content/cn/docs/deployment/index.html +++ b/content/cn/docs/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/disaster_recovery/index.html b/content/cn/docs/disaster_recovery/index.html index 27f8ab40dcbe5..5fdcc84f37c59 100644 --- a/content/cn/docs/disaster_recovery/index.html +++ b/content/cn/docs/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/docker_demo/index.html b/content/cn/docs/docker_demo/index.html index d16c78417de29..8f6e3caedc16a 100644 --- a/content/cn/docs/docker_demo/index.html +++ b/content/cn/docs/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/encryption/index.html b/content/cn/docs/encryption/index.html index a871b9345c0e4..7f83f8d7b876d 100644 --- a/content/cn/docs/encryption/index.html +++ b/content/cn/docs/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/faq/index.html b/content/cn/docs/faq/index.html index d7d8c0f31221c..85f219cb1dc3a 100644 --- a/content/cn/docs/faq/index.html +++ b/content/cn/docs/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/faq_design_and_concepts/index.html b/content/cn/docs/faq_design_and_concepts/index.html index b9e30f4c87c0a..43f9f0bb9efa9 100644 --- a/content/cn/docs/faq_design_and_concepts/index.html +++ b/content/cn/docs/faq_design_and_concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/faq_general/index.html b/content/cn/docs/faq_general/index.html index a4989a7d4d356..cabf84916ca54 100644 --- a/content/cn/docs/faq_general/index.html +++ b/content/cn/docs/faq_general/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/faq_integrations/index.html b/content/cn/docs/faq_integrations/index.html index 2b04cc30de40a..67f25db083a73 100644 --- a/content/cn/docs/faq_integrations/index.html +++ b/content/cn/docs/faq_integrations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/faq_reading_tables/index.html b/content/cn/docs/faq_reading_tables/index.html index 303c3584f4525..bdb04141543c4 100644 --- a/content/cn/docs/faq_reading_tables/index.html +++ b/content/cn/docs/faq_reading_tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/faq_storage/index.html b/content/cn/docs/faq_storage/index.html index 74c16a3647136..c41c13be071bf 100644 --- a/content/cn/docs/faq_storage/index.html +++ b/content/cn/docs/faq_storage/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/faq_table_services/index.html b/content/cn/docs/faq_table_services/index.html index b6e56ab5b97f2..ec9ebc69135a1 100644 --- a/content/cn/docs/faq_table_services/index.html +++ b/content/cn/docs/faq_table_services/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/faq_writing_tables/index.html b/content/cn/docs/faq_writing_tables/index.html index 4884800ae3cc1..ec497afadca8d 100644 --- a/content/cn/docs/faq_writing_tables/index.html +++ b/content/cn/docs/faq_writing_tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/file_sizing/index.html b/content/cn/docs/file_sizing/index.html index 5f21be118d550..e62c7400fb1cb 100644 --- a/content/cn/docs/file_sizing/index.html +++ b/content/cn/docs/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/flink-quick-start-guide/index.html b/content/cn/docs/flink-quick-start-guide/index.html index 710fd7da9b821..8b95d082cb3c2 100644 --- a/content/cn/docs/flink-quick-start-guide/index.html +++ b/content/cn/docs/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/flink_tuning/index.html b/content/cn/docs/flink_tuning/index.html index 794a7a4500246..6d958adb16ece 100644 --- a/content/cn/docs/flink_tuning/index.html +++ b/content/cn/docs/flink_tuning/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/gcp_bigquery/index.html b/content/cn/docs/gcp_bigquery/index.html index a44af4507ab70..8b7b6480ed17c 100644 --- a/content/cn/docs/gcp_bigquery/index.html +++ b/content/cn/docs/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/gcs_hoodie/index.html b/content/cn/docs/gcs_hoodie/index.html index f77e6f532e888..50c2e05260910 100644 --- a/content/cn/docs/gcs_hoodie/index.html +++ b/content/cn/docs/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/hoodie_streaming_ingestion/index.html b/content/cn/docs/hoodie_streaming_ingestion/index.html index 3bfda1bc89508..c444eb394beaf 100644 --- a/content/cn/docs/hoodie_streaming_ingestion/index.html +++ b/content/cn/docs/hoodie_streaming_ingestion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/hudi_stack/index.html b/content/cn/docs/hudi_stack/index.html index a13990d4d4872..b47bd814dd417 100644 --- a/content/cn/docs/hudi_stack/index.html +++ b/content/cn/docs/hudi_stack/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/ibm_cos_hoodie/index.html b/content/cn/docs/ibm_cos_hoodie/index.html index 5cb45fcf3ece2..ac751d0218b6e 100644 --- a/content/cn/docs/ibm_cos_hoodie/index.html +++ b/content/cn/docs/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/indexes/index.html b/content/cn/docs/indexes/index.html index 63819f780c5c2..e9e32ec21ba14 100644 --- a/content/cn/docs/indexes/index.html +++ b/content/cn/docs/indexes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/ingestion_flink/index.html b/content/cn/docs/ingestion_flink/index.html index 6cdc07c0570a9..b153a3b3f4131 100644 --- a/content/cn/docs/ingestion_flink/index.html +++ b/content/cn/docs/ingestion_flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/ingestion_kafka_connect/index.html b/content/cn/docs/ingestion_kafka_connect/index.html index 856aa0e003186..2bdd55658f335 100644 --- a/content/cn/docs/ingestion_kafka_connect/index.html +++ b/content/cn/docs/ingestion_kafka_connect/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/intro/index.html b/content/cn/docs/intro/index.html index 0e5e284995435..34006bb5fe58a 100644 --- a/content/cn/docs/intro/index.html +++ b/content/cn/docs/intro/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/jfs_hoodie/index.html b/content/cn/docs/jfs_hoodie/index.html index e3880ee1e0b61..e15ff6a92c776 100644 --- a/content/cn/docs/jfs_hoodie/index.html +++ b/content/cn/docs/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/key_generation/index.html b/content/cn/docs/key_generation/index.html index 5309d460bcb79..1268b55a79de2 100644 --- a/content/cn/docs/key_generation/index.html +++ b/content/cn/docs/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/markers/index.html b/content/cn/docs/markers/index.html index d9b55616db85a..791e0fb9cc12f 100644 --- a/content/cn/docs/markers/index.html +++ b/content/cn/docs/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/metadata/index.html b/content/cn/docs/metadata/index.html index 7883b753844b5..2b2f9f2243577 100644 --- a/content/cn/docs/metadata/index.html +++ b/content/cn/docs/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/metadata_indexing/index.html b/content/cn/docs/metadata_indexing/index.html index dae3b71afa7a2..5601bbae34d4f 100644 --- a/content/cn/docs/metadata_indexing/index.html +++ b/content/cn/docs/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/metrics/index.html b/content/cn/docs/metrics/index.html index 3f45297e06aa7..a7babfd083544 100644 --- a/content/cn/docs/metrics/index.html +++ b/content/cn/docs/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/migration_guide/index.html b/content/cn/docs/migration_guide/index.html index 352ef9d1546d1..2072644134f75 100644 --- a/content/cn/docs/migration_guide/index.html +++ b/content/cn/docs/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/azure_hoodie/index.html b/content/cn/docs/next/azure_hoodie/index.html index 949f2cd0ef142..29684f35f7d53 100644 --- a/content/cn/docs/next/azure_hoodie/index.html +++ b/content/cn/docs/next/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/basic_configurations/index.html b/content/cn/docs/next/basic_configurations/index.html index b34a44fc2866f..d46523d80e902 100644 --- a/content/cn/docs/next/basic_configurations/index.html +++ b/content/cn/docs/next/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/bos_hoodie/index.html b/content/cn/docs/next/bos_hoodie/index.html index 53b25acb1dd5a..18d87619f75a8 100644 --- a/content/cn/docs/next/bos_hoodie/index.html +++ b/content/cn/docs/next/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/cleaning/index.html b/content/cn/docs/next/cleaning/index.html index fc1a72977170d..296cfa2fa400c 100644 --- a/content/cn/docs/next/cleaning/index.html +++ b/content/cn/docs/next/cleaning/index.html @@ -19,7 +19,7 @@ - + @@ -100,6 +100,10 @@

CLI
cleans run --sparkMaster local --hoodieConfigs hoodie.cleaner.policy=KEEP_LATEST_COMMITS hoodie.cleaner.commits.retained=3 hoodie.cleaner.parallelism=200

You can find more details and the relevant code for these commands in org.apache.hudi.cli.commands.CleansCommand class.

+

Blogs

+

Videos

  • Cleaner Service: Save up to 40% on data lake storage costs | Hudi Labs
  • diff --git a/content/cn/docs/next/cli/index.html b/content/cn/docs/next/cli/index.html index 13261308f7902..12d397f743e8a 100644 --- a/content/cn/docs/next/cli/index.html +++ b/content/cn/docs/next/cli/index.html @@ -19,7 +19,7 @@ - + @@ -212,7 +212,12 @@

    Chang

    The parameter target_table_type candidates are below:

    target table typecomment
    MORChange COW table to MERGE_ON_READ.
    COWChange MOR table to COPY_ON_WRITE.
    By default, changing to COW will execute all pending compactions and perform a full compaction if any log file left. Set --enable-compaction=false will disable the default compaction.
    There are params can be set for the compaction operation:
    --parallelism: Default 3. Parallelism for hoodie compaction
    --sparkMaster: Default local. Spark Master
    --sparkMemory: Default 4G. Spark executor memory
    --retry: Default 1. Number of retries
    --propsFilePath: Default . path to properties file on localfs or dfs with configurations for hoodie client for compacting
    --hoodieConfigs: Default . Any configuration that can be set in the properties file can be passed here in the form of an array

    Example below is changing MOR table to COW:

    -
    connect --path /var/dataset/test_table_mor2cow
    desc
    ╔════════════════════════════════════════════════╤═════════════════════════════════════════╗
    ║ Property │ Value ║
    ╠════════════════════════════════════════════════╪═════════════════════════════════════════╣
    ║ basePath │ /var/dataset/test_table_mor2cow ║
    ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
    ║ metaPath │ /var/dataset/test_table_mor2cow/.hoodie ║
    ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
    ║ fileSystem │ file ║
    ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
    ║ hoodie.table.name │ test_table ║
    ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
    ║ hoodie.compaction.record.merger.strategy │ eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 ║
    ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
    ║ hoodie.table.metadata.partitions │ files ║
    ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
    ║ hoodie.table.type │ MERGE_ON_READ ║
    ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
    ║ hoodie.table.metadata.partitions.inflight │ ║
    ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
    ║ hoodie.archivelog.folder │ archived ║
    ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
    ║ hoodie.timeline.layout.version │ 1 ║
    ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
    ║ hoodie.table.checksum │ 2702201862 ║
    ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
    ║ hoodie.compaction.payload.type │ HOODIE_AVRO ║
    ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
    ║ hoodie.table.version │ 6 ║
    ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
    ║ hoodie.datasource.write.drop.partition.columns │ false ║
    ╚════════════════════════════════════════════════╧═════════════════════════════════════════╝

    table change-table-type COW
    ╔════════════════════════════════════════════════╤══════════════════════════════════════╤══════════════════════════════════════╗
    ║ Property │ Old Value │ New Value ║
    ╠════════════════════════════════════════════════╪══════════════════════════════════════╪══════════════════════════════════════╣
    ║ hoodie.archivelog.folder │ archived │ archived ║
    ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
    ║ hoodie.compaction.payload.type │ HOODIE_AVRO │ HOODIE_AVRO ║
    ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
    ║ hoodie.compaction.record.merger.strategy │ eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 │ eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 ║
    ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
    ║ hoodie.datasource.write.drop.partition.columns │ false │ false ║
    ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
    ║ hoodie.table.checksum │ 2702201862 │ 2702201862 ║
    ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
    ║ hoodie.table.metadata.partitions │ files │ files ║
    ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
    ║ hoodie.table.metadata.partitions.inflight │ │ ║
    ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
    ║ hoodie.table.name │ test_table │ test_table ║
    ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
    ║ hoodie.table.type │ MERGE_ON_READ │ COPY_ON_WRITE ║
    ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
    ║ hoodie.table.version │ 6 │ 6 ║
    ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
    ║ hoodie.timeline.layout.version │ 1 │ 1 ║
    ╚════════════════════════════════════════════════╧══════════════════════════════════════╧══════════════════════════════════════╝

\ No newline at end of file diff --git a/content/cn/docs/next/cloud/index.html b/content/cn/docs/next/cloud/index.html index 44fe48cf80902..52794ce39ff8c 100644 --- a/content/cn/docs/next/cloud/index.html +++ b/content/cn/docs/next/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/clustering/index.html b/content/cn/docs/next/clustering/index.html index 8ec08c7d38edf..e9c53915d5292 100644 --- a/content/cn/docs/next/clustering/index.html +++ b/content/cn/docs/next/clustering/index.html @@ -19,7 +19,7 @@ - + @@ -183,6 +183,9 @@

Java Clientorg.apache.hudi.client.clustering.run.strategy.JavaSortAndSizeExecutionStrategy are supported out-of-the-box. Note that as of now only linear sort is supported in Java execution strategy.

+

Blogs

+Apache Hudi Z-Order and Hilbert Space Filling Curves +Hudi Z-Order and Hilbert Space-filling Curves

Videos

\ No newline at end of file diff --git a/content/cn/docs/next/comparison/index.html b/content/cn/docs/next/comparison/index.html index 841e600becfa7..0572c55c2bdf7 100644 --- a/content/cn/docs/next/comparison/index.html +++ b/content/cn/docs/next/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/concepts/index.html b/content/cn/docs/next/concepts/index.html index feca09f5053a4..2fab05874d9ee 100644 --- a/content/cn/docs/next/concepts/index.html +++ b/content/cn/docs/next/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/concurrency_control/index.html b/content/cn/docs/next/concurrency_control/index.html index 614415cc72d54..5bc110f2ccf46 100644 --- a/content/cn/docs/next/concurrency_control/index.html +++ b/content/cn/docs/next/concurrency_control/index.html @@ -19,7 +19,7 @@ - + @@ -182,6 +182,11 @@

CaveatsRelated Resources

+

Blogs

+

Videos

  • Hands on Lab with using DynamoDB as lock table for Apache Hudi Data Lakes
  • diff --git a/content/cn/docs/next/configurations/index.html b/content/cn/docs/next/configurations/index.html index e5df2efcaf3f8..43b9e20d2f9d6 100644 --- a/content/cn/docs/next/configurations/index.html +++ b/content/cn/docs/next/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/cos_hoodie/index.html b/content/cn/docs/next/cos_hoodie/index.html index 850f5b9669dd2..ec1554ad43d22 100644 --- a/content/cn/docs/next/cos_hoodie/index.html +++ b/content/cn/docs/next/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/deployment/index.html b/content/cn/docs/next/deployment/index.html index 7587327a3857e..cd4c8474576da 100644 --- a/content/cn/docs/next/deployment/index.html +++ b/content/cn/docs/next/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/disaster_recovery/index.html b/content/cn/docs/next/disaster_recovery/index.html index 1638919ff0a98..9221d34a25e53 100644 --- a/content/cn/docs/next/disaster_recovery/index.html +++ b/content/cn/docs/next/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/docker_demo/index.html b/content/cn/docs/next/docker_demo/index.html index 4fc66eede6623..4cd72547adcae 100644 --- a/content/cn/docs/next/docker_demo/index.html +++ b/content/cn/docs/next/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/encryption/index.html b/content/cn/docs/next/encryption/index.html index 94ed85588294f..75a95bbac3328 100644 --- a/content/cn/docs/next/encryption/index.html +++ b/content/cn/docs/next/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/faq/index.html b/content/cn/docs/next/faq/index.html index c33a743d78a94..ef7ed23de59aa 100644 --- a/content/cn/docs/next/faq/index.html +++ b/content/cn/docs/next/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/faq_design_and_concepts/index.html b/content/cn/docs/next/faq_design_and_concepts/index.html index f2db46f6acb90..97fcfd94e1442 100644 --- a/content/cn/docs/next/faq_design_and_concepts/index.html +++ b/content/cn/docs/next/faq_design_and_concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/faq_general/index.html b/content/cn/docs/next/faq_general/index.html index a06eeb0d007d7..9c7c18305b391 100644 --- a/content/cn/docs/next/faq_general/index.html +++ b/content/cn/docs/next/faq_general/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/faq_integrations/index.html b/content/cn/docs/next/faq_integrations/index.html index 371c241226c1e..4355296f747e2 100644 --- a/content/cn/docs/next/faq_integrations/index.html +++ b/content/cn/docs/next/faq_integrations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/faq_reading_tables/index.html b/content/cn/docs/next/faq_reading_tables/index.html index f1f89cd90a9e7..4570a887f2240 100644 --- a/content/cn/docs/next/faq_reading_tables/index.html +++ b/content/cn/docs/next/faq_reading_tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/faq_storage/index.html b/content/cn/docs/next/faq_storage/index.html index 1dc5644f9136d..a0831e8cfc649 100644 --- a/content/cn/docs/next/faq_storage/index.html +++ b/content/cn/docs/next/faq_storage/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/faq_table_services/index.html b/content/cn/docs/next/faq_table_services/index.html index 535b4df7248c6..e64974e8d648c 100644 --- a/content/cn/docs/next/faq_table_services/index.html +++ b/content/cn/docs/next/faq_table_services/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/faq_writing_tables/index.html b/content/cn/docs/next/faq_writing_tables/index.html index 2ae27264e3ae6..f971b44b85cf0 100644 --- a/content/cn/docs/next/faq_writing_tables/index.html +++ b/content/cn/docs/next/faq_writing_tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/file_sizing/index.html b/content/cn/docs/next/file_sizing/index.html index dfb7fce94df05..539f670c86470 100644 --- a/content/cn/docs/next/file_sizing/index.html +++ b/content/cn/docs/next/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/flink-quick-start-guide/index.html b/content/cn/docs/next/flink-quick-start-guide/index.html index db3942727e2ed..ff27322db8fd8 100644 --- a/content/cn/docs/next/flink-quick-start-guide/index.html +++ b/content/cn/docs/next/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/flink_tuning/index.html b/content/cn/docs/next/flink_tuning/index.html index 19c5e63da322e..9cc181c144cb4 100644 --- a/content/cn/docs/next/flink_tuning/index.html +++ b/content/cn/docs/next/flink_tuning/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/gcp_bigquery/index.html b/content/cn/docs/next/gcp_bigquery/index.html index 8fc8dba1deb55..28252f8372c65 100644 --- a/content/cn/docs/next/gcp_bigquery/index.html +++ b/content/cn/docs/next/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/gcs_hoodie/index.html b/content/cn/docs/next/gcs_hoodie/index.html index 75c5d99ca5920..4a4e195417809 100644 --- a/content/cn/docs/next/gcs_hoodie/index.html +++ b/content/cn/docs/next/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/hoodie_streaming_ingestion/index.html b/content/cn/docs/next/hoodie_streaming_ingestion/index.html index c78f54144ff89..bccf525369d41 100644 --- a/content/cn/docs/next/hoodie_streaming_ingestion/index.html +++ b/content/cn/docs/next/hoodie_streaming_ingestion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/hudi_stack/index.html b/content/cn/docs/next/hudi_stack/index.html index acc7fbe8b8b41..56544e7bc05ba 100644 --- a/content/cn/docs/next/hudi_stack/index.html +++ b/content/cn/docs/next/hudi_stack/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/ibm_cos_hoodie/index.html b/content/cn/docs/next/ibm_cos_hoodie/index.html index a22ac3a2de9ab..3375183a5fd77 100644 --- a/content/cn/docs/next/ibm_cos_hoodie/index.html +++ b/content/cn/docs/next/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/indexes/index.html b/content/cn/docs/next/indexes/index.html index 4174e48f93c54..a0ec0e54db12b 100644 --- a/content/cn/docs/next/indexes/index.html +++ b/content/cn/docs/next/indexes/index.html @@ -19,7 +19,7 @@ - + @@ -194,6 +194,10 @@

    Related Resources

    +

    Blogs

    +

    Videos

    • Global Bloom Index: Remove duplicates & guarantee uniquness - Hudi Labs
    • diff --git a/content/cn/docs/next/ingestion_flink/index.html b/content/cn/docs/next/ingestion_flink/index.html index a7d06b553e1cb..28d379f2738a1 100644 --- a/content/cn/docs/next/ingestion_flink/index.html +++ b/content/cn/docs/next/ingestion_flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/ingestion_kafka_connect/index.html b/content/cn/docs/next/ingestion_kafka_connect/index.html index 6c5621d998d08..7afeb34fb76a0 100644 --- a/content/cn/docs/next/ingestion_kafka_connect/index.html +++ b/content/cn/docs/next/ingestion_kafka_connect/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/intro/index.html b/content/cn/docs/next/intro/index.html index e73c4d066f97e..9e001d24e300d 100644 --- a/content/cn/docs/next/intro/index.html +++ b/content/cn/docs/next/intro/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/jfs_hoodie/index.html b/content/cn/docs/next/jfs_hoodie/index.html index 323a5c45339ed..c2bbb8c7b83e0 100644 --- a/content/cn/docs/next/jfs_hoodie/index.html +++ b/content/cn/docs/next/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/key_generation/index.html b/content/cn/docs/next/key_generation/index.html index 35dd10b4e580f..cbb51c8f958ba 100644 --- a/content/cn/docs/next/key_generation/index.html +++ b/content/cn/docs/next/key_generation/index.html @@ -19,7 +19,7 @@ - + @@ -121,8 +121,10 @@

      Related Resources

      +

      Blogs

      diff --git a/content/cn/docs/next/markers/index.html b/content/cn/docs/next/markers/index.html index 7b1a3357cd3ad..4481aee50c5f5 100644 --- a/content/cn/docs/next/markers/index.html +++ b/content/cn/docs/next/markers/index.html @@ -19,7 +19,7 @@ - + @@ -94,7 +94,10 @@

      Marker Configuration Parameters

      -
      Property NameDefaultMeaning
      hoodie.write.markers.typetimeline_server_basedMarker type to use. Two modes are supported: (1) direct: individual marker file corresponding to each data file is directly created by the executor; (2) timeline_server_based: marker operations are all handled at the timeline service which serves as a proxy. New marker entries are batch processed and stored in a limited number of underlying files for efficiency.
      hoodie.markers.timeline_server_based.batch.num_threads20Number of threads to use for batch processing marker creation requests at the timeline server.
      hoodie.markers.timeline_server_based.batch.interval_ms50The batch interval in milliseconds for marker creation batch processing.
      \ No newline at end of file diff --git a/content/cn/docs/next/metadata/index.html b/content/cn/docs/next/metadata/index.html index 9a042b13e65da..6fb359282ca79 100644 --- a/content/cn/docs/next/metadata/index.html +++ b/content/cn/docs/next/metadata/index.html @@ -19,7 +19,7 @@ - + @@ -125,6 +125,7 @@

      Blogs

      diff --git a/content/cn/docs/next/metadata_indexing/index.html b/content/cn/docs/next/metadata_indexing/index.html index f146c5acb63a1..d19758550aeaf 100644 --- a/content/cn/docs/next/metadata_indexing/index.html +++ b/content/cn/docs/next/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/metrics/index.html b/content/cn/docs/next/metrics/index.html index b39d07eef302a..e257ba06feb1b 100644 --- a/content/cn/docs/next/metrics/index.html +++ b/content/cn/docs/next/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/migration_guide/index.html b/content/cn/docs/next/migration_guide/index.html index 1d0930b472816..ae39b76c4fb63 100644 --- a/content/cn/docs/next/migration_guide/index.html +++ b/content/cn/docs/next/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/oci_hoodie/index.html b/content/cn/docs/next/oci_hoodie/index.html index 712752c4d9942..ab436540d6e9e 100644 --- a/content/cn/docs/next/oci_hoodie/index.html +++ b/content/cn/docs/next/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/oss_hoodie/index.html b/content/cn/docs/next/oss_hoodie/index.html index d5922f4d0784b..80ee8ed7edbae 100644 --- a/content/cn/docs/next/oss_hoodie/index.html +++ b/content/cn/docs/next/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/overview/index.html b/content/cn/docs/next/overview/index.html index dd886b5327ddf..81e26dc813f61 100644 --- a/content/cn/docs/next/overview/index.html +++ b/content/cn/docs/next/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/performance/index.html b/content/cn/docs/next/performance/index.html index 2b8adf717d4e9..89a9b8584e9ce 100644 --- a/content/cn/docs/next/performance/index.html +++ b/content/cn/docs/next/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/platform_services_post_commit_callback/index.html b/content/cn/docs/next/platform_services_post_commit_callback/index.html index 31f595468c505..2dc5e099de82c 100644 --- a/content/cn/docs/next/platform_services_post_commit_callback/index.html +++ b/content/cn/docs/next/platform_services_post_commit_callback/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/precommit_validator/index.html b/content/cn/docs/next/precommit_validator/index.html index ced05d73ea5d4..cc3f9bb750d6b 100644 --- a/content/cn/docs/next/precommit_validator/index.html +++ b/content/cn/docs/next/precommit_validator/index.html @@ -19,7 +19,7 @@ - + @@ -60,6 +60,10 @@

      commit notification service that can be configured to trigger notifications about write commits.

      The commit notification service can be combined with pre-commit validators to send a notification when a commit fails a validation. This is possible by passing details about the validation as a custom value to the HTTP endpoint.

      +

      Blogs

      +

      Videos

      • Learn About Apache Hudi Pre Commit Validator with Hands on Lab
      • diff --git a/content/cn/docs/next/privacy/index.html b/content/cn/docs/next/privacy/index.html index e9070fcad9205..c85377b186cd8 100644 --- a/content/cn/docs/next/privacy/index.html +++ b/content/cn/docs/next/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/procedures/index.html b/content/cn/docs/next/procedures/index.html index 78a0889584c06..4995476b5332a 100644 --- a/content/cn/docs/next/procedures/index.html +++ b/content/cn/docs/next/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/python-rust-quick-start-guide/index.html b/content/cn/docs/next/python-rust-quick-start-guide/index.html index 3b0371fbbbf91..404898063fe48 100644 --- a/content/cn/docs/next/python-rust-quick-start-guide/index.html +++ b/content/cn/docs/next/python-rust-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/querying_data/index.html b/content/cn/docs/next/querying_data/index.html index 48acc6da3dc0d..7177e684f487f 100644 --- a/content/cn/docs/next/querying_data/index.html +++ b/content/cn/docs/next/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/quick-start-guide/index.html b/content/cn/docs/next/quick-start-guide/index.html index e5eb672616607..03bc8f9e717f2 100644 --- a/content/cn/docs/next/quick-start-guide/index.html +++ b/content/cn/docs/next/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/reading_tables_batch_reads/index.html b/content/cn/docs/next/reading_tables_batch_reads/index.html index 6fefdcd66fbf3..e9b0aa2d16f8f 100644 --- a/content/cn/docs/next/reading_tables_batch_reads/index.html +++ b/content/cn/docs/next/reading_tables_batch_reads/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/reading_tables_streaming_reads/index.html b/content/cn/docs/next/reading_tables_streaming_reads/index.html index c087ab50231ac..f028d8a717251 100644 --- a/content/cn/docs/next/reading_tables_streaming_reads/index.html +++ b/content/cn/docs/next/reading_tables_streaming_reads/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/record_merger/index.html b/content/cn/docs/next/record_merger/index.html index 47a5b40bc470b..3e5cfa1b91b9b 100644 --- a/content/cn/docs/next/record_merger/index.html +++ b/content/cn/docs/next/record_merger/index.html @@ -19,7 +19,7 @@ - + @@ -138,7 +138,12 @@

        ConfigsMySqlDebeziumAvroPayload and PostgresDebeziumAvroPayload provides support for seamlessly applying changes captured via Debezium for MySQL and PostgresDB. AWSDmsAvroPayload provides support for applying changes captured via Amazon Database Migration Service onto S3. -For full configurations, go here and please check out this FAQ if you want to implement your own custom payloads.

        \ No newline at end of file diff --git a/content/cn/docs/next/rollbacks/index.html b/content/cn/docs/next/rollbacks/index.html index 378c6b2542720..371855f8a7e95 100644 --- a/content/cn/docs/next/rollbacks/index.html +++ b/content/cn/docs/next/rollbacks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/s3_hoodie/index.html b/content/cn/docs/next/s3_hoodie/index.html index beec1cf58ee59..1d0b0a2b9e659 100644 --- a/content/cn/docs/next/s3_hoodie/index.html +++ b/content/cn/docs/next/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/schema_evolution/index.html b/content/cn/docs/next/schema_evolution/index.html index a9804ade3fb44..b8ee5de85626a 100644 --- a/content/cn/docs/next/schema_evolution/index.html +++ b/content/cn/docs/next/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/snapshot_exporter/index.html b/content/cn/docs/next/snapshot_exporter/index.html index 6d7625beebd68..d2f353785c553 100644 --- a/content/cn/docs/next/snapshot_exporter/index.html +++ b/content/cn/docs/next/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/sql_ddl/index.html b/content/cn/docs/next/sql_ddl/index.html index b5e264356bb3a..e053923b7120b 100644 --- a/content/cn/docs/next/sql_ddl/index.html +++ b/content/cn/docs/next/sql_ddl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/sql_dml/index.html b/content/cn/docs/next/sql_dml/index.html index c568e1821f6de..4438145e33ae4 100644 --- a/content/cn/docs/next/sql_dml/index.html +++ b/content/cn/docs/next/sql_dml/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/sql_queries/index.html b/content/cn/docs/next/sql_queries/index.html index 568aa143e611f..ab1284c2d845a 100644 --- a/content/cn/docs/next/sql_queries/index.html +++ b/content/cn/docs/next/sql_queries/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/storage_layouts/index.html b/content/cn/docs/next/storage_layouts/index.html index 9c8843f5a7e3b..f0b4249118d2b 100644 --- a/content/cn/docs/next/storage_layouts/index.html +++ b/content/cn/docs/next/storage_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/structure/index.html b/content/cn/docs/next/structure/index.html index bc62c5ba07682..bdf1ffffebf7e 100644 --- a/content/cn/docs/next/structure/index.html +++ b/content/cn/docs/next/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/syncing_aws_glue_data_catalog/index.html b/content/cn/docs/next/syncing_aws_glue_data_catalog/index.html index bab998516f3c7..0e7b82392a4dd 100644 --- a/content/cn/docs/next/syncing_aws_glue_data_catalog/index.html +++ b/content/cn/docs/next/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/syncing_datahub/index.html b/content/cn/docs/next/syncing_datahub/index.html index e3a5b9ed9daec..006414bc375e0 100644 --- a/content/cn/docs/next/syncing_datahub/index.html +++ b/content/cn/docs/next/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/syncing_metastore/index.html b/content/cn/docs/next/syncing_metastore/index.html index 3a0a15a3c982f..00f8dc4ec1bb2 100644 --- a/content/cn/docs/next/syncing_metastore/index.html +++ b/content/cn/docs/next/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/syncing_xtable/index.html b/content/cn/docs/next/syncing_xtable/index.html index 085d1bbc76246..970cd9975c51c 100644 --- a/content/cn/docs/next/syncing_xtable/index.html +++ b/content/cn/docs/next/syncing_xtable/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/table_types/index.html b/content/cn/docs/next/table_types/index.html index 1f6bbd387dbfe..0d8502bd9b55a 100644 --- a/content/cn/docs/next/table_types/index.html +++ b/content/cn/docs/next/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/timeline/index.html b/content/cn/docs/next/timeline/index.html index 51c31525b8c1e..8332d766aed94 100644 --- a/content/cn/docs/next/timeline/index.html +++ b/content/cn/docs/next/timeline/index.html @@ -19,7 +19,7 @@ - + @@ -122,7 +122,12 @@

        Spark configs<

        Flink jobs using the SQL can be configured through the options in WITH clause. The actual datasource level configs are listed below.

        Config NameDefaultDescription
        archive.max_commits50 (Optional)Max number of commits to keep before archiving older commits into a sequential log, default 50

        Config Param: ARCHIVE_MAX_COMMITS
        archive.min_commits40 (Optional)Min number of commits to keep before archiving older commits into a sequential log, default 40

        Config Param: ARCHIVE_MIN_COMMITS
        hoodie.timeline.compaction.batch.size10 (Optional)Controls the number of parquet files to compact in a single compaction run at the current level of the LSM tree.
        -

        Refer here for more details.

        \ No newline at end of file diff --git a/content/cn/docs/next/troubleshooting/index.html b/content/cn/docs/next/troubleshooting/index.html index d558d24605b46..22c2012ca7186 100644 --- a/content/cn/docs/next/troubleshooting/index.html +++ b/content/cn/docs/next/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/tuning-guide/index.html b/content/cn/docs/next/tuning-guide/index.html index 1886747d7119e..b6266ed07dd4c 100644 --- a/content/cn/docs/next/tuning-guide/index.html +++ b/content/cn/docs/next/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/use_cases/index.html b/content/cn/docs/next/use_cases/index.html index 3b74e35497e7b..76813d3fafd2b 100644 --- a/content/cn/docs/next/use_cases/index.html +++ b/content/cn/docs/next/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/write_operations/index.html b/content/cn/docs/next/write_operations/index.html index c9082a36c838c..a8e9aba4fdfb8 100644 --- a/content/cn/docs/next/write_operations/index.html +++ b/content/cn/docs/next/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/writing_data/index.html b/content/cn/docs/next/writing_data/index.html index 844a2a7482fb7..1136941d97a03 100644 --- a/content/cn/docs/next/writing_data/index.html +++ b/content/cn/docs/next/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/next/writing_tables_streaming_writes/index.html b/content/cn/docs/next/writing_tables_streaming_writes/index.html index 730e8c84e2ece..b3ad9fea20caf 100644 --- a/content/cn/docs/next/writing_tables_streaming_writes/index.html +++ b/content/cn/docs/next/writing_tables_streaming_writes/index.html @@ -19,13 +19,19 @@ - +
        Version: Next

        Streaming Writes

        Spark Streaming

        You can write Hudi tables using spark's structured streaming.

        -
        # pyspark
        # prepare to stream write to new table
        streamingTableName = "hudi_trips_cow_streaming"
        baseStreamingPath = "file:///tmp/hudi_trips_cow_streaming"
        checkpointLocation = "file:///tmp/checkpoints/hudi_trips_cow_streaming"

        hudi_streaming_options = {
        'hoodie.table.name': streamingTableName,
        'hoodie.datasource.write.recordkey.field': 'uuid',
        'hoodie.datasource.write.partitionpath.field': 'partitionpath',
        'hoodie.datasource.write.table.name': streamingTableName,
        'hoodie.datasource.write.operation': 'upsert',
        'hoodie.datasource.write.precombine.field': 'ts',
        'hoodie.upsert.shuffle.parallelism': 2,
        'hoodie.insert.shuffle.parallelism': 2
        }

        # create streaming df
        df = spark.readStream
        .format("hudi")
        .load(basePath)

        # write stream to new hudi table
        df.writeStream.format("hudi")
        .options(**hudi_streaming_options)
        .outputMode("append")
        .option("path", baseStreamingPath)
        .option("checkpointLocation", checkpointLocation)
        .trigger(once=True)
        .start()

        \ No newline at end of file diff --git a/content/cn/docs/oci_hoodie/index.html b/content/cn/docs/oci_hoodie/index.html index 7c24106bfa19c..89fc5b3dfd85a 100644 --- a/content/cn/docs/oci_hoodie/index.html +++ b/content/cn/docs/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/oss_hoodie/index.html b/content/cn/docs/oss_hoodie/index.html index 21b3c6588fde6..35e1d6ec63ea6 100644 --- a/content/cn/docs/oss_hoodie/index.html +++ b/content/cn/docs/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/overview/index.html b/content/cn/docs/overview/index.html index 924a4bbd90da1..bf9837f2e94da 100644 --- a/content/cn/docs/overview/index.html +++ b/content/cn/docs/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/performance/index.html b/content/cn/docs/performance/index.html index a4b3369508c27..ee254398cec6d 100644 --- a/content/cn/docs/performance/index.html +++ b/content/cn/docs/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/platform_services_post_commit_callback/index.html b/content/cn/docs/platform_services_post_commit_callback/index.html index 63a689220b237..e2f89f74cfaed 100644 --- a/content/cn/docs/platform_services_post_commit_callback/index.html +++ b/content/cn/docs/platform_services_post_commit_callback/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/precommit_validator/index.html b/content/cn/docs/precommit_validator/index.html index a83145a668888..f809a45b9efbe 100644 --- a/content/cn/docs/precommit_validator/index.html +++ b/content/cn/docs/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/privacy/index.html b/content/cn/docs/privacy/index.html index b5414ceb1589a..75d9a8d560506 100644 --- a/content/cn/docs/privacy/index.html +++ b/content/cn/docs/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/procedures/index.html b/content/cn/docs/procedures/index.html index f95ae73bc9184..7fe7292625059 100644 --- a/content/cn/docs/procedures/index.html +++ b/content/cn/docs/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/python-rust-quick-start-guide/index.html b/content/cn/docs/python-rust-quick-start-guide/index.html index 8fc6c8b61c30d..c74b317ad22d9 100644 --- a/content/cn/docs/python-rust-quick-start-guide/index.html +++ b/content/cn/docs/python-rust-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/querying_data/index.html b/content/cn/docs/querying_data/index.html index a5ea630d83404..b38fb56205990 100644 --- a/content/cn/docs/querying_data/index.html +++ b/content/cn/docs/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/quick-start-guide/index.html b/content/cn/docs/quick-start-guide/index.html index bd96bcfd9d380..c1815f0ef64a3 100644 --- a/content/cn/docs/quick-start-guide/index.html +++ b/content/cn/docs/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/reading_tables_batch_reads/index.html b/content/cn/docs/reading_tables_batch_reads/index.html index 13b7340d0249e..19b1c685159e9 100644 --- a/content/cn/docs/reading_tables_batch_reads/index.html +++ b/content/cn/docs/reading_tables_batch_reads/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/reading_tables_streaming_reads/index.html b/content/cn/docs/reading_tables_streaming_reads/index.html index 756ae3d373d49..c19d09b45470b 100644 --- a/content/cn/docs/reading_tables_streaming_reads/index.html +++ b/content/cn/docs/reading_tables_streaming_reads/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/record_merger/index.html b/content/cn/docs/record_merger/index.html index c708251c54aa2..094e7e4f3f8c6 100644 --- a/content/cn/docs/record_merger/index.html +++ b/content/cn/docs/record_merger/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/rollbacks/index.html b/content/cn/docs/rollbacks/index.html index 15f750eca2525..b7eeb8961c1da 100644 --- a/content/cn/docs/rollbacks/index.html +++ b/content/cn/docs/rollbacks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/s3_hoodie/index.html b/content/cn/docs/s3_hoodie/index.html index a8aff6f58968d..035ad298728e7 100644 --- a/content/cn/docs/s3_hoodie/index.html +++ b/content/cn/docs/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/schema_evolution/index.html b/content/cn/docs/schema_evolution/index.html index 7cbc2f826b8d4..e8f02e50b0947 100644 --- a/content/cn/docs/schema_evolution/index.html +++ b/content/cn/docs/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/snapshot_exporter/index.html b/content/cn/docs/snapshot_exporter/index.html index 12e45a89f0800..8b1c119cb929a 100644 --- a/content/cn/docs/snapshot_exporter/index.html +++ b/content/cn/docs/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/sql_ddl/index.html b/content/cn/docs/sql_ddl/index.html index 5fa58038dba92..9dfd311137255 100644 --- a/content/cn/docs/sql_ddl/index.html +++ b/content/cn/docs/sql_ddl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/sql_dml/index.html b/content/cn/docs/sql_dml/index.html index 72970a18fb837..2a46c19f69d19 100644 --- a/content/cn/docs/sql_dml/index.html +++ b/content/cn/docs/sql_dml/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/sql_queries/index.html b/content/cn/docs/sql_queries/index.html index a70bffaeec6d1..5ee2c5b83d354 100644 --- a/content/cn/docs/sql_queries/index.html +++ b/content/cn/docs/sql_queries/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/storage_layouts/index.html b/content/cn/docs/storage_layouts/index.html index 379de8ef889a0..3484c2a04cdf0 100644 --- a/content/cn/docs/storage_layouts/index.html +++ b/content/cn/docs/storage_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/structure/index.html b/content/cn/docs/structure/index.html index c5e38a4c4627b..e484c548d6c30 100644 --- a/content/cn/docs/structure/index.html +++ b/content/cn/docs/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/syncing_aws_glue_data_catalog/index.html b/content/cn/docs/syncing_aws_glue_data_catalog/index.html index 36bf926c42210..0232280bdd641 100644 --- a/content/cn/docs/syncing_aws_glue_data_catalog/index.html +++ b/content/cn/docs/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/syncing_datahub/index.html b/content/cn/docs/syncing_datahub/index.html index 72d6852c179c4..f8343c9b8081a 100644 --- a/content/cn/docs/syncing_datahub/index.html +++ b/content/cn/docs/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/syncing_metastore/index.html b/content/cn/docs/syncing_metastore/index.html index e3a6c0b9134ac..9eababbd2b77f 100644 --- a/content/cn/docs/syncing_metastore/index.html +++ b/content/cn/docs/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/syncing_xtable/index.html b/content/cn/docs/syncing_xtable/index.html index c0d7acf0ebfe8..9a42bd8dc0ec7 100644 --- a/content/cn/docs/syncing_xtable/index.html +++ b/content/cn/docs/syncing_xtable/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/table_types/index.html b/content/cn/docs/table_types/index.html index 7cd157680a253..38396f3a35871 100644 --- a/content/cn/docs/table_types/index.html +++ b/content/cn/docs/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/timeline/index.html b/content/cn/docs/timeline/index.html index 59e95d7d911bb..3082ff83e851f 100644 --- a/content/cn/docs/timeline/index.html +++ b/content/cn/docs/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/troubleshooting/index.html b/content/cn/docs/troubleshooting/index.html index 8e84277a5cb4d..6513cb2e0472a 100644 --- a/content/cn/docs/troubleshooting/index.html +++ b/content/cn/docs/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/tuning-guide/index.html b/content/cn/docs/tuning-guide/index.html index 1a473b8d12176..549574cb999f8 100644 --- a/content/cn/docs/tuning-guide/index.html +++ b/content/cn/docs/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/use_cases/index.html b/content/cn/docs/use_cases/index.html index ac47f2e562ee5..c87d02b2e1104 100644 --- a/content/cn/docs/use_cases/index.html +++ b/content/cn/docs/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/write_operations/index.html b/content/cn/docs/write_operations/index.html index 21ad5df83df20..62d4432bf8f25 100644 --- a/content/cn/docs/write_operations/index.html +++ b/content/cn/docs/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/writing_data/index.html b/content/cn/docs/writing_data/index.html index 4139b5ed80d5a..afa063062050a 100644 --- a/content/cn/docs/writing_data/index.html +++ b/content/cn/docs/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/docs/writing_tables_streaming_writes/index.html b/content/cn/docs/writing_tables_streaming_writes/index.html index 6c71775de0aa1..8f38693e3951e 100644 --- a/content/cn/docs/writing_tables_streaming_writes/index.html +++ b/content/cn/docs/writing_tables_streaming_writes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/ecosystem/index.html b/content/cn/ecosystem/index.html index 56e4455e356b1..8c0026c00c115 100644 --- a/content/cn/ecosystem/index.html +++ b/content/cn/ecosystem/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/index.html b/content/cn/index.html index a08669eafeb75..2d9442f2aac7a 100644 --- a/content/cn/index.html +++ b/content/cn/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/learn/use_cases/index.html b/content/cn/learn/use_cases/index.html index a6fc6a8607572..2b56738fab64a 100644 --- a/content/cn/learn/use_cases/index.html +++ b/content/cn/learn/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/markdown-page/index.html b/content/cn/markdown-page/index.html index b95c28c2beadf..3db46936a8693 100644 --- a/content/cn/markdown-page/index.html +++ b/content/cn/markdown-page/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/powered-by/index.html b/content/cn/powered-by/index.html index e39040745da39..ae1d41d1977a9 100644 --- a/content/cn/powered-by/index.html +++ b/content/cn/powered-by/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/quickstart/index.html b/content/cn/quickstart/index.html index 8c369e7d96edc..42198f72e85ed 100644 --- a/content/cn/quickstart/index.html +++ b/content/cn/quickstart/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/download/index.html b/content/cn/releases/download/index.html index d0091ed0eeb4c..f756d9275dfac 100644 --- a/content/cn/releases/download/index.html +++ b/content/cn/releases/download/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/older-releases/index.html b/content/cn/releases/older-releases/index.html index 2c2adaf853bd8..035267e0fb1f9 100644 --- a/content/cn/releases/older-releases/index.html +++ b/content/cn/releases/older-releases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-0.10.0/index.html b/content/cn/releases/release-0.10.0/index.html index f5217b7d030af..af1c4666b222a 100644 --- a/content/cn/releases/release-0.10.0/index.html +++ b/content/cn/releases/release-0.10.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-0.10.1/index.html b/content/cn/releases/release-0.10.1/index.html index c3d6fdb6a59f7..1a03da363580f 100644 --- a/content/cn/releases/release-0.10.1/index.html +++ b/content/cn/releases/release-0.10.1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-0.11.0/index.html b/content/cn/releases/release-0.11.0/index.html index 4139b9a3de906..4bfc4a09a5993 100644 --- a/content/cn/releases/release-0.11.0/index.html +++ b/content/cn/releases/release-0.11.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-0.11.1/index.html b/content/cn/releases/release-0.11.1/index.html index c9a5bbef4b369..77c2e236334c3 100644 --- a/content/cn/releases/release-0.11.1/index.html +++ b/content/cn/releases/release-0.11.1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-0.12.0/index.html b/content/cn/releases/release-0.12.0/index.html index 47a8b5975e8fb..e27a73dc16baf 100644 --- a/content/cn/releases/release-0.12.0/index.html +++ b/content/cn/releases/release-0.12.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-0.12.1/index.html b/content/cn/releases/release-0.12.1/index.html index eebb963ef0c79..eb88a3dc4600f 100644 --- a/content/cn/releases/release-0.12.1/index.html +++ b/content/cn/releases/release-0.12.1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-0.12.2/index.html b/content/cn/releases/release-0.12.2/index.html index d69dab6fcd210..ffad28f4b9980 100644 --- a/content/cn/releases/release-0.12.2/index.html +++ b/content/cn/releases/release-0.12.2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-0.12.3/index.html b/content/cn/releases/release-0.12.3/index.html index 6e2e22d866588..bbc20b5914396 100644 --- a/content/cn/releases/release-0.12.3/index.html +++ b/content/cn/releases/release-0.12.3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-0.13.0/index.html b/content/cn/releases/release-0.13.0/index.html index 543d39bcd2a26..7b164f8eeb307 100644 --- a/content/cn/releases/release-0.13.0/index.html +++ b/content/cn/releases/release-0.13.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-0.13.1/index.html b/content/cn/releases/release-0.13.1/index.html index d388816f7bd6f..7d12eda147d6d 100644 --- a/content/cn/releases/release-0.13.1/index.html +++ b/content/cn/releases/release-0.13.1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-0.14.0/index.html b/content/cn/releases/release-0.14.0/index.html index 50d981c546cbc..55ab5c33036cf 100644 --- a/content/cn/releases/release-0.14.0/index.html +++ b/content/cn/releases/release-0.14.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-0.14.1/index.html b/content/cn/releases/release-0.14.1/index.html index 438304b646f25..44f6e3eed8269 100644 --- a/content/cn/releases/release-0.14.1/index.html +++ b/content/cn/releases/release-0.14.1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-0.15.0/index.html b/content/cn/releases/release-0.15.0/index.html index d5f10b21e00ac..cfc10d9d48ff6 100644 --- a/content/cn/releases/release-0.15.0/index.html +++ b/content/cn/releases/release-0.15.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-0.6.0/index.html b/content/cn/releases/release-0.6.0/index.html index 41114c3521827..e5596949e0968 100644 --- a/content/cn/releases/release-0.6.0/index.html +++ b/content/cn/releases/release-0.6.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-0.7.0/index.html b/content/cn/releases/release-0.7.0/index.html index 5409bafbefd24..61417299f0e8d 100644 --- a/content/cn/releases/release-0.7.0/index.html +++ b/content/cn/releases/release-0.7.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-0.8.0/index.html b/content/cn/releases/release-0.8.0/index.html index e213f5a4d1133..97bb4bc24ff98 100644 --- a/content/cn/releases/release-0.8.0/index.html +++ b/content/cn/releases/release-0.8.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-0.9.0/index.html b/content/cn/releases/release-0.9.0/index.html index de9657e5f4835..dd7bb1118dd26 100644 --- a/content/cn/releases/release-0.9.0/index.html +++ b/content/cn/releases/release-0.9.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-1.0.0-beta1/index.html b/content/cn/releases/release-1.0.0-beta1/index.html index 93bb723eaa66c..575a84c51be57 100644 --- a/content/cn/releases/release-1.0.0-beta1/index.html +++ b/content/cn/releases/release-1.0.0-beta1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-1.0.0-beta2/index.html b/content/cn/releases/release-1.0.0-beta2/index.html index 52f4e65527f62..be83c2d4b647a 100644 --- a/content/cn/releases/release-1.0.0-beta2/index.html +++ b/content/cn/releases/release-1.0.0-beta2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/releases/release-1.0.0/index.html b/content/cn/releases/release-1.0.0/index.html index 6ecd99083ceb6..990f7545daa4e 100644 --- a/content/cn/releases/release-1.0.0/index.html +++ b/content/cn/releases/release-1.0.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/roadmap/index.html b/content/cn/roadmap/index.html index abd98b431235d..e0cb9f2e6a380 100644 --- a/content/cn/roadmap/index.html +++ b/content/cn/roadmap/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/search/index.html b/content/cn/search/index.html index fbbbb7e7935b2..8450c2c9bc6e8 100644 --- a/content/cn/search/index.html +++ b/content/cn/search/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/talks/index.html b/content/cn/talks/index.html index ec1a190985817..db0a69f6b1e8e 100644 --- a/content/cn/talks/index.html +++ b/content/cn/talks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/tech-specs-1point0/index.html b/content/cn/tech-specs-1point0/index.html index b0c261b4f4605..d927da8e64048 100644 --- a/content/cn/tech-specs-1point0/index.html +++ b/content/cn/tech-specs-1point0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/tech-specs/index.html b/content/cn/tech-specs/index.html index 8444ab013361e..1ef0b74e10f59 100644 --- a/content/cn/tech-specs/index.html +++ b/content/cn/tech-specs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/11/17/Insert_Update_Delete_On_Datalake_S3_with_Apache_Hudi_and_glue_Pyspark/index.html b/content/cn/videos/2022/11/17/Insert_Update_Delete_On_Datalake_S3_with_Apache_Hudi_and_glue_Pyspark/index.html index 1edb49a1c4a5e..37712b3575aa6 100644 --- a/content/cn/videos/2022/11/17/Insert_Update_Delete_On_Datalake_S3_with_Apache_Hudi_and_glue_Pyspark/index.html +++ b/content/cn/videos/2022/11/17/Insert_Update_Delete_On_Datalake_S3_with_Apache_Hudi_and_glue_Pyspark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/11/19/Build_a_Spark_pipeline_to_analyze_streaming_data_using_AWS_Glue_Apache_Hudi_S3_and_Athena/index.html b/content/cn/videos/2022/11/19/Build_a_Spark_pipeline_to_analyze_streaming_data_using_AWS_Glue_Apache_Hudi_S3_and_Athena/index.html index 3626cfa42291b..e6965cba09d69 100644 --- a/content/cn/videos/2022/11/19/Build_a_Spark_pipeline_to_analyze_streaming_data_using_AWS_Glue_Apache_Hudi_S3_and_Athena/index.html +++ b/content/cn/videos/2022/11/19/Build_a_Spark_pipeline_to_analyze_streaming_data_using_AWS_Glue_Apache_Hudi_S3_and_Athena/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/11/20/Different_table_types_in_Apache_Hudi_MOR_and_COW_Deep_Dive_By_Sivabalan_Narayanan/index.html b/content/cn/videos/2022/11/20/Different_table_types_in_Apache_Hudi_MOR_and_COW_Deep_Dive_By_Sivabalan_Narayanan/index.html index cd03b3532dbf4..8e799dbe9247f 100644 --- a/content/cn/videos/2022/11/20/Different_table_types_in_Apache_Hudi_MOR_and_COW_Deep_Dive_By_Sivabalan_Narayanan/index.html +++ b/content/cn/videos/2022/11/20/Different_table_types_in_Apache_Hudi_MOR_and_COW_Deep_Dive_By_Sivabalan_Narayanan/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/12/08/Simple_5_Steps_Guide_to_get_started_with_Apache_Hudi_and_Glue_40_and_query_the_data_using_Athena/index.html b/content/cn/videos/2022/12/08/Simple_5_Steps_Guide_to_get_started_with_Apache_Hudi_and_Glue_40_and_query_the_data_using_Athena/index.html index 5e1e1ec07ef67..53b022c2a92ca 100644 --- a/content/cn/videos/2022/12/08/Simple_5_Steps_Guide_to_get_started_with_Apache_Hudi_and_Glue_40_and_query_the_data_using_Athena/index.html +++ b/content/cn/videos/2022/12/08/Simple_5_Steps_Guide_to_get_started_with_Apache_Hudi_and_Glue_40_and_query_the_data_using_Athena/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/12/11/Build_Datalakes_on_S3_with_Apache_HUDI_in_a_easy_way_for_Beginners_with_hands_on_labs_Glue/index.html b/content/cn/videos/2022/12/11/Build_Datalakes_on_S3_with_Apache_HUDI_in_a_easy_way_for_Beginners_with_hands_on_labs_Glue/index.html index 25ecbc1d6e4c7..b7e372e2f13cd 100644 --- a/content/cn/videos/2022/12/11/Build_Datalakes_on_S3_with_Apache_HUDI_in_a_easy_way_for_Beginners_with_hands_on_labs_Glue/index.html +++ b/content/cn/videos/2022/12/11/Build_Datalakes_on_S3_with_Apache_HUDI_in_a_easy_way_for_Beginners_with_hands_on_labs_Glue/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/12/14/Build_Slowly_Changing_Dimensions_Type_2_SCD2_with_Apache_Spark_and_Apache_Hudi_Hands_on_Labs/index.html b/content/cn/videos/2022/12/14/Build_Slowly_Changing_Dimensions_Type_2_SCD2_with_Apache_Spark_and_Apache_Hudi_Hands_on_Labs/index.html index 69d90a4bff84d..3fc1fd22d5514 100644 --- a/content/cn/videos/2022/12/14/Build_Slowly_Changing_Dimensions_Type_2_SCD2_with_Apache_Spark_and_Apache_Hudi_Hands_on_Labs/index.html +++ b/content/cn/videos/2022/12/14/Build_Slowly_Changing_Dimensions_Type_2_SCD2_with_Apache_Spark_and_Apache_Hudi_Hands_on_Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/12/14/Hands_on_Lab_with_using_DynamoDB_as_lock_table_for_Apache_Hudi_Data_Lakes/index.html b/content/cn/videos/2022/12/14/Hands_on_Lab_with_using_DynamoDB_as_lock_table_for_Apache_Hudi_Data_Lakes/index.html index 3eb147bba65bc..ee4bd50862f32 100644 --- a/content/cn/videos/2022/12/14/Hands_on_Lab_with_using_DynamoDB_as_lock_table_for_Apache_Hudi_Data_Lakes/index.html +++ b/content/cn/videos/2022/12/14/Hands_on_Lab_with_using_DynamoDB_as_lock_table_for_Apache_Hudi_Data_Lakes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/12/14/How_to_convert_Existing_data_in_S3_into_Apache_Hudi_Transaction_Datalake_with_Glue_Hands_on_Lab/index.html b/content/cn/videos/2022/12/14/How_to_convert_Existing_data_in_S3_into_Apache_Hudi_Transaction_Datalake_with_Glue_Hands_on_Lab/index.html index 2f71328360f84..40ebd6ce6beb1 100644 --- a/content/cn/videos/2022/12/14/How_to_convert_Existing_data_in_S3_into_Apache_Hudi_Transaction_Datalake_with_Glue_Hands_on_Lab/index.html +++ b/content/cn/videos/2022/12/14/How_to_convert_Existing_data_in_S3_into_Apache_Hudi_Transaction_Datalake_with_Glue_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/12/15/Build_production_Ready_Real_Time_Transaction_Hudi_Datalake_from_DynamoDB_Streams_using_Glue_kinesis/index.html b/content/cn/videos/2022/12/15/Build_production_Ready_Real_Time_Transaction_Hudi_Datalake_from_DynamoDB_Streams_using_Glue_kinesis/index.html index b1cab36289852..56d844a933d3a 100644 --- a/content/cn/videos/2022/12/15/Build_production_Ready_Real_Time_Transaction_Hudi_Datalake_from_DynamoDB_Streams_using_Glue_kinesis/index.html +++ b/content/cn/videos/2022/12/15/Build_production_Ready_Real_Time_Transaction_Hudi_Datalake_from_DynamoDB_Streams_using_Glue_kinesis/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/12/17/Migrate_Certain_Tables_from_ONPREM_DB_using_DMS_into_Apache_Hudi_Transaction_Datalake_with_GlueDemo/index.html b/content/cn/videos/2022/12/17/Migrate_Certain_Tables_from_ONPREM_DB_using_DMS_into_Apache_Hudi_Transaction_Datalake_with_GlueDemo/index.html index 4646571bd6c05..faf0c2041ba62 100644 --- a/content/cn/videos/2022/12/17/Migrate_Certain_Tables_from_ONPREM_DB_using_DMS_into_Apache_Hudi_Transaction_Datalake_with_GlueDemo/index.html +++ b/content/cn/videos/2022/12/17/Migrate_Certain_Tables_from_ONPREM_DB_using_DMS_into_Apache_Hudi_Transaction_Datalake_with_GlueDemo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/12/17/Step_by_Step_Guide_on_Migrate_Certain_Tables_from_DB_using_DMS_into_Apache_Hudi_Transaction_Datalake/index.html b/content/cn/videos/2022/12/17/Step_by_Step_Guide_on_Migrate_Certain_Tables_from_DB_using_DMS_into_Apache_Hudi_Transaction_Datalake/index.html index a134fa832c46d..6e5db9deb3771 100644 --- a/content/cn/videos/2022/12/17/Step_by_Step_Guide_on_Migrate_Certain_Tables_from_DB_using_DMS_into_Apache_Hudi_Transaction_Datalake/index.html +++ b/content/cn/videos/2022/12/17/Step_by_Step_Guide_on_Migrate_Certain_Tables_from_DB_using_DMS_into_Apache_Hudi_Transaction_Datalake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/12/18/InsertUpdateReadWriteSnapShot_Time_Travel_incremental_Query_on_Apache_Hudi_datalake_S3/index.html b/content/cn/videos/2022/12/18/InsertUpdateReadWriteSnapShot_Time_Travel_incremental_Query_on_Apache_Hudi_datalake_S3/index.html index 4fb9af26382bc..1c32ad89062f5 100644 --- a/content/cn/videos/2022/12/18/InsertUpdateReadWriteSnapShot_Time_Travel_incremental_Query_on_Apache_Hudi_datalake_S3/index.html +++ b/content/cn/videos/2022/12/18/InsertUpdateReadWriteSnapShot_Time_Travel_incremental_Query_on_Apache_Hudi_datalake_S3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/12/19/Build_Production_Ready_Alternative_Data_Pipeline_from_DynamoDB_to_Apache_Hudi_PROJECT_DEMO/index.html b/content/cn/videos/2022/12/19/Build_Production_Ready_Alternative_Data_Pipeline_from_DynamoDB_to_Apache_Hudi_PROJECT_DEMO/index.html index 9b7de231c6438..e201c9d92d15b 100644 --- a/content/cn/videos/2022/12/19/Build_Production_Ready_Alternative_Data_Pipeline_from_DynamoDB_to_Apache_Hudi_PROJECT_DEMO/index.html +++ b/content/cn/videos/2022/12/19/Build_Production_Ready_Alternative_Data_Pipeline_from_DynamoDB_to_Apache_Hudi_PROJECT_DEMO/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/12/19/Build_Production_Ready_Alternative_Data_Pipeline_from_DynamoDB_to_Apache_Hudi_Step_by_Step_Guide/index.html b/content/cn/videos/2022/12/19/Build_Production_Ready_Alternative_Data_Pipeline_from_DynamoDB_to_Apache_Hudi_Step_by_Step_Guide/index.html index fc269a85aafa3..77077c2b2215f 100644 --- a/content/cn/videos/2022/12/19/Build_Production_Ready_Alternative_Data_Pipeline_from_DynamoDB_to_Apache_Hudi_Step_by_Step_Guide/index.html +++ b/content/cn/videos/2022/12/19/Build_Production_Ready_Alternative_Data_Pipeline_from_DynamoDB_to_Apache_Hudi_Step_by_Step_Guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/12/20/Getting_started_with_Kafka_and_Glue_to_Build_Real_Time_Apache_Hudi_Transaction_Datalake/index.html b/content/cn/videos/2022/12/20/Getting_started_with_Kafka_and_Glue_to_Build_Real_Time_Apache_Hudi_Transaction_Datalake/index.html index 467e0ab3dedeb..a3da89d65088c 100644 --- a/content/cn/videos/2022/12/20/Getting_started_with_Kafka_and_Glue_to_Build_Real_Time_Apache_Hudi_Transaction_Datalake/index.html +++ b/content/cn/videos/2022/12/20/Getting_started_with_Kafka_and_Glue_to_Build_Real_Time_Apache_Hudi_Transaction_Datalake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/12/21/Learn_Schema_Evolution_in_Apache_Hudi_Transaction_Datalake_with_hands_on_labs/index.html b/content/cn/videos/2022/12/21/Learn_Schema_Evolution_in_Apache_Hudi_Transaction_Datalake_with_hands_on_labs/index.html index b8125dc0cceec..7ff7c7c86b8a7 100644 --- a/content/cn/videos/2022/12/21/Learn_Schema_Evolution_in_Apache_Hudi_Transaction_Datalake_with_hands_on_labs/index.html +++ b/content/cn/videos/2022/12/21/Learn_Schema_Evolution_in_Apache_Hudi_Transaction_Datalake_with_hands_on_labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/12/23/Apache_Hudi_with_DBT_Hands_on_LabTransform_Raw_Hudi_tables_with_DBT_and_Glue_Interactive_Session/index.html b/content/cn/videos/2022/12/23/Apache_Hudi_with_DBT_Hands_on_LabTransform_Raw_Hudi_tables_with_DBT_and_Glue_Interactive_Session/index.html index 2c087eed991d8..632b8765d2bf8 100644 --- a/content/cn/videos/2022/12/23/Apache_Hudi_with_DBT_Hands_on_LabTransform_Raw_Hudi_tables_with_DBT_and_Glue_Interactive_Session/index.html +++ b/content/cn/videos/2022/12/23/Apache_Hudi_with_DBT_Hands_on_LabTransform_Raw_Hudi_tables_with_DBT_and_Glue_Interactive_Session/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/12/24/Apache_Hudi_on_Windows_Machine_Spark_33_and_hadoop27_Step_by_Step_guide_and_Installation_Process/index.html b/content/cn/videos/2022/12/24/Apache_Hudi_on_Windows_Machine_Spark_33_and_hadoop27_Step_by_Step_guide_and_Installation_Process/index.html index 839c1effb7d6d..a7f370c05228b 100644 --- a/content/cn/videos/2022/12/24/Apache_Hudi_on_Windows_Machine_Spark_33_and_hadoop27_Step_by_Step_guide_and_Installation_Process/index.html +++ b/content/cn/videos/2022/12/24/Apache_Hudi_on_Windows_Machine_Spark_33_and_hadoop27_Step_by_Step_guide_and_Installation_Process/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/12/24/Lets_Build_Streaming_Solution_using_Kafka_PySpark_and_Apache_HUDI_Hands_on_Lab_with_code/index.html b/content/cn/videos/2022/12/24/Lets_Build_Streaming_Solution_using_Kafka_PySpark_and_Apache_HUDI_Hands_on_Lab_with_code/index.html index d6a52ac5d69af..3638fc7c1f05c 100644 --- a/content/cn/videos/2022/12/24/Lets_Build_Streaming_Solution_using_Kafka_PySpark_and_Apache_HUDI_Hands_on_Lab_with_code/index.html +++ b/content/cn/videos/2022/12/24/Lets_Build_Streaming_Solution_using_Kafka_PySpark_and_Apache_HUDI_Hands_on_Lab_with_code/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/12/27/Bring_Data_from_Source_using_Debezium_with_CDC_into_Kafka_S3Sink_Build_Hudi_Datalake_Hands_on_lab/index.html b/content/cn/videos/2022/12/27/Bring_Data_from_Source_using_Debezium_with_CDC_into_Kafka_S3Sink_Build_Hudi_Datalake_Hands_on_lab/index.html index bd23c59f0f6a5..b6b3499520ee7 100644 --- a/content/cn/videos/2022/12/27/Bring_Data_from_Source_using_Debezium_with_CDC_into_Kafka_S3Sink_Build_Hudi_Datalake_Hands_on_lab/index.html +++ b/content/cn/videos/2022/12/27/Bring_Data_from_Source_using_Debezium_with_CDC_into_Kafka_S3Sink_Build_Hudi_Datalake_Hands_on_lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/12/28/Comparing_Apache_Hudi_s_MOR_and_COW_Tables_Use_Cases_from_Uber/index.html b/content/cn/videos/2022/12/28/Comparing_Apache_Hudi_s_MOR_and_COW_Tables_Use_Cases_from_Uber/index.html index 63fb3cf69e32e..28405c2ce388b 100644 --- a/content/cn/videos/2022/12/28/Comparing_Apache_Hudi_s_MOR_and_COW_Tables_Use_Cases_from_Uber/index.html +++ b/content/cn/videos/2022/12/28/Comparing_Apache_Hudi_s_MOR_and_COW_Tables_Use_Cases_from_Uber/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2022/12/30/Step_by_Step_guide_how_to_setup_VPC_Subnet_Get_Started_with_HUDI_on_EMR_Installation_Guide/index.html b/content/cn/videos/2022/12/30/Step_by_Step_guide_how_to_setup_VPC_Subnet_Get_Started_with_HUDI_on_EMR_Installation_Guide/index.html index 2ca04984d150d..d170d7400d3ef 100644 --- a/content/cn/videos/2022/12/30/Step_by_Step_guide_how_to_setup_VPC_Subnet_Get_Started_with_HUDI_on_EMR_Installation_Guide/index.html +++ b/content/cn/videos/2022/12/30/Step_by_Step_guide_how_to_setup_VPC_Subnet_Get_Started_with_HUDI_on_EMR_Installation_Guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/01/01/Streaming_ETL_using_Apache_Flink_joining_multiple_Kinesis_streams_Demo/index.html b/content/cn/videos/2023/01/01/Streaming_ETL_using_Apache_Flink_joining_multiple_Kinesis_streams_Demo/index.html index 51c8e04d50e03..c299319a6707c 100644 --- a/content/cn/videos/2023/01/01/Streaming_ETL_using_Apache_Flink_joining_multiple_Kinesis_streams_Demo/index.html +++ b/content/cn/videos/2023/01/01/Streaming_ETL_using_Apache_Flink_joining_multiple_Kinesis_streams_Demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/01/01/Transaction_Hudi_Data_Lake_with_Streaming_ETL_from_Multiple_Kinesis_Streams_Joining_using_Flink/index.html b/content/cn/videos/2023/01/01/Transaction_Hudi_Data_Lake_with_Streaming_ETL_from_Multiple_Kinesis_Streams_Joining_using_Flink/index.html index 175c02f888745..b26b70cf92e75 100644 --- a/content/cn/videos/2023/01/01/Transaction_Hudi_Data_Lake_with_Streaming_ETL_from_Multiple_Kinesis_Streams_Joining_using_Flink/index.html +++ b/content/cn/videos/2023/01/01/Transaction_Hudi_Data_Lake_with_Streaming_ETL_from_Multiple_Kinesis_Streams_Joining_using_Flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/01/11/Great_ArticleApache_Hudi_vs_Delta_Lake_vs_Apache_Iceberg_Lakehouse_Feature_Comparison_by_OneHouse/index.html b/content/cn/videos/2023/01/11/Great_ArticleApache_Hudi_vs_Delta_Lake_vs_Apache_Iceberg_Lakehouse_Feature_Comparison_by_OneHouse/index.html index 28a7f3e8c7914..b799feee2bb5f 100644 --- a/content/cn/videos/2023/01/11/Great_ArticleApache_Hudi_vs_Delta_Lake_vs_Apache_Iceberg_Lakehouse_Feature_Comparison_by_OneHouse/index.html +++ b/content/cn/videos/2023/01/11/Great_ArticleApache_Hudi_vs_Delta_Lake_vs_Apache_Iceberg_Lakehouse_Feature_Comparison_by_OneHouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/01/12/Build_Real_Time_Streaming_Pipeline_with_Apache_Hudi_Kinesis_and_Flink_Hands_on_Lab/index.html b/content/cn/videos/2023/01/12/Build_Real_Time_Streaming_Pipeline_with_Apache_Hudi_Kinesis_and_Flink_Hands_on_Lab/index.html index 242d3220f1991..f125f16ed74b1 100644 --- a/content/cn/videos/2023/01/12/Build_Real_Time_Streaming_Pipeline_with_Apache_Hudi_Kinesis_and_Flink_Hands_on_Lab/index.html +++ b/content/cn/videos/2023/01/12/Build_Real_Time_Streaming_Pipeline_with_Apache_Hudi_Kinesis_and_Flink_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/01/13/Build_Real_Time_Low_Latency_Streaming_pipeline_from_DynamoDB_to_Apache_Hudi_using_Kinesis_FlinkLab/index.html b/content/cn/videos/2023/01/13/Build_Real_Time_Low_Latency_Streaming_pipeline_from_DynamoDB_to_Apache_Hudi_using_Kinesis_FlinkLab/index.html index ffd63c934bdd6..0772570316de5 100644 --- a/content/cn/videos/2023/01/13/Build_Real_Time_Low_Latency_Streaming_pipeline_from_DynamoDB_to_Apache_Hudi_using_Kinesis_FlinkLab/index.html +++ b/content/cn/videos/2023/01/13/Build_Real_Time_Low_Latency_Streaming_pipeline_from_DynamoDB_to_Apache_Hudi_using_Kinesis_FlinkLab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/01/15/Real_Time_Streaming_Data_Pipeline_From_Aurora_Postgres_to_Hudi_with_DMS_Kinesis_and_Flink_DEMO/index.html b/content/cn/videos/2023/01/15/Real_Time_Streaming_Data_Pipeline_From_Aurora_Postgres_to_Hudi_with_DMS_Kinesis_and_Flink_DEMO/index.html index 4c94b9042edcd..2e71ee178cc1e 100644 --- a/content/cn/videos/2023/01/15/Real_Time_Streaming_Data_Pipeline_From_Aurora_Postgres_to_Hudi_with_DMS_Kinesis_and_Flink_DEMO/index.html +++ b/content/cn/videos/2023/01/15/Real_Time_Streaming_Data_Pipeline_From_Aurora_Postgres_to_Hudi_with_DMS_Kinesis_and_Flink_DEMO/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/01/16/Real_Time_Streaming_Pipeline_From_Aurora_Postgres_to_Hudi_with_DMS_Kinesis_and_Flink_Hands_on_Lab/index.html b/content/cn/videos/2023/01/16/Real_Time_Streaming_Pipeline_From_Aurora_Postgres_to_Hudi_with_DMS_Kinesis_and_Flink_Hands_on_Lab/index.html index 97b684f45b236..5f42b69680c20 100644 --- a/content/cn/videos/2023/01/16/Real_Time_Streaming_Pipeline_From_Aurora_Postgres_to_Hudi_with_DMS_Kinesis_and_Flink_Hands_on_Lab/index.html +++ b/content/cn/videos/2023/01/16/Real_Time_Streaming_Pipeline_From_Aurora_Postgres_to_Hudi_with_DMS_Kinesis_and_Flink_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/01/17/Cleaner_Service_Save_up_to_40_on_data_lake_storage_costs_Hudi_Labs/index.html b/content/cn/videos/2023/01/17/Cleaner_Service_Save_up_to_40_on_data_lake_storage_costs_Hudi_Labs/index.html index 57e04066795e3..45bc1aa33619d 100644 --- a/content/cn/videos/2023/01/17/Cleaner_Service_Save_up_to_40_on_data_lake_storage_costs_Hudi_Labs/index.html +++ b/content/cn/videos/2023/01/17/Cleaner_Service_Save_up_to_40_on_data_lake_storage_costs_Hudi_Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/01/17/Global_Bloom_Index_Remove_duplicates_guarantee_uniquness_Hudi_Labs/index.html b/content/cn/videos/2023/01/17/Global_Bloom_Index_Remove_duplicates_guarantee_uniquness_Hudi_Labs/index.html index a70ab065677e2..9783d11a3c74b 100644 --- a/content/cn/videos/2023/01/17/Global_Bloom_Index_Remove_duplicates_guarantee_uniquness_Hudi_Labs/index.html +++ b/content/cn/videos/2023/01/17/Global_Bloom_Index_Remove_duplicates_guarantee_uniquness_Hudi_Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/01/17/How_businesses_use_Hudi_Soft_delete_features_to_do_soft_delete_instead_of_hard_delete_on_Datalake/index.html b/content/cn/videos/2023/01/17/How_businesses_use_Hudi_Soft_delete_features_to_do_soft_delete_instead_of_hard_delete_on_Datalake/index.html index bc5a47702c24f..729d2ba21e744 100644 --- a/content/cn/videos/2023/01/17/How_businesses_use_Hudi_Soft_delete_features_to_do_soft_delete_instead_of_hard_delete_on_Datalake/index.html +++ b/content/cn/videos/2023/01/17/How_businesses_use_Hudi_Soft_delete_features_to_do_soft_delete_instead_of_hard_delete_on_Datalake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/01/17/Leverage_Apache_Hudi_incremental_query_to_process_new_updated_data_Hudi_Labs/index.html b/content/cn/videos/2023/01/17/Leverage_Apache_Hudi_incremental_query_to_process_new_updated_data_Hudi_Labs/index.html index 1dc8de92d903d..a8a460164748d 100644 --- a/content/cn/videos/2023/01/17/Leverage_Apache_Hudi_incremental_query_to_process_new_updated_data_Hudi_Labs/index.html +++ b/content/cn/videos/2023/01/17/Leverage_Apache_Hudi_incremental_query_to_process_new_updated_data_Hudi_Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/01/17/Leverage_Apache_Hudi_upsert_to_remove_duplicates_on_a_data_lake_Hudi_Labs/index.html b/content/cn/videos/2023/01/17/Leverage_Apache_Hudi_upsert_to_remove_duplicates_on_a_data_lake_Hudi_Labs/index.html index 481c4087484be..fe22f509f7e5f 100644 --- a/content/cn/videos/2023/01/17/Leverage_Apache_Hudi_upsert_to_remove_duplicates_on_a_data_lake_Hudi_Labs/index.html +++ b/content/cn/videos/2023/01/17/Leverage_Apache_Hudi_upsert_to_remove_duplicates_on_a_data_lake_Hudi_Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/01/17/Precomb_Key_Overview_Avoid_dedupes_Hudi_Labs/index.html b/content/cn/videos/2023/01/17/Precomb_Key_Overview_Avoid_dedupes_Hudi_Labs/index.html index 0be3a9362d64d..b3186e3295f65 100644 --- a/content/cn/videos/2023/01/17/Precomb_Key_Overview_Avoid_dedupes_Hudi_Labs/index.html +++ b/content/cn/videos/2023/01/17/Precomb_Key_Overview_Avoid_dedupes_Hudi_Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/01/17/Use_Apache_Hudi_for_hard_deletes_on_your_data_lake_for_data_governance_Hudi_Labs/index.html b/content/cn/videos/2023/01/17/Use_Apache_Hudi_for_hard_deletes_on_your_data_lake_for_data_governance_Hudi_Labs/index.html index 3fc91da966cd6..d4b729dea6680 100644 --- a/content/cn/videos/2023/01/17/Use_Apache_Hudi_for_hard_deletes_on_your_data_lake_for_data_governance_Hudi_Labs/index.html +++ b/content/cn/videos/2023/01/17/Use_Apache_Hudi_for_hard_deletes_on_your_data_lake_for_data_governance_Hudi_Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/01/20/How_do_I_identify_Schema_Changes_in_Hudi_Tables_and_Send_Email_Alert_when_New_Column_addedremoved/index.html b/content/cn/videos/2023/01/20/How_do_I_identify_Schema_Changes_in_Hudi_Tables_and_Send_Email_Alert_when_New_Column_addedremoved/index.html index d022cbc4cf731..5c6939e0b2c75 100644 --- a/content/cn/videos/2023/01/20/How_do_I_identify_Schema_Changes_in_Hudi_Tables_and_Send_Email_Alert_when_New_Column_addedremoved/index.html +++ b/content/cn/videos/2023/01/20/How_do_I_identify_Schema_Changes_in_Hudi_Tables_and_Send_Email_Alert_when_New_Column_addedremoved/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/01/21/How_to_detect_and_Mask_PII_data_in_Apache_Hudi_Data_Lake_Hands_on_Lab/index.html b/content/cn/videos/2023/01/21/How_to_detect_and_Mask_PII_data_in_Apache_Hudi_Data_Lake_Hands_on_Lab/index.html index 0cadd15f53cf8..e9ba36fff6139 100644 --- a/content/cn/videos/2023/01/21/How_to_detect_and_Mask_PII_data_in_Apache_Hudi_Data_Lake_Hands_on_Lab/index.html +++ b/content/cn/videos/2023/01/21/How_to_detect_and_Mask_PII_data_in_Apache_Hudi_Data_Lake_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/01/23/Writing_data_quality_and_validation_scripts_for_a_Hudi_data_lake_with_AWS_Glue_and_pydeequ_Hands_on_Lab/index.html b/content/cn/videos/2023/01/23/Writing_data_quality_and_validation_scripts_for_a_Hudi_data_lake_with_AWS_Glue_and_pydeequ_Hands_on_Lab/index.html index 9c9e2390f2106..1745ba6c979c0 100644 --- a/content/cn/videos/2023/01/23/Writing_data_quality_and_validation_scripts_for_a_Hudi_data_lake_with_AWS_Glue_and_pydeequ_Hands_on_Lab/index.html +++ b/content/cn/videos/2023/01/23/Writing_data_quality_and_validation_scripts_for_a_Hudi_data_lake_with_AWS_Glue_and_pydeequ_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/01/28/Learn_How_to_restrict_Intern_from_accessing_Certain_Column_in_Hudi_Datalake_with_lake_Formation/index.html b/content/cn/videos/2023/01/28/Learn_How_to_restrict_Intern_from_accessing_Certain_Column_in_Hudi_Datalake_with_lake_Formation/index.html index 943a68fa9a988..dc86495b0453f 100644 --- a/content/cn/videos/2023/01/28/Learn_How_to_restrict_Intern_from_accessing_Certain_Column_in_Hudi_Datalake_with_lake_Formation/index.html +++ b/content/cn/videos/2023/01/28/Learn_How_to_restrict_Intern_from_accessing_Certain_Column_in_Hudi_Datalake_with_lake_Formation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/02/07/How_do_I_Ingest_Extremely_Small_Files_into_Hudi_Data_lake_with_Glue_Incremental_data_processing/index.html b/content/cn/videos/2023/02/07/How_do_I_Ingest_Extremely_Small_Files_into_Hudi_Data_lake_with_Glue_Incremental_data_processing/index.html index 4a3583d639653..b7ffac7f79ad8 100644 --- a/content/cn/videos/2023/02/07/How_do_I_Ingest_Extremely_Small_Files_into_Hudi_Data_lake_with_Glue_Incremental_data_processing/index.html +++ b/content/cn/videos/2023/02/07/How_do_I_Ingest_Extremely_Small_Files_into_Hudi_Data_lake_with_Glue_Incremental_data_processing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/02/11/Create_Your_Hudi_Transaction_Datalake_on_S3_with_EMR_Serverless_for_Beginners_in_fun_and_easy_way/index.html b/content/cn/videos/2023/02/11/Create_Your_Hudi_Transaction_Datalake_on_S3_with_EMR_Serverless_for_Beginners_in_fun_and_easy_way/index.html index 2f4ecd07f3d5e..f0e0496f1b991 100644 --- a/content/cn/videos/2023/02/11/Create_Your_Hudi_Transaction_Datalake_on_S3_with_EMR_Serverless_for_Beginners_in_fun_and_easy_way/index.html +++ b/content/cn/videos/2023/02/11/Create_Your_Hudi_Transaction_Datalake_on_S3_with_EMR_Serverless_for_Beginners_in_fun_and_easy_way/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/02/18/Streaming_Ingestion_from_MongoDB_into_Hudi_with_Glue_kinesis_Event_bridge_MongoStream_Hands_on_labs/index.html b/content/cn/videos/2023/02/18/Streaming_Ingestion_from_MongoDB_into_Hudi_with_Glue_kinesis_Event_bridge_MongoStream_Hands_on_labs/index.html index 55a2789e895f8..63593eba5d224 100644 --- a/content/cn/videos/2023/02/18/Streaming_Ingestion_from_MongoDB_into_Hudi_with_Glue_kinesis_Event_bridge_MongoStream_Hands_on_labs/index.html +++ b/content/cn/videos/2023/02/18/Streaming_Ingestion_from_MongoDB_into_Hudi_with_Glue_kinesis_Event_bridge_MongoStream_Hands_on_labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/02/21/Apache_Hudi_Bulk_Insert_Sort_Modes_a_summary_of_two_incredible_blogs/index.html b/content/cn/videos/2023/02/21/Apache_Hudi_Bulk_Insert_Sort_Modes_a_summary_of_two_incredible_blogs/index.html index 397d391a97584..32e5d8a03d891 100644 --- a/content/cn/videos/2023/02/21/Apache_Hudi_Bulk_Insert_Sort_Modes_a_summary_of_two_incredible_blogs/index.html +++ b/content/cn/videos/2023/02/21/Apache_Hudi_Bulk_Insert_Sort_Modes_a_summary_of_two_incredible_blogs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/02/22/Use_Glue_40_to_take_regular_save_points_for_your_Hudi_tables_for_backup_or_disaster_Recovery/index.html b/content/cn/videos/2023/02/22/Use_Glue_40_to_take_regular_save_points_for_your_Hudi_tables_for_backup_or_disaster_Recovery/index.html index 13702de660ffe..913522adafd24 100644 --- a/content/cn/videos/2023/02/22/Use_Glue_40_to_take_regular_save_points_for_your_Hudi_tables_for_backup_or_disaster_Recovery/index.html +++ b/content/cn/videos/2023/02/22/Use_Glue_40_to_take_regular_save_points_for_your_Hudi_tables_for_backup_or_disaster_Recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/02/25/RFC51_Change_Data_Capture_in_Apache_Hudi_like_Debezium_and_AWS_DMS_Hands_on_Labs/index.html b/content/cn/videos/2023/02/25/RFC51_Change_Data_Capture_in_Apache_Hudi_like_Debezium_and_AWS_DMS_Hands_on_Labs/index.html index 6c2c6420c96c9..8aee43203d165 100644 --- a/content/cn/videos/2023/02/25/RFC51_Change_Data_Capture_in_Apache_Hudi_like_Debezium_and_AWS_DMS_Hands_on_Labs/index.html +++ b/content/cn/videos/2023/02/25/RFC51_Change_Data_Capture_in_Apache_Hudi_like_Debezium_and_AWS_DMS_Hands_on_Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/02/26/Python_helper_class_which_makes_querying_incremental_data_from_Hudi_Data_lakes_easy/index.html b/content/cn/videos/2023/02/26/Python_helper_class_which_makes_querying_incremental_data_from_Hudi_Data_lakes_easy/index.html index 327ad12276790..6e89c55e588df 100644 --- a/content/cn/videos/2023/02/26/Python_helper_class_which_makes_querying_incremental_data_from_Hudi_Data_lakes_easy/index.html +++ b/content/cn/videos/2023/02/26/Python_helper_class_which_makes_querying_incremental_data_from_Hudi_Data_lakes_easy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/04/Develop_Incremental_Pipeline_with_CDC_from_Hudi_to_Aurora_Postgres_Demo_Video/index.html b/content/cn/videos/2023/03/04/Develop_Incremental_Pipeline_with_CDC_from_Hudi_to_Aurora_Postgres_Demo_Video/index.html index 0c27ec67bb382..13e2300c3c2d8 100644 --- a/content/cn/videos/2023/03/04/Develop_Incremental_Pipeline_with_CDC_from_Hudi_to_Aurora_Postgres_Demo_Video/index.html +++ b/content/cn/videos/2023/03/04/Develop_Incremental_Pipeline_with_CDC_from_Hudi_to_Aurora_Postgres_Demo_Video/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/06/Power_your_Down_Stream_ElasticSearch_Stack_From_Apache_Hudi_Transaction_Datalake_with_CDCDemo_Video/index.html b/content/cn/videos/2023/03/06/Power_your_Down_Stream_ElasticSearch_Stack_From_Apache_Hudi_Transaction_Datalake_with_CDCDemo_Video/index.html index 16330ec86b3d9..b951e37c291b7 100644 --- a/content/cn/videos/2023/03/06/Power_your_Down_Stream_ElasticSearch_Stack_From_Apache_Hudi_Transaction_Datalake_with_CDCDemo_Video/index.html +++ b/content/cn/videos/2023/03/06/Power_your_Down_Stream_ElasticSearch_Stack_From_Apache_Hudi_Transaction_Datalake_with_CDCDemo_Video/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/06/Power_your_Down_Stream_Elastic_Search_Stack_From_Apache_Hudi_Transaction_Datalake_with_CDCDeepDive/index.html b/content/cn/videos/2023/03/06/Power_your_Down_Stream_Elastic_Search_Stack_From_Apache_Hudi_Transaction_Datalake_with_CDCDeepDive/index.html index 1c804bb885257..08c5db5d41aff 100644 --- a/content/cn/videos/2023/03/06/Power_your_Down_Stream_Elastic_Search_Stack_From_Apache_Hudi_Transaction_Datalake_with_CDCDeepDive/index.html +++ b/content/cn/videos/2023/03/06/Power_your_Down_Stream_Elastic_Search_Stack_From_Apache_Hudi_Transaction_Datalake_with_CDCDeepDive/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/07/How_to_Rollback_to_Previous_Checkpoint_during_Disaster_in_Apache_Hudi_using_Glue_40_Demo/index.html b/content/cn/videos/2023/03/07/How_to_Rollback_to_Previous_Checkpoint_during_Disaster_in_Apache_Hudi_using_Glue_40_Demo/index.html index 75efd625ae4b0..92f040a734f91 100644 --- a/content/cn/videos/2023/03/07/How_to_Rollback_to_Previous_Checkpoint_during_Disaster_in_Apache_Hudi_using_Glue_40_Demo/index.html +++ b/content/cn/videos/2023/03/07/How_to_Rollback_to_Previous_Checkpoint_during_Disaster_in_Apache_Hudi_using_Glue_40_Demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/11/How_do_I_read_data_from_Cross_Account_S3_Buckets_and_Build_Hudi_Datalake_in_Datateam_Account/index.html b/content/cn/videos/2023/03/11/How_do_I_read_data_from_Cross_Account_S3_Buckets_and_Build_Hudi_Datalake_in_Datateam_Account/index.html index 497e70cff1050..3df519c17502f 100644 --- a/content/cn/videos/2023/03/11/How_do_I_read_data_from_Cross_Account_S3_Buckets_and_Build_Hudi_Datalake_in_Datateam_Account/index.html +++ b/content/cn/videos/2023/03/11/How_do_I_read_data_from_Cross_Account_S3_Buckets_and_Build_Hudi_Datalake_in_Datateam_Account/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/11/Query_crossaccount_Hudi_Glue_Data_Catalogs_using_Amazon_Athena/index.html b/content/cn/videos/2023/03/11/Query_crossaccount_Hudi_Glue_Data_Catalogs_using_Amazon_Athena/index.html index a4a583aab482e..122b872dffb54 100644 --- a/content/cn/videos/2023/03/11/Query_crossaccount_Hudi_Glue_Data_Catalogs_using_Amazon_Athena/index.html +++ b/content/cn/videos/2023/03/11/Query_crossaccount_Hudi_Glue_Data_Catalogs_using_Amazon_Athena/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/15/Learn_About_Bucket_Index_SIMPLE_In_Apache_Hudi_with_lab/index.html b/content/cn/videos/2023/03/15/Learn_About_Bucket_Index_SIMPLE_In_Apache_Hudi_with_lab/index.html index 1ed2e0a8dbf1e..552c5609219a7 100644 --- a/content/cn/videos/2023/03/15/Learn_About_Bucket_Index_SIMPLE_In_Apache_Hudi_with_lab/index.html +++ b/content/cn/videos/2023/03/15/Learn_About_Bucket_Index_SIMPLE_In_Apache_Hudi_with_lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/17/Setting_Uber_s_Transactional_Data_Lake_in_Motion_with_Incremental_ETL_Using_Apache_Hudi/index.html b/content/cn/videos/2023/03/17/Setting_Uber_s_Transactional_Data_Lake_in_Motion_with_Incremental_ETL_Using_Apache_Hudi/index.html index 99167cf9ba4b8..a546bc677efae 100644 --- a/content/cn/videos/2023/03/17/Setting_Uber_s_Transactional_Data_Lake_in_Motion_with_Incremental_ETL_Using_Apache_Hudi/index.html +++ b/content/cn/videos/2023/03/17/Setting_Uber_s_Transactional_Data_Lake_in_Motion_with_Incremental_ETL_Using_Apache_Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/18/Push_Hudi_Commit_Notification_TO_HTTP_URI_with_Callback/index.html b/content/cn/videos/2023/03/18/Push_Hudi_Commit_Notification_TO_HTTP_URI_with_Callback/index.html index 9cd44a2566408..6755a96252692 100644 --- a/content/cn/videos/2023/03/18/Push_Hudi_Commit_Notification_TO_HTTP_URI_with_Callback/index.html +++ b/content/cn/videos/2023/03/18/Push_Hudi_Commit_Notification_TO_HTTP_URI_with_Callback/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/19/RFC_18_Insert_Overwrite_in_Apache_Hudi_with_Example/index.html b/content/cn/videos/2023/03/19/RFC_18_Insert_Overwrite_in_Apache_Hudi_with_Example/index.html index afa1ff7a1c1de..0df1fbc0685fc 100644 --- a/content/cn/videos/2023/03/19/RFC_18_Insert_Overwrite_in_Apache_Hudi_with_Example/index.html +++ b/content/cn/videos/2023/03/19/RFC_18_Insert_Overwrite_in_Apache_Hudi_with_Example/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/21/RFC_42_Consistent_Hashing_in_Apache_Hudi_MOR_Tables/index.html b/content/cn/videos/2023/03/21/RFC_42_Consistent_Hashing_in_Apache_Hudi_MOR_Tables/index.html index 47c2c24e0c770..813e6f922d095 100644 --- a/content/cn/videos/2023/03/21/RFC_42_Consistent_Hashing_in_Apache_Hudi_MOR_Tables/index.html +++ b/content/cn/videos/2023/03/21/RFC_42_Consistent_Hashing_in_Apache_Hudi_MOR_Tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/24/Data_Analysis_for_Apache_Hudi_Blogs_on_Medium_with_Pandas/index.html b/content/cn/videos/2023/03/24/Data_Analysis_for_Apache_Hudi_Blogs_on_Medium_with_Pandas/index.html index 710b5083573f0..9f28b5862ea5c 100644 --- a/content/cn/videos/2023/03/24/Data_Analysis_for_Apache_Hudi_Blogs_on_Medium_with_Pandas/index.html +++ b/content/cn/videos/2023/03/24/Data_Analysis_for_Apache_Hudi_Blogs_on_Medium_with_Pandas/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_1/index.html b/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_1/index.html index 90e66dbc53682..76f22f583ceec 100644 --- a/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_1/index.html +++ b/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_2/index.html b/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_2/index.html index afac652da61dd..548e31fabd91b 100644 --- a/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_2/index.html +++ b/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_3/index.html b/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_3/index.html index b6a6a76042226..af2793b767338 100644 --- a/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_3/index.html +++ b/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_4/index.html b/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_4/index.html index 5e83513909350..9933996842bde 100644 --- a/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_4/index.html +++ b/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_5/index.html b/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_5/index.html index 0cb4f3b404aa3..72bbbf7ee1409 100644 --- a/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_5/index.html +++ b/content/cn/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/25/Weekend_Project_Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_1/index.html b/content/cn/videos/2023/03/25/Weekend_Project_Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_1/index.html index 5aeecc2e19dac..889d2431fb75f 100644 --- a/content/cn/videos/2023/03/25/Weekend_Project_Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_1/index.html +++ b/content/cn/videos/2023/03/25/Weekend_Project_Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/26/How_to_use_Apache_Hudi_with_AWS_Glue_Studio_Visual_Editor_Hands_on_Lab/index.html b/content/cn/videos/2023/03/26/How_to_use_Apache_Hudi_with_AWS_Glue_Studio_Visual_Editor_Hands_on_Lab/index.html index f778c33370bcc..c3e6c530e6e60 100644 --- a/content/cn/videos/2023/03/26/How_to_use_Apache_Hudi_with_AWS_Glue_Studio_Visual_Editor_Hands_on_Lab/index.html +++ b/content/cn/videos/2023/03/26/How_to_use_Apache_Hudi_with_AWS_Glue_Studio_Visual_Editor_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_1/index.html b/content/cn/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_1/index.html index 9f533d405e509..4110fd07f2b26 100644 --- a/content/cn/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_1/index.html +++ b/content/cn/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_2/index.html b/content/cn/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_2/index.html index d4dc98e73e524..89302bb953c66 100644 --- a/content/cn/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_2/index.html +++ b/content/cn/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_3/index.html b/content/cn/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_3/index.html index 3d0ef64b63b95..ab620ae667430 100644 --- a/content/cn/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_3/index.html +++ b/content/cn/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_4/index.html b/content/cn/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_4/index.html index ec43ed5dc7b9d..7b7d317a0a1dc 100644 --- a/content/cn/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_4/index.html +++ b/content/cn/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/03/31/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_5/index.html b/content/cn/videos/2023/03/31/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_5/index.html index c37ea5103b6d6..446763738dba0 100644 --- a/content/cn/videos/2023/03/31/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_5/index.html +++ b/content/cn/videos/2023/03/31/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/04/02/Learn_How_to_Integrate_Apache_Hudi_with_Redshift_Spectrum_Hands_on_Labs_with_Code/index.html b/content/cn/videos/2023/04/02/Learn_How_to_Integrate_Apache_Hudi_with_Redshift_Spectrum_Hands_on_Labs_with_Code/index.html index 47ab8709896e5..4e78bcbb5076c 100644 --- a/content/cn/videos/2023/04/02/Learn_How_to_Integrate_Apache_Hudi_with_Redshift_Spectrum_Hands_on_Labs_with_Code/index.html +++ b/content/cn/videos/2023/04/02/Learn_How_to_Integrate_Apache_Hudi_with_Redshift_Spectrum_Hands_on_Labs_with_Code/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/04/04/Running_Apache_Hudi_Delta_Streamer_On_EMR_Serverless_Hands_on_Lab_step_by_step_guide/index.html b/content/cn/videos/2023/04/04/Running_Apache_Hudi_Delta_Streamer_On_EMR_Serverless_Hands_on_Lab_step_by_step_guide/index.html index 2e815fe1ff3d4..9cf5f70e756f6 100644 --- a/content/cn/videos/2023/04/04/Running_Apache_Hudi_Delta_Streamer_On_EMR_Serverless_Hands_on_Lab_step_by_step_guide/index.html +++ b/content/cn/videos/2023/04/04/Running_Apache_Hudi_Delta_Streamer_On_EMR_Serverless_Hands_on_Lab_step_by_step_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/04/05/Getting_Alerts_when_hudi_Delta_Streamer_Fails_with_Event_Driven_Approach_using_Lambdas_Event_Bridge/index.html b/content/cn/videos/2023/04/05/Getting_Alerts_when_hudi_Delta_Streamer_Fails_with_Event_Driven_Approach_using_Lambdas_Event_Bridge/index.html index 17922c3ff53bf..9fbe4d1dfae5f 100644 --- a/content/cn/videos/2023/04/05/Getting_Alerts_when_hudi_Delta_Streamer_Fails_with_Event_Driven_Approach_using_Lambdas_Event_Bridge/index.html +++ b/content/cn/videos/2023/04/05/Getting_Alerts_when_hudi_Delta_Streamer_Fails_with_Event_Driven_Approach_using_Lambdas_Event_Bridge/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/04/06/Efficient_Data_Lake_Management_with_Apache_Hudi_Cleaner_Benefits_of_Scheduling_Data_Cleaning_1/index.html b/content/cn/videos/2023/04/06/Efficient_Data_Lake_Management_with_Apache_Hudi_Cleaner_Benefits_of_Scheduling_Data_Cleaning_1/index.html index d93f98b5f25f8..f3b654d090259 100644 --- a/content/cn/videos/2023/04/06/Efficient_Data_Lake_Management_with_Apache_Hudi_Cleaner_Benefits_of_Scheduling_Data_Cleaning_1/index.html +++ b/content/cn/videos/2023/04/06/Efficient_Data_Lake_Management_with_Apache_Hudi_Cleaner_Benefits_of_Scheduling_Data_Cleaning_1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/04/06/Efficient_Data_Lake_Management_with_Apache_Hudi_Cleaner_Benefits_of_Scheduling_Data_Cleaning_2/index.html b/content/cn/videos/2023/04/06/Efficient_Data_Lake_Management_with_Apache_Hudi_Cleaner_Benefits_of_Scheduling_Data_Cleaning_2/index.html index 3c52b1a6bcd70..30731f5b47827 100644 --- a/content/cn/videos/2023/04/06/Efficient_Data_Lake_Management_with_Apache_Hudi_Cleaner_Benefits_of_Scheduling_Data_Cleaning_2/index.html +++ b/content/cn/videos/2023/04/06/Efficient_Data_Lake_Management_with_Apache_Hudi_Cleaner_Benefits_of_Scheduling_Data_Cleaning_2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/04/07/Advantages_of_Metadata_Indexing_and_Asynchronous_Indexing_in_Hudi_Hands_on_Lab/index.html b/content/cn/videos/2023/04/07/Advantages_of_Metadata_Indexing_and_Asynchronous_Indexing_in_Hudi_Hands_on_Lab/index.html index 8c3782591aba4..dd5c428ed1de9 100644 --- a/content/cn/videos/2023/04/07/Advantages_of_Metadata_Indexing_and_Asynchronous_Indexing_in_Hudi_Hands_on_Lab/index.html +++ b/content/cn/videos/2023/04/07/Advantages_of_Metadata_Indexing_and_Asynchronous_Indexing_in_Hudi_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/04/08/Understanding_Clustering_in_Apache_Hudi_and_the_Benefits_of_Asynchronous_Clustering/index.html b/content/cn/videos/2023/04/08/Understanding_Clustering_in_Apache_Hudi_and_the_Benefits_of_Asynchronous_Clustering/index.html index c9cadfadc47a5..ece72c21ba82f 100644 --- a/content/cn/videos/2023/04/08/Understanding_Clustering_in_Apache_Hudi_and_the_Benefits_of_Asynchronous_Clustering/index.html +++ b/content/cn/videos/2023/04/08/Understanding_Clustering_in_Apache_Hudi_and_the_Benefits_of_Asynchronous_Clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/04/09/Bootstrapping_in_Apache_Hudi_on_EMR_Serverless_with_Lab/index.html b/content/cn/videos/2023/04/09/Bootstrapping_in_Apache_Hudi_on_EMR_Serverless_with_Lab/index.html index b7ed521915ad3..f0c0f31b23082 100644 --- a/content/cn/videos/2023/04/09/Bootstrapping_in_Apache_Hudi_on_EMR_Serverless_with_Lab/index.html +++ b/content/cn/videos/2023/04/09/Bootstrapping_in_Apache_Hudi_on_EMR_Serverless_with_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/04/11/Journey_to_Hudi_Transactional_Data_Lake_Mastery_How_I_Learned_and_Succeeded/index.html b/content/cn/videos/2023/04/11/Journey_to_Hudi_Transactional_Data_Lake_Mastery_How_I_Learned_and_Succeeded/index.html index aedb6842a1216..3c35d33b56158 100644 --- a/content/cn/videos/2023/04/11/Journey_to_Hudi_Transactional_Data_Lake_Mastery_How_I_Learned_and_Succeeded/index.html +++ b/content/cn/videos/2023/04/11/Journey_to_Hudi_Transactional_Data_Lake_Mastery_How_I_Learned_and_Succeeded/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/04/11/Learn_about_Apache_Hudi_Transformers_with_Hands_on_Lab/index.html b/content/cn/videos/2023/04/11/Learn_about_Apache_Hudi_Transformers_with_Hands_on_Lab/index.html index 36a0593e263d8..a4c97fd7ebd46 100644 --- a/content/cn/videos/2023/04/11/Learn_about_Apache_Hudi_Transformers_with_Hands_on_Lab/index.html +++ b/content/cn/videos/2023/04/11/Learn_about_Apache_Hudi_Transformers_with_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/04/12/Efficient_Data_Ingestion_with_Glue_Concurrency_and_Hudi_Data_Lake/index.html b/content/cn/videos/2023/04/12/Efficient_Data_Ingestion_with_Glue_Concurrency_and_Hudi_Data_Lake/index.html index cd93072029e89..70065cee34aa2 100644 --- a/content/cn/videos/2023/04/12/Efficient_Data_Ingestion_with_Glue_Concurrency_and_Hudi_Data_Lake/index.html +++ b/content/cn/videos/2023/04/12/Efficient_Data_Ingestion_with_Glue_Concurrency_and_Hudi_Data_Lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/04/20/Effortlessly_Sync_Your_JDBC_Source_to_Hudi_Transactional_Datalake_No_DMS_or_Debezium_Required/index.html b/content/cn/videos/2023/04/20/Effortlessly_Sync_Your_JDBC_Source_to_Hudi_Transactional_Datalake_No_DMS_or_Debezium_Required/index.html index c7850af1a77e2..a633c1bbbc708 100644 --- a/content/cn/videos/2023/04/20/Effortlessly_Sync_Your_JDBC_Source_to_Hudi_Transactional_Datalake_No_DMS_or_Debezium_Required/index.html +++ b/content/cn/videos/2023/04/20/Effortlessly_Sync_Your_JDBC_Source_to_Hudi_Transactional_Datalake_No_DMS_or_Debezium_Required/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/04/25/Joining_Hudi_Raw_Tables_for_Powerful_Data_Analysis_with_Spark_SQL/index.html b/content/cn/videos/2023/04/25/Joining_Hudi_Raw_Tables_for_Powerful_Data_Analysis_with_Spark_SQL/index.html index ad0410361edd3..dc824a59883dc 100644 --- a/content/cn/videos/2023/04/25/Joining_Hudi_Raw_Tables_for_Powerful_Data_Analysis_with_Spark_SQL/index.html +++ b/content/cn/videos/2023/04/25/Joining_Hudi_Raw_Tables_for_Powerful_Data_Analysis_with_Spark_SQL/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/04/26/From_Raw_Data_to_Insights_Building_a_Lake_House_with_Hudi_and_Star_Schema_Step_by_Step_Guide/index.html b/content/cn/videos/2023/04/26/From_Raw_Data_to_Insights_Building_a_Lake_House_with_Hudi_and_Star_Schema_Step_by_Step_Guide/index.html index f5c8a6cc59299..a2ab1ded71b34 100644 --- a/content/cn/videos/2023/04/26/From_Raw_Data_to_Insights_Building_a_Lake_House_with_Hudi_and_Star_Schema_Step_by_Step_Guide/index.html +++ b/content/cn/videos/2023/04/26/From_Raw_Data_to_Insights_Building_a_Lake_House_with_Hudi_and_Star_Schema_Step_by_Step_Guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/04/29/Efficiently_Managing_Ride_Late_Arriving_Tips_Data_with_Incremental_ETL_using_Apache_Hudi_Hands_On/index.html b/content/cn/videos/2023/04/29/Efficiently_Managing_Ride_Late_Arriving_Tips_Data_with_Incremental_ETL_using_Apache_Hudi_Hands_On/index.html index f5ac5dccc1efe..660e253cad443 100644 --- a/content/cn/videos/2023/04/29/Efficiently_Managing_Ride_Late_Arriving_Tips_Data_with_Incremental_ETL_using_Apache_Hudi_Hands_On/index.html +++ b/content/cn/videos/2023/04/29/Efficiently_Managing_Ride_Late_Arriving_Tips_Data_with_Incremental_ETL_using_Apache_Hudi_Hands_On/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/05/01/Building_a_Scalable_and_Resilient_Streaming_ETL_Pipeline_with_Hudi_s_Incremental_Processing_1/index.html b/content/cn/videos/2023/05/01/Building_a_Scalable_and_Resilient_Streaming_ETL_Pipeline_with_Hudi_s_Incremental_Processing_1/index.html index 60eeec7f733be..3bf10c3e28836 100644 --- a/content/cn/videos/2023/05/01/Building_a_Scalable_and_Resilient_Streaming_ETL_Pipeline_with_Hudi_s_Incremental_Processing_1/index.html +++ b/content/cn/videos/2023/05/01/Building_a_Scalable_and_Resilient_Streaming_ETL_Pipeline_with_Hudi_s_Incremental_Processing_1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/05/03/Build_deploy_and_run_Spark_jobs_on_Amazon_EMR_with_the_opensource_EMR_CLI_tool/index.html b/content/cn/videos/2023/05/03/Build_deploy_and_run_Spark_jobs_on_Amazon_EMR_with_the_opensource_EMR_CLI_tool/index.html index ad9a004834b93..f8e6825e1d121 100644 --- a/content/cn/videos/2023/05/03/Build_deploy_and_run_Spark_jobs_on_Amazon_EMR_with_the_opensource_EMR_CLI_tool/index.html +++ b/content/cn/videos/2023/05/03/Build_deploy_and_run_Spark_jobs_on_Amazon_EMR_with_the_opensource_EMR_CLI_tool/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/05/03/Mastering_Slowly_Changing_Dimension_with_Hudi_A_StepbyStep_Guide_to_Efficient_Data_Management/index.html b/content/cn/videos/2023/05/03/Mastering_Slowly_Changing_Dimension_with_Hudi_A_StepbyStep_Guide_to_Efficient_Data_Management/index.html index e5ff4eefb10d3..46c348baf8b1c 100644 --- a/content/cn/videos/2023/05/03/Mastering_Slowly_Changing_Dimension_with_Hudi_A_StepbyStep_Guide_to_Efficient_Data_Management/index.html +++ b/content/cn/videos/2023/05/03/Mastering_Slowly_Changing_Dimension_with_Hudi_A_StepbyStep_Guide_to_Efficient_Data_Management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/05/06/How_to_Build_Your_Own_Version_of_AWS_Glue_Bookmark_to_get_Only_New_Incremental_Files/index.html b/content/cn/videos/2023/05/06/How_to_Build_Your_Own_Version_of_AWS_Glue_Bookmark_to_get_Only_New_Incremental_Files/index.html index 87beb5189c163..624f26e57c62c 100644 --- a/content/cn/videos/2023/05/06/How_to_Build_Your_Own_Version_of_AWS_Glue_Bookmark_to_get_Only_New_Incremental_Files/index.html +++ b/content/cn/videos/2023/05/06/How_to_Build_Your_Own_Version_of_AWS_Glue_Bookmark_to_get_Only_New_Incremental_Files/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/05/07/Maximizing_Efficiency_DataLake_Hudi_Glue_ETL_Jobs_with_Templated_Approach_Serverless_Architecture/index.html b/content/cn/videos/2023/05/07/Maximizing_Efficiency_DataLake_Hudi_Glue_ETL_Jobs_with_Templated_Approach_Serverless_Architecture/index.html index f1acbcca4bca4..2fd6b9b60d0f1 100644 --- a/content/cn/videos/2023/05/07/Maximizing_Efficiency_DataLake_Hudi_Glue_ETL_Jobs_with_Templated_Approach_Serverless_Architecture/index.html +++ b/content/cn/videos/2023/05/07/Maximizing_Efficiency_DataLake_Hudi_Glue_ETL_Jobs_with_Templated_Approach_Serverless_Architecture/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/05/11/EMR_Serverless_for_Beginners_Ingest_Data_incrementally_Submit_Spark_Job_with_EMRCLI_Data_lake/index.html b/content/cn/videos/2023/05/11/EMR_Serverless_for_Beginners_Ingest_Data_incrementally_Submit_Spark_Job_with_EMRCLI_Data_lake/index.html index a669f08c07d3e..5f351c1249be9 100644 --- a/content/cn/videos/2023/05/11/EMR_Serverless_for_Beginners_Ingest_Data_incrementally_Submit_Spark_Job_with_EMRCLI_Data_lake/index.html +++ b/content/cn/videos/2023/05/11/EMR_Serverless_for_Beginners_Ingest_Data_incrementally_Submit_Spark_Job_with_EMRCLI_Data_lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/05/13/EMR_Serverless_Made_Easy_Submitting_Hive_SQL_Queries_for_Beginners_with_NYC_Taxi_Dataset/index.html b/content/cn/videos/2023/05/13/EMR_Serverless_Made_Easy_Submitting_Hive_SQL_Queries_for_Beginners_with_NYC_Taxi_Dataset/index.html index e3d3c8711156b..a798fe31328e3 100644 --- a/content/cn/videos/2023/05/13/EMR_Serverless_Made_Easy_Submitting_Hive_SQL_Queries_for_Beginners_with_NYC_Taxi_Dataset/index.html +++ b/content/cn/videos/2023/05/13/EMR_Serverless_Made_Easy_Submitting_Hive_SQL_Queries_for_Beginners_with_NYC_Taxi_Dataset/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/05/16/Unify_Your_Event_Data_Guide_to_Mapping_Events_to_Standardized_Format_with_Incremental_ETL_using_Hudi/index.html b/content/cn/videos/2023/05/16/Unify_Your_Event_Data_Guide_to_Mapping_Events_to_Standardized_Format_with_Incremental_ETL_using_Hudi/index.html index ca145c81929c8..6be3bfe4b2a4b 100644 --- a/content/cn/videos/2023/05/16/Unify_Your_Event_Data_Guide_to_Mapping_Events_to_Standardized_Format_with_Incremental_ETL_using_Hudi/index.html +++ b/content/cn/videos/2023/05/16/Unify_Your_Event_Data_Guide_to_Mapping_Events_to_Standardized_Format_with_Incremental_ETL_using_Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/05/19/HandsOn_Lab_Unleashing_Efficiency_and_Flexibility_with_Partial_Updates_in_Apache_Hudi/index.html b/content/cn/videos/2023/05/19/HandsOn_Lab_Unleashing_Efficiency_and_Flexibility_with_Partial_Updates_in_Apache_Hudi/index.html index 0a07c8755a4fd..c6935942df8ac 100644 --- a/content/cn/videos/2023/05/19/HandsOn_Lab_Unleashing_Efficiency_and_Flexibility_with_Partial_Updates_in_Apache_Hudi/index.html +++ b/content/cn/videos/2023/05/19/HandsOn_Lab_Unleashing_Efficiency_and_Flexibility_with_Partial_Updates_in_Apache_Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/05/20/Mastering_File_Sizing_in_Hudi_Boosting_Performance_and_Efficiency/index.html b/content/cn/videos/2023/05/20/Mastering_File_Sizing_in_Hudi_Boosting_Performance_and_Efficiency/index.html index 7e959d3271c76..92e141fee431f 100644 --- a/content/cn/videos/2023/05/20/Mastering_File_Sizing_in_Hudi_Boosting_Performance_and_Efficiency/index.html +++ b/content/cn/videos/2023/05/20/Mastering_File_Sizing_in_Hudi_Boosting_Performance_and_Efficiency/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/05/21/How_to_Set_Up_AWS_Glue_Locally_with_Docker_Accessing_Glue_Database_Table_in_Your_LocalEnvironment/index.html b/content/cn/videos/2023/05/21/How_to_Set_Up_AWS_Glue_Locally_with_Docker_Accessing_Glue_Database_Table_in_Your_LocalEnvironment/index.html index d0f7b6545b1be..0551d3c29df1a 100644 --- a/content/cn/videos/2023/05/21/How_to_Set_Up_AWS_Glue_Locally_with_Docker_Accessing_Glue_Database_Table_in_Your_LocalEnvironment/index.html +++ b/content/cn/videos/2023/05/21/How_to_Set_Up_AWS_Glue_Locally_with_Docker_Accessing_Glue_Database_Table_in_Your_LocalEnvironment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/05/27/Automate_alerting_and_reporting_for_AWS_Glue_job_resource_usage/index.html b/content/cn/videos/2023/05/27/Automate_alerting_and_reporting_for_AWS_Glue_job_resource_usage/index.html index 5e3be819ce459..667abe0ab75bf 100644 --- a/content/cn/videos/2023/05/27/Automate_alerting_and_reporting_for_AWS_Glue_job_resource_usage/index.html +++ b/content/cn/videos/2023/05/27/Automate_alerting_and_reporting_for_AWS_Glue_job_resource_usage/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/05/31/AWS_and_Apache_Hudi_Workshop_Overview_Build_a_ride_share_lakehouse_platform/index.html b/content/cn/videos/2023/05/31/AWS_and_Apache_Hudi_Workshop_Overview_Build_a_ride_share_lakehouse_platform/index.html index e5b99f8d1a58a..402db911fce63 100644 --- a/content/cn/videos/2023/05/31/AWS_and_Apache_Hudi_Workshop_Overview_Build_a_ride_share_lakehouse_platform/index.html +++ b/content/cn/videos/2023/05/31/AWS_and_Apache_Hudi_Workshop_Overview_Build_a_ride_share_lakehouse_platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/06/02/How_to_Query_Hudi_Tables_in_Incremental_Fashion_and_Get_only_New_data_on_AWS_Glue_Hands_on_Lab/index.html b/content/cn/videos/2023/06/02/How_to_Query_Hudi_Tables_in_Incremental_Fashion_and_Get_only_New_data_on_AWS_Glue_Hands_on_Lab/index.html index 1430ddc400286..a6abb9e94d730 100644 --- a/content/cn/videos/2023/06/02/How_to_Query_Hudi_Tables_in_Incremental_Fashion_and_Get_only_New_data_on_AWS_Glue_Hands_on_Lab/index.html +++ b/content/cn/videos/2023/06/02/How_to_Query_Hudi_Tables_in_Incremental_Fashion_and_Get_only_New_data_on_AWS_Glue_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/06/05/How_to_JOIN_Hudi_Tables_in_Incremental_fashion_with_DynamoDB_in_AWS_GLue_Hands_on_Lab_for_Begineer/index.html b/content/cn/videos/2023/06/05/How_to_JOIN_Hudi_Tables_in_Incremental_fashion_with_DynamoDB_in_AWS_GLue_Hands_on_Lab_for_Begineer/index.html index 47aa6193b6ea0..76f5d43d3f99a 100644 --- a/content/cn/videos/2023/06/05/How_to_JOIN_Hudi_Tables_in_Incremental_fashion_with_DynamoDB_in_AWS_GLue_Hands_on_Lab_for_Begineer/index.html +++ b/content/cn/videos/2023/06/05/How_to_JOIN_Hudi_Tables_in_Incremental_fashion_with_DynamoDB_in_AWS_GLue_Hands_on_Lab_for_Begineer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/06/07/How_Data_Scientist_Data_Engineer_Can_Query_Hudi_Tables_with_Athena_Spark_Notebook_for_AdhocAnalysis/index.html b/content/cn/videos/2023/06/07/How_Data_Scientist_Data_Engineer_Can_Query_Hudi_Tables_with_Athena_Spark_Notebook_for_AdhocAnalysis/index.html index 18f3e6cbc7d3e..d4709e7e922d8 100644 --- a/content/cn/videos/2023/06/07/How_Data_Scientist_Data_Engineer_Can_Query_Hudi_Tables_with_Athena_Spark_Notebook_for_AdhocAnalysis/index.html +++ b/content/cn/videos/2023/06/07/How_Data_Scientist_Data_Engineer_Can_Query_Hudi_Tables_with_Athena_Spark_Notebook_for_AdhocAnalysis/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/06/07/Learn_How_to_delete_Partition_in_Apache_Hudi_on_AWS_Glue_Hands_on/index.html b/content/cn/videos/2023/06/07/Learn_How_to_delete_Partition_in_Apache_Hudi_on_AWS_Glue_Hands_on/index.html index 54c50af38aee8..26003acde9ade 100644 --- a/content/cn/videos/2023/06/07/Learn_How_to_delete_Partition_in_Apache_Hudi_on_AWS_Glue_Hands_on/index.html +++ b/content/cn/videos/2023/06/07/Learn_How_to_delete_Partition_in_Apache_Hudi_on_AWS_Glue_Hands_on/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/06/10/How_to_read_data_from_Multiple_Hudi_Tables_Join_them_and_insert_into_DynamoDB_with_AWS_Glue/index.html b/content/cn/videos/2023/06/10/How_to_read_data_from_Multiple_Hudi_Tables_Join_them_and_insert_into_DynamoDB_with_AWS_Glue/index.html index 655ed2744d541..42a8e521f51d5 100644 --- a/content/cn/videos/2023/06/10/How_to_read_data_from_Multiple_Hudi_Tables_Join_them_and_insert_into_DynamoDB_with_AWS_Glue/index.html +++ b/content/cn/videos/2023/06/10/How_to_read_data_from_Multiple_Hudi_Tables_Join_them_and_insert_into_DynamoDB_with_AWS_Glue/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/06/16/SNS_Lambda_How_to_Trigger_Lambda_Functions_from_SNS_using_Message_Filtering/index.html b/content/cn/videos/2023/06/16/SNS_Lambda_How_to_Trigger_Lambda_Functions_from_SNS_using_Message_Filtering/index.html index 4d949ea0f8387..b48561a9f879a 100644 --- a/content/cn/videos/2023/06/16/SNS_Lambda_How_to_Trigger_Lambda_Functions_from_SNS_using_Message_Filtering/index.html +++ b/content/cn/videos/2023/06/16/SNS_Lambda_How_to_Trigger_Lambda_Functions_from_SNS_using_Message_Filtering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/06/22/Full_Workshop_Recap_Build_a_rideshare_lakehouse_platform/index.html b/content/cn/videos/2023/06/22/Full_Workshop_Recap_Build_a_rideshare_lakehouse_platform/index.html index 588fcef400081..b047536003bad 100644 --- a/content/cn/videos/2023/06/22/Full_Workshop_Recap_Build_a_rideshare_lakehouse_platform/index.html +++ b/content/cn/videos/2023/06/22/Full_Workshop_Recap_Build_a_rideshare_lakehouse_platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/06/23/Learn_About_Apache_Hudi_Pre_Commit_Validator_with_Hands_on_Lab/index.html b/content/cn/videos/2023/06/23/Learn_About_Apache_Hudi_Pre_Commit_Validator_with_Hands_on_Lab/index.html index a1cdf0c36b1c3..9cab03b06d8b1 100644 --- a/content/cn/videos/2023/06/23/Learn_About_Apache_Hudi_Pre_Commit_Validator_with_Hands_on_Lab/index.html +++ b/content/cn/videos/2023/06/23/Learn_About_Apache_Hudi_Pre_Commit_Validator_with_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/07/01/Building_Lakehouse_using_Hudi_Apache_Hudi_Data_Lakehouse_Hudi_Apache/index.html b/content/cn/videos/2023/07/01/Building_Lakehouse_using_Hudi_Apache_Hudi_Data_Lakehouse_Hudi_Apache/index.html index c93038a08a3e6..24402f6445bcf 100644 --- a/content/cn/videos/2023/07/01/Building_Lakehouse_using_Hudi_Apache_Hudi_Data_Lakehouse_Hudi_Apache/index.html +++ b/content/cn/videos/2023/07/01/Building_Lakehouse_using_Hudi_Apache_Hudi_Data_Lakehouse_Hudi_Apache/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/07/02/Hudi_Best_Practices_Handling_Failed_InsertsUpserts_with_Error_Tables/index.html b/content/cn/videos/2023/07/02/Hudi_Best_Practices_Handling_Failed_InsertsUpserts_with_Error_Tables/index.html index 32e22d74dfaab..9d883806d8cca 100644 --- a/content/cn/videos/2023/07/02/Hudi_Best_Practices_Handling_Failed_InsertsUpserts_with_Error_Tables/index.html +++ b/content/cn/videos/2023/07/02/Hudi_Best_Practices_Handling_Failed_InsertsUpserts_with_Error_Tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/07/09/Develop_Incremental_ETL_Pipeline_From_Hudi_Tables_to_Redshift_Using_AWS_Glue_and_Spark/index.html b/content/cn/videos/2023/07/09/Develop_Incremental_ETL_Pipeline_From_Hudi_Tables_to_Redshift_Using_AWS_Glue_and_Spark/index.html index 91226a8d32d39..3f75f00698e2d 100644 --- a/content/cn/videos/2023/07/09/Develop_Incremental_ETL_Pipeline_From_Hudi_Tables_to_Redshift_Using_AWS_Glue_and_Spark/index.html +++ b/content/cn/videos/2023/07/09/Develop_Incremental_ETL_Pipeline_From_Hudi_Tables_to_Redshift_Using_AWS_Glue_and_Spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/07/09/Incremental_Data_Extraction_from_Postgres_using_Triggers_and_PySpark/index.html b/content/cn/videos/2023/07/09/Incremental_Data_Extraction_from_Postgres_using_Triggers_and_PySpark/index.html index 1a770f2c9f21d..4d0f24084273e 100644 --- a/content/cn/videos/2023/07/09/Incremental_Data_Extraction_from_Postgres_using_Triggers_and_PySpark/index.html +++ b/content/cn/videos/2023/07/09/Incremental_Data_Extraction_from_Postgres_using_Triggers_and_PySpark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/07/22/learn_How_to_use_AWS_Glue_Crawler_with_Hudi_Tables_to_Catlog_the_Data/index.html b/content/cn/videos/2023/07/22/learn_How_to_use_AWS_Glue_Crawler_with_Hudi_Tables_to_Catlog_the_Data/index.html index 21eb0ecee0838..44a71f7a8ab2a 100644 --- a/content/cn/videos/2023/07/22/learn_How_to_use_AWS_Glue_Crawler_with_Hudi_Tables_to_Catlog_the_Data/index.html +++ b/content/cn/videos/2023/07/22/learn_How_to_use_AWS_Glue_Crawler_with_Hudi_Tables_to_Catlog_the_Data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/07/28/Removing_Duplicates_in_Hudi_Partitions_with_InsertOverwrite_API_and_Spark_SQL/index.html b/content/cn/videos/2023/07/28/Removing_Duplicates_in_Hudi_Partitions_with_InsertOverwrite_API_and_Spark_SQL/index.html index 0f8cbd8815473..19dd94de14451 100644 --- a/content/cn/videos/2023/07/28/Removing_Duplicates_in_Hudi_Partitions_with_InsertOverwrite_API_and_Spark_SQL/index.html +++ b/content/cn/videos/2023/07/28/Removing_Duplicates_in_Hudi_Partitions_with_InsertOverwrite_API_and_Spark_SQL/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/08/01/Building_and_Automating_Hudi_Medallion_Architecture_with_AWS_Glue_Workflow_Hands_on_Labs_StepbyStep/index.html b/content/cn/videos/2023/08/01/Building_and_Automating_Hudi_Medallion_Architecture_with_AWS_Glue_Workflow_Hands_on_Labs_StepbyStep/index.html index 9afdf9c781f34..52965d309933b 100644 --- a/content/cn/videos/2023/08/01/Building_and_Automating_Hudi_Medallion_Architecture_with_AWS_Glue_Workflow_Hands_on_Labs_StepbyStep/index.html +++ b/content/cn/videos/2023/08/01/Building_and_Automating_Hudi_Medallion_Architecture_with_AWS_Glue_Workflow_Hands_on_Labs_StepbyStep/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/08/03/Powering_EventDriven_Workloads_with_Hudi_Read_Stream_AWS_Glue_Streaming_JOBS/index.html b/content/cn/videos/2023/08/03/Powering_EventDriven_Workloads_with_Hudi_Read_Stream_AWS_Glue_Streaming_JOBS/index.html index e2e10b106dc51..460398160bcd9 100644 --- a/content/cn/videos/2023/08/03/Powering_EventDriven_Workloads_with_Hudi_Read_Stream_AWS_Glue_Streaming_JOBS/index.html +++ b/content/cn/videos/2023/08/03/Powering_EventDriven_Workloads_with_Hudi_Read_Stream_AWS_Glue_Streaming_JOBS/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/08/06/Easy_Step_by_Step_Guide_for_Beginner_Setup_AWS_Transfer_Family_SFTP_with_S3/index.html b/content/cn/videos/2023/08/06/Easy_Step_by_Step_Guide_for_Beginner_Setup_AWS_Transfer_Family_SFTP_with_S3/index.html index a857b01440102..8d34a58ce17ef 100644 --- a/content/cn/videos/2023/08/06/Easy_Step_by_Step_Guide_for_Beginner_Setup_AWS_Transfer_Family_SFTP_with_S3/index.html +++ b/content/cn/videos/2023/08/06/Easy_Step_by_Step_Guide_for_Beginner_Setup_AWS_Transfer_Family_SFTP_with_S3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/08/09/Easy_Step_by_Step_Guide_for_Beginner_Ingest_CSV_Files_into_Hudi_with_AWS_GLue_Hands_on_Labs/index.html b/content/cn/videos/2023/08/09/Easy_Step_by_Step_Guide_for_Beginner_Ingest_CSV_Files_into_Hudi_with_AWS_GLue_Hands_on_Labs/index.html index 0db731c18a93c..db0654fbd7da2 100644 --- a/content/cn/videos/2023/08/09/Easy_Step_by_Step_Guide_for_Beginner_Ingest_CSV_Files_into_Hudi_with_AWS_GLue_Hands_on_Labs/index.html +++ b/content/cn/videos/2023/08/09/Easy_Step_by_Step_Guide_for_Beginner_Ingest_CSV_Files_into_Hudi_with_AWS_GLue_Hands_on_Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/08/29/From-Zero-to-Data-Hero-Building-Dynamic-Data-Platforms-Like-a-Pro-Final-Part-Demo/index.html b/content/cn/videos/2023/08/29/From-Zero-to-Data-Hero-Building-Dynamic-Data-Platforms-Like-a-Pro-Final-Part-Demo/index.html index c7cdb7173b261..520c552f0abca 100644 --- a/content/cn/videos/2023/08/29/From-Zero-to-Data-Hero-Building-Dynamic-Data-Platforms-Like-a-Pro-Final-Part-Demo/index.html +++ b/content/cn/videos/2023/08/29/From-Zero-to-Data-Hero-Building-Dynamic-Data-Platforms-Like-a-Pro-Final-Part-Demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/09/23/Flink-with-POSTGRES-RealTime-Stream-Data-Processing-with-Python-Hands-on-Labs/index.html b/content/cn/videos/2023/09/23/Flink-with-POSTGRES-RealTime-Stream-Data-Processing-with-Python-Hands-on-Labs/index.html index d6c3c0d3d8e32..edd5752ba3cea 100644 --- a/content/cn/videos/2023/09/23/Flink-with-POSTGRES-RealTime-Stream-Data-Processing-with-Python-Hands-on-Labs/index.html +++ b/content/cn/videos/2023/09/23/Flink-with-POSTGRES-RealTime-Stream-Data-Processing-with-Python-Hands-on-Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/09/25/How-to-Use-Apache-Hudi-with-Flink-1-15-on-AWS-Managed-Apache-Flink-Hands-on-Guide-for-Beginners/index.html b/content/cn/videos/2023/09/25/How-to-Use-Apache-Hudi-with-Flink-1-15-on-AWS-Managed-Apache-Flink-Hands-on-Guide-for-Beginners/index.html index 703b434483b88..b3f88d1837d15 100644 --- a/content/cn/videos/2023/09/25/How-to-Use-Apache-Hudi-with-Flink-1-15-on-AWS-Managed-Apache-Flink-Hands-on-Guide-for-Beginners/index.html +++ b/content/cn/videos/2023/09/25/How-to-Use-Apache-Hudi-with-Flink-1-15-on-AWS-Managed-Apache-Flink-Hands-on-Guide-for-Beginners/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/09/26/How-to-Ingest-Data-from-PostgreSQL-into-Hudi-Tables-on-S3-with-Apache-Flink-CDC-Connector-Python/index.html b/content/cn/videos/2023/09/26/How-to-Ingest-Data-from-PostgreSQL-into-Hudi-Tables-on-S3-with-Apache-Flink-CDC-Connector-Python/index.html index dbc345b3a65d3..b8015b0e2e8b5 100644 --- a/content/cn/videos/2023/09/26/How-to-Ingest-Data-from-PostgreSQL-into-Hudi-Tables-on-S3-with-Apache-Flink-CDC-Connector-Python/index.html +++ b/content/cn/videos/2023/09/26/How-to-Ingest-Data-from-PostgreSQL-into-Hudi-Tables-on-S3-with-Apache-Flink-CDC-Connector-Python/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/09/27/Learn-How-to-Use-Apache-Flink-with-Kafka-Build-Transactional-Datalakes-on-S3-using-PyFLink-Locally/index.html b/content/cn/videos/2023/09/27/Learn-How-to-Use-Apache-Flink-with-Kafka-Build-Transactional-Datalakes-on-S3-using-PyFLink-Locally/index.html index aac4d1a80c7e5..df4cf0c986ac0 100644 --- a/content/cn/videos/2023/09/27/Learn-How-to-Use-Apache-Flink-with-Kafka-Build-Transactional-Datalakes-on-S3-using-PyFLink-Locally/index.html +++ b/content/cn/videos/2023/09/27/Learn-How-to-Use-Apache-Flink-with-Kafka-Build-Transactional-Datalakes-on-S3-using-PyFLink-Locally/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/10/07/Hudi-Latest-Feature-Auto-Generating-Primary-Keys-for-Modern-Data-Lakes/index.html b/content/cn/videos/2023/10/07/Hudi-Latest-Feature-Auto-Generating-Primary-Keys-for-Modern-Data-Lakes/index.html index 90c6508d7e13e..15f0ed93f6bc6 100644 --- a/content/cn/videos/2023/10/07/Hudi-Latest-Feature-Auto-Generating-Primary-Keys-for-Modern-Data-Lakes/index.html +++ b/content/cn/videos/2023/10/07/Hudi-Latest-Feature-Auto-Generating-Primary-Keys-for-Modern-Data-Lakes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/10/14/Accelerating-Data-Processing-Leveraging-Apache-Hudi-with-DynamoDB-for-Faster-Commit-Time-Retrieval/index.html b/content/cn/videos/2023/10/14/Accelerating-Data-Processing-Leveraging-Apache-Hudi-with-DynamoDB-for-Faster-Commit-Time-Retrieval/index.html index 8e90fd0d50092..07216a3bea9f2 100644 --- a/content/cn/videos/2023/10/14/Accelerating-Data-Processing-Leveraging-Apache-Hudi-with-DynamoDB-for-Faster-Commit-Time-Retrieval/index.html +++ b/content/cn/videos/2023/10/14/Accelerating-Data-Processing-Leveraging-Apache-Hudi-with-DynamoDB-for-Faster-Commit-Time-Retrieval/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/10/16/Hudi-0-14-0-Deep-Dive-Record-Level-Index/index.html b/content/cn/videos/2023/10/16/Hudi-0-14-0-Deep-Dive-Record-Level-Index/index.html index d7868f21cb109..3637070127a94 100644 --- a/content/cn/videos/2023/10/16/Hudi-0-14-0-Deep-Dive-Record-Level-Index/index.html +++ b/content/cn/videos/2023/10/16/Hudi-0-14-0-Deep-Dive-Record-Level-Index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/10/21/Full-Apache-Hudi-Course-for-beginner-Operations-Type-Part-5/index.html b/content/cn/videos/2023/10/21/Full-Apache-Hudi-Course-for-beginner-Operations-Type-Part-5/index.html index 6b2922a018dc9..776e6f7225b86 100644 --- a/content/cn/videos/2023/10/21/Full-Apache-Hudi-Course-for-beginner-Operations-Type-Part-5/index.html +++ b/content/cn/videos/2023/10/21/Full-Apache-Hudi-Course-for-beginner-Operations-Type-Part-5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/10/28/How-to-Unlock-Data-Insights-from-Hudi-Metrics-for-Your-Data-Lake-using-Elastic-Search-and-Kibana/index.html b/content/cn/videos/2023/10/28/How-to-Unlock-Data-Insights-from-Hudi-Metrics-for-Your-Data-Lake-using-Elastic-Search-and-Kibana/index.html index 2db6006e2880b..bf44ec2883b1c 100644 --- a/content/cn/videos/2023/10/28/How-to-Unlock-Data-Insights-from-Hudi-Metrics-for-Your-Data-Lake-using-Elastic-Search-and-Kibana/index.html +++ b/content/cn/videos/2023/10/28/How-to-Unlock-Data-Insights-from-Hudi-Metrics-for-Your-Data-Lake-using-Elastic-Search-and-Kibana/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/11/08/A-Glide-Skip-or-a-Jump-Efficiently-Stream-Data-into-Your-Medallion-Architecture-with-Apache-Hudi/index.html b/content/cn/videos/2023/11/08/A-Glide-Skip-or-a-Jump-Efficiently-Stream-Data-into-Your-Medallion-Architecture-with-Apache-Hudi/index.html index 1d9f0fc0494aa..21194824fd2d2 100644 --- a/content/cn/videos/2023/11/08/A-Glide-Skip-or-a-Jump-Efficiently-Stream-Data-into-Your-Medallion-Architecture-with-Apache-Hudi/index.html +++ b/content/cn/videos/2023/11/08/A-Glide-Skip-or-a-Jump-Efficiently-Stream-Data-into-Your-Medallion-Architecture-with-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/11/17/Maximizing-Efficiency-by-Templating-Serverless-Architecture-in-Hudi-Data-Lakes/index.html b/content/cn/videos/2023/11/17/Maximizing-Efficiency-by-Templating-Serverless-Architecture-in-Hudi-Data-Lakes/index.html index 42856a921e1c7..9beddf9997adc 100644 --- a/content/cn/videos/2023/11/17/Maximizing-Efficiency-by-Templating-Serverless-Architecture-in-Hudi-Data-Lakes/index.html +++ b/content/cn/videos/2023/11/17/Maximizing-Efficiency-by-Templating-Serverless-Architecture-in-Hudi-Data-Lakes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/11/19/Hudi-Streamer-Hands-On-Guide-Local-Ingestion-from-Parquet-Source-1/index.html b/content/cn/videos/2023/11/19/Hudi-Streamer-Hands-On-Guide-Local-Ingestion-from-Parquet-Source-1/index.html index e30ccc64819ad..0be69439658c8 100644 --- a/content/cn/videos/2023/11/19/Hudi-Streamer-Hands-On-Guide-Local-Ingestion-from-Parquet-Source-1/index.html +++ b/content/cn/videos/2023/11/19/Hudi-Streamer-Hands-On-Guide-Local-Ingestion-from-Parquet-Source-1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/11/20/Hudi-Streamer-Hands-On-Guide-Local-Ingestion-from-CSV-Source-2/index.html b/content/cn/videos/2023/11/20/Hudi-Streamer-Hands-On-Guide-Local-Ingestion-from-CSV-Source-2/index.html index 47a4ee5f60352..b325aa6f0196d 100644 --- a/content/cn/videos/2023/11/20/Hudi-Streamer-Hands-On-Guide-Local-Ingestion-from-CSV-Source-2/index.html +++ b/content/cn/videos/2023/11/20/Hudi-Streamer-Hands-On-Guide-Local-Ingestion-from-CSV-Source-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/11/20/Learn-How-to-Ingest-Multiple-Tables-using-Hudi-MultiTable-Delta-Streamer-3/index.html b/content/cn/videos/2023/11/20/Learn-How-to-Ingest-Multiple-Tables-using-Hudi-MultiTable-Delta-Streamer-3/index.html index 4d8251685fca2..5b41e85459553 100644 --- a/content/cn/videos/2023/11/20/Learn-How-to-Ingest-Multiple-Tables-using-Hudi-MultiTable-Delta-Streamer-3/index.html +++ b/content/cn/videos/2023/11/20/Learn-How-to-Ingest-Multiple-Tables-using-Hudi-MultiTable-Delta-Streamer-3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/11/21/RFC-14-Step-by-Step-Guide-for-Incremental-Data-Pull-from-Postgres-to-Hudi-using-deltastreamer/index.html b/content/cn/videos/2023/11/21/RFC-14-Step-by-Step-Guide-for-Incremental-Data-Pull-from-Postgres-to-Hudi-using-deltastreamer/index.html index 3b12ebc0c9ffd..094a07e2fdb72 100644 --- a/content/cn/videos/2023/11/21/RFC-14-Step-by-Step-Guide-for-Incremental-Data-Pull-from-Postgres-to-Hudi-using-deltastreamer/index.html +++ b/content/cn/videos/2023/11/21/RFC-14-Step-by-Step-Guide-for-Incremental-Data-Pull-from-Postgres-to-Hudi-using-deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/11/23/Learn-How-to-Ingest-Data-Into-Hudi-Table-using-DeltaStreamer-in-continous-Mode-and-SQL-transformer-5/index.html b/content/cn/videos/2023/11/23/Learn-How-to-Ingest-Data-Into-Hudi-Table-using-DeltaStreamer-in-continous-Mode-and-SQL-transformer-5/index.html index 62469440a9a1a..e62b26371c8a4 100644 --- a/content/cn/videos/2023/11/23/Learn-How-to-Ingest-Data-Into-Hudi-Table-using-DeltaStreamer-in-continous-Mode-and-SQL-transformer-5/index.html +++ b/content/cn/videos/2023/11/23/Learn-How-to-Ingest-Data-Into-Hudi-Table-using-DeltaStreamer-in-continous-Mode-and-SQL-transformer-5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/11/24/Learn-How-to-use-DeltaStreamer-and-ingest-data-from-Kafka-Topic-Hands-on-Labs-6/index.html b/content/cn/videos/2023/11/24/Learn-How-to-use-DeltaStreamer-and-ingest-data-from-Kafka-Topic-Hands-on-Labs-6/index.html index fb6d957fda688..a442e19d900c8 100644 --- a/content/cn/videos/2023/11/24/Learn-How-to-use-DeltaStreamer-and-ingest-data-from-Kafka-Topic-Hands-on-Labs-6/index.html +++ b/content/cn/videos/2023/11/24/Learn-How-to-use-DeltaStreamer-and-ingest-data-from-Kafka-Topic-Hands-on-Labs-6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/11/24/hudi-table-types/index.html b/content/cn/videos/2023/11/24/hudi-table-types/index.html index 8efa390d1dcf0..71dcef30d9e3c 100644 --- a/content/cn/videos/2023/11/24/hudi-table-types/index.html +++ b/content/cn/videos/2023/11/24/hudi-table-types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/11/26/real-time-data-postgres-debezium-kafka-schema-registry-deltastreamer-7a/index.html b/content/cn/videos/2023/11/26/real-time-data-postgres-debezium-kafka-schema-registry-deltastreamer-7a/index.html index 0df6baaa2a59c..98a40ef065707 100644 --- a/content/cn/videos/2023/11/26/real-time-data-postgres-debezium-kafka-schema-registry-deltastreamer-7a/index.html +++ b/content/cn/videos/2023/11/26/real-time-data-postgres-debezium-kafka-schema-registry-deltastreamer-7a/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/11/26/real-time-data-postgres-debezium-kafka-schema-registry-deltastreamer-7b/index.html b/content/cn/videos/2023/11/26/real-time-data-postgres-debezium-kafka-schema-registry-deltastreamer-7b/index.html index 4028902579091..2e056fe7b9aab 100644 --- a/content/cn/videos/2023/11/26/real-time-data-postgres-debezium-kafka-schema-registry-deltastreamer-7b/index.html +++ b/content/cn/videos/2023/11/26/real-time-data-postgres-debezium-kafka-schema-registry-deltastreamer-7b/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/11/27/Hudi-Metadata-table-Record-Level-Index-HBase-Index/index.html b/content/cn/videos/2023/11/27/Hudi-Metadata-table-Record-Level-Index-HBase-Index/index.html index d7fd6730353c4..e906bb9b0acb8 100644 --- a/content/cn/videos/2023/11/27/Hudi-Metadata-table-Record-Level-Index-HBase-Index/index.html +++ b/content/cn/videos/2023/11/27/Hudi-Metadata-table-Record-Level-Index-HBase-Index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/11/27/Learn-How-to-Run-Clustering-in-Async-Mode-with-DeltaStreamer-in-Continuous-Mode-Hands-on-Labs-8/index.html b/content/cn/videos/2023/11/27/Learn-How-to-Run-Clustering-in-Async-Mode-with-DeltaStreamer-in-Continuous-Mode-Hands-on-Labs-8/index.html index e6b7300e14741..0d7bc40eb3b48 100644 --- a/content/cn/videos/2023/11/27/Learn-How-to-Run-Clustering-in-Async-Mode-with-DeltaStreamer-in-Continuous-Mode-Hands-on-Labs-8/index.html +++ b/content/cn/videos/2023/11/27/Learn-How-to-Run-Clustering-in-Async-Mode-with-DeltaStreamer-in-Continuous-Mode-Hands-on-Labs-8/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/11/30/Learn-How-to-use-MinIO-and-Apache-Hudi-DeltaStreamer-with-Hands-on-Lab-9/index.html b/content/cn/videos/2023/11/30/Learn-How-to-use-MinIO-and-Apache-Hudi-DeltaStreamer-with-Hands-on-Lab-9/index.html index d9a6abb7a92c9..156a78453aa43 100644 --- a/content/cn/videos/2023/11/30/Learn-How-to-use-MinIO-and-Apache-Hudi-DeltaStreamer-with-Hands-on-Lab-9/index.html +++ b/content/cn/videos/2023/11/30/Learn-How-to-use-MinIO-and-Apache-Hudi-DeltaStreamer-with-Hands-on-Lab-9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/12/08/How-to-use-DeltaStreamer-to-Read-Data-From-Hudi-Source-in-Incremental-Fashion-Bronze-to-Silver-10/index.html b/content/cn/videos/2023/12/08/How-to-use-DeltaStreamer-to-Read-Data-From-Hudi-Source-in-Incremental-Fashion-Bronze-to-Silver-10/index.html index daee0214a0439..610eafe86ff31 100644 --- a/content/cn/videos/2023/12/08/How-to-use-DeltaStreamer-to-Read-Data-From-Hudi-Source-in-Incremental-Fashion-Bronze-to-Silver-10/index.html +++ b/content/cn/videos/2023/12/08/How-to-use-DeltaStreamer-to-Read-Data-From-Hudi-Source-in-Incremental-Fashion-Bronze-to-Silver-10/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/12/09/Learn-How-to-use-DBT-with-Spark-and-Thrift-Server-on-Local-Machine-for-Begineers-Easy-Setup/index.html b/content/cn/videos/2023/12/09/Learn-How-to-use-DBT-with-Spark-and-Thrift-Server-on-Local-Machine-for-Begineers-Easy-Setup/index.html index 64bb498dea674..8f6b7c8d354db 100644 --- a/content/cn/videos/2023/12/09/Learn-How-to-use-DBT-with-Spark-and-Thrift-Server-on-Local-Machine-for-Begineers-Easy-Setup/index.html +++ b/content/cn/videos/2023/12/09/Learn-How-to-use-DBT-with-Spark-and-Thrift-Server-on-Local-Machine-for-Begineers-Easy-Setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/12/11/Simplifying-Big-Data-Setting-Up-SparkSQL-Hive-Thrift-Server-and-Hudi-with-Beeline-in-Minutes/index.html b/content/cn/videos/2023/12/11/Simplifying-Big-Data-Setting-Up-SparkSQL-Hive-Thrift-Server-and-Hudi-with-Beeline-in-Minutes/index.html index 24c81331bfac4..a85a4217e482b 100644 --- a/content/cn/videos/2023/12/11/Simplifying-Big-Data-Setting-Up-SparkSQL-Hive-Thrift-Server-and-Hudi-with-Beeline-in-Minutes/index.html +++ b/content/cn/videos/2023/12/11/Simplifying-Big-Data-Setting-Up-SparkSQL-Hive-Thrift-Server-and-Hudi-with-Beeline-in-Minutes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/12/12/Apache-Hudi-DeltaStreamer-in-Action-Python-Publishing-and-AvroKafkaSource-Consumption-11-Guide/index.html b/content/cn/videos/2023/12/12/Apache-Hudi-DeltaStreamer-in-Action-Python-Publishing-and-AvroKafkaSource-Consumption-11-Guide/index.html index 4d62e05274582..8d95e11a0b405 100644 --- a/content/cn/videos/2023/12/12/Apache-Hudi-DeltaStreamer-in-Action-Python-Publishing-and-AvroKafkaSource-Consumption-11-Guide/index.html +++ b/content/cn/videos/2023/12/12/Apache-Hudi-DeltaStreamer-in-Action-Python-Publishing-and-AvroKafkaSource-Consumption-11-Guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/12/16/Learn-How-to-Setup-Hudi-on-EMR-with-Hive-and-Query-Data-using-Hue-and-Presto-CLI-Hands-on-Labs/index.html b/content/cn/videos/2023/12/16/Learn-How-to-Setup-Hudi-on-EMR-with-Hive-and-Query-Data-using-Hue-and-Presto-CLI-Hands-on-Labs/index.html index 0460def99604d..34b2bb1d99103 100644 --- a/content/cn/videos/2023/12/16/Learn-How-to-Setup-Hudi-on-EMR-with-Hive-and-Query-Data-using-Hue-and-Presto-CLI-Hands-on-Labs/index.html +++ b/content/cn/videos/2023/12/16/Learn-How-to-Setup-Hudi-on-EMR-with-Hive-and-Query-Data-using-Hue-and-Presto-CLI-Hands-on-Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/12/19/How-to-Use-Apache-Hudi-0-14-and-RLI-on-AWS-Glue-Step-by-Step-Guide/index.html b/content/cn/videos/2023/12/19/How-to-Use-Apache-Hudi-0-14-and-RLI-on-AWS-Glue-Step-by-Step-Guide/index.html index db1d801406699..857e7c9bd02cd 100644 --- a/content/cn/videos/2023/12/19/How-to-Use-Apache-Hudi-0-14-and-RLI-on-AWS-Glue-Step-by-Step-Guide/index.html +++ b/content/cn/videos/2023/12/19/How-to-Use-Apache-Hudi-0-14-and-RLI-on-AWS-Glue-Step-by-Step-Guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/12/24/Apache-Hudi-Spark-DBT-Glue-Hive-MetaStore-Setup-Locally-in-Minutes-Hands-On-Exercise/index.html b/content/cn/videos/2023/12/24/Apache-Hudi-Spark-DBT-Glue-Hive-MetaStore-Setup-Locally-in-Minutes-Hands-On-Exercise/index.html index b33780671b3f2..f06b73c424416 100644 --- a/content/cn/videos/2023/12/24/Apache-Hudi-Spark-DBT-Glue-Hive-MetaStore-Setup-Locally-in-Minutes-Hands-On-Exercise/index.html +++ b/content/cn/videos/2023/12/24/Apache-Hudi-Spark-DBT-Glue-Hive-MetaStore-Setup-Locally-in-Minutes-Hands-On-Exercise/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/12/25/Hudi-DBT-Spark-Glue-Hive-MetaStore-Join-two-hudi-tables-Labs-with-Exercise-Files/index.html b/content/cn/videos/2023/12/25/Hudi-DBT-Spark-Glue-Hive-MetaStore-Join-two-hudi-tables-Labs-with-Exercise-Files/index.html index d2622d06f9595..adf9696f80a90 100644 --- a/content/cn/videos/2023/12/25/Hudi-DBT-Spark-Glue-Hive-MetaStore-Join-two-hudi-tables-Labs-with-Exercise-Files/index.html +++ b/content/cn/videos/2023/12/25/Hudi-DBT-Spark-Glue-Hive-MetaStore-Join-two-hudi-tables-Labs-with-Exercise-Files/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/12/29/Get-Started-with-Hudi-CLI-Locally-Using-Docker-in-Minutes-and-Connect-to-Your-S3-Data/index.html b/content/cn/videos/2023/12/29/Get-Started-with-Hudi-CLI-Locally-Using-Docker-in-Minutes-and-Connect-to-Your-S3-Data/index.html index f1711b879b2b8..b6503932925c3 100644 --- a/content/cn/videos/2023/12/29/Get-Started-with-Hudi-CLI-Locally-Using-Docker-in-Minutes-and-Connect-to-Your-S3-Data/index.html +++ b/content/cn/videos/2023/12/29/Get-Started-with-Hudi-CLI-Locally-Using-Docker-in-Minutes-and-Connect-to-Your-S3-Data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/12/30/Step-by-step-guide-on-How-to-Migrate-legacy-COW-Table-on-S3-to-MOR-Table-using-Hudi-CLI/index.html b/content/cn/videos/2023/12/30/Step-by-step-guide-on-How-to-Migrate-legacy-COW-Table-on-S3-to-MOR-Table-using-Hudi-CLI/index.html index 8a97ce1b318c1..c840c616fdd88 100644 --- a/content/cn/videos/2023/12/30/Step-by-step-guide-on-How-to-Migrate-legacy-COW-Table-on-S3-to-MOR-Table-using-Hudi-CLI/index.html +++ b/content/cn/videos/2023/12/30/Step-by-step-guide-on-How-to-Migrate-legacy-COW-Table-on-S3-to-MOR-Table-using-Hudi-CLI/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2023/12/31/What-is-Spark-Connect-and-Getting-started-Spark-Connect-Hello-World/index.html b/content/cn/videos/2023/12/31/What-is-Spark-Connect-and-Getting-started-Spark-Connect-Hello-World/index.html index a8aa454bd8c86..4eb389d1ae960 100644 --- a/content/cn/videos/2023/12/31/What-is-Spark-Connect-and-Getting-started-Spark-Connect-Hello-World/index.html +++ b/content/cn/videos/2023/12/31/What-is-Spark-Connect-and-Getting-started-Spark-Connect-Hello-World/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/01/01/Data-Lake-to-Microservices-Apache-Hudi-Record-Index-FastAPI-Spark-Connect-with-Swagger-UI/index.html b/content/cn/videos/2024/01/01/Data-Lake-to-Microservices-Apache-Hudi-Record-Index-FastAPI-Spark-Connect-with-Swagger-UI/index.html index 1b52adc088cc4..adf7d6cce837b 100644 --- a/content/cn/videos/2024/01/01/Data-Lake-to-Microservices-Apache-Hudi-Record-Index-FastAPI-Spark-Connect-with-Swagger-UI/index.html +++ b/content/cn/videos/2024/01/01/Data-Lake-to-Microservices-Apache-Hudi-Record-Index-FastAPI-Spark-Connect-with-Swagger-UI/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/01/06/Dynamic-Delta-Streamer-Jobs-with-JDBC-Puller-for-Postgres-Bring-all-Tables-from-particular-Schema-full/index.html b/content/cn/videos/2024/01/06/Dynamic-Delta-Streamer-Jobs-with-JDBC-Puller-for-Postgres-Bring-all-Tables-from-particular-Schema-full/index.html index e2eb5ee8875af..9ba637e1c8714 100644 --- a/content/cn/videos/2024/01/06/Dynamic-Delta-Streamer-Jobs-with-JDBC-Puller-for-Postgres-Bring-all-Tables-from-particular-Schema-full/index.html +++ b/content/cn/videos/2024/01/06/Dynamic-Delta-Streamer-Jobs-with-JDBC-Puller-for-Postgres-Bring-all-Tables-from-particular-Schema-full/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/01/06/Dynamic-Delta-Streamer-Jobs-with-JDBC-Puller-for-Postgres-Bring-all-Tables-from-particular-Schema/index.html b/content/cn/videos/2024/01/06/Dynamic-Delta-Streamer-Jobs-with-JDBC-Puller-for-Postgres-Bring-all-Tables-from-particular-Schema/index.html index dfd71ce3b13f8..00ab79ae68f4e 100644 --- a/content/cn/videos/2024/01/06/Dynamic-Delta-Streamer-Jobs-with-JDBC-Puller-for-Postgres-Bring-all-Tables-from-particular-Schema/index.html +++ b/content/cn/videos/2024/01/06/Dynamic-Delta-Streamer-Jobs-with-JDBC-Puller-for-Postgres-Bring-all-Tables-from-particular-Schema/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/01/13/Setup-HUDI-with-AWS-Glue-and-MINIO-locally-using-Docker-Container-in-Minutes/index.html b/content/cn/videos/2024/01/13/Setup-HUDI-with-AWS-Glue-and-MINIO-locally-using-Docker-Container-in-Minutes/index.html index fd80974d8648e..4f4440300510f 100644 --- a/content/cn/videos/2024/01/13/Setup-HUDI-with-AWS-Glue-and-MINIO-locally-using-Docker-Container-in-Minutes/index.html +++ b/content/cn/videos/2024/01/13/Setup-HUDI-with-AWS-Glue-and-MINIO-locally-using-Docker-Container-in-Minutes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/01/17/How-to-Delete-Items-from-Hudi-using-Delta-Streamer-operating-in-UPSERT-Mode-with-Kafka-Avro-MSG-12/index.html b/content/cn/videos/2024/01/17/How-to-Delete-Items-from-Hudi-using-Delta-Streamer-operating-in-UPSERT-Mode-with-Kafka-Avro-MSG-12/index.html index 84d4f99c6c148..381cba41f7e70 100644 --- a/content/cn/videos/2024/01/17/How-to-Delete-Items-from-Hudi-using-Delta-Streamer-operating-in-UPSERT-Mode-with-Kafka-Avro-MSG-12/index.html +++ b/content/cn/videos/2024/01/17/How-to-Delete-Items-from-Hudi-using-Delta-Streamer-operating-in-UPSERT-Mode-with-Kafka-Avro-MSG-12/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/01/21/Learn-How-to-Move-Data-From-MongoDB-to-Apache-Hudi-Using-PySpark/index.html b/content/cn/videos/2024/01/21/Learn-How-to-Move-Data-From-MongoDB-to-Apache-Hudi-Using-PySpark/index.html index e93a0712c1fde..a07ed367991d8 100644 --- a/content/cn/videos/2024/01/21/Learn-How-to-Move-Data-From-MongoDB-to-Apache-Hudi-Using-PySpark/index.html +++ b/content/cn/videos/2024/01/21/Learn-How-to-Move-Data-From-MongoDB-to-Apache-Hudi-Using-PySpark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/02/03/Apache-Hudi-Table-Services-Export-Services-HoodieSnapshotExporter-Hands-on-labs/index.html b/content/cn/videos/2024/02/03/Apache-Hudi-Table-Services-Export-Services-HoodieSnapshotExporter-Hands-on-labs/index.html index da7fe0e12f9e1..ff228f8c1cb4a 100644 --- a/content/cn/videos/2024/02/03/Apache-Hudi-Table-Services-Export-Services-HoodieSnapshotExporter-Hands-on-labs/index.html +++ b/content/cn/videos/2024/02/03/Apache-Hudi-Table-Services-Export-Services-HoodieSnapshotExporter-Hands-on-labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/02/03/Apache-Hudi-Table-Services-Offline-Compaction-HoodieCompactor-Hands-on-labs/index.html b/content/cn/videos/2024/02/03/Apache-Hudi-Table-Services-Offline-Compaction-HoodieCompactor-Hands-on-labs/index.html index cc345efe8a312..0552e74ff008d 100644 --- a/content/cn/videos/2024/02/03/Apache-Hudi-Table-Services-Offline-Compaction-HoodieCompactor-Hands-on-labs/index.html +++ b/content/cn/videos/2024/02/03/Apache-Hudi-Table-Services-Offline-Compaction-HoodieCompactor-Hands-on-labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/02/07/Building-an-Open-Source-Data-Lake-House-with-Hudip-Postgres-Hive-Metastore-Minio-and-StarRocks/index.html b/content/cn/videos/2024/02/07/Building-an-Open-Source-Data-Lake-House-with-Hudip-Postgres-Hive-Metastore-Minio-and-StarRocks/index.html index 454543a0675a3..5024ac12a2263 100644 --- a/content/cn/videos/2024/02/07/Building-an-Open-Source-Data-Lake-House-with-Hudip-Postgres-Hive-Metastore-Minio-and-StarRocks/index.html +++ b/content/cn/videos/2024/02/07/Building-an-Open-Source-Data-Lake-House-with-Hudip-Postgres-Hive-Metastore-Minio-and-StarRocks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/02/10/Data-Ingestion-to-Visualization-Hudi-MinIO-StarRocks-HiveMetaStore-Apache-SuperSet-Hands-on-Guide/index.html b/content/cn/videos/2024/02/10/Data-Ingestion-to-Visualization-Hudi-MinIO-StarRocks-HiveMetaStore-Apache-SuperSet-Hands-on-Guide/index.html index 9c8bd6330a4d0..fb650192be34b 100644 --- a/content/cn/videos/2024/02/10/Data-Ingestion-to-Visualization-Hudi-MinIO-StarRocks-HiveMetaStore-Apache-SuperSet-Hands-on-Guide/index.html +++ b/content/cn/videos/2024/02/10/Data-Ingestion-to-Visualization-Hudi-MinIO-StarRocks-HiveMetaStore-Apache-SuperSet-Hands-on-Guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/02/17/Learn-How-to-Integerate-Hudi-Spark-job-with-Airflow-and-MinIO-Hands-on-Labs/index.html b/content/cn/videos/2024/02/17/Learn-How-to-Integerate-Hudi-Spark-job-with-Airflow-and-MinIO-Hands-on-Labs/index.html index 7fd251b15ddc0..f2f1a1b89cdd2 100644 --- a/content/cn/videos/2024/02/17/Learn-How-to-Integerate-Hudi-Spark-job-with-Airflow-and-MinIO-Hands-on-Labs/index.html +++ b/content/cn/videos/2024/02/17/Learn-How-to-Integerate-Hudi-Spark-job-with-Airflow-and-MinIO-Hands-on-Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/02/18/Build-Incremental-ETL-pipeline-with-Hudi-and-Airflow-and-MinIO/index.html b/content/cn/videos/2024/02/18/Build-Incremental-ETL-pipeline-with-Hudi-and-Airflow-and-MinIO/index.html index 63fe7d0526ee4..dfbf3b325fdc5 100644 --- a/content/cn/videos/2024/02/18/Build-Incremental-ETL-pipeline-with-Hudi-and-Airflow-and-MinIO/index.html +++ b/content/cn/videos/2024/02/18/Build-Incremental-ETL-pipeline-with-Hudi-and-Airflow-and-MinIO/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/02/23/Getting-Started-with-Open-Data-lineage-Marquez-Project-Apache-Hudi-Spark-jobs/index.html b/content/cn/videos/2024/02/23/Getting-Started-with-Open-Data-lineage-Marquez-Project-Apache-Hudi-Spark-jobs/index.html index a5451e2537d2a..6d15aaf6a5c7f 100644 --- a/content/cn/videos/2024/02/23/Getting-Started-with-Open-Data-lineage-Marquez-Project-Apache-Hudi-Spark-jobs/index.html +++ b/content/cn/videos/2024/02/23/Getting-Started-with-Open-Data-lineage-Marquez-Project-Apache-Hudi-Spark-jobs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/02/27/Learn-How-you-can-run-DeltaStreamer-Running-on-AWS-Glue-with-Hudi-0.14-Step-by-Step-Guide/index.html b/content/cn/videos/2024/02/27/Learn-How-you-can-run-DeltaStreamer-Running-on-AWS-Glue-with-Hudi-0.14-Step-by-Step-Guide/index.html index 3787464713b84..8d94d98761dab 100644 --- a/content/cn/videos/2024/02/27/Learn-How-you-can-run-DeltaStreamer-Running-on-AWS-Glue-with-Hudi-0.14-Step-by-Step-Guide/index.html +++ b/content/cn/videos/2024/02/27/Learn-How-you-can-run-DeltaStreamer-Running-on-AWS-Glue-with-Hudi-0.14-Step-by-Step-Guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/03/01/How-to-Query-Apache-Hudi-tables-from-Glue-Interactive-Notebook-for-AdHoc-Analysis/index.html b/content/cn/videos/2024/03/01/How-to-Query-Apache-Hudi-tables-from-Glue-Interactive-Notebook-for-AdHoc-Analysis/index.html index 9741777a4822c..a3e7b40f336bb 100644 --- a/content/cn/videos/2024/03/01/How-to-Query-Apache-Hudi-tables-from-Glue-Interactive-Notebook-for-AdHoc-Analysis/index.html +++ b/content/cn/videos/2024/03/01/How-to-Query-Apache-Hudi-tables-from-Glue-Interactive-Notebook-for-AdHoc-Analysis/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/03/11/Getting-Started-Tutorial-Building-a-Data-Lakehouse-With-StarRocks-Apache-Hudi-and-MinIO/index.html b/content/cn/videos/2024/03/11/Getting-Started-Tutorial-Building-a-Data-Lakehouse-With-StarRocks-Apache-Hudi-and-MinIO/index.html index 43c5e7063a627..457988004fe0a 100644 --- a/content/cn/videos/2024/03/11/Getting-Started-Tutorial-Building-a-Data-Lakehouse-With-StarRocks-Apache-Hudi-and-MinIO/index.html +++ b/content/cn/videos/2024/03/11/Getting-Started-Tutorial-Building-a-Data-Lakehouse-With-StarRocks-Apache-Hudi-and-MinIO/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/03/12/Managing-Updates-&-Deletes-in-Glue-Hudi-Spark-Jobs-with-CDC-Data:-Using-_hoodie_is_deleted-Flag/index.html b/content/cn/videos/2024/03/12/Managing-Updates-&-Deletes-in-Glue-Hudi-Spark-Jobs-with-CDC-Data:-Using-_hoodie_is_deleted-Flag/index.html index b54763d1aad42..e315e0cf42de2 100644 --- a/content/cn/videos/2024/03/12/Managing-Updates-&-Deletes-in-Glue-Hudi-Spark-Jobs-with-CDC-Data:-Using-_hoodie_is_deleted-Flag/index.html +++ b/content/cn/videos/2024/03/12/Managing-Updates-&-Deletes-in-Glue-Hudi-Spark-Jobs-with-CDC-Data:-Using-_hoodie_is_deleted-Flag/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/03/18/Mastering-Incremental-ETL-with-DeltaStreamer-and-SQL-Based-Transformer/index.html b/content/cn/videos/2024/03/18/Mastering-Incremental-ETL-with-DeltaStreamer-and-SQL-Based-Transformer/index.html index 8532b55f4d993..541704ebf1d6a 100644 --- a/content/cn/videos/2024/03/18/Mastering-Incremental-ETL-with-DeltaStreamer-and-SQL-Based-Transformer/index.html +++ b/content/cn/videos/2024/03/18/Mastering-Incremental-ETL-with-DeltaStreamer-and-SQL-Based-Transformer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/03/20/How-to-perform-Backfilling-jobs-with-Hudi-DeltaStreamer-and-Spark-SQL-using-SqlSource-Class/index.html b/content/cn/videos/2024/03/20/How-to-perform-Backfilling-jobs-with-Hudi-DeltaStreamer-and-Spark-SQL-using-SqlSource-Class/index.html index e94e8a468daf1..89ecbc6fd090a 100644 --- a/content/cn/videos/2024/03/20/How-to-perform-Backfilling-jobs-with-Hudi-DeltaStreamer-and-Spark-SQL-using-SqlSource-Class/index.html +++ b/content/cn/videos/2024/03/20/How-to-perform-Backfilling-jobs-with-Hudi-DeltaStreamer-and-Spark-SQL-using-SqlSource-Class/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/03/29/Open-Lakehouse-Evolution-Powering-the-Future-with-YugabyteDB-and-Apache-Hudi-Episode-102/index.html b/content/cn/videos/2024/03/29/Open-Lakehouse-Evolution-Powering-the-Future-with-YugabyteDB-and-Apache-Hudi-Episode-102/index.html index 27600befed473..373cdea3a76b4 100644 --- a/content/cn/videos/2024/03/29/Open-Lakehouse-Evolution-Powering-the-Future-with-YugabyteDB-and-Apache-Hudi-Episode-102/index.html +++ b/content/cn/videos/2024/03/29/Open-Lakehouse-Evolution-Powering-the-Future-with-YugabyteDB-and-Apache-Hudi-Episode-102/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/03/30/Building-DataLakeHouse-using-XTableMinIO-StarRocks-DeltaStreamer---Interoperating-Hudi-IceBerg-and-Delta/index.html b/content/cn/videos/2024/03/30/Building-DataLakeHouse-using-XTableMinIO-StarRocks-DeltaStreamer---Interoperating-Hudi-IceBerg-and-Delta/index.html index a12a7ff54fde2..0255710497ea9 100644 --- a/content/cn/videos/2024/03/30/Building-DataLakeHouse-using-XTableMinIO-StarRocks-DeltaStreamer---Interoperating-Hudi-IceBerg-and-Delta/index.html +++ b/content/cn/videos/2024/03/30/Building-DataLakeHouse-using-XTableMinIO-StarRocks-DeltaStreamer---Interoperating-Hudi-IceBerg-and-Delta/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/04/03/Reading-Data-from-Hudi-INC-and-Joining-with-Delta-Tables-using-HudiStreamer-and-SQL-Based-Transformer/index.html b/content/cn/videos/2024/04/03/Reading-Data-from-Hudi-INC-and-Joining-with-Delta-Tables-using-HudiStreamer-and-SQL-Based-Transformer/index.html index c0b4de1899545..8da5d2a3979b6 100644 --- a/content/cn/videos/2024/04/03/Reading-Data-from-Hudi-INC-and-Joining-with-Delta-Tables-using-HudiStreamer-and-SQL-Based-Transformer/index.html +++ b/content/cn/videos/2024/04/03/Reading-Data-from-Hudi-INC-and-Joining-with-Delta-Tables-using-HudiStreamer-and-SQL-Based-Transformer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/04/06/Build-Universal-Data-lake-with-Posgres-+-Debezium+Kafka+DeltaSTreamer-+-Minio+HiveMetastore+Trino/index.html b/content/cn/videos/2024/04/06/Build-Universal-Data-lake-with-Posgres-+-Debezium+Kafka+DeltaSTreamer-+-Minio+HiveMetastore+Trino/index.html index af39d84f80f94..a1f55289cf717 100644 --- a/content/cn/videos/2024/04/06/Build-Universal-Data-lake-with-Posgres-+-Debezium+Kafka+DeltaSTreamer-+-Minio+HiveMetastore+Trino/index.html +++ b/content/cn/videos/2024/04/06/Build-Universal-Data-lake-with-Posgres-+-Debezium+Kafka+DeltaSTreamer-+-Minio+HiveMetastore+Trino/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/04/10/Build-Universal-Data-lake-with-MySQL-+-Debezium+Kafka+DeltaSTreamer-+-Minio+HiveMetastore+Trino/index.html b/content/cn/videos/2024/04/10/Build-Universal-Data-lake-with-MySQL-+-Debezium+Kafka+DeltaSTreamer-+-Minio+HiveMetastore+Trino/index.html index 23ce5729f64d6..db978b231a132 100644 --- a/content/cn/videos/2024/04/10/Build-Universal-Data-lake-with-MySQL-+-Debezium+Kafka+DeltaSTreamer-+-Minio+HiveMetastore+Trino/index.html +++ b/content/cn/videos/2024/04/10/Build-Universal-Data-lake-with-MySQL-+-Debezium+Kafka+DeltaSTreamer-+-Minio+HiveMetastore+Trino/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/04/22/Hudi-with-Kyuubi-a-distributed-and-multi-tenant-gateway-to-provide-serverless-SQL-on-lakehouses/index.html b/content/cn/videos/2024/04/22/Hudi-with-Kyuubi-a-distributed-and-multi-tenant-gateway-to-provide-serverless-SQL-on-lakehouses/index.html index 010ef5a80f22a..8cb0a6b5ad280 100644 --- a/content/cn/videos/2024/04/22/Hudi-with-Kyuubi-a-distributed-and-multi-tenant-gateway-to-provide-serverless-SQL-on-lakehouses/index.html +++ b/content/cn/videos/2024/04/22/Hudi-with-Kyuubi-a-distributed-and-multi-tenant-gateway-to-provide-serverless-SQL-on-lakehouses/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/05/04/Learn-How-to-Display-Data-From-Hudi-Tables-to-your-Frontend-with-Flask-and-Daft-NO-SPARK-NEEDED/index.html b/content/cn/videos/2024/05/04/Learn-How-to-Display-Data-From-Hudi-Tables-to-your-Frontend-with-Flask-and-Daft-NO-SPARK-NEEDED/index.html index d0101d38f7150..cb99e302fd177 100644 --- a/content/cn/videos/2024/05/04/Learn-How-to-Display-Data-From-Hudi-Tables-to-your-Frontend-with-Flask-and-Daft-NO-SPARK-NEEDED/index.html +++ b/content/cn/videos/2024/05/04/Learn-How-to-Display-Data-From-Hudi-Tables-to-your-Frontend-with-Flask-and-Daft-NO-SPARK-NEEDED/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/05/08/How-to-read-Hudi-Dataset-Using-AWS-Glue-Ray-and-Glue-Notebooks-(withouth-Spark)/index.html b/content/cn/videos/2024/05/08/How-to-read-Hudi-Dataset-Using-AWS-Glue-Ray-and-Glue-Notebooks-(withouth-Spark)/index.html index 7922b6fd18cf1..7769db91b3ba8 100644 --- a/content/cn/videos/2024/05/08/How-to-read-Hudi-Dataset-Using-AWS-Glue-Ray-and-Glue-Notebooks-(withouth-Spark)/index.html +++ b/content/cn/videos/2024/05/08/How-to-read-Hudi-Dataset-Using-AWS-Glue-Ray-and-Glue-Notebooks-(withouth-Spark)/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/05/12/Unleashing-the-Power-of-Serverless-Serving-Gold-Hudi-Tables-with-AWS-Lambda/index.html b/content/cn/videos/2024/05/12/Unleashing-the-Power-of-Serverless-Serving-Gold-Hudi-Tables-with-AWS-Lambda/index.html index 4bb35d34f00c9..789111b259ecf 100644 --- a/content/cn/videos/2024/05/12/Unleashing-the-Power-of-Serverless-Serving-Gold-Hudi-Tables-with-AWS-Lambda/index.html +++ b/content/cn/videos/2024/05/12/Unleashing-the-Power-of-Serverless-Serving-Gold-Hudi-Tables-with-AWS-Lambda/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/05/18/Learn-How-to-use-Cloudwatch-metrics-with-Hudi-AWS-Glue-Jobs/index.html b/content/cn/videos/2024/05/18/Learn-How-to-use-Cloudwatch-metrics-with-Hudi-AWS-Glue-Jobs/index.html index c74b2af8c9543..79f03604f041f 100644 --- a/content/cn/videos/2024/05/18/Learn-How-to-use-Cloudwatch-metrics-with-Hudi-AWS-Glue-Jobs/index.html +++ b/content/cn/videos/2024/05/18/Learn-How-to-use-Cloudwatch-metrics-with-Hudi-AWS-Glue-Jobs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/05/20/deltastreamer-with-incremental-etl-and-broadcast-joins-for-faster-etl/index.html b/content/cn/videos/2024/05/20/deltastreamer-with-incremental-etl-and-broadcast-joins-for-faster-etl/index.html index 96bd537397a3e..35b9fbbc863b2 100644 --- a/content/cn/videos/2024/05/20/deltastreamer-with-incremental-etl-and-broadcast-joins-for-faster-etl/index.html +++ b/content/cn/videos/2024/05/20/deltastreamer-with-incremental-etl-and-broadcast-joins-for-faster-etl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/05/22/hudi-delta-streamer-implementing-slowly-changing-dimension-and-query-that-using-trino/index.html b/content/cn/videos/2024/05/22/hudi-delta-streamer-implementing-slowly-changing-dimension-and-query-that-using-trino/index.html index 0bd18350bd870..eb145caf2101d 100644 --- a/content/cn/videos/2024/05/22/hudi-delta-streamer-implementing-slowly-changing-dimension-and-query-that-using-trino/index.html +++ b/content/cn/videos/2024/05/22/hudi-delta-streamer-implementing-slowly-changing-dimension-and-query-that-using-trino/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/05/22/hudi-streamer-implementing-slowly-changing-dimension-type-2-and-query-real-time-trino/index.html b/content/cn/videos/2024/05/22/hudi-streamer-implementing-slowly-changing-dimension-type-2-and-query-real-time-trino/index.html index 930586fc31bb7..6452103f1ab77 100644 --- a/content/cn/videos/2024/05/22/hudi-streamer-implementing-slowly-changing-dimension-type-2-and-query-real-time-trino/index.html +++ b/content/cn/videos/2024/05/22/hudi-streamer-implementing-slowly-changing-dimension-type-2-and-query-real-time-trino/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/05/23/build-hudi-date-dimension-in-minutes-with-spark-sql-minio-and-query-with-trino/index.html b/content/cn/videos/2024/05/23/build-hudi-date-dimension-in-minutes-with-spark-sql-minio-and-query-with-trino/index.html index d70135b781b45..6a2e2a9723d9f 100644 --- a/content/cn/videos/2024/05/23/build-hudi-date-dimension-in-minutes-with-spark-sql-minio-and-query-with-trino/index.html +++ b/content/cn/videos/2024/05/23/build-hudi-date-dimension-in-minutes-with-spark-sql-minio-and-query-with-trino/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/05/25/learn-how-to-ingest-data-from-pulsar-topic-into-hudi-with-deltastreamer/index.html b/content/cn/videos/2024/05/25/learn-how-to-ingest-data-from-pulsar-topic-into-hudi-with-deltastreamer/index.html index bb49413a8c0ae..616c0ffb7c2fe 100644 --- a/content/cn/videos/2024/05/25/learn-how-to-ingest-data-from-pulsar-topic-into-hudi-with-deltastreamer/index.html +++ b/content/cn/videos/2024/05/25/learn-how-to-ingest-data-from-pulsar-topic-into-hudi-with-deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/06/05/multiple-spark-writers-to-hudi-tables/index.html b/content/cn/videos/2024/06/05/multiple-spark-writers-to-hudi-tables/index.html index d27c972631fd4..ed672080bce1b 100644 --- a/content/cn/videos/2024/06/05/multiple-spark-writers-to-hudi-tables/index.html +++ b/content/cn/videos/2024/06/05/multiple-spark-writers-to-hudi-tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/06/12/hudi-cleaning-process-hoodie.keep.min.commits-and-hoodie.keep.max.commits-explained/index.html b/content/cn/videos/2024/06/12/hudi-cleaning-process-hoodie.keep.min.commits-and-hoodie.keep.max.commits-explained/index.html index cd382c4e511b3..58c7154373257 100644 --- a/content/cn/videos/2024/06/12/hudi-cleaning-process-hoodie.keep.min.commits-and-hoodie.keep.max.commits-explained/index.html +++ b/content/cn/videos/2024/06/12/hudi-cleaning-process-hoodie.keep.min.commits-and-hoodie.keep.max.commits-explained/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/06/15/how-we-utilized-hudis-time-travel-query-to-investigate-bid-and-spend/index.html b/content/cn/videos/2024/06/15/how-we-utilized-hudis-time-travel-query-to-investigate-bid-and-spend/index.html index 629294f24df20..fe27d3a24fc5e 100644 --- a/content/cn/videos/2024/06/15/how-we-utilized-hudis-time-travel-query-to-investigate-bid-and-spend/index.html +++ b/content/cn/videos/2024/06/15/how-we-utilized-hudis-time-travel-query-to-investigate-bid-and-spend/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/06/16/hudi-with-spark-sql-for-beginners-insert-updates-delete-incremental-query-stored-procedures/index.html b/content/cn/videos/2024/06/16/hudi-with-spark-sql-for-beginners-insert-updates-delete-incremental-query-stored-procedures/index.html index dd2561cd72ccb..a7050b701a6dc 100644 --- a/content/cn/videos/2024/06/16/hudi-with-spark-sql-for-beginners-insert-updates-delete-incremental-query-stored-procedures/index.html +++ b/content/cn/videos/2024/06/16/hudi-with-spark-sql-for-beginners-insert-updates-delete-incremental-query-stored-procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/06/18/learn-how-to-ingest-xml-files-with-aws-glue-into-hudi-datalakes/index.html b/content/cn/videos/2024/06/18/learn-how-to-ingest-xml-files-with-aws-glue-into-hudi-datalakes/index.html index 03d9940b5b610..d3ecf07816fd8 100644 --- a/content/cn/videos/2024/06/18/learn-how-to-ingest-xml-files-with-aws-glue-into-hudi-datalakes/index.html +++ b/content/cn/videos/2024/06/18/learn-how-to-ingest-xml-files-with-aws-glue-into-hudi-datalakes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/06/21/Four-Different-Ways-to-fetch-Apache-Hudi-Commit-time-in-Python-and-PySpark/index.html b/content/cn/videos/2024/06/21/Four-Different-Ways-to-fetch-Apache-Hudi-Commit-time-in-Python-and-PySpark/index.html index 64aac536300b3..4dd70a2ce0c9f 100644 --- a/content/cn/videos/2024/06/21/Four-Different-Ways-to-fetch-Apache-Hudi-Commit-time-in-Python-and-PySpark/index.html +++ b/content/cn/videos/2024/06/21/Four-Different-Ways-to-fetch-Apache-Hudi-Commit-time-in-Python-and-PySpark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/09/01/how-to-consume-apache-hudi-tables-in-snowflake-iceberg-and-athena-hands-on-labs/index.html b/content/cn/videos/2024/09/01/how-to-consume-apache-hudi-tables-in-snowflake-iceberg-and-athena-hands-on-labs/index.html index 56f57711f2556..f4629263c801e 100644 --- a/content/cn/videos/2024/09/01/how-to-consume-apache-hudi-tables-in-snowflake-iceberg-and-athena-hands-on-labs/index.html +++ b/content/cn/videos/2024/09/01/how-to-consume-apache-hudi-tables-in-snowflake-iceberg-and-athena-hands-on-labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/09/26/Create-Apache-Hudi-Table-Using-Glue-in-Catalog-By-Reading-Streaming-Data-From-AWS-Kinesis/index.html b/content/cn/videos/2024/09/26/Create-Apache-Hudi-Table-Using-Glue-in-Catalog-By-Reading-Streaming-Data-From-AWS-Kinesis/index.html index 0820d9b9f1187..33b44e03f8117 100644 --- a/content/cn/videos/2024/09/26/Create-Apache-Hudi-Table-Using-Glue-in-Catalog-By-Reading-Streaming-Data-From-AWS-Kinesis/index.html +++ b/content/cn/videos/2024/09/26/Create-Apache-Hudi-Table-Using-Glue-in-Catalog-By-Reading-Streaming-Data-From-AWS-Kinesis/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/10/06/learn-how-to-read-hudi-tables-on-s3-locally-in-your-pyspark-job/index.html b/content/cn/videos/2024/10/06/learn-how-to-read-hudi-tables-on-s3-locally-in-your-pyspark-job/index.html index 71c79b70c6961..2697bb105c125 100644 --- a/content/cn/videos/2024/10/06/learn-how-to-read-hudi-tables-on-s3-locally-in-your-pyspark-job/index.html +++ b/content/cn/videos/2024/10/06/learn-how-to-read-hudi-tables-on-s3-locally-in-your-pyspark-job/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/10/22/practice-of-building-a-lakehouse-based-on-apache-hudi-at-kuaishou-inc/index.html b/content/cn/videos/2024/10/22/practice-of-building-a-lakehouse-based-on-apache-hudi-at-kuaishou-inc/index.html index 7a03c8e586aac..897b52982dc4a 100644 --- a/content/cn/videos/2024/10/22/practice-of-building-a-lakehouse-based-on-apache-hudi-at-kuaishou-inc/index.html +++ b/content/cn/videos/2024/10/22/practice-of-building-a-lakehouse-based-on-apache-hudi-at-kuaishou-inc/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/2024/11/17/Create-Data-Lake-using-aws-Glue-as-beginner/index.html b/content/cn/videos/2024/11/17/Create-Data-Lake-using-aws-Glue-as-beginner/index.html index 1c1c9ae671c15..883cf976da500 100644 --- a/content/cn/videos/2024/11/17/Create-Data-Lake-using-aws-Glue-as-beginner/index.html +++ b/content/cn/videos/2024/11/17/Create-Data-Lake-using-aws-Glue-as-beginner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/archive/index.html b/content/cn/videos/archive/index.html index 04a3d1bdcf17e..ce7cba9a67642 100644 --- a/content/cn/videos/archive/index.html +++ b/content/cn/videos/archive/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/index.html b/content/cn/videos/index.html index 8bb9b613c114d..968f849ab3754 100644 --- a/content/cn/videos/index.html +++ b/content/cn/videos/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/page/10/index.html b/content/cn/videos/page/10/index.html index 6b7594394abb7..3c42752798c23 100644 --- a/content/cn/videos/page/10/index.html +++ b/content/cn/videos/page/10/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/page/11/index.html b/content/cn/videos/page/11/index.html index 09184b13e82c3..49b6f5f901640 100644 --- a/content/cn/videos/page/11/index.html +++ b/content/cn/videos/page/11/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/page/12/index.html b/content/cn/videos/page/12/index.html index 5b6e09fff13ef..3c57ea3cb743d 100644 --- a/content/cn/videos/page/12/index.html +++ b/content/cn/videos/page/12/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/page/13/index.html b/content/cn/videos/page/13/index.html index 4b72c7436f598..1f3ce427c6b7c 100644 --- a/content/cn/videos/page/13/index.html +++ b/content/cn/videos/page/13/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/page/14/index.html b/content/cn/videos/page/14/index.html index 0c4215c0a5b5c..0fe9d29cff452 100644 --- a/content/cn/videos/page/14/index.html +++ b/content/cn/videos/page/14/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/page/15/index.html b/content/cn/videos/page/15/index.html index b971266561d7b..7b2e9c864dee4 100644 --- a/content/cn/videos/page/15/index.html +++ b/content/cn/videos/page/15/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/page/16/index.html b/content/cn/videos/page/16/index.html index e20d810715b57..146b090ec2111 100644 --- a/content/cn/videos/page/16/index.html +++ b/content/cn/videos/page/16/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/page/17/index.html b/content/cn/videos/page/17/index.html index 319792c8b6ecc..ce039e1912be6 100644 --- a/content/cn/videos/page/17/index.html +++ b/content/cn/videos/page/17/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/page/18/index.html b/content/cn/videos/page/18/index.html index b1a88443a12da..7a9db01830f16 100644 --- a/content/cn/videos/page/18/index.html +++ b/content/cn/videos/page/18/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/page/19/index.html b/content/cn/videos/page/19/index.html index 193175b379696..e0bdf66e6a671 100644 --- a/content/cn/videos/page/19/index.html +++ b/content/cn/videos/page/19/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/page/2/index.html b/content/cn/videos/page/2/index.html index 31a33290d375e..cd91aef85b13e 100644 --- a/content/cn/videos/page/2/index.html +++ b/content/cn/videos/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/page/20/index.html b/content/cn/videos/page/20/index.html index 9c3319f6de170..f99639bb557ad 100644 --- a/content/cn/videos/page/20/index.html +++ b/content/cn/videos/page/20/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/page/3/index.html b/content/cn/videos/page/3/index.html index 26106d1c84c5c..bd5583f5188ef 100644 --- a/content/cn/videos/page/3/index.html +++ b/content/cn/videos/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/page/4/index.html b/content/cn/videos/page/4/index.html index f5877b8915bf7..14e91b491d52b 100644 --- a/content/cn/videos/page/4/index.html +++ b/content/cn/videos/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/page/5/index.html b/content/cn/videos/page/5/index.html index 6d72a518d7a9c..491686d1bd243 100644 --- a/content/cn/videos/page/5/index.html +++ b/content/cn/videos/page/5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/page/6/index.html b/content/cn/videos/page/6/index.html index bd1a70e30e05c..ab5bb6ccd9066 100644 --- a/content/cn/videos/page/6/index.html +++ b/content/cn/videos/page/6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/page/7/index.html b/content/cn/videos/page/7/index.html index 290cc5d8ba1a7..291106462e67f 100644 --- a/content/cn/videos/page/7/index.html +++ b/content/cn/videos/page/7/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/page/8/index.html b/content/cn/videos/page/8/index.html index 63388b1c30955..77a4992357fac 100644 --- a/content/cn/videos/page/8/index.html +++ b/content/cn/videos/page/8/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/page/9/index.html b/content/cn/videos/page/9/index.html index 828b5304f2685..f5b0097db1568 100644 --- a/content/cn/videos/page/9/index.html +++ b/content/cn/videos/page/9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/access-restriction/index.html b/content/cn/videos/tags/access-restriction/index.html index 0482ce2115e6a..83a0bbeff0e25 100644 --- a/content/cn/videos/tags/access-restriction/index.html +++ b/content/cn/videos/tags/access-restriction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/after-image/index.html b/content/cn/videos/tags/after-image/index.html index 79b184ec156f9..55003d2fbc10c 100644 --- a/content/cn/videos/tags/after-image/index.html +++ b/content/cn/videos/tags/after-image/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/alerting/index.html b/content/cn/videos/tags/alerting/index.html index 3c9b194531cf2..315430cbc563f 100644 --- a/content/cn/videos/tags/alerting/index.html +++ b/content/cn/videos/tags/alerting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-athena-spark-notebook/index.html b/content/cn/videos/tags/amazon-athena-spark-notebook/index.html index 6b32a531d9070..c933ce516e808 100644 --- a/content/cn/videos/tags/amazon-athena-spark-notebook/index.html +++ b/content/cn/videos/tags/amazon-athena-spark-notebook/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-athena/index.html b/content/cn/videos/tags/amazon-athena/index.html index 647319602abf9..3e36946cd15ed 100644 --- a/content/cn/videos/tags/amazon-athena/index.html +++ b/content/cn/videos/tags/amazon-athena/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-athena/page/2/index.html b/content/cn/videos/tags/amazon-athena/page/2/index.html index ceea3bf1b3ba3..5586fc8958516 100644 --- a/content/cn/videos/tags/amazon-athena/page/2/index.html +++ b/content/cn/videos/tags/amazon-athena/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-aurora/index.html b/content/cn/videos/tags/amazon-aurora/index.html index a3cb1da199eff..32b847d447340 100644 --- a/content/cn/videos/tags/amazon-aurora/index.html +++ b/content/cn/videos/tags/amazon-aurora/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-cloudwatch/index.html b/content/cn/videos/tags/amazon-cloudwatch/index.html index 993b4e67fe5b2..c0ef5f953dc08 100644 --- a/content/cn/videos/tags/amazon-cloudwatch/index.html +++ b/content/cn/videos/tags/amazon-cloudwatch/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-dyanmodb/index.html b/content/cn/videos/tags/amazon-dyanmodb/index.html index f6f102f1af018..0cec06d2200c9 100644 --- a/content/cn/videos/tags/amazon-dyanmodb/index.html +++ b/content/cn/videos/tags/amazon-dyanmodb/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-dynamodb/index.html b/content/cn/videos/tags/amazon-dynamodb/index.html index 14685557e4696..0df71eee92d33 100644 --- a/content/cn/videos/tags/amazon-dynamodb/index.html +++ b/content/cn/videos/tags/amazon-dynamodb/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-emr-cli/index.html b/content/cn/videos/tags/amazon-emr-cli/index.html index de3ea8b78425f..c72b60e951271 100644 --- a/content/cn/videos/tags/amazon-emr-cli/index.html +++ b/content/cn/videos/tags/amazon-emr-cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-emr-serverless/index.html b/content/cn/videos/tags/amazon-emr-serverless/index.html index 97fb08cf7a8ce..ba13ba1272852 100644 --- a/content/cn/videos/tags/amazon-emr-serverless/index.html +++ b/content/cn/videos/tags/amazon-emr-serverless/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-emr/index.html b/content/cn/videos/tags/amazon-emr/index.html index 5fe971a4ea7ba..9b1349e14b1b6 100644 --- a/content/cn/videos/tags/amazon-emr/index.html +++ b/content/cn/videos/tags/amazon-emr/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-kinesis/index.html b/content/cn/videos/tags/amazon-kinesis/index.html index 320afbc9c495d..0827c56457d4e 100644 --- a/content/cn/videos/tags/amazon-kinesis/index.html +++ b/content/cn/videos/tags/amazon-kinesis/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-kinesis/page/2/index.html b/content/cn/videos/tags/amazon-kinesis/page/2/index.html index 258862c8ef791..e5cf627363d36 100644 --- a/content/cn/videos/tags/amazon-kinesis/page/2/index.html +++ b/content/cn/videos/tags/amazon-kinesis/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-quicksight/index.html b/content/cn/videos/tags/amazon-quicksight/index.html index fbf30258c58da..d509866313471 100644 --- a/content/cn/videos/tags/amazon-quicksight/index.html +++ b/content/cn/videos/tags/amazon-quicksight/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-redshift-spectrum/index.html b/content/cn/videos/tags/amazon-redshift-spectrum/index.html index b4ce8ae372694..5fd63d0cd60bc 100644 --- a/content/cn/videos/tags/amazon-redshift-spectrum/index.html +++ b/content/cn/videos/tags/amazon-redshift-spectrum/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-redshift/index.html b/content/cn/videos/tags/amazon-redshift/index.html index c70eb1b8119d2..09baf710bc4bf 100644 --- a/content/cn/videos/tags/amazon-redshift/index.html +++ b/content/cn/videos/tags/amazon-redshift/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-s-3/index.html b/content/cn/videos/tags/amazon-s-3/index.html index d490232bc10ee..579866fc82ba5 100644 --- a/content/cn/videos/tags/amazon-s-3/index.html +++ b/content/cn/videos/tags/amazon-s-3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-s-3/page/2/index.html b/content/cn/videos/tags/amazon-s-3/page/2/index.html index f6a95b5fcc8cd..62832a5984184 100644 --- a/content/cn/videos/tags/amazon-s-3/page/2/index.html +++ b/content/cn/videos/tags/amazon-s-3/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-s-3/page/3/index.html b/content/cn/videos/tags/amazon-s-3/page/3/index.html index 3726635b6ed13..ca9695fe0f3b8 100644 --- a/content/cn/videos/tags/amazon-s-3/page/3/index.html +++ b/content/cn/videos/tags/amazon-s-3/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-s-3/page/4/index.html b/content/cn/videos/tags/amazon-s-3/page/4/index.html index 39723e1bc213c..b3cb6ca6bddb0 100644 --- a/content/cn/videos/tags/amazon-s-3/page/4/index.html +++ b/content/cn/videos/tags/amazon-s-3/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-sns/index.html b/content/cn/videos/tags/amazon-sns/index.html index 574d300be8a2c..b706ac850f488 100644 --- a/content/cn/videos/tags/amazon-sns/index.html +++ b/content/cn/videos/tags/amazon-sns/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon-sqs/index.html b/content/cn/videos/tags/amazon-sqs/index.html index 09a601129aa62..f8fbe5947540d 100644 --- a/content/cn/videos/tags/amazon-sqs/index.html +++ b/content/cn/videos/tags/amazon-sqs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/amazon/index.html b/content/cn/videos/tags/amazon/index.html index e30d7797291ca..16d9b5e1d2c4e 100644 --- a/content/cn/videos/tags/amazon/index.html +++ b/content/cn/videos/tags/amazon/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/analytics/index.html b/content/cn/videos/tags/analytics/index.html index a904d224de6ad..60c5f06792d22 100644 --- a/content/cn/videos/tags/analytics/index.html +++ b/content/cn/videos/tags/analytics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-airflow/index.html b/content/cn/videos/tags/apache-airflow/index.html index 29b5579ec7e56..f064e30d77f65 100644 --- a/content/cn/videos/tags/apache-airflow/index.html +++ b/content/cn/videos/tags/apache-airflow/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-avro/index.html b/content/cn/videos/tags/apache-avro/index.html index 83c601b0a0b2e..462e59acad575 100644 --- a/content/cn/videos/tags/apache-avro/index.html +++ b/content/cn/videos/tags/apache-avro/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-flink/index.html b/content/cn/videos/tags/apache-flink/index.html index 987a948251182..6952625117c15 100644 --- a/content/cn/videos/tags/apache-flink/index.html +++ b/content/cn/videos/tags/apache-flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hive/index.html b/content/cn/videos/tags/apache-hive/index.html index ea86269bb5222..7e861216301f1 100644 --- a/content/cn/videos/tags/apache-hive/index.html +++ b/content/cn/videos/tags/apache-hive/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/index.html b/content/cn/videos/tags/apache-hudi/index.html index 1e156f8b6c4bf..9fcc334d88203 100644 --- a/content/cn/videos/tags/apache-hudi/index.html +++ b/content/cn/videos/tags/apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/page/10/index.html b/content/cn/videos/tags/apache-hudi/page/10/index.html index d99bd2979bf99..f709707a79d0e 100644 --- a/content/cn/videos/tags/apache-hudi/page/10/index.html +++ b/content/cn/videos/tags/apache-hudi/page/10/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/page/11/index.html b/content/cn/videos/tags/apache-hudi/page/11/index.html index fb84912a4ac29..420854d953617 100644 --- a/content/cn/videos/tags/apache-hudi/page/11/index.html +++ b/content/cn/videos/tags/apache-hudi/page/11/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/page/12/index.html b/content/cn/videos/tags/apache-hudi/page/12/index.html index 031509bb89f7e..df92a53998e4d 100644 --- a/content/cn/videos/tags/apache-hudi/page/12/index.html +++ b/content/cn/videos/tags/apache-hudi/page/12/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/page/13/index.html b/content/cn/videos/tags/apache-hudi/page/13/index.html index d96bfec861866..3f6015b8369fd 100644 --- a/content/cn/videos/tags/apache-hudi/page/13/index.html +++ b/content/cn/videos/tags/apache-hudi/page/13/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/page/14/index.html b/content/cn/videos/tags/apache-hudi/page/14/index.html index 6089495c14b5b..1d4d8fe2d08a6 100644 --- a/content/cn/videos/tags/apache-hudi/page/14/index.html +++ b/content/cn/videos/tags/apache-hudi/page/14/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/page/15/index.html b/content/cn/videos/tags/apache-hudi/page/15/index.html index fc2f358b670cc..553ccd340ce62 100644 --- a/content/cn/videos/tags/apache-hudi/page/15/index.html +++ b/content/cn/videos/tags/apache-hudi/page/15/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/page/16/index.html b/content/cn/videos/tags/apache-hudi/page/16/index.html index fd7f56021a4b7..5fd23dac1a3c4 100644 --- a/content/cn/videos/tags/apache-hudi/page/16/index.html +++ b/content/cn/videos/tags/apache-hudi/page/16/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/page/17/index.html b/content/cn/videos/tags/apache-hudi/page/17/index.html index f25fb8caf39d4..1d3c9f15cfb2d 100644 --- a/content/cn/videos/tags/apache-hudi/page/17/index.html +++ b/content/cn/videos/tags/apache-hudi/page/17/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/page/18/index.html b/content/cn/videos/tags/apache-hudi/page/18/index.html index 609c23b69a6b0..ffdf995f00aa2 100644 --- a/content/cn/videos/tags/apache-hudi/page/18/index.html +++ b/content/cn/videos/tags/apache-hudi/page/18/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/page/19/index.html b/content/cn/videos/tags/apache-hudi/page/19/index.html index f4681f8977ff4..831108d9f39b5 100644 --- a/content/cn/videos/tags/apache-hudi/page/19/index.html +++ b/content/cn/videos/tags/apache-hudi/page/19/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/page/2/index.html b/content/cn/videos/tags/apache-hudi/page/2/index.html index db10c5b7cf256..c89ac9ab1ea74 100644 --- a/content/cn/videos/tags/apache-hudi/page/2/index.html +++ b/content/cn/videos/tags/apache-hudi/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/page/20/index.html b/content/cn/videos/tags/apache-hudi/page/20/index.html index 671e4e8c31c9e..6c9e6ed049908 100644 --- a/content/cn/videos/tags/apache-hudi/page/20/index.html +++ b/content/cn/videos/tags/apache-hudi/page/20/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/page/3/index.html b/content/cn/videos/tags/apache-hudi/page/3/index.html index deaa1047ce021..22b5bf59901e7 100644 --- a/content/cn/videos/tags/apache-hudi/page/3/index.html +++ b/content/cn/videos/tags/apache-hudi/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/page/4/index.html b/content/cn/videos/tags/apache-hudi/page/4/index.html index 0aa205c8d67f6..ea41dadc04936 100644 --- a/content/cn/videos/tags/apache-hudi/page/4/index.html +++ b/content/cn/videos/tags/apache-hudi/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/page/5/index.html b/content/cn/videos/tags/apache-hudi/page/5/index.html index d34b262fc5ebb..b1552671188ca 100644 --- a/content/cn/videos/tags/apache-hudi/page/5/index.html +++ b/content/cn/videos/tags/apache-hudi/page/5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/page/6/index.html b/content/cn/videos/tags/apache-hudi/page/6/index.html index 3c01e5b4c90ec..efae705ba8773 100644 --- a/content/cn/videos/tags/apache-hudi/page/6/index.html +++ b/content/cn/videos/tags/apache-hudi/page/6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/page/7/index.html b/content/cn/videos/tags/apache-hudi/page/7/index.html index da43182a9409e..70f42f1b3ebba 100644 --- a/content/cn/videos/tags/apache-hudi/page/7/index.html +++ b/content/cn/videos/tags/apache-hudi/page/7/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/page/8/index.html b/content/cn/videos/tags/apache-hudi/page/8/index.html index 4bccacc4a9ea8..22997cdf5c5e1 100644 --- a/content/cn/videos/tags/apache-hudi/page/8/index.html +++ b/content/cn/videos/tags/apache-hudi/page/8/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-hudi/page/9/index.html b/content/cn/videos/tags/apache-hudi/page/9/index.html index 4abb96a279d33..973852ccb13ee 100644 --- a/content/cn/videos/tags/apache-hudi/page/9/index.html +++ b/content/cn/videos/tags/apache-hudi/page/9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-iceberg/index.html b/content/cn/videos/tags/apache-iceberg/index.html index c4bdaaef133b8..2bc81902238e3 100644 --- a/content/cn/videos/tags/apache-iceberg/index.html +++ b/content/cn/videos/tags/apache-iceberg/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-iceberge/index.html b/content/cn/videos/tags/apache-iceberge/index.html index fd60ee6af617d..980eb237ecab7 100644 --- a/content/cn/videos/tags/apache-iceberge/index.html +++ b/content/cn/videos/tags/apache-iceberge/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-kafka/index.html b/content/cn/videos/tags/apache-kafka/index.html index 5bff64af4c135..7906cf03c1efa 100644 --- a/content/cn/videos/tags/apache-kafka/index.html +++ b/content/cn/videos/tags/apache-kafka/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-kafka/page/2/index.html b/content/cn/videos/tags/apache-kafka/page/2/index.html index 4af44d9ba72f9..162f0aba9693e 100644 --- a/content/cn/videos/tags/apache-kafka/page/2/index.html +++ b/content/cn/videos/tags/apache-kafka/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-kyuubi/index.html b/content/cn/videos/tags/apache-kyuubi/index.html index 40aac5cd9457d..94233c0da0096 100644 --- a/content/cn/videos/tags/apache-kyuubi/index.html +++ b/content/cn/videos/tags/apache-kyuubi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-parquet/index.html b/content/cn/videos/tags/apache-parquet/index.html index 43a0f222047e3..29b1053e90e09 100644 --- a/content/cn/videos/tags/apache-parquet/index.html +++ b/content/cn/videos/tags/apache-parquet/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-pulsar/index.html b/content/cn/videos/tags/apache-pulsar/index.html index 976dcc47f6228..1a54e17bdbbb8 100644 --- a/content/cn/videos/tags/apache-pulsar/index.html +++ b/content/cn/videos/tags/apache-pulsar/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-spark/index.html b/content/cn/videos/tags/apache-spark/index.html index f5e5095c11572..f9c43b287db94 100644 --- a/content/cn/videos/tags/apache-spark/index.html +++ b/content/cn/videos/tags/apache-spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-spark/page/2/index.html b/content/cn/videos/tags/apache-spark/page/2/index.html index 0c7e0004f4137..aa9b46d479d60 100644 --- a/content/cn/videos/tags/apache-spark/page/2/index.html +++ b/content/cn/videos/tags/apache-spark/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-superset/index.html b/content/cn/videos/tags/apache-superset/index.html index d3be6ef53da97..b5347d1d6bc16 100644 --- a/content/cn/videos/tags/apache-superset/index.html +++ b/content/cn/videos/tags/apache-superset/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-thrift/index.html b/content/cn/videos/tags/apache-thrift/index.html index 32c2845b5b824..1c712fe3fa991 100644 --- a/content/cn/videos/tags/apache-thrift/index.html +++ b/content/cn/videos/tags/apache-thrift/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-xtable/index.html b/content/cn/videos/tags/apache-xtable/index.html index 2488ae8c4994d..4b2445b18544f 100644 --- a/content/cn/videos/tags/apache-xtable/index.html +++ b/content/cn/videos/tags/apache-xtable/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/apache-zookeeper/index.html b/content/cn/videos/tags/apache-zookeeper/index.html index 11b5c751583c8..77d7b58483865 100644 --- a/content/cn/videos/tags/apache-zookeeper/index.html +++ b/content/cn/videos/tags/apache-zookeeper/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/async-mode/index.html b/content/cn/videos/tags/async-mode/index.html index 62387376c1876..c6ecc621d81f1 100644 --- a/content/cn/videos/tags/async-mode/index.html +++ b/content/cn/videos/tags/async-mode/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/asynchronous-clustering/index.html b/content/cn/videos/tags/asynchronous-clustering/index.html index e031297615f94..4694bd55b771e 100644 --- a/content/cn/videos/tags/asynchronous-clustering/index.html +++ b/content/cn/videos/tags/asynchronous-clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/asynchronous-indexing/index.html b/content/cn/videos/tags/asynchronous-indexing/index.html index 17d527f665943..4cecf101853df 100644 --- a/content/cn/videos/tags/asynchronous-indexing/index.html +++ b/content/cn/videos/tags/asynchronous-indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/athena/index.html b/content/cn/videos/tags/athena/index.html index c40906f4d1f81..d7f49d69f4fe6 100644 --- a/content/cn/videos/tags/athena/index.html +++ b/content/cn/videos/tags/athena/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/auto-generated-primary-keys/index.html b/content/cn/videos/tags/auto-generated-primary-keys/index.html index fdb22d1282137..f8af30e419e0c 100644 --- a/content/cn/videos/tags/auto-generated-primary-keys/index.html +++ b/content/cn/videos/tags/auto-generated-primary-keys/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/automation/index.html b/content/cn/videos/tags/automation/index.html index 5f0be8afc5285..df4ecc66bdb26 100644 --- a/content/cn/videos/tags/automation/index.html +++ b/content/cn/videos/tags/automation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/aws-dms/index.html b/content/cn/videos/tags/aws-dms/index.html index 7bf34575d3f53..8ad81a9c2c066 100644 --- a/content/cn/videos/tags/aws-dms/index.html +++ b/content/cn/videos/tags/aws-dms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/aws-dms/page/2/index.html b/content/cn/videos/tags/aws-dms/page/2/index.html index 86ab2124c9390..8dae0ba040459 100644 --- a/content/cn/videos/tags/aws-dms/page/2/index.html +++ b/content/cn/videos/tags/aws-dms/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/aws-dynamodb/index.html b/content/cn/videos/tags/aws-dynamodb/index.html index 73b9ef618d0fd..fab91437e9d68 100644 --- a/content/cn/videos/tags/aws-dynamodb/index.html +++ b/content/cn/videos/tags/aws-dynamodb/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/aws-emr/index.html b/content/cn/videos/tags/aws-emr/index.html index f67bd52274d39..628bf01000beb 100644 --- a/content/cn/videos/tags/aws-emr/index.html +++ b/content/cn/videos/tags/aws-emr/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/aws-glue-concurrency/index.html b/content/cn/videos/tags/aws-glue-concurrency/index.html index f2a48f7648576..b7c310f13fc67 100644 --- a/content/cn/videos/tags/aws-glue-concurrency/index.html +++ b/content/cn/videos/tags/aws-glue-concurrency/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/aws-glue-crawler/index.html b/content/cn/videos/tags/aws-glue-crawler/index.html index 284f9d5131fe9..d7e77a6ad1084 100644 --- a/content/cn/videos/tags/aws-glue-crawler/index.html +++ b/content/cn/videos/tags/aws-glue-crawler/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/aws-glue/index.html b/content/cn/videos/tags/aws-glue/index.html index d2ed5e2d43c99..42b16a5e2f18d 100644 --- a/content/cn/videos/tags/aws-glue/index.html +++ b/content/cn/videos/tags/aws-glue/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/aws-glue/page/2/index.html b/content/cn/videos/tags/aws-glue/page/2/index.html index 7c0be2879fbd6..4a4d6cfa2649a 100644 --- a/content/cn/videos/tags/aws-glue/page/2/index.html +++ b/content/cn/videos/tags/aws-glue/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/aws-glue/page/3/index.html b/content/cn/videos/tags/aws-glue/page/3/index.html index 7ff637b4fc26a..1ec90e30dd5ac 100644 --- a/content/cn/videos/tags/aws-glue/page/3/index.html +++ b/content/cn/videos/tags/aws-glue/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/aws-glue/page/4/index.html b/content/cn/videos/tags/aws-glue/page/4/index.html index dea2f6ee6bc9e..9c53992dd1e9e 100644 --- a/content/cn/videos/tags/aws-glue/page/4/index.html +++ b/content/cn/videos/tags/aws-glue/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/aws-glue/page/5/index.html b/content/cn/videos/tags/aws-glue/page/5/index.html index 6b8c23eb7bf39..d749c02fb7342 100644 --- a/content/cn/videos/tags/aws-glue/page/5/index.html +++ b/content/cn/videos/tags/aws-glue/page/5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/aws-glue/page/6/index.html b/content/cn/videos/tags/aws-glue/page/6/index.html index b70fc803f308c..bebdbdf1c5f2f 100644 --- a/content/cn/videos/tags/aws-glue/page/6/index.html +++ b/content/cn/videos/tags/aws-glue/page/6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/aws-glue/page/7/index.html b/content/cn/videos/tags/aws-glue/page/7/index.html index c963d153f1cb9..fb29ecbdd7aa4 100644 --- a/content/cn/videos/tags/aws-glue/page/7/index.html +++ b/content/cn/videos/tags/aws-glue/page/7/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/aws-lake-formation/index.html b/content/cn/videos/tags/aws-lake-formation/index.html index a1c943b3d15f3..be0bd5b1bd5f5 100644 --- a/content/cn/videos/tags/aws-lake-formation/index.html +++ b/content/cn/videos/tags/aws-lake-formation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/aws-lambda/index.html b/content/cn/videos/tags/aws-lambda/index.html index c1fc61920e6e6..1e3d9a57c8282 100644 --- a/content/cn/videos/tags/aws-lambda/index.html +++ b/content/cn/videos/tags/aws-lambda/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/aws-managed-apache-flink/index.html b/content/cn/videos/tags/aws-managed-apache-flink/index.html index 5dc08d3233bd4..5740390af3dc9 100644 --- a/content/cn/videos/tags/aws-managed-apache-flink/index.html +++ b/content/cn/videos/tags/aws-managed-apache-flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/aws-s-3/index.html b/content/cn/videos/tags/aws-s-3/index.html index 5d599eb0b2e16..385421337832d 100644 --- a/content/cn/videos/tags/aws-s-3/index.html +++ b/content/cn/videos/tags/aws-s-3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/aws-sqs/index.html b/content/cn/videos/tags/aws-sqs/index.html index b8165d49992e3..cd1415489ac15 100644 --- a/content/cn/videos/tags/aws-sqs/index.html +++ b/content/cn/videos/tags/aws-sqs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/aws-transfer-family/index.html b/content/cn/videos/tags/aws-transfer-family/index.html index 3e6fd9e24e3f0..dd34dc6a51d93 100644 --- a/content/cn/videos/tags/aws-transfer-family/index.html +++ b/content/cn/videos/tags/aws-transfer-family/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/backfilling/index.html b/content/cn/videos/tags/backfilling/index.html index 340821be99d10..e832b9783b698 100644 --- a/content/cn/videos/tags/backfilling/index.html +++ b/content/cn/videos/tags/backfilling/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/backup/index.html b/content/cn/videos/tags/backup/index.html index 125305f2ad4e2..964eedc6c8c79 100644 --- a/content/cn/videos/tags/backup/index.html +++ b/content/cn/videos/tags/backup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/batch-etl/index.html b/content/cn/videos/tags/batch-etl/index.html index c6cd1c5cfe035..4461138d0126e 100644 --- a/content/cn/videos/tags/batch-etl/index.html +++ b/content/cn/videos/tags/batch-etl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/beeline/index.html b/content/cn/videos/tags/beeline/index.html index 4697a247cc4ae..78a1e7499d77a 100644 --- a/content/cn/videos/tags/beeline/index.html +++ b/content/cn/videos/tags/beeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/before-image/index.html b/content/cn/videos/tags/before-image/index.html index 7e62d34b7b6a8..3e0cfb188415d 100644 --- a/content/cn/videos/tags/before-image/index.html +++ b/content/cn/videos/tags/before-image/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/beginner/index.html b/content/cn/videos/tags/beginner/index.html index 0906c73169a6d..757e9803c16fa 100644 --- a/content/cn/videos/tags/beginner/index.html +++ b/content/cn/videos/tags/beginner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/beginner/page/2/index.html b/content/cn/videos/tags/beginner/page/2/index.html index 41adb08ab8adc..e49f5fc9efd76 100644 --- a/content/cn/videos/tags/beginner/page/2/index.html +++ b/content/cn/videos/tags/beginner/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/beginner/page/3/index.html b/content/cn/videos/tags/beginner/page/3/index.html index c0492cfe965b6..eb608abca5ef8 100644 --- a/content/cn/videos/tags/beginner/page/3/index.html +++ b/content/cn/videos/tags/beginner/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/beginner/page/4/index.html b/content/cn/videos/tags/beginner/page/4/index.html index 5481eecd5aa02..7274ce0d11814 100644 --- a/content/cn/videos/tags/beginner/page/4/index.html +++ b/content/cn/videos/tags/beginner/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/beginner/page/5/index.html b/content/cn/videos/tags/beginner/page/5/index.html index b1c82467bd084..953d00ad30f34 100644 --- a/content/cn/videos/tags/beginner/page/5/index.html +++ b/content/cn/videos/tags/beginner/page/5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/beginner/page/6/index.html b/content/cn/videos/tags/beginner/page/6/index.html index d711d3827462e..20888ba7a920c 100644 --- a/content/cn/videos/tags/beginner/page/6/index.html +++ b/content/cn/videos/tags/beginner/page/6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/beginner/page/7/index.html b/content/cn/videos/tags/beginner/page/7/index.html index 0c25459a930f1..3f1967144640c 100644 --- a/content/cn/videos/tags/beginner/page/7/index.html +++ b/content/cn/videos/tags/beginner/page/7/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/beginner/page/8/index.html b/content/cn/videos/tags/beginner/page/8/index.html index fd2231e862b09..0ecc619bf2deb 100644 --- a/content/cn/videos/tags/beginner/page/8/index.html +++ b/content/cn/videos/tags/beginner/page/8/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/beginner/page/9/index.html b/content/cn/videos/tags/beginner/page/9/index.html index fa31f6bcf89a9..6d6849382ed72 100644 --- a/content/cn/videos/tags/beginner/page/9/index.html +++ b/content/cn/videos/tags/beginner/page/9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/best-practices/index.html b/content/cn/videos/tags/best-practices/index.html index ffa8a3c90dab8..f38600228aaa1 100644 --- a/content/cn/videos/tags/best-practices/index.html +++ b/content/cn/videos/tags/best-practices/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/bloom/index.html b/content/cn/videos/tags/bloom/index.html index 0e770285346ca..32bd5943ec22f 100644 --- a/content/cn/videos/tags/bloom/index.html +++ b/content/cn/videos/tags/bloom/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/bootstrapping/index.html b/content/cn/videos/tags/bootstrapping/index.html index 6c772385dec45..9c82692212f26 100644 --- a/content/cn/videos/tags/bootstrapping/index.html +++ b/content/cn/videos/tags/bootstrapping/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/bucket-index/index.html b/content/cn/videos/tags/bucket-index/index.html index 684268a1b27ed..5573810462157 100644 --- a/content/cn/videos/tags/bucket-index/index.html +++ b/content/cn/videos/tags/bucket-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/bulk-insert-sort-modes/index.html b/content/cn/videos/tags/bulk-insert-sort-modes/index.html index 628396f6a8b9d..fd8fb4fc35aaa 100644 --- a/content/cn/videos/tags/bulk-insert-sort-modes/index.html +++ b/content/cn/videos/tags/bulk-insert-sort-modes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/bulk-insert/index.html b/content/cn/videos/tags/bulk-insert/index.html index 57aa748644795..0051f96437883 100644 --- a/content/cn/videos/tags/bulk-insert/index.html +++ b/content/cn/videos/tags/bulk-insert/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/catalog/index.html b/content/cn/videos/tags/catalog/index.html index 364eecb24d3b8..0457015cd2a25 100644 --- a/content/cn/videos/tags/catalog/index.html +++ b/content/cn/videos/tags/catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/cdc/index.html b/content/cn/videos/tags/cdc/index.html index b3358faffe514..025aab061980d 100644 --- a/content/cn/videos/tags/cdc/index.html +++ b/content/cn/videos/tags/cdc/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/cdc/page/2/index.html b/content/cn/videos/tags/cdc/page/2/index.html index f5c61a6b6209c..f7f0824e87993 100644 --- a/content/cn/videos/tags/cdc/page/2/index.html +++ b/content/cn/videos/tags/cdc/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/cleaner-service/index.html b/content/cn/videos/tags/cleaner-service/index.html index ed02e428d90b7..86cc9524a844e 100644 --- a/content/cn/videos/tags/cleaner-service/index.html +++ b/content/cn/videos/tags/cleaner-service/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/clustering/index.html b/content/cn/videos/tags/clustering/index.html index e266b92479e0d..edd380de3fb35 100644 --- a/content/cn/videos/tags/clustering/index.html +++ b/content/cn/videos/tags/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/command-line-interface/index.html b/content/cn/videos/tags/command-line-interface/index.html index 9d31f78284354..0a0b898a0ca31 100644 --- a/content/cn/videos/tags/command-line-interface/index.html +++ b/content/cn/videos/tags/command-line-interface/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/commit-notification/index.html b/content/cn/videos/tags/commit-notification/index.html index 2f996f4a0d175..ce17065ee475f 100644 --- a/content/cn/videos/tags/commit-notification/index.html +++ b/content/cn/videos/tags/commit-notification/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/commit-times/index.html b/content/cn/videos/tags/commit-times/index.html index 615bcf3b05360..f667cf3294bd7 100644 --- a/content/cn/videos/tags/commit-times/index.html +++ b/content/cn/videos/tags/commit-times/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/compaction/index.html b/content/cn/videos/tags/compaction/index.html index e70d1e5b21d61..03d632523dc4b 100644 --- a/content/cn/videos/tags/compaction/index.html +++ b/content/cn/videos/tags/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/comparison/index.html b/content/cn/videos/tags/comparison/index.html index 767b72e51e08f..139f0037232b2 100644 --- a/content/cn/videos/tags/comparison/index.html +++ b/content/cn/videos/tags/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/compliance/index.html b/content/cn/videos/tags/compliance/index.html index d5e02bcbdf598..24a4b9eb69c0e 100644 --- a/content/cn/videos/tags/compliance/index.html +++ b/content/cn/videos/tags/compliance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/concurrency-control/index.html b/content/cn/videos/tags/concurrency-control/index.html index 531889c3343a1..6b0a93022eddb 100644 --- a/content/cn/videos/tags/concurrency-control/index.html +++ b/content/cn/videos/tags/concurrency-control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/consistent-hashing-index/index.html b/content/cn/videos/tags/consistent-hashing-index/index.html index 84b75cfc93f86..8854c9778da10 100644 --- a/content/cn/videos/tags/consistent-hashing-index/index.html +++ b/content/cn/videos/tags/consistent-hashing-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/copy-on-write/index.html b/content/cn/videos/tags/copy-on-write/index.html index 4715c1b5bf910..0178ba1708d45 100644 --- a/content/cn/videos/tags/copy-on-write/index.html +++ b/content/cn/videos/tags/copy-on-write/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/cow/index.html b/content/cn/videos/tags/cow/index.html index 0065e1d48e0e6..fa99f05e2e7bd 100644 --- a/content/cn/videos/tags/cow/index.html +++ b/content/cn/videos/tags/cow/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/csv/index.html b/content/cn/videos/tags/csv/index.html index 3cc25bd2b61fa..750765200060e 100644 --- a/content/cn/videos/tags/csv/index.html +++ b/content/cn/videos/tags/csv/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/daft/index.html b/content/cn/videos/tags/daft/index.html index a035703636386..d3aa70ef01937 100644 --- a/content/cn/videos/tags/daft/index.html +++ b/content/cn/videos/tags/daft/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/data-cleaning/index.html b/content/cn/videos/tags/data-cleaning/index.html index 88ac759a153a6..aba057e63b69a 100644 --- a/content/cn/videos/tags/data-cleaning/index.html +++ b/content/cn/videos/tags/data-cleaning/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/data-governance/index.html b/content/cn/videos/tags/data-governance/index.html index 03b9812ce0872..4891193edd5ad 100644 --- a/content/cn/videos/tags/data-governance/index.html +++ b/content/cn/videos/tags/data-governance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/data-ingestion/index.html b/content/cn/videos/tags/data-ingestion/index.html index fddc8e05bc226..3c1003ea6dfdf 100644 --- a/content/cn/videos/tags/data-ingestion/index.html +++ b/content/cn/videos/tags/data-ingestion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/data-integration/index.html b/content/cn/videos/tags/data-integration/index.html index e8b5ce4e6ddab..6a0c55b22d564 100644 --- a/content/cn/videos/tags/data-integration/index.html +++ b/content/cn/videos/tags/data-integration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/data-lake/index.html b/content/cn/videos/tags/data-lake/index.html index 94ce74f809063..2fba3f10501b9 100644 --- a/content/cn/videos/tags/data-lake/index.html +++ b/content/cn/videos/tags/data-lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/data-lakehouse/index.html b/content/cn/videos/tags/data-lakehouse/index.html index 10c7972929875..cb9ec6a311b70 100644 --- a/content/cn/videos/tags/data-lakehouse/index.html +++ b/content/cn/videos/tags/data-lakehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/data-lineage/index.html b/content/cn/videos/tags/data-lineage/index.html index cac9e69a2e7c0..7d2876b4b761e 100644 --- a/content/cn/videos/tags/data-lineage/index.html +++ b/content/cn/videos/tags/data-lineage/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/data-management/index.html b/content/cn/videos/tags/data-management/index.html index 7e28f4ec2a83f..2033bcfe12402 100644 --- a/content/cn/videos/tags/data-management/index.html +++ b/content/cn/videos/tags/data-management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/data-processing/index.html b/content/cn/videos/tags/data-processing/index.html index 4a7d4fa76df23..b1930d53ba991 100644 --- a/content/cn/videos/tags/data-processing/index.html +++ b/content/cn/videos/tags/data-processing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/data-quality/index.html b/content/cn/videos/tags/data-quality/index.html index 5538cc7ccfbb5..1cf20fed201f0 100644 --- a/content/cn/videos/tags/data-quality/index.html +++ b/content/cn/videos/tags/data-quality/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/data-skipping/index.html b/content/cn/videos/tags/data-skipping/index.html index f25f1cfdaa1da..dcb29419e87dc 100644 --- a/content/cn/videos/tags/data-skipping/index.html +++ b/content/cn/videos/tags/data-skipping/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/data-unification/index.html b/content/cn/videos/tags/data-unification/index.html index 8bfc0e62c2d33..c5901a0fb76a5 100644 --- a/content/cn/videos/tags/data-unification/index.html +++ b/content/cn/videos/tags/data-unification/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/data-update/index.html b/content/cn/videos/tags/data-update/index.html index 2f6fbad00a328..bf8960e293b8b 100644 --- a/content/cn/videos/tags/data-update/index.html +++ b/content/cn/videos/tags/data-update/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/data-upsert/index.html b/content/cn/videos/tags/data-upsert/index.html index 62ad838d1198b..8e58ae589cb44 100644 --- a/content/cn/videos/tags/data-upsert/index.html +++ b/content/cn/videos/tags/data-upsert/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/database/index.html b/content/cn/videos/tags/database/index.html index 402953ac56b5c..5faccbf03dd4a 100644 --- a/content/cn/videos/tags/database/index.html +++ b/content/cn/videos/tags/database/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/datalake/index.html b/content/cn/videos/tags/datalake/index.html index d6256c7913eab..cefc773ed3728 100644 --- a/content/cn/videos/tags/datalake/index.html +++ b/content/cn/videos/tags/datalake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/dbt/index.html b/content/cn/videos/tags/dbt/index.html index 37cd0acbcb731..f2a1942d9b95d 100644 --- a/content/cn/videos/tags/dbt/index.html +++ b/content/cn/videos/tags/dbt/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/de-duplicate/index.html b/content/cn/videos/tags/de-duplicate/index.html index 0a7eb842382a4..8e3649e683196 100644 --- a/content/cn/videos/tags/de-duplicate/index.html +++ b/content/cn/videos/tags/de-duplicate/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/debezium/index.html b/content/cn/videos/tags/debezium/index.html index 14018dc9fa0d5..a7140980ab79a 100644 --- a/content/cn/videos/tags/debezium/index.html +++ b/content/cn/videos/tags/debezium/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/deep-dive/index.html b/content/cn/videos/tags/deep-dive/index.html index db0c007a50cbc..1d0ad1fe0d223 100644 --- a/content/cn/videos/tags/deep-dive/index.html +++ b/content/cn/videos/tags/deep-dive/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/delete-partition/index.html b/content/cn/videos/tags/delete-partition/index.html index c4f9d609fc871..e98a6379cf1a9 100644 --- a/content/cn/videos/tags/delete-partition/index.html +++ b/content/cn/videos/tags/delete-partition/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/delete/index.html b/content/cn/videos/tags/delete/index.html index efbc0272b103d..61b4c434ccc95 100644 --- a/content/cn/videos/tags/delete/index.html +++ b/content/cn/videos/tags/delete/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/delta-lake/index.html b/content/cn/videos/tags/delta-lake/index.html index b25c06f229080..d2ed7aab830fe 100644 --- a/content/cn/videos/tags/delta-lake/index.html +++ b/content/cn/videos/tags/delta-lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/deltastreamer/index.html b/content/cn/videos/tags/deltastreamer/index.html index 63d2dadf067c9..27f0740d73e4d 100644 --- a/content/cn/videos/tags/deltastreamer/index.html +++ b/content/cn/videos/tags/deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/deltastreamer/page/2/index.html b/content/cn/videos/tags/deltastreamer/page/2/index.html index 90669d45f0f94..4639ef219e5cb 100644 --- a/content/cn/videos/tags/deltastreamer/page/2/index.html +++ b/content/cn/videos/tags/deltastreamer/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/deltastreamer/page/3/index.html b/content/cn/videos/tags/deltastreamer/page/3/index.html index f8941f3037778..559b6be1a459b 100644 --- a/content/cn/videos/tags/deltastreamer/page/3/index.html +++ b/content/cn/videos/tags/deltastreamer/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/deltastreamer/page/4/index.html b/content/cn/videos/tags/deltastreamer/page/4/index.html index 0b7efb60375d1..c28af99e89ea4 100644 --- a/content/cn/videos/tags/deltastreamer/page/4/index.html +++ b/content/cn/videos/tags/deltastreamer/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/development-setup/index.html b/content/cn/videos/tags/development-setup/index.html index ce8355d20e04c..d7b176d0b7691 100644 --- a/content/cn/videos/tags/development-setup/index.html +++ b/content/cn/videos/tags/development-setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/dimension-fields/index.html b/content/cn/videos/tags/dimension-fields/index.html index f2fc3a2abcb5c..d4b92c1d3b1b6 100644 --- a/content/cn/videos/tags/dimension-fields/index.html +++ b/content/cn/videos/tags/dimension-fields/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/disaster-recovery/index.html b/content/cn/videos/tags/disaster-recovery/index.html index 891ac06efedd5..0984ce58ecad3 100644 --- a/content/cn/videos/tags/disaster-recovery/index.html +++ b/content/cn/videos/tags/disaster-recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/docker/index.html b/content/cn/videos/tags/docker/index.html index f2afdd7b7ea14..4076707aeda70 100644 --- a/content/cn/videos/tags/docker/index.html +++ b/content/cn/videos/tags/docker/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/duplicates/index.html b/content/cn/videos/tags/duplicates/index.html index 215c561a77b98..48e91c6aa0a62 100644 --- a/content/cn/videos/tags/duplicates/index.html +++ b/content/cn/videos/tags/duplicates/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/dynamic-buckets/index.html b/content/cn/videos/tags/dynamic-buckets/index.html index 9a359c968d5ed..c650d8871a221 100644 --- a/content/cn/videos/tags/dynamic-buckets/index.html +++ b/content/cn/videos/tags/dynamic-buckets/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/elastic-search/index.html b/content/cn/videos/tags/elastic-search/index.html index bcc8b0a459173..4682ba98ff42f 100644 --- a/content/cn/videos/tags/elastic-search/index.html +++ b/content/cn/videos/tags/elastic-search/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/emr-serverless/index.html b/content/cn/videos/tags/emr-serverless/index.html index b0cb7e358c414..cb2aa03b8c03b 100644 --- a/content/cn/videos/tags/emr-serverless/index.html +++ b/content/cn/videos/tags/emr-serverless/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/error-tables/index.html b/content/cn/videos/tags/error-tables/index.html index 719febacdf42d..d2c5fdc916d44 100644 --- a/content/cn/videos/tags/error-tables/index.html +++ b/content/cn/videos/tags/error-tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/etl/index.html b/content/cn/videos/tags/etl/index.html index 5cc5ec47e6319..e94ded61e4f9c 100644 --- a/content/cn/videos/tags/etl/index.html +++ b/content/cn/videos/tags/etl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/event-bridge/index.html b/content/cn/videos/tags/event-bridge/index.html index 3454f4f1620a5..fe373b7f45121 100644 --- a/content/cn/videos/tags/event-bridge/index.html +++ b/content/cn/videos/tags/event-bridge/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/event-bus/index.html b/content/cn/videos/tags/event-bus/index.html index eddfcb161c704..d0ec43767658a 100644 --- a/content/cn/videos/tags/event-bus/index.html +++ b/content/cn/videos/tags/event-bus/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/event-driven/index.html b/content/cn/videos/tags/event-driven/index.html index 32d303029f439..4650bbd394a47 100644 --- a/content/cn/videos/tags/event-driven/index.html +++ b/content/cn/videos/tags/event-driven/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/event-notification/index.html b/content/cn/videos/tags/event-notification/index.html index 0bc48a946e2c0..ccc1cdb534563 100644 --- a/content/cn/videos/tags/event-notification/index.html +++ b/content/cn/videos/tags/event-notification/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/external-locking/index.html b/content/cn/videos/tags/external-locking/index.html index 4f2fb0198ccc1..bba425c4bc374 100644 --- a/content/cn/videos/tags/external-locking/index.html +++ b/content/cn/videos/tags/external-locking/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/fastapi/index.html b/content/cn/videos/tags/fastapi/index.html index 8014189818f01..9ad36e18fd21f 100644 --- a/content/cn/videos/tags/fastapi/index.html +++ b/content/cn/videos/tags/fastapi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/file-sizing/index.html b/content/cn/videos/tags/file-sizing/index.html index dcdb1763ecdde..2c3cb07170944 100644 --- a/content/cn/videos/tags/file-sizing/index.html +++ b/content/cn/videos/tags/file-sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/flask/index.html b/content/cn/videos/tags/flask/index.html index c9a8d741acb7e..35659e6274a96 100644 --- a/content/cn/videos/tags/flask/index.html +++ b/content/cn/videos/tags/flask/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/frontend/index.html b/content/cn/videos/tags/frontend/index.html index 760bbdd82f31f..da9c078e51af5 100644 --- a/content/cn/videos/tags/frontend/index.html +++ b/content/cn/videos/tags/frontend/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/gdpr/index.html b/content/cn/videos/tags/gdpr/index.html index 52f72a88d9624..b1374c0b72ef6 100644 --- a/content/cn/videos/tags/gdpr/index.html +++ b/content/cn/videos/tags/gdpr/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/global-index/index.html b/content/cn/videos/tags/global-index/index.html index 447d98e136734..a6ffcdc5ae85e 100644 --- a/content/cn/videos/tags/global-index/index.html +++ b/content/cn/videos/tags/global-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/glue-bookmarks/index.html b/content/cn/videos/tags/glue-bookmarks/index.html index 69df4042a9b22..52e5c061f0199 100644 --- a/content/cn/videos/tags/glue-bookmarks/index.html +++ b/content/cn/videos/tags/glue-bookmarks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/glue-notebook/index.html b/content/cn/videos/tags/glue-notebook/index.html index 811629aa5d7b1..fc142eea64c3f 100644 --- a/content/cn/videos/tags/glue-notebook/index.html +++ b/content/cn/videos/tags/glue-notebook/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/guide/index.html b/content/cn/videos/tags/guide/index.html index 8dc8ae388d1aa..c59bca7e84aa6 100644 --- a/content/cn/videos/tags/guide/index.html +++ b/content/cn/videos/tags/guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/guide/page/10/index.html b/content/cn/videos/tags/guide/page/10/index.html index ab5e34f4bace6..e9e5373468d5f 100644 --- a/content/cn/videos/tags/guide/page/10/index.html +++ b/content/cn/videos/tags/guide/page/10/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/guide/page/11/index.html b/content/cn/videos/tags/guide/page/11/index.html index 893e9ab890854..2c48a8abba36e 100644 --- a/content/cn/videos/tags/guide/page/11/index.html +++ b/content/cn/videos/tags/guide/page/11/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/guide/page/12/index.html b/content/cn/videos/tags/guide/page/12/index.html index 0ab58fb0e24bf..14679f3275ba6 100644 --- a/content/cn/videos/tags/guide/page/12/index.html +++ b/content/cn/videos/tags/guide/page/12/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/guide/page/13/index.html b/content/cn/videos/tags/guide/page/13/index.html index cccda6bedb5a7..024adf24dd380 100644 --- a/content/cn/videos/tags/guide/page/13/index.html +++ b/content/cn/videos/tags/guide/page/13/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/guide/page/14/index.html b/content/cn/videos/tags/guide/page/14/index.html index 249415f7f14f4..be066031e58aa 100644 --- a/content/cn/videos/tags/guide/page/14/index.html +++ b/content/cn/videos/tags/guide/page/14/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/guide/page/15/index.html b/content/cn/videos/tags/guide/page/15/index.html index 9982533b8b957..47b20b7601d87 100644 --- a/content/cn/videos/tags/guide/page/15/index.html +++ b/content/cn/videos/tags/guide/page/15/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/guide/page/16/index.html b/content/cn/videos/tags/guide/page/16/index.html index ca934f9a9c98c..c5b091ea26230 100644 --- a/content/cn/videos/tags/guide/page/16/index.html +++ b/content/cn/videos/tags/guide/page/16/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/guide/page/17/index.html b/content/cn/videos/tags/guide/page/17/index.html index 8ebb5199457cc..a1610780ca87b 100644 --- a/content/cn/videos/tags/guide/page/17/index.html +++ b/content/cn/videos/tags/guide/page/17/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/guide/page/18/index.html b/content/cn/videos/tags/guide/page/18/index.html index 64a2b477857b1..664a61e937e59 100644 --- a/content/cn/videos/tags/guide/page/18/index.html +++ b/content/cn/videos/tags/guide/page/18/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/guide/page/19/index.html b/content/cn/videos/tags/guide/page/19/index.html index bd83999ac5821..f9d911374a7c6 100644 --- a/content/cn/videos/tags/guide/page/19/index.html +++ b/content/cn/videos/tags/guide/page/19/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/guide/page/2/index.html b/content/cn/videos/tags/guide/page/2/index.html index 96fca47152705..2b7c49b92786a 100644 --- a/content/cn/videos/tags/guide/page/2/index.html +++ b/content/cn/videos/tags/guide/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/guide/page/3/index.html b/content/cn/videos/tags/guide/page/3/index.html index c6fd25031e1c4..aa9f87307122c 100644 --- a/content/cn/videos/tags/guide/page/3/index.html +++ b/content/cn/videos/tags/guide/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/guide/page/4/index.html b/content/cn/videos/tags/guide/page/4/index.html index 77d1ff4d90042..81990e883d93d 100644 --- a/content/cn/videos/tags/guide/page/4/index.html +++ b/content/cn/videos/tags/guide/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/guide/page/5/index.html b/content/cn/videos/tags/guide/page/5/index.html index de03cc6ec910f..38a23ca5f46eb 100644 --- a/content/cn/videos/tags/guide/page/5/index.html +++ b/content/cn/videos/tags/guide/page/5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/guide/page/6/index.html b/content/cn/videos/tags/guide/page/6/index.html index 60a87ee8e4831..c75ed7f21f74a 100644 --- a/content/cn/videos/tags/guide/page/6/index.html +++ b/content/cn/videos/tags/guide/page/6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/guide/page/7/index.html b/content/cn/videos/tags/guide/page/7/index.html index 693dcfaedb9f6..432f9d562a8cf 100644 --- a/content/cn/videos/tags/guide/page/7/index.html +++ b/content/cn/videos/tags/guide/page/7/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/guide/page/8/index.html b/content/cn/videos/tags/guide/page/8/index.html index 7092e9015ea5b..2d93573306209 100644 --- a/content/cn/videos/tags/guide/page/8/index.html +++ b/content/cn/videos/tags/guide/page/8/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/guide/page/9/index.html b/content/cn/videos/tags/guide/page/9/index.html index e2dd66260e2bd..3b32ff0fbc55c 100644 --- a/content/cn/videos/tags/guide/page/9/index.html +++ b/content/cn/videos/tags/guide/page/9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/hands-on-lab/index.html b/content/cn/videos/tags/hands-on-lab/index.html index aa8c7f8ce5634..55a78b50cb91d 100644 --- a/content/cn/videos/tags/hands-on-lab/index.html +++ b/content/cn/videos/tags/hands-on-lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/hard-delete/index.html b/content/cn/videos/tags/hard-delete/index.html index b10cec8dbd41b..40c26dc6e0480 100644 --- a/content/cn/videos/tags/hard-delete/index.html +++ b/content/cn/videos/tags/hard-delete/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/hbase-index/index.html b/content/cn/videos/tags/hbase-index/index.html index 62f5711c0209b..32f46482eb6f9 100644 --- a/content/cn/videos/tags/hbase-index/index.html +++ b/content/cn/videos/tags/hbase-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/hipaa/index.html b/content/cn/videos/tags/hipaa/index.html index 8903375f042ce..6a9d4594cc397 100644 --- a/content/cn/videos/tags/hipaa/index.html +++ b/content/cn/videos/tags/hipaa/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/hive-metastore/index.html b/content/cn/videos/tags/hive-metastore/index.html index fa1f274cb603e..f5eb562afa7f3 100644 --- a/content/cn/videos/tags/hive-metastore/index.html +++ b/content/cn/videos/tags/hive-metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/hive-sql/index.html b/content/cn/videos/tags/hive-sql/index.html index 78490947a3747..d7b5727f40395 100644 --- a/content/cn/videos/tags/hive-sql/index.html +++ b/content/cn/videos/tags/hive-sql/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/hoodie-snapshot-exporter/index.html b/content/cn/videos/tags/hoodie-snapshot-exporter/index.html index 3116f334a1332..5a58ceab0a83c 100644 --- a/content/cn/videos/tags/hoodie-snapshot-exporter/index.html +++ b/content/cn/videos/tags/hoodie-snapshot-exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/how-to/index.html b/content/cn/videos/tags/how-to/index.html index 394e38fa840a8..5803d36283b2a 100644 --- a/content/cn/videos/tags/how-to/index.html +++ b/content/cn/videos/tags/how-to/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/http-endpoint/index.html b/content/cn/videos/tags/http-endpoint/index.html index e01a63b95648b..a7a87f1a188e1 100644 --- a/content/cn/videos/tags/http-endpoint/index.html +++ b/content/cn/videos/tags/http-endpoint/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/hudi-cli/index.html b/content/cn/videos/tags/hudi-cli/index.html index 00a8318fc455e..68384366f4e97 100644 --- a/content/cn/videos/tags/hudi-cli/index.html +++ b/content/cn/videos/tags/hudi-cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/hudi-performacne/index.html b/content/cn/videos/tags/hudi-performacne/index.html index f18488e06ad48..bc60eb074032c 100644 --- a/content/cn/videos/tags/hudi-performacne/index.html +++ b/content/cn/videos/tags/hudi-performacne/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/hudi-streamer/index.html b/content/cn/videos/tags/hudi-streamer/index.html index ba388731ebacb..adbc29c674ab9 100644 --- a/content/cn/videos/tags/hudi-streamer/index.html +++ b/content/cn/videos/tags/hudi-streamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/hudi-streamer/page/2/index.html b/content/cn/videos/tags/hudi-streamer/page/2/index.html index 597c7a9664347..3e204c2b3acfc 100644 --- a/content/cn/videos/tags/hudi-streamer/page/2/index.html +++ b/content/cn/videos/tags/hudi-streamer/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/hudi-streamer/page/3/index.html b/content/cn/videos/tags/hudi-streamer/page/3/index.html index 79b9fb36bde96..052fa9bb8f8bb 100644 --- a/content/cn/videos/tags/hudi-streamer/page/3/index.html +++ b/content/cn/videos/tags/hudi-streamer/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/hudi-streamer/page/4/index.html b/content/cn/videos/tags/hudi-streamer/page/4/index.html index 41c5894d69754..ed7d9186b71cf 100644 --- a/content/cn/videos/tags/hudi-streamer/page/4/index.html +++ b/content/cn/videos/tags/hudi-streamer/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/hue/index.html b/content/cn/videos/tags/hue/index.html index 4e5b341d4d79b..bb88f143ad83c 100644 --- a/content/cn/videos/tags/hue/index.html +++ b/content/cn/videos/tags/hue/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/incremental-data-processing/index.html b/content/cn/videos/tags/incremental-data-processing/index.html index 18156c23447ba..112718823e558 100644 --- a/content/cn/videos/tags/incremental-data-processing/index.html +++ b/content/cn/videos/tags/incremental-data-processing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/incremental-etl/index.html b/content/cn/videos/tags/incremental-etl/index.html index b89394d954a51..763650d6eed42 100644 --- a/content/cn/videos/tags/incremental-etl/index.html +++ b/content/cn/videos/tags/incremental-etl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/incremental-etl/page/2/index.html b/content/cn/videos/tags/incremental-etl/page/2/index.html index e96b3a36ecfdb..e22c433fe613f 100644 --- a/content/cn/videos/tags/incremental-etl/page/2/index.html +++ b/content/cn/videos/tags/incremental-etl/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/incremental-pipelines/index.html b/content/cn/videos/tags/incremental-pipelines/index.html index ac5cfb97112b8..955d82c4c4697 100644 --- a/content/cn/videos/tags/incremental-pipelines/index.html +++ b/content/cn/videos/tags/incremental-pipelines/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/incremental-processing/index.html b/content/cn/videos/tags/incremental-processing/index.html index a2d1c93f792be..a65bcb416d623 100644 --- a/content/cn/videos/tags/incremental-processing/index.html +++ b/content/cn/videos/tags/incremental-processing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/incremental-query/index.html b/content/cn/videos/tags/incremental-query/index.html index 085aca71ab989..c98fc401ee94d 100644 --- a/content/cn/videos/tags/incremental-query/index.html +++ b/content/cn/videos/tags/incremental-query/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/incremental-query/page/2/index.html b/content/cn/videos/tags/incremental-query/page/2/index.html index 17a8dde198039..36c94a1e87874 100644 --- a/content/cn/videos/tags/incremental-query/page/2/index.html +++ b/content/cn/videos/tags/incremental-query/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/index.html b/content/cn/videos/tags/index.html index 37c3cd2327809..7b5d2e130b356 100644 --- a/content/cn/videos/tags/index.html +++ b/content/cn/videos/tags/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/indexing/index.html b/content/cn/videos/tags/indexing/index.html index e722b3c1d4739..924804a53b888 100644 --- a/content/cn/videos/tags/indexing/index.html +++ b/content/cn/videos/tags/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/insert-overwrite/index.html b/content/cn/videos/tags/insert-overwrite/index.html index d98bdab7c5680..926941f05f509 100644 --- a/content/cn/videos/tags/insert-overwrite/index.html +++ b/content/cn/videos/tags/insert-overwrite/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/insert/index.html b/content/cn/videos/tags/insert/index.html index 5aeb448fa3413..0ef7458b1c988 100644 --- a/content/cn/videos/tags/insert/index.html +++ b/content/cn/videos/tags/insert/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/internet-gateway/index.html b/content/cn/videos/tags/internet-gateway/index.html index 7231982c8ba67..a4d0214f2bf94 100644 --- a/content/cn/videos/tags/internet-gateway/index.html +++ b/content/cn/videos/tags/internet-gateway/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/jdbc/index.html b/content/cn/videos/tags/jdbc/index.html index ac0c59cf625a6..cf9e6943ea16d 100644 --- a/content/cn/videos/tags/jdbc/index.html +++ b/content/cn/videos/tags/jdbc/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/join/index.html b/content/cn/videos/tags/join/index.html index 7c5e31b7f0ad2..45bedff88431a 100644 --- a/content/cn/videos/tags/join/index.html +++ b/content/cn/videos/tags/join/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/joins/index.html b/content/cn/videos/tags/joins/index.html index 5436fb3a76708..c2c47c8ddd97b 100644 --- a/content/cn/videos/tags/joins/index.html +++ b/content/cn/videos/tags/joins/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/kafka-topic/index.html b/content/cn/videos/tags/kafka-topic/index.html index a72327768413e..34bfc785b3047 100644 --- a/content/cn/videos/tags/kafka-topic/index.html +++ b/content/cn/videos/tags/kafka-topic/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/kibana/index.html b/content/cn/videos/tags/kibana/index.html index 7c3d7e58753bb..1c81fe6f83165 100644 --- a/content/cn/videos/tags/kibana/index.html +++ b/content/cn/videos/tags/kibana/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/lakehouse/index.html b/content/cn/videos/tags/lakehouse/index.html index e137503ab1501..f85fa19848c71 100644 --- a/content/cn/videos/tags/lakehouse/index.html +++ b/content/cn/videos/tags/lakehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/lakehouse/page/2/index.html b/content/cn/videos/tags/lakehouse/page/2/index.html index 56e37ae73cf42..a20580e990cf2 100644 --- a/content/cn/videos/tags/lakehouse/page/2/index.html +++ b/content/cn/videos/tags/lakehouse/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/late-arriving-data/index.html b/content/cn/videos/tags/late-arriving-data/index.html index 14da237af48e3..9ea7fae0eaeb4 100644 --- a/content/cn/videos/tags/late-arriving-data/index.html +++ b/content/cn/videos/tags/late-arriving-data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/lock-providers/index.html b/content/cn/videos/tags/lock-providers/index.html index ce3a70b1d367c..744768f93a6a0 100644 --- a/content/cn/videos/tags/lock-providers/index.html +++ b/content/cn/videos/tags/lock-providers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/marquez/index.html b/content/cn/videos/tags/marquez/index.html index f5dc723df12e4..8e93a053b71f5 100644 --- a/content/cn/videos/tags/marquez/index.html +++ b/content/cn/videos/tags/marquez/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/mask-pii/index.html b/content/cn/videos/tags/mask-pii/index.html index 837bce30591b4..c8fb822b61027 100644 --- a/content/cn/videos/tags/mask-pii/index.html +++ b/content/cn/videos/tags/mask-pii/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/masking/index.html b/content/cn/videos/tags/masking/index.html index a076989ae3026..0222b9452e516 100644 --- a/content/cn/videos/tags/masking/index.html +++ b/content/cn/videos/tags/masking/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/medallion-architecture/index.html b/content/cn/videos/tags/medallion-architecture/index.html index a1b37d88f540f..6dc5e343bf64f 100644 --- a/content/cn/videos/tags/medallion-architecture/index.html +++ b/content/cn/videos/tags/medallion-architecture/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/medallion/index.html b/content/cn/videos/tags/medallion/index.html index 2b9210156b157..32a67371d4b6d 100644 --- a/content/cn/videos/tags/medallion/index.html +++ b/content/cn/videos/tags/medallion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/merge-on-read/index.html b/content/cn/videos/tags/merge-on-read/index.html index dc25d679f2c38..a27ae4007581b 100644 --- a/content/cn/videos/tags/merge-on-read/index.html +++ b/content/cn/videos/tags/merge-on-read/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/metadata-indexing/index.html b/content/cn/videos/tags/metadata-indexing/index.html index 9b0570d581140..8c8703bb81a5e 100644 --- a/content/cn/videos/tags/metadata-indexing/index.html +++ b/content/cn/videos/tags/metadata-indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/metadata-table/index.html b/content/cn/videos/tags/metadata-table/index.html index f6e33babfc1f8..472d5082bfa66 100644 --- a/content/cn/videos/tags/metadata-table/index.html +++ b/content/cn/videos/tags/metadata-table/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/metrics/index.html b/content/cn/videos/tags/metrics/index.html index 84c0a2b27f3b6..76a5da13fdb7d 100644 --- a/content/cn/videos/tags/metrics/index.html +++ b/content/cn/videos/tags/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/microsft-sql-server/index.html b/content/cn/videos/tags/microsft-sql-server/index.html index 9b8b0a75bd550..7e2bb425007a4 100644 --- a/content/cn/videos/tags/microsft-sql-server/index.html +++ b/content/cn/videos/tags/microsft-sql-server/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/minio/index.html b/content/cn/videos/tags/minio/index.html index 6bbe284034766..06d246a0af8fc 100644 --- a/content/cn/videos/tags/minio/index.html +++ b/content/cn/videos/tags/minio/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/minio/page/2/index.html b/content/cn/videos/tags/minio/page/2/index.html index a3d97ad69af92..3db9d5437297f 100644 --- a/content/cn/videos/tags/minio/page/2/index.html +++ b/content/cn/videos/tags/minio/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/mongodb-atlas/index.html b/content/cn/videos/tags/mongodb-atlas/index.html index 8ce7c856488f3..0b1bce2eec7d9 100644 --- a/content/cn/videos/tags/mongodb-atlas/index.html +++ b/content/cn/videos/tags/mongodb-atlas/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/mongodb/index.html b/content/cn/videos/tags/mongodb/index.html index 4b1975b868b80..6a548c153e38b 100644 --- a/content/cn/videos/tags/mongodb/index.html +++ b/content/cn/videos/tags/mongodb/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/mor/index.html b/content/cn/videos/tags/mor/index.html index d31f9a2f29ab4..3a8a823086c5c 100644 --- a/content/cn/videos/tags/mor/index.html +++ b/content/cn/videos/tags/mor/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/multi-table/index.html b/content/cn/videos/tags/multi-table/index.html index 20d910552fe3e..dfaf5e0d1f887 100644 --- a/content/cn/videos/tags/multi-table/index.html +++ b/content/cn/videos/tags/multi-table/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/multi-writer/index.html b/content/cn/videos/tags/multi-writer/index.html index 74623235ab879..625326023f3cd 100644 --- a/content/cn/videos/tags/multi-writer/index.html +++ b/content/cn/videos/tags/multi-writer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/mysql/index.html b/content/cn/videos/tags/mysql/index.html index fa07cc94d4862..97f4a0642d5da 100644 --- a/content/cn/videos/tags/mysql/index.html +++ b/content/cn/videos/tags/mysql/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/near-real-time-analytics/index.html b/content/cn/videos/tags/near-real-time-analytics/index.html index a15f755cf1649..cb13f517fbc8f 100644 --- a/content/cn/videos/tags/near-real-time-analytics/index.html +++ b/content/cn/videos/tags/near-real-time-analytics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/oltp/index.html b/content/cn/videos/tags/oltp/index.html index 46e6596701145..88bef146d1a04 100644 --- a/content/cn/videos/tags/oltp/index.html +++ b/content/cn/videos/tags/oltp/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/on-prem/index.html b/content/cn/videos/tags/on-prem/index.html index d9c406436ffb8..4f34ae31b0307 100644 --- a/content/cn/videos/tags/on-prem/index.html +++ b/content/cn/videos/tags/on-prem/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/onehouse/index.html b/content/cn/videos/tags/onehouse/index.html index cbc8cf2afe31f..a5ba7ff6e8c35 100644 --- a/content/cn/videos/tags/onehouse/index.html +++ b/content/cn/videos/tags/onehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/ordering/index.html b/content/cn/videos/tags/ordering/index.html index 72c51875c96fb..52d8ff3f5d386 100644 --- a/content/cn/videos/tags/ordering/index.html +++ b/content/cn/videos/tags/ordering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/partition/index.html b/content/cn/videos/tags/partition/index.html index 1dd15a1b014d1..2bd403307c96b 100644 --- a/content/cn/videos/tags/partition/index.html +++ b/content/cn/videos/tags/partition/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/point-lookups/index.html b/content/cn/videos/tags/point-lookups/index.html index 8c759363dc4f7..0ac51fc80e405 100644 --- a/content/cn/videos/tags/point-lookups/index.html +++ b/content/cn/videos/tags/point-lookups/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/postgres/index.html b/content/cn/videos/tags/postgres/index.html index 9be5426541e32..96c5b875037a4 100644 --- a/content/cn/videos/tags/postgres/index.html +++ b/content/cn/videos/tags/postgres/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/postgres/page/2/index.html b/content/cn/videos/tags/postgres/page/2/index.html index f724404b24117..84e016a0d217c 100644 --- a/content/cn/videos/tags/postgres/page/2/index.html +++ b/content/cn/videos/tags/postgres/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/postgresql/index.html b/content/cn/videos/tags/postgresql/index.html index 18b878b00074c..aae22260414fa 100644 --- a/content/cn/videos/tags/postgresql/index.html +++ b/content/cn/videos/tags/postgresql/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/pre-commit-validator/index.html b/content/cn/videos/tags/pre-commit-validator/index.html index 3e356ac85128c..3c2f84642e8d6 100644 --- a/content/cn/videos/tags/pre-commit-validator/index.html +++ b/content/cn/videos/tags/pre-commit-validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/precombine-key/index.html b/content/cn/videos/tags/precombine-key/index.html index 78dd4919a582e..18b98bdd5a717 100644 --- a/content/cn/videos/tags/precombine-key/index.html +++ b/content/cn/videos/tags/precombine-key/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/presto/index.html b/content/cn/videos/tags/presto/index.html index cfd070f54d5e9..d3709966b55c0 100644 --- a/content/cn/videos/tags/presto/index.html +++ b/content/cn/videos/tags/presto/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/primary-keys/index.html b/content/cn/videos/tags/primary-keys/index.html index 3f476ff69a4bc..0d381cfc4f058 100644 --- a/content/cn/videos/tags/primary-keys/index.html +++ b/content/cn/videos/tags/primary-keys/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/pydeequ/index.html b/content/cn/videos/tags/pydeequ/index.html index de2f1a65f3ea0..eb90afb2d20a7 100644 --- a/content/cn/videos/tags/pydeequ/index.html +++ b/content/cn/videos/tags/pydeequ/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/pyflink/index.html b/content/cn/videos/tags/pyflink/index.html index 5e2f2c34a0a2c..f64c4a8fb08a1 100644 --- a/content/cn/videos/tags/pyflink/index.html +++ b/content/cn/videos/tags/pyflink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/pyspark/index.html b/content/cn/videos/tags/pyspark/index.html index 75994e0931fcd..20b8c2f7cda50 100644 --- a/content/cn/videos/tags/pyspark/index.html +++ b/content/cn/videos/tags/pyspark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/python/index.html b/content/cn/videos/tags/python/index.html index c85685616b559..e5d536b4c2549 100644 --- a/content/cn/videos/tags/python/index.html +++ b/content/cn/videos/tags/python/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/query/index.html b/content/cn/videos/tags/query/index.html index 89da938c4038a..b3af8b5487d2a 100644 --- a/content/cn/videos/tags/query/index.html +++ b/content/cn/videos/tags/query/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/ray/index.html b/content/cn/videos/tags/ray/index.html index b74f287110250..e5261770b5612 100644 --- a/content/cn/videos/tags/ray/index.html +++ b/content/cn/videos/tags/ray/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/real-time-datalake/index.html b/content/cn/videos/tags/real-time-datalake/index.html index 81f2a1a1bf3c4..8f0cdee0ac18d 100644 --- a/content/cn/videos/tags/real-time-datalake/index.html +++ b/content/cn/videos/tags/real-time-datalake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/record-level-index/index.html b/content/cn/videos/tags/record-level-index/index.html index 45c2ec0463beb..444bcf4c7df0d 100644 --- a/content/cn/videos/tags/record-level-index/index.html +++ b/content/cn/videos/tags/record-level-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/reporting/index.html b/content/cn/videos/tags/reporting/index.html index 9e1d485b6963d..44ae3ad6eb666 100644 --- a/content/cn/videos/tags/reporting/index.html +++ b/content/cn/videos/tags/reporting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/resource-usage/index.html b/content/cn/videos/tags/resource-usage/index.html index cecbf8c176e07..a7ea4c68a5b2b 100644 --- a/content/cn/videos/tags/resource-usage/index.html +++ b/content/cn/videos/tags/resource-usage/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/restore/index.html b/content/cn/videos/tags/restore/index.html index 84225994fa1e3..0d7ecdd51e4b7 100644 --- a/content/cn/videos/tags/restore/index.html +++ b/content/cn/videos/tags/restore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/rli/index.html b/content/cn/videos/tags/rli/index.html index 5ef47d52a744b..79e939dfc49ba 100644 --- a/content/cn/videos/tags/rli/index.html +++ b/content/cn/videos/tags/rli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/rollback/index.html b/content/cn/videos/tags/rollback/index.html index 6e62f93a5cd68..d88cceb0545f4 100644 --- a/content/cn/videos/tags/rollback/index.html +++ b/content/cn/videos/tags/rollback/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/savepoint/index.html b/content/cn/videos/tags/savepoint/index.html index 37c3fb49ac601..431829778ba50 100644 --- a/content/cn/videos/tags/savepoint/index.html +++ b/content/cn/videos/tags/savepoint/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/scd-2/index.html b/content/cn/videos/tags/scd-2/index.html index 9f0bf735ad107..cab92fede5b5c 100644 --- a/content/cn/videos/tags/scd-2/index.html +++ b/content/cn/videos/tags/scd-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/schema-changes/index.html b/content/cn/videos/tags/schema-changes/index.html index 37f48d1051608..3cd6473cf232c 100644 --- a/content/cn/videos/tags/schema-changes/index.html +++ b/content/cn/videos/tags/schema-changes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/schema-evolution/index.html b/content/cn/videos/tags/schema-evolution/index.html index a0d236ad813b0..e5c804dc16670 100644 --- a/content/cn/videos/tags/schema-evolution/index.html +++ b/content/cn/videos/tags/schema-evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/schema-registry/index.html b/content/cn/videos/tags/schema-registry/index.html index 9ca50dc403bf5..961821e612530 100644 --- a/content/cn/videos/tags/schema-registry/index.html +++ b/content/cn/videos/tags/schema-registry/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/serverless/index.html b/content/cn/videos/tags/serverless/index.html index 3bae852c53341..695904472e515 100644 --- a/content/cn/videos/tags/serverless/index.html +++ b/content/cn/videos/tags/serverless/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/sftp/index.html b/content/cn/videos/tags/sftp/index.html index 9e9eda18c7794..b18c5f8bb8812 100644 --- a/content/cn/videos/tags/sftp/index.html +++ b/content/cn/videos/tags/sftp/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/slowly-changing-dimension-type-2/index.html b/content/cn/videos/tags/slowly-changing-dimension-type-2/index.html index 5ac801858aa1a..e7ea89e864b14 100644 --- a/content/cn/videos/tags/slowly-changing-dimension-type-2/index.html +++ b/content/cn/videos/tags/slowly-changing-dimension-type-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/slowly-changing-dimensions-type-2/index.html b/content/cn/videos/tags/slowly-changing-dimensions-type-2/index.html index da135966b2dbe..e594f0b7b36db 100644 --- a/content/cn/videos/tags/slowly-changing-dimensions-type-2/index.html +++ b/content/cn/videos/tags/slowly-changing-dimensions-type-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/small-files/index.html b/content/cn/videos/tags/small-files/index.html index b293302d2b699..53aeefcc22760 100644 --- a/content/cn/videos/tags/small-files/index.html +++ b/content/cn/videos/tags/small-files/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/snapshot-query/index.html b/content/cn/videos/tags/snapshot-query/index.html index f221bea809ba5..42af0c3ed4622 100644 --- a/content/cn/videos/tags/snapshot-query/index.html +++ b/content/cn/videos/tags/snapshot-query/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/snowflake/index.html b/content/cn/videos/tags/snowflake/index.html index 97a39e30f1028..2e7b4c4391c30 100644 --- a/content/cn/videos/tags/snowflake/index.html +++ b/content/cn/videos/tags/snowflake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/soft-delete/index.html b/content/cn/videos/tags/soft-delete/index.html index 6906b5cb08c10..7949123b7ee04 100644 --- a/content/cn/videos/tags/soft-delete/index.html +++ b/content/cn/videos/tags/soft-delete/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/sort-modes/index.html b/content/cn/videos/tags/sort-modes/index.html index 66c23e897949b..117ea780bf3d2 100644 --- a/content/cn/videos/tags/sort-modes/index.html +++ b/content/cn/videos/tags/sort-modes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/sorting/index.html b/content/cn/videos/tags/sorting/index.html index 339e2f3967d11..d8dd3668df79f 100644 --- a/content/cn/videos/tags/sorting/index.html +++ b/content/cn/videos/tags/sorting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/spark-datasource-writer/index.html b/content/cn/videos/tags/spark-datasource-writer/index.html index 0905d859f121a..d6131054b8f1f 100644 --- a/content/cn/videos/tags/spark-datasource-writer/index.html +++ b/content/cn/videos/tags/spark-datasource-writer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/spark-sql/index.html b/content/cn/videos/tags/spark-sql/index.html index cf8567ade7f16..8a2f138d28a8b 100644 --- a/content/cn/videos/tags/spark-sql/index.html +++ b/content/cn/videos/tags/spark-sql/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/speed/index.html b/content/cn/videos/tags/speed/index.html index c9312fc28ad94..b318f0facc844 100644 --- a/content/cn/videos/tags/speed/index.html +++ b/content/cn/videos/tags/speed/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/sql-transformer/index.html b/content/cn/videos/tags/sql-transformer/index.html index d644d7d4afa55..13877ee7ccf59 100644 --- a/content/cn/videos/tags/sql-transformer/index.html +++ b/content/cn/videos/tags/sql-transformer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/star-schema/index.html b/content/cn/videos/tags/star-schema/index.html index 8d94d15c298c0..dfcfc0b5b07a6 100644 --- a/content/cn/videos/tags/star-schema/index.html +++ b/content/cn/videos/tags/star-schema/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/starrocks/index.html b/content/cn/videos/tags/starrocks/index.html index 20e90c479ce76..f7c635a780005 100644 --- a/content/cn/videos/tags/starrocks/index.html +++ b/content/cn/videos/tags/starrocks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/storage-cost/index.html b/content/cn/videos/tags/storage-cost/index.html index ddae5ff2888fa..6994fdac1987f 100644 --- a/content/cn/videos/tags/storage-cost/index.html +++ b/content/cn/videos/tags/storage-cost/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/stored-procedures/index.html b/content/cn/videos/tags/stored-procedures/index.html index 10a3407270878..453dade8cb89b 100644 --- a/content/cn/videos/tags/stored-procedures/index.html +++ b/content/cn/videos/tags/stored-procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/streaming-etl/index.html b/content/cn/videos/tags/streaming-etl/index.html index a8758d967fd32..4eece82c86e87 100644 --- a/content/cn/videos/tags/streaming-etl/index.html +++ b/content/cn/videos/tags/streaming-etl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/streaming-ingestion/index.html b/content/cn/videos/tags/streaming-ingestion/index.html index bccbc0349ecb9..df850fc6ce860 100644 --- a/content/cn/videos/tags/streaming-ingestion/index.html +++ b/content/cn/videos/tags/streaming-ingestion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/streaming/index.html b/content/cn/videos/tags/streaming/index.html index 104ca48badacb..9c6cc6001440b 100644 --- a/content/cn/videos/tags/streaming/index.html +++ b/content/cn/videos/tags/streaming/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/subnet/index.html b/content/cn/videos/tags/subnet/index.html index ce524f742cd9f..ba5462aef0e6b 100644 --- a/content/cn/videos/tags/subnet/index.html +++ b/content/cn/videos/tags/subnet/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/table-types/index.html b/content/cn/videos/tags/table-types/index.html index 216d8750b05fd..283297af96b12 100644 --- a/content/cn/videos/tags/table-types/index.html +++ b/content/cn/videos/tags/table-types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/templated-architecture/index.html b/content/cn/videos/tags/templated-architecture/index.html index f492cdaa3544b..8a7e34916a611 100644 --- a/content/cn/videos/tags/templated-architecture/index.html +++ b/content/cn/videos/tags/templated-architecture/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/third-party-data/index.html b/content/cn/videos/tags/third-party-data/index.html index 64426a8adc154..58677f7f1ff41 100644 --- a/content/cn/videos/tags/third-party-data/index.html +++ b/content/cn/videos/tags/third-party-data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/time-travel/index.html b/content/cn/videos/tags/time-travel/index.html index 932adab0f0e11..0cc848d606fbe 100644 --- a/content/cn/videos/tags/time-travel/index.html +++ b/content/cn/videos/tags/time-travel/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/transactional-data-lakes/index.html b/content/cn/videos/tags/transactional-data-lakes/index.html index 1a374b13e80cc..067efd1182a79 100644 --- a/content/cn/videos/tags/transactional-data-lakes/index.html +++ b/content/cn/videos/tags/transactional-data-lakes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/transformers/index.html b/content/cn/videos/tags/transformers/index.html index 5971a2de2bba6..61de2d63759b4 100644 --- a/content/cn/videos/tags/transformers/index.html +++ b/content/cn/videos/tags/transformers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/triggers/index.html b/content/cn/videos/tags/triggers/index.html index aac969500a8f4..9573f9ed13030 100644 --- a/content/cn/videos/tags/triggers/index.html +++ b/content/cn/videos/tags/triggers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/trino/index.html b/content/cn/videos/tags/trino/index.html index af77edd7ce82f..41a6ff2cbb17e 100644 --- a/content/cn/videos/tags/trino/index.html +++ b/content/cn/videos/tags/trino/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/uniqueness/index.html b/content/cn/videos/tags/uniqueness/index.html index de0e13ce673e8..9b40a99899403 100644 --- a/content/cn/videos/tags/uniqueness/index.html +++ b/content/cn/videos/tags/uniqueness/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/universal-lakehouse/index.html b/content/cn/videos/tags/universal-lakehouse/index.html index 10d13414e204c..236897bb1105b 100644 --- a/content/cn/videos/tags/universal-lakehouse/index.html +++ b/content/cn/videos/tags/universal-lakehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/update/index.html b/content/cn/videos/tags/update/index.html index 8d1a81710f306..9735f4b71fdb7 100644 --- a/content/cn/videos/tags/update/index.html +++ b/content/cn/videos/tags/update/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/updates/index.html b/content/cn/videos/tags/updates/index.html index 6ca06d6a5f891..8b3c123760c66 100644 --- a/content/cn/videos/tags/updates/index.html +++ b/content/cn/videos/tags/updates/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/upsert/index.html b/content/cn/videos/tags/upsert/index.html index c419168366a67..3dc35c9fcf5fc 100644 --- a/content/cn/videos/tags/upsert/index.html +++ b/content/cn/videos/tags/upsert/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/use-case/index.html b/content/cn/videos/tags/use-case/index.html index ed73a04e63765..205300980d5d0 100644 --- a/content/cn/videos/tags/use-case/index.html +++ b/content/cn/videos/tags/use-case/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/validation/index.html b/content/cn/videos/tags/validation/index.html index 69e8755fd4d72..dd63b344cc59c 100644 --- a/content/cn/videos/tags/validation/index.html +++ b/content/cn/videos/tags/validation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/vpc/index.html b/content/cn/videos/tags/vpc/index.html index e389be5b1699e..4e53c061b58e4 100644 --- a/content/cn/videos/tags/vpc/index.html +++ b/content/cn/videos/tags/vpc/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/windows-10/index.html b/content/cn/videos/tags/windows-10/index.html index 3aa3db9518cdd..16d21665ebbc7 100644 --- a/content/cn/videos/tags/windows-10/index.html +++ b/content/cn/videos/tags/windows-10/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/workshop/index.html b/content/cn/videos/tags/workshop/index.html index 494ad5e43f1dc..5e5ef5b894f9a 100644 --- a/content/cn/videos/tags/workshop/index.html +++ b/content/cn/videos/tags/workshop/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/write-operations/index.html b/content/cn/videos/tags/write-operations/index.html index d42213df0f66a..54e23aa94a78b 100644 --- a/content/cn/videos/tags/write-operations/index.html +++ b/content/cn/videos/tags/write-operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/xml/index.html b/content/cn/videos/tags/xml/index.html index 760299c8bd2e2..504a1cf4eaad0 100644 --- a/content/cn/videos/tags/xml/index.html +++ b/content/cn/videos/tags/xml/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/cn/videos/tags/yugabyte/index.html b/content/cn/videos/tags/yugabyte/index.html index 8ab7665a8de82..8fe121964e9cb 100644 --- a/content/cn/videos/tags/yugabyte/index.html +++ b/content/cn/videos/tags/yugabyte/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/community/get-involved/index.html b/content/community/get-involved/index.html index 2909147257ef6..ba486ba5deb86 100644 --- a/content/community/get-involved/index.html +++ b/content/community/get-involved/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/community/office_hours/index.html b/content/community/office_hours/index.html index aa4377abe75b4..3411eac428add 100644 --- a/content/community/office_hours/index.html +++ b/content/community/office_hours/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/community/syncs/index.html b/content/community/syncs/index.html index b56ad03dc0eb5..a1130fa262b75 100644 --- a/content/community/syncs/index.html +++ b/content/community/syncs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/community/team/index.html b/content/community/team/index.html index 790caa59ea1a8..d92086daf9918 100644 --- a/content/community/team/index.html +++ b/content/community/team/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/contribute/developer-setup/index.html b/content/contribute/developer-setup/index.html index 590924f984587..63706123476e3 100644 --- a/content/contribute/developer-setup/index.html +++ b/content/contribute/developer-setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/contribute/how-to-contribute/index.html b/content/contribute/how-to-contribute/index.html index 5cd39761a81a3..2b0d51f46fb17 100644 --- a/content/contribute/how-to-contribute/index.html +++ b/content/contribute/how-to-contribute/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/contribute/report-security-issues/index.html b/content/contribute/report-security-issues/index.html index 7f5e142750c66..2eed95975ae60 100644 --- a/content/contribute/report-security-issues/index.html +++ b/content/contribute/report-security-issues/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/contribute/rfc-process/index.html b/content/contribute/rfc-process/index.html index b654d0642fd92..fc1c8ed5fb710 100644 --- a/content/contribute/rfc-process/index.html +++ b/content/contribute/rfc-process/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/azure_hoodie/index.html b/content/docs/0.10.0/azure_hoodie/index.html index c5fac0b10cbda..0593a0049e21c 100644 --- a/content/docs/0.10.0/azure_hoodie/index.html +++ b/content/docs/0.10.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/bos_hoodie/index.html b/content/docs/0.10.0/bos_hoodie/index.html index d3589ec392e70..fe4ef272d6866 100644 --- a/content/docs/0.10.0/bos_hoodie/index.html +++ b/content/docs/0.10.0/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/cli/index.html b/content/docs/0.10.0/cli/index.html index f3aade33ec06d..4eedd7b2a3fc5 100644 --- a/content/docs/0.10.0/cli/index.html +++ b/content/docs/0.10.0/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/cloud/index.html b/content/docs/0.10.0/cloud/index.html index 6fd6968e8ed48..a9734970b639a 100644 --- a/content/docs/0.10.0/cloud/index.html +++ b/content/docs/0.10.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/clustering/index.html b/content/docs/0.10.0/clustering/index.html index 7b21fdb4727fb..cf4767d52ac5b 100644 --- a/content/docs/0.10.0/clustering/index.html +++ b/content/docs/0.10.0/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/compaction/index.html b/content/docs/0.10.0/compaction/index.html index ed64b5ac02411..8692ee8f81d52 100644 --- a/content/docs/0.10.0/compaction/index.html +++ b/content/docs/0.10.0/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/comparison/index.html b/content/docs/0.10.0/comparison/index.html index 8d2c532c1f2fc..e3919780d4b28 100644 --- a/content/docs/0.10.0/comparison/index.html +++ b/content/docs/0.10.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/concepts/index.html b/content/docs/0.10.0/concepts/index.html index ab09ab8b67ec3..10395b5652686 100644 --- a/content/docs/0.10.0/concepts/index.html +++ b/content/docs/0.10.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/concurrency_control/index.html b/content/docs/0.10.0/concurrency_control/index.html index 9d9fff58dc382..45d6e5b7119ed 100644 --- a/content/docs/0.10.0/concurrency_control/index.html +++ b/content/docs/0.10.0/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/configurations/index.html b/content/docs/0.10.0/configurations/index.html index 51fd3f80f390f..1c67871871aad 100644 --- a/content/docs/0.10.0/configurations/index.html +++ b/content/docs/0.10.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/cos_hoodie/index.html b/content/docs/0.10.0/cos_hoodie/index.html index 8c79a80603589..0a0b0ad842ca7 100644 --- a/content/docs/0.10.0/cos_hoodie/index.html +++ b/content/docs/0.10.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/deployment/index.html b/content/docs/0.10.0/deployment/index.html index 60d650487324b..52c6207108d77 100644 --- a/content/docs/0.10.0/deployment/index.html +++ b/content/docs/0.10.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/docker_demo/index.html b/content/docs/0.10.0/docker_demo/index.html index 33079f7d90166..afaca1e205ff2 100644 --- a/content/docs/0.10.0/docker_demo/index.html +++ b/content/docs/0.10.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/faq/index.html b/content/docs/0.10.0/faq/index.html index 34074e1727be6..6a8a1e9a3e6a2 100644 --- a/content/docs/0.10.0/faq/index.html +++ b/content/docs/0.10.0/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/file_layouts/index.html b/content/docs/0.10.0/file_layouts/index.html index 44a9ada0edd82..69f9608d9d1c3 100644 --- a/content/docs/0.10.0/file_layouts/index.html +++ b/content/docs/0.10.0/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/file_sizing/index.html b/content/docs/0.10.0/file_sizing/index.html index aeb867afda1f3..d33b410100ca7 100644 --- a/content/docs/0.10.0/file_sizing/index.html +++ b/content/docs/0.10.0/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/flink-quick-start-guide/index.html b/content/docs/0.10.0/flink-quick-start-guide/index.html index 858eb91971229..08d82fcf4036c 100644 --- a/content/docs/0.10.0/flink-quick-start-guide/index.html +++ b/content/docs/0.10.0/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/flink_configuration/index.html b/content/docs/0.10.0/flink_configuration/index.html index 8588b2cdcb10d..35d9f6c73f2e3 100644 --- a/content/docs/0.10.0/flink_configuration/index.html +++ b/content/docs/0.10.0/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/gcs_hoodie/index.html b/content/docs/0.10.0/gcs_hoodie/index.html index c1a293a4b4e61..4cbb2940d4d40 100644 --- a/content/docs/0.10.0/gcs_hoodie/index.html +++ b/content/docs/0.10.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/hoodie_cleaner/index.html b/content/docs/0.10.0/hoodie_cleaner/index.html index 7f9d16d40d650..d12c6c4e3c6f9 100644 --- a/content/docs/0.10.0/hoodie_cleaner/index.html +++ b/content/docs/0.10.0/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/hoodie_deltastreamer/index.html b/content/docs/0.10.0/hoodie_deltastreamer/index.html index b603074935e84..6fb4adcea6fd0 100644 --- a/content/docs/0.10.0/hoodie_deltastreamer/index.html +++ b/content/docs/0.10.0/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/ibm_cos_hoodie/index.html b/content/docs/0.10.0/ibm_cos_hoodie/index.html index 44486e3e735a1..85b9aadc9c918 100644 --- a/content/docs/0.10.0/ibm_cos_hoodie/index.html +++ b/content/docs/0.10.0/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/indexing/index.html b/content/docs/0.10.0/indexing/index.html index 0b137cae44baa..653bf3f129cc4 100644 --- a/content/docs/0.10.0/indexing/index.html +++ b/content/docs/0.10.0/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/jfs_hoodie/index.html b/content/docs/0.10.0/jfs_hoodie/index.html index 8d2df7f7416fa..473ed14254783 100644 --- a/content/docs/0.10.0/jfs_hoodie/index.html +++ b/content/docs/0.10.0/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/key_generation/index.html b/content/docs/0.10.0/key_generation/index.html index 076bc1d960239..95c2b2c72a330 100644 --- a/content/docs/0.10.0/key_generation/index.html +++ b/content/docs/0.10.0/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/markers/index.html b/content/docs/0.10.0/markers/index.html index cfbaebbd69867..61cc438f3a44f 100644 --- a/content/docs/0.10.0/markers/index.html +++ b/content/docs/0.10.0/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/metadata/index.html b/content/docs/0.10.0/metadata/index.html index e7886dbde3ebe..5851ebb260f41 100644 --- a/content/docs/0.10.0/metadata/index.html +++ b/content/docs/0.10.0/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/metrics/index.html b/content/docs/0.10.0/metrics/index.html index a2234309700d3..84700c31b6825 100644 --- a/content/docs/0.10.0/metrics/index.html +++ b/content/docs/0.10.0/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/migration_guide/index.html b/content/docs/0.10.0/migration_guide/index.html index 1e073ae2faf99..d50d17e432177 100644 --- a/content/docs/0.10.0/migration_guide/index.html +++ b/content/docs/0.10.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/oss_hoodie/index.html b/content/docs/0.10.0/oss_hoodie/index.html index 384502167e643..31e81ab4cb6c2 100644 --- a/content/docs/0.10.0/oss_hoodie/index.html +++ b/content/docs/0.10.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/overview/index.html b/content/docs/0.10.0/overview/index.html index fcad359b14b4d..76fa5dc6bdd9a 100644 --- a/content/docs/0.10.0/overview/index.html +++ b/content/docs/0.10.0/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/performance/index.html b/content/docs/0.10.0/performance/index.html index bf747399a0d67..f7fb46962052f 100644 --- a/content/docs/0.10.0/performance/index.html +++ b/content/docs/0.10.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/precommit_validator/index.html b/content/docs/0.10.0/precommit_validator/index.html index 7cd6f90609dac..08d3c8f08bb1d 100644 --- a/content/docs/0.10.0/precommit_validator/index.html +++ b/content/docs/0.10.0/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/privacy/index.html b/content/docs/0.10.0/privacy/index.html index 9d85ada508346..25ae2cc6d3b1f 100644 --- a/content/docs/0.10.0/privacy/index.html +++ b/content/docs/0.10.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/query_engine_setup/index.html b/content/docs/0.10.0/query_engine_setup/index.html index 42856f28759d8..390ed5d487769 100644 --- a/content/docs/0.10.0/query_engine_setup/index.html +++ b/content/docs/0.10.0/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/querying_data/index.html b/content/docs/0.10.0/querying_data/index.html index b151d61178215..b70e000d24a16 100644 --- a/content/docs/0.10.0/querying_data/index.html +++ b/content/docs/0.10.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/quick-start-guide/index.html b/content/docs/0.10.0/quick-start-guide/index.html index 0b1d432d3995b..4fc9a963fe3a9 100644 --- a/content/docs/0.10.0/quick-start-guide/index.html +++ b/content/docs/0.10.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/s3_hoodie/index.html b/content/docs/0.10.0/s3_hoodie/index.html index b86b8b5fddaf6..0393aeca07bd5 100644 --- a/content/docs/0.10.0/s3_hoodie/index.html +++ b/content/docs/0.10.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/schema_evolution/index.html b/content/docs/0.10.0/schema_evolution/index.html index fc8b873188e90..15a49bcf50dfa 100644 --- a/content/docs/0.10.0/schema_evolution/index.html +++ b/content/docs/0.10.0/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/snapshot_exporter/index.html b/content/docs/0.10.0/snapshot_exporter/index.html index f1fc58968ddfb..40267ad834cc3 100644 --- a/content/docs/0.10.0/snapshot_exporter/index.html +++ b/content/docs/0.10.0/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/structure/index.html b/content/docs/0.10.0/structure/index.html index 3f539ded18b4f..4056702efcdd1 100644 --- a/content/docs/0.10.0/structure/index.html +++ b/content/docs/0.10.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/syncing_metastore/index.html b/content/docs/0.10.0/syncing_metastore/index.html index ccf45d2c95697..f4f9bbc74a43f 100644 --- a/content/docs/0.10.0/syncing_metastore/index.html +++ b/content/docs/0.10.0/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/table_management/index.html b/content/docs/0.10.0/table_management/index.html index 03a995a725e4f..f2f0f8f29db52 100644 --- a/content/docs/0.10.0/table_management/index.html +++ b/content/docs/0.10.0/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/table_types/index.html b/content/docs/0.10.0/table_types/index.html index ccfc5ce3f7e07..86b25fe89203b 100644 --- a/content/docs/0.10.0/table_types/index.html +++ b/content/docs/0.10.0/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/timeline/index.html b/content/docs/0.10.0/timeline/index.html index a9277e789670c..26d324e5c7b9f 100644 --- a/content/docs/0.10.0/timeline/index.html +++ b/content/docs/0.10.0/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/transforms/index.html b/content/docs/0.10.0/transforms/index.html index ab45401faec4d..db29664beb997 100644 --- a/content/docs/0.10.0/transforms/index.html +++ b/content/docs/0.10.0/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/troubleshooting/index.html b/content/docs/0.10.0/troubleshooting/index.html index 36bd27adfd679..75a0f388507c1 100644 --- a/content/docs/0.10.0/troubleshooting/index.html +++ b/content/docs/0.10.0/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/use_cases/index.html b/content/docs/0.10.0/use_cases/index.html index 0609fb1916bbb..79314adcccc04 100644 --- a/content/docs/0.10.0/use_cases/index.html +++ b/content/docs/0.10.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/write_operations/index.html b/content/docs/0.10.0/write_operations/index.html index 7bb30f660ad4d..586fc9ce49670 100644 --- a/content/docs/0.10.0/write_operations/index.html +++ b/content/docs/0.10.0/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.0/writing_data/index.html b/content/docs/0.10.0/writing_data/index.html index 8ffe52d58f010..1eef75c2d28e2 100644 --- a/content/docs/0.10.0/writing_data/index.html +++ b/content/docs/0.10.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/azure_hoodie/index.html b/content/docs/0.10.1/azure_hoodie/index.html index d856bfb47a0df..8a4948b0d508b 100644 --- a/content/docs/0.10.1/azure_hoodie/index.html +++ b/content/docs/0.10.1/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/bos_hoodie/index.html b/content/docs/0.10.1/bos_hoodie/index.html index bb68017c7a666..0f2e31ddebdab 100644 --- a/content/docs/0.10.1/bos_hoodie/index.html +++ b/content/docs/0.10.1/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/cli/index.html b/content/docs/0.10.1/cli/index.html index ffdf3c94fbc0b..918da64b27aa4 100644 --- a/content/docs/0.10.1/cli/index.html +++ b/content/docs/0.10.1/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/cloud/index.html b/content/docs/0.10.1/cloud/index.html index 86cdd9392bea1..ceca0633e7ab6 100644 --- a/content/docs/0.10.1/cloud/index.html +++ b/content/docs/0.10.1/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/clustering/index.html b/content/docs/0.10.1/clustering/index.html index da36ffc6d0432..f5f38dac197cd 100644 --- a/content/docs/0.10.1/clustering/index.html +++ b/content/docs/0.10.1/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/compaction/index.html b/content/docs/0.10.1/compaction/index.html index b1e0affb10272..3d458054df17d 100644 --- a/content/docs/0.10.1/compaction/index.html +++ b/content/docs/0.10.1/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/comparison/index.html b/content/docs/0.10.1/comparison/index.html index 73624b1d1bd9c..66a92f524436a 100644 --- a/content/docs/0.10.1/comparison/index.html +++ b/content/docs/0.10.1/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/concepts/index.html b/content/docs/0.10.1/concepts/index.html index 747f1e1492f48..8bd6d6d3eff3b 100644 --- a/content/docs/0.10.1/concepts/index.html +++ b/content/docs/0.10.1/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/concurrency_control/index.html b/content/docs/0.10.1/concurrency_control/index.html index 935f86416f9e4..d894a0d2440a4 100644 --- a/content/docs/0.10.1/concurrency_control/index.html +++ b/content/docs/0.10.1/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/configurations/index.html b/content/docs/0.10.1/configurations/index.html index 8a0494a211329..3192d17c1bcb8 100644 --- a/content/docs/0.10.1/configurations/index.html +++ b/content/docs/0.10.1/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/cos_hoodie/index.html b/content/docs/0.10.1/cos_hoodie/index.html index cdb916824bc5b..bfa8ce64cc81a 100644 --- a/content/docs/0.10.1/cos_hoodie/index.html +++ b/content/docs/0.10.1/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/deployment/index.html b/content/docs/0.10.1/deployment/index.html index 344fa18b92771..603b46b57404c 100644 --- a/content/docs/0.10.1/deployment/index.html +++ b/content/docs/0.10.1/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/docker_demo/index.html b/content/docs/0.10.1/docker_demo/index.html index 206b8e149f8ed..1401bed6deb2f 100644 --- a/content/docs/0.10.1/docker_demo/index.html +++ b/content/docs/0.10.1/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/faq/index.html b/content/docs/0.10.1/faq/index.html index 72a51bc5beade..0cefdc32b1284 100644 --- a/content/docs/0.10.1/faq/index.html +++ b/content/docs/0.10.1/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/file_layouts/index.html b/content/docs/0.10.1/file_layouts/index.html index 6cbe774608716..8483d528f5070 100644 --- a/content/docs/0.10.1/file_layouts/index.html +++ b/content/docs/0.10.1/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/file_sizing/index.html b/content/docs/0.10.1/file_sizing/index.html index 0baba81ad0afd..41d6f3bb5e4f9 100644 --- a/content/docs/0.10.1/file_sizing/index.html +++ b/content/docs/0.10.1/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/flink-quick-start-guide/index.html b/content/docs/0.10.1/flink-quick-start-guide/index.html index f50c44b660989..a4c034c25d426 100644 --- a/content/docs/0.10.1/flink-quick-start-guide/index.html +++ b/content/docs/0.10.1/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/flink_configuration/index.html b/content/docs/0.10.1/flink_configuration/index.html index 0e8e5a805156d..dc4e2cdd5916f 100644 --- a/content/docs/0.10.1/flink_configuration/index.html +++ b/content/docs/0.10.1/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/gcs_hoodie/index.html b/content/docs/0.10.1/gcs_hoodie/index.html index 7163180445349..5ca9273686add 100644 --- a/content/docs/0.10.1/gcs_hoodie/index.html +++ b/content/docs/0.10.1/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/hoodie_cleaner/index.html b/content/docs/0.10.1/hoodie_cleaner/index.html index 20f8869c6abd6..920e5722e09de 100644 --- a/content/docs/0.10.1/hoodie_cleaner/index.html +++ b/content/docs/0.10.1/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/hoodie_deltastreamer/index.html b/content/docs/0.10.1/hoodie_deltastreamer/index.html index b3a435386383e..ac288a69399b1 100644 --- a/content/docs/0.10.1/hoodie_deltastreamer/index.html +++ b/content/docs/0.10.1/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/ibm_cos_hoodie/index.html b/content/docs/0.10.1/ibm_cos_hoodie/index.html index 027c432fd256b..717611489b0fb 100644 --- a/content/docs/0.10.1/ibm_cos_hoodie/index.html +++ b/content/docs/0.10.1/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/indexing/index.html b/content/docs/0.10.1/indexing/index.html index e27284bd1c0ab..18dac734df6bc 100644 --- a/content/docs/0.10.1/indexing/index.html +++ b/content/docs/0.10.1/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/jfs_hoodie/index.html b/content/docs/0.10.1/jfs_hoodie/index.html index 75f0a2b53c671..1cb8b15533f57 100644 --- a/content/docs/0.10.1/jfs_hoodie/index.html +++ b/content/docs/0.10.1/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/key_generation/index.html b/content/docs/0.10.1/key_generation/index.html index 461e657dfae49..d85568b6919f2 100644 --- a/content/docs/0.10.1/key_generation/index.html +++ b/content/docs/0.10.1/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/markers/index.html b/content/docs/0.10.1/markers/index.html index 5deeb481850dc..8877f5685b856 100644 --- a/content/docs/0.10.1/markers/index.html +++ b/content/docs/0.10.1/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/metadata/index.html b/content/docs/0.10.1/metadata/index.html index 41d718b42d683..69fe2a175071f 100644 --- a/content/docs/0.10.1/metadata/index.html +++ b/content/docs/0.10.1/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/metrics/index.html b/content/docs/0.10.1/metrics/index.html index 52b8b1091f4a2..3df905508ec4d 100644 --- a/content/docs/0.10.1/metrics/index.html +++ b/content/docs/0.10.1/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/migration_guide/index.html b/content/docs/0.10.1/migration_guide/index.html index 7cd7386467c23..1f276c0cf5148 100644 --- a/content/docs/0.10.1/migration_guide/index.html +++ b/content/docs/0.10.1/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/oss_hoodie/index.html b/content/docs/0.10.1/oss_hoodie/index.html index cf179f5942ddf..b6dd4541bd768 100644 --- a/content/docs/0.10.1/oss_hoodie/index.html +++ b/content/docs/0.10.1/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/overview/index.html b/content/docs/0.10.1/overview/index.html index fe44887330afe..989d47f290fa6 100644 --- a/content/docs/0.10.1/overview/index.html +++ b/content/docs/0.10.1/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/performance/index.html b/content/docs/0.10.1/performance/index.html index 50d7c3a3ada6e..a208cca5fd1fa 100644 --- a/content/docs/0.10.1/performance/index.html +++ b/content/docs/0.10.1/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/precommit_validator/index.html b/content/docs/0.10.1/precommit_validator/index.html index 6ada826e00645..05a00339357b7 100644 --- a/content/docs/0.10.1/precommit_validator/index.html +++ b/content/docs/0.10.1/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/privacy/index.html b/content/docs/0.10.1/privacy/index.html index b53c1979a9d07..3db3754a00775 100644 --- a/content/docs/0.10.1/privacy/index.html +++ b/content/docs/0.10.1/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/query_engine_setup/index.html b/content/docs/0.10.1/query_engine_setup/index.html index a23e2020d1919..c49ffb8b99a1a 100644 --- a/content/docs/0.10.1/query_engine_setup/index.html +++ b/content/docs/0.10.1/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/querying_data/index.html b/content/docs/0.10.1/querying_data/index.html index 400721d2e1057..37c535f3c626e 100644 --- a/content/docs/0.10.1/querying_data/index.html +++ b/content/docs/0.10.1/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/quick-start-guide/index.html b/content/docs/0.10.1/quick-start-guide/index.html index afcd57a551a44..23319c3ba3671 100644 --- a/content/docs/0.10.1/quick-start-guide/index.html +++ b/content/docs/0.10.1/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/s3_hoodie/index.html b/content/docs/0.10.1/s3_hoodie/index.html index 54524ea91977b..9f5dcba9e9379 100644 --- a/content/docs/0.10.1/s3_hoodie/index.html +++ b/content/docs/0.10.1/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/schema_evolution/index.html b/content/docs/0.10.1/schema_evolution/index.html index e78a0e2df553c..776c89b2ea266 100644 --- a/content/docs/0.10.1/schema_evolution/index.html +++ b/content/docs/0.10.1/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/snapshot_exporter/index.html b/content/docs/0.10.1/snapshot_exporter/index.html index 9c117c3322f2c..116c32e72d67d 100644 --- a/content/docs/0.10.1/snapshot_exporter/index.html +++ b/content/docs/0.10.1/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/structure/index.html b/content/docs/0.10.1/structure/index.html index b5489a3d23c8a..8fd3c7881513a 100644 --- a/content/docs/0.10.1/structure/index.html +++ b/content/docs/0.10.1/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/syncing_metastore/index.html b/content/docs/0.10.1/syncing_metastore/index.html index ecfdc0871634e..339257288d7cb 100644 --- a/content/docs/0.10.1/syncing_metastore/index.html +++ b/content/docs/0.10.1/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/table_management/index.html b/content/docs/0.10.1/table_management/index.html index cfe2d7658d197..a9766ca3a3eb7 100644 --- a/content/docs/0.10.1/table_management/index.html +++ b/content/docs/0.10.1/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/table_types/index.html b/content/docs/0.10.1/table_types/index.html index 2c1160dfc1768..ea234ec624596 100644 --- a/content/docs/0.10.1/table_types/index.html +++ b/content/docs/0.10.1/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/timeline/index.html b/content/docs/0.10.1/timeline/index.html index 1fd1f9749d115..c46dc490d1587 100644 --- a/content/docs/0.10.1/timeline/index.html +++ b/content/docs/0.10.1/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/transforms/index.html b/content/docs/0.10.1/transforms/index.html index eced8a0aed4ca..2c368f95d2131 100644 --- a/content/docs/0.10.1/transforms/index.html +++ b/content/docs/0.10.1/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/troubleshooting/index.html b/content/docs/0.10.1/troubleshooting/index.html index ac29ad8278484..a80c11026b649 100644 --- a/content/docs/0.10.1/troubleshooting/index.html +++ b/content/docs/0.10.1/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/tuning-guide/index.html b/content/docs/0.10.1/tuning-guide/index.html index 7419068994fb2..efa2772efe891 100644 --- a/content/docs/0.10.1/tuning-guide/index.html +++ b/content/docs/0.10.1/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/use_cases/index.html b/content/docs/0.10.1/use_cases/index.html index b02b771537842..afb0d1d314838 100644 --- a/content/docs/0.10.1/use_cases/index.html +++ b/content/docs/0.10.1/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/write_operations/index.html b/content/docs/0.10.1/write_operations/index.html index 7256b60978600..e46025ef9c6ad 100644 --- a/content/docs/0.10.1/write_operations/index.html +++ b/content/docs/0.10.1/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.10.1/writing_data/index.html b/content/docs/0.10.1/writing_data/index.html index fbabc1021d09d..c7dd5c9915f73 100644 --- a/content/docs/0.10.1/writing_data/index.html +++ b/content/docs/0.10.1/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/azure_hoodie/index.html b/content/docs/0.11.0/azure_hoodie/index.html index dc2fab799fb27..5ddc146f6f26f 100644 --- a/content/docs/0.11.0/azure_hoodie/index.html +++ b/content/docs/0.11.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/bos_hoodie/index.html b/content/docs/0.11.0/bos_hoodie/index.html index 8351b25bf60ed..501509b9c67a1 100644 --- a/content/docs/0.11.0/bos_hoodie/index.html +++ b/content/docs/0.11.0/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/cli/index.html b/content/docs/0.11.0/cli/index.html index 55d8627cb4c4e..9b18f0a029471 100644 --- a/content/docs/0.11.0/cli/index.html +++ b/content/docs/0.11.0/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/cloud/index.html b/content/docs/0.11.0/cloud/index.html index 01f6f5041df1e..f8a4aef3b2c7b 100644 --- a/content/docs/0.11.0/cloud/index.html +++ b/content/docs/0.11.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/clustering/index.html b/content/docs/0.11.0/clustering/index.html index ee1c97d450374..8c1b331c79d6e 100644 --- a/content/docs/0.11.0/clustering/index.html +++ b/content/docs/0.11.0/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/compaction/index.html b/content/docs/0.11.0/compaction/index.html index 8b8e2cc826e9a..5d9b4a80fa954 100644 --- a/content/docs/0.11.0/compaction/index.html +++ b/content/docs/0.11.0/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/comparison/index.html b/content/docs/0.11.0/comparison/index.html index c3d199013df9e..7da4fc1374bd9 100644 --- a/content/docs/0.11.0/comparison/index.html +++ b/content/docs/0.11.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/concepts/index.html b/content/docs/0.11.0/concepts/index.html index b22ba79dff0ab..169bc29533039 100644 --- a/content/docs/0.11.0/concepts/index.html +++ b/content/docs/0.11.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/concurrency_control/index.html b/content/docs/0.11.0/concurrency_control/index.html index 42e42d4b0d5c9..53037ea44b6b4 100644 --- a/content/docs/0.11.0/concurrency_control/index.html +++ b/content/docs/0.11.0/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/configurations/index.html b/content/docs/0.11.0/configurations/index.html index f8b16cfe6dc15..36e610a900bc0 100644 --- a/content/docs/0.11.0/configurations/index.html +++ b/content/docs/0.11.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/cos_hoodie/index.html b/content/docs/0.11.0/cos_hoodie/index.html index 59a77f71997a1..acaf5a5b63d54 100644 --- a/content/docs/0.11.0/cos_hoodie/index.html +++ b/content/docs/0.11.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/deployment/index.html b/content/docs/0.11.0/deployment/index.html index 8b8b6df68c869..a160e672de3fd 100644 --- a/content/docs/0.11.0/deployment/index.html +++ b/content/docs/0.11.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/disaster_recovery/index.html b/content/docs/0.11.0/disaster_recovery/index.html index 96bbb7bc6aaab..aae34e1e8944b 100644 --- a/content/docs/0.11.0/disaster_recovery/index.html +++ b/content/docs/0.11.0/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/docker_demo/index.html b/content/docs/0.11.0/docker_demo/index.html index 361eb667f380f..ab883693b1f84 100644 --- a/content/docs/0.11.0/docker_demo/index.html +++ b/content/docs/0.11.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/encryption/index.html b/content/docs/0.11.0/encryption/index.html index 12299bd8c3dd6..920df10ccbc69 100644 --- a/content/docs/0.11.0/encryption/index.html +++ b/content/docs/0.11.0/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/faq/index.html b/content/docs/0.11.0/faq/index.html index cd8117cfdfeaf..7f61ed1768838 100644 --- a/content/docs/0.11.0/faq/index.html +++ b/content/docs/0.11.0/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/file_layouts/index.html b/content/docs/0.11.0/file_layouts/index.html index 5d082c3e7e6a6..dc6830442d6ee 100644 --- a/content/docs/0.11.0/file_layouts/index.html +++ b/content/docs/0.11.0/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/file_sizing/index.html b/content/docs/0.11.0/file_sizing/index.html index 6f0ce7fadf865..2d545330b8415 100644 --- a/content/docs/0.11.0/file_sizing/index.html +++ b/content/docs/0.11.0/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/flink-quick-start-guide/index.html b/content/docs/0.11.0/flink-quick-start-guide/index.html index 0ae6883976b2e..5f6334472eaa4 100644 --- a/content/docs/0.11.0/flink-quick-start-guide/index.html +++ b/content/docs/0.11.0/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/flink_configuration/index.html b/content/docs/0.11.0/flink_configuration/index.html index 9e8fcff8b3fd1..1a85ce07f449f 100644 --- a/content/docs/0.11.0/flink_configuration/index.html +++ b/content/docs/0.11.0/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/gcp_bigquery/index.html b/content/docs/0.11.0/gcp_bigquery/index.html index afcfffa2829c0..c67778590ac09 100644 --- a/content/docs/0.11.0/gcp_bigquery/index.html +++ b/content/docs/0.11.0/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/gcs_hoodie/index.html b/content/docs/0.11.0/gcs_hoodie/index.html index e44f90d1a9849..215e8fb8ae013 100644 --- a/content/docs/0.11.0/gcs_hoodie/index.html +++ b/content/docs/0.11.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/hoodie_cleaner/index.html b/content/docs/0.11.0/hoodie_cleaner/index.html index 6d8a569cade77..f4779f11bd0d5 100644 --- a/content/docs/0.11.0/hoodie_cleaner/index.html +++ b/content/docs/0.11.0/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/hoodie_deltastreamer/index.html b/content/docs/0.11.0/hoodie_deltastreamer/index.html index b927b96004e1f..051456ec002ba 100644 --- a/content/docs/0.11.0/hoodie_deltastreamer/index.html +++ b/content/docs/0.11.0/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/ibm_cos_hoodie/index.html b/content/docs/0.11.0/ibm_cos_hoodie/index.html index bd8954162cf44..605007fa03274 100644 --- a/content/docs/0.11.0/ibm_cos_hoodie/index.html +++ b/content/docs/0.11.0/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/indexing/index.html b/content/docs/0.11.0/indexing/index.html index 5f9e31728bfd7..c2f1e9ad482bf 100644 --- a/content/docs/0.11.0/indexing/index.html +++ b/content/docs/0.11.0/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/jfs_hoodie/index.html b/content/docs/0.11.0/jfs_hoodie/index.html index 2c70872f59194..95bf5c4dfb90b 100644 --- a/content/docs/0.11.0/jfs_hoodie/index.html +++ b/content/docs/0.11.0/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/key_generation/index.html b/content/docs/0.11.0/key_generation/index.html index 86a1dbdcc41ec..18ed6ed353b38 100644 --- a/content/docs/0.11.0/key_generation/index.html +++ b/content/docs/0.11.0/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/markers/index.html b/content/docs/0.11.0/markers/index.html index e59b52be77f87..fc9b80fb12c2e 100644 --- a/content/docs/0.11.0/markers/index.html +++ b/content/docs/0.11.0/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/metadata/index.html b/content/docs/0.11.0/metadata/index.html index a303a06bc12d9..0ddea3409ea58 100644 --- a/content/docs/0.11.0/metadata/index.html +++ b/content/docs/0.11.0/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/metadata_indexing/index.html b/content/docs/0.11.0/metadata_indexing/index.html index 28feddfcf19cd..9c4cf8e15d4f0 100644 --- a/content/docs/0.11.0/metadata_indexing/index.html +++ b/content/docs/0.11.0/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/metrics/index.html b/content/docs/0.11.0/metrics/index.html index 9d8d3d9061503..9dd93a1292ddf 100644 --- a/content/docs/0.11.0/metrics/index.html +++ b/content/docs/0.11.0/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/migration_guide/index.html b/content/docs/0.11.0/migration_guide/index.html index cf9bb36b9063a..daec2f8ae6ce9 100644 --- a/content/docs/0.11.0/migration_guide/index.html +++ b/content/docs/0.11.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/oss_hoodie/index.html b/content/docs/0.11.0/oss_hoodie/index.html index 343584c10e70a..aef726286b92d 100644 --- a/content/docs/0.11.0/oss_hoodie/index.html +++ b/content/docs/0.11.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/overview/index.html b/content/docs/0.11.0/overview/index.html index 09e19dee0e2bb..2b4e1f6b36c6a 100644 --- a/content/docs/0.11.0/overview/index.html +++ b/content/docs/0.11.0/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/performance/index.html b/content/docs/0.11.0/performance/index.html index 2d444a90bbab8..f319a5ddc90d8 100644 --- a/content/docs/0.11.0/performance/index.html +++ b/content/docs/0.11.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/precommit_validator/index.html b/content/docs/0.11.0/precommit_validator/index.html index eb199088baeaa..b93b955fea80e 100644 --- a/content/docs/0.11.0/precommit_validator/index.html +++ b/content/docs/0.11.0/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/privacy/index.html b/content/docs/0.11.0/privacy/index.html index 4ee1cbc0708d3..8a55ab17d19c7 100644 --- a/content/docs/0.11.0/privacy/index.html +++ b/content/docs/0.11.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/procedures/index.html b/content/docs/0.11.0/procedures/index.html index 5a62400df779c..a334d2139e98a 100644 --- a/content/docs/0.11.0/procedures/index.html +++ b/content/docs/0.11.0/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/query_engine_setup/index.html b/content/docs/0.11.0/query_engine_setup/index.html index dfda3d3cfac89..0b17bba0733eb 100644 --- a/content/docs/0.11.0/query_engine_setup/index.html +++ b/content/docs/0.11.0/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/querying_data/index.html b/content/docs/0.11.0/querying_data/index.html index 962d17b4bb5d8..101a80422728b 100644 --- a/content/docs/0.11.0/querying_data/index.html +++ b/content/docs/0.11.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/quick-start-guide/index.html b/content/docs/0.11.0/quick-start-guide/index.html index ae82f7431fa3e..ddb8077e16fcd 100644 --- a/content/docs/0.11.0/quick-start-guide/index.html +++ b/content/docs/0.11.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/s3_hoodie/index.html b/content/docs/0.11.0/s3_hoodie/index.html index d8447b2037f6b..e12d2ae6d6b46 100644 --- a/content/docs/0.11.0/s3_hoodie/index.html +++ b/content/docs/0.11.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/schema_evolution/index.html b/content/docs/0.11.0/schema_evolution/index.html index 25fea921d7351..be2307d3bbd68 100644 --- a/content/docs/0.11.0/schema_evolution/index.html +++ b/content/docs/0.11.0/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/snapshot_exporter/index.html b/content/docs/0.11.0/snapshot_exporter/index.html index 5a41f7f34dd93..bd0383be948ad 100644 --- a/content/docs/0.11.0/snapshot_exporter/index.html +++ b/content/docs/0.11.0/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/structure/index.html b/content/docs/0.11.0/structure/index.html index e81a45b1a2c3b..f9ea2a0a6cf5e 100644 --- a/content/docs/0.11.0/structure/index.html +++ b/content/docs/0.11.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/syncing_aws_glue_data_catalog/index.html b/content/docs/0.11.0/syncing_aws_glue_data_catalog/index.html index c1c699db1f29c..eb27149e1cd33 100644 --- a/content/docs/0.11.0/syncing_aws_glue_data_catalog/index.html +++ b/content/docs/0.11.0/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/syncing_datahub/index.html b/content/docs/0.11.0/syncing_datahub/index.html index dc8d070a4946f..971ada8ef9e0d 100644 --- a/content/docs/0.11.0/syncing_datahub/index.html +++ b/content/docs/0.11.0/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/syncing_metastore/index.html b/content/docs/0.11.0/syncing_metastore/index.html index 3e569479b354e..ee2f1c1d5bf2a 100644 --- a/content/docs/0.11.0/syncing_metastore/index.html +++ b/content/docs/0.11.0/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/table_management/index.html b/content/docs/0.11.0/table_management/index.html index 0f500f000e6b8..cfecfbf530917 100644 --- a/content/docs/0.11.0/table_management/index.html +++ b/content/docs/0.11.0/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/table_types/index.html b/content/docs/0.11.0/table_types/index.html index b67f95d29899e..af2d82de74ac5 100644 --- a/content/docs/0.11.0/table_types/index.html +++ b/content/docs/0.11.0/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/timeline/index.html b/content/docs/0.11.0/timeline/index.html index c86f77944a42c..6b9152a75e1fc 100644 --- a/content/docs/0.11.0/timeline/index.html +++ b/content/docs/0.11.0/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/transforms/index.html b/content/docs/0.11.0/transforms/index.html index 8d4788e56c4ff..f91c16251fce3 100644 --- a/content/docs/0.11.0/transforms/index.html +++ b/content/docs/0.11.0/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/troubleshooting/index.html b/content/docs/0.11.0/troubleshooting/index.html index 7d7eae7533b27..8907e154d0f6b 100644 --- a/content/docs/0.11.0/troubleshooting/index.html +++ b/content/docs/0.11.0/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/tuning-guide/index.html b/content/docs/0.11.0/tuning-guide/index.html index e77333e5cd045..07740895724f6 100644 --- a/content/docs/0.11.0/tuning-guide/index.html +++ b/content/docs/0.11.0/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/use_cases/index.html b/content/docs/0.11.0/use_cases/index.html index 867803a8a76ef..f2bd97a4466dc 100644 --- a/content/docs/0.11.0/use_cases/index.html +++ b/content/docs/0.11.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/write_operations/index.html b/content/docs/0.11.0/write_operations/index.html index 273b792905569..19e9081f98689 100644 --- a/content/docs/0.11.0/write_operations/index.html +++ b/content/docs/0.11.0/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.0/writing_data/index.html b/content/docs/0.11.0/writing_data/index.html index 3c4ddbc378f68..896442710c91d 100644 --- a/content/docs/0.11.0/writing_data/index.html +++ b/content/docs/0.11.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/azure_hoodie/index.html b/content/docs/0.11.1/azure_hoodie/index.html index e03032a35b16d..1a8571d360680 100644 --- a/content/docs/0.11.1/azure_hoodie/index.html +++ b/content/docs/0.11.1/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/basic_configurations/index.html b/content/docs/0.11.1/basic_configurations/index.html index 2cdc8fdcbd4a1..d27bca05a6f9b 100644 --- a/content/docs/0.11.1/basic_configurations/index.html +++ b/content/docs/0.11.1/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/bos_hoodie/index.html b/content/docs/0.11.1/bos_hoodie/index.html index c69e85f762492..bdbc74473cb86 100644 --- a/content/docs/0.11.1/bos_hoodie/index.html +++ b/content/docs/0.11.1/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/cli/index.html b/content/docs/0.11.1/cli/index.html index f0afb7dca6280..c2b55a2de47f0 100644 --- a/content/docs/0.11.1/cli/index.html +++ b/content/docs/0.11.1/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/cloud/index.html b/content/docs/0.11.1/cloud/index.html index b926c964c2658..5aa70cc9383b8 100644 --- a/content/docs/0.11.1/cloud/index.html +++ b/content/docs/0.11.1/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/clustering/index.html b/content/docs/0.11.1/clustering/index.html index 5bf436c1f82b6..04508308c59b2 100644 --- a/content/docs/0.11.1/clustering/index.html +++ b/content/docs/0.11.1/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/compaction/index.html b/content/docs/0.11.1/compaction/index.html index aedcbeed3a3bc..5a9c2a49a07df 100644 --- a/content/docs/0.11.1/compaction/index.html +++ b/content/docs/0.11.1/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/comparison/index.html b/content/docs/0.11.1/comparison/index.html index 151ca4a808546..8adf967a095a1 100644 --- a/content/docs/0.11.1/comparison/index.html +++ b/content/docs/0.11.1/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/concepts/index.html b/content/docs/0.11.1/concepts/index.html index 69be20701caf1..1ab3600856d4e 100644 --- a/content/docs/0.11.1/concepts/index.html +++ b/content/docs/0.11.1/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/concurrency_control/index.html b/content/docs/0.11.1/concurrency_control/index.html index 73fa598d1b500..28b2774600a9a 100644 --- a/content/docs/0.11.1/concurrency_control/index.html +++ b/content/docs/0.11.1/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/configurations/index.html b/content/docs/0.11.1/configurations/index.html index 2492ab6ae9bfd..dbeba570b35c7 100644 --- a/content/docs/0.11.1/configurations/index.html +++ b/content/docs/0.11.1/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/cos_hoodie/index.html b/content/docs/0.11.1/cos_hoodie/index.html index 857ad2c1a68f2..4c0981182027b 100644 --- a/content/docs/0.11.1/cos_hoodie/index.html +++ b/content/docs/0.11.1/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/deployment/index.html b/content/docs/0.11.1/deployment/index.html index d77dde275a4e0..a990ddac31a9a 100644 --- a/content/docs/0.11.1/deployment/index.html +++ b/content/docs/0.11.1/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/disaster_recovery/index.html b/content/docs/0.11.1/disaster_recovery/index.html index 7e9c7e0a4a609..81d69b994b51b 100644 --- a/content/docs/0.11.1/disaster_recovery/index.html +++ b/content/docs/0.11.1/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/docker_demo/index.html b/content/docs/0.11.1/docker_demo/index.html index 97bc924d24c1d..6da4f39c44e4c 100644 --- a/content/docs/0.11.1/docker_demo/index.html +++ b/content/docs/0.11.1/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/encryption/index.html b/content/docs/0.11.1/encryption/index.html index 2b132a30f234b..2fb53c3d9c6b4 100644 --- a/content/docs/0.11.1/encryption/index.html +++ b/content/docs/0.11.1/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/faq/index.html b/content/docs/0.11.1/faq/index.html index b997a3a6432b3..21c32332e748d 100644 --- a/content/docs/0.11.1/faq/index.html +++ b/content/docs/0.11.1/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/file_layouts/index.html b/content/docs/0.11.1/file_layouts/index.html index cd04dae5acf1f..fb9b64138f115 100644 --- a/content/docs/0.11.1/file_layouts/index.html +++ b/content/docs/0.11.1/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/file_sizing/index.html b/content/docs/0.11.1/file_sizing/index.html index 98312572d3125..b1a1dc3ae5a63 100644 --- a/content/docs/0.11.1/file_sizing/index.html +++ b/content/docs/0.11.1/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/flink-quick-start-guide/index.html b/content/docs/0.11.1/flink-quick-start-guide/index.html index 776d368951d69..5014c49b7fdf6 100644 --- a/content/docs/0.11.1/flink-quick-start-guide/index.html +++ b/content/docs/0.11.1/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/flink_configuration/index.html b/content/docs/0.11.1/flink_configuration/index.html index d99470947511a..46ba8076d544a 100644 --- a/content/docs/0.11.1/flink_configuration/index.html +++ b/content/docs/0.11.1/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/gcp_bigquery/index.html b/content/docs/0.11.1/gcp_bigquery/index.html index 2653ce648a2fc..366821505a867 100644 --- a/content/docs/0.11.1/gcp_bigquery/index.html +++ b/content/docs/0.11.1/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/gcs_hoodie/index.html b/content/docs/0.11.1/gcs_hoodie/index.html index 0cb18ee06aa76..14dabb563a2f6 100644 --- a/content/docs/0.11.1/gcs_hoodie/index.html +++ b/content/docs/0.11.1/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/hoodie_cleaner/index.html b/content/docs/0.11.1/hoodie_cleaner/index.html index 1a7560a31ee8f..2057cd194d85d 100644 --- a/content/docs/0.11.1/hoodie_cleaner/index.html +++ b/content/docs/0.11.1/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/hoodie_deltastreamer/index.html b/content/docs/0.11.1/hoodie_deltastreamer/index.html index c8928e60fd3ed..8a86939fd79da 100644 --- a/content/docs/0.11.1/hoodie_deltastreamer/index.html +++ b/content/docs/0.11.1/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/ibm_cos_hoodie/index.html b/content/docs/0.11.1/ibm_cos_hoodie/index.html index 6d355e3f1981c..65428db0757e0 100644 --- a/content/docs/0.11.1/ibm_cos_hoodie/index.html +++ b/content/docs/0.11.1/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/indexing/index.html b/content/docs/0.11.1/indexing/index.html index 47764c410e743..338648de33935 100644 --- a/content/docs/0.11.1/indexing/index.html +++ b/content/docs/0.11.1/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/jfs_hoodie/index.html b/content/docs/0.11.1/jfs_hoodie/index.html index b4633b1072363..7108f1817e641 100644 --- a/content/docs/0.11.1/jfs_hoodie/index.html +++ b/content/docs/0.11.1/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/key_generation/index.html b/content/docs/0.11.1/key_generation/index.html index a1da61d9342a8..b3105ecc485ee 100644 --- a/content/docs/0.11.1/key_generation/index.html +++ b/content/docs/0.11.1/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/markers/index.html b/content/docs/0.11.1/markers/index.html index e450975e5ceac..f89955b40239f 100644 --- a/content/docs/0.11.1/markers/index.html +++ b/content/docs/0.11.1/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/metadata/index.html b/content/docs/0.11.1/metadata/index.html index 90ddd5a579137..ec3938910d5cf 100644 --- a/content/docs/0.11.1/metadata/index.html +++ b/content/docs/0.11.1/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/metadata_indexing/index.html b/content/docs/0.11.1/metadata_indexing/index.html index 7a5dbeb26fef0..250627abd97b0 100644 --- a/content/docs/0.11.1/metadata_indexing/index.html +++ b/content/docs/0.11.1/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/metrics/index.html b/content/docs/0.11.1/metrics/index.html index 313c506c55d0c..8a2ea1e2359e5 100644 --- a/content/docs/0.11.1/metrics/index.html +++ b/content/docs/0.11.1/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/migration_guide/index.html b/content/docs/0.11.1/migration_guide/index.html index c5dc6fa3dc9cc..94e15b8f0f78b 100644 --- a/content/docs/0.11.1/migration_guide/index.html +++ b/content/docs/0.11.1/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/oss_hoodie/index.html b/content/docs/0.11.1/oss_hoodie/index.html index 9fd9009482b7d..2d0cccf00ee4c 100644 --- a/content/docs/0.11.1/oss_hoodie/index.html +++ b/content/docs/0.11.1/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/overview/index.html b/content/docs/0.11.1/overview/index.html index 4bd11a792d0e0..657a32349586f 100644 --- a/content/docs/0.11.1/overview/index.html +++ b/content/docs/0.11.1/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/performance/index.html b/content/docs/0.11.1/performance/index.html index 110766d3cdfc9..bbd7d279fc708 100644 --- a/content/docs/0.11.1/performance/index.html +++ b/content/docs/0.11.1/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/precommit_validator/index.html b/content/docs/0.11.1/precommit_validator/index.html index 5474026c4a19a..c45879165be1d 100644 --- a/content/docs/0.11.1/precommit_validator/index.html +++ b/content/docs/0.11.1/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/privacy/index.html b/content/docs/0.11.1/privacy/index.html index a8fa51fcd6686..0243894d7199d 100644 --- a/content/docs/0.11.1/privacy/index.html +++ b/content/docs/0.11.1/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/procedures/index.html b/content/docs/0.11.1/procedures/index.html index 1b27550a1744a..ce1656e445c15 100644 --- a/content/docs/0.11.1/procedures/index.html +++ b/content/docs/0.11.1/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/query_engine_setup/index.html b/content/docs/0.11.1/query_engine_setup/index.html index d13b503028e14..efb1db80bee54 100644 --- a/content/docs/0.11.1/query_engine_setup/index.html +++ b/content/docs/0.11.1/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/querying_data/index.html b/content/docs/0.11.1/querying_data/index.html index 2c296fd5592f1..e46da71bf0641 100644 --- a/content/docs/0.11.1/querying_data/index.html +++ b/content/docs/0.11.1/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/quick-start-guide/index.html b/content/docs/0.11.1/quick-start-guide/index.html index c16adc0e5509c..6435b300ee781 100644 --- a/content/docs/0.11.1/quick-start-guide/index.html +++ b/content/docs/0.11.1/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/s3_hoodie/index.html b/content/docs/0.11.1/s3_hoodie/index.html index f720569653535..268af75da0d83 100644 --- a/content/docs/0.11.1/s3_hoodie/index.html +++ b/content/docs/0.11.1/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/schema_evolution/index.html b/content/docs/0.11.1/schema_evolution/index.html index ed395f840614d..d39d0c6c8f954 100644 --- a/content/docs/0.11.1/schema_evolution/index.html +++ b/content/docs/0.11.1/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/snapshot_exporter/index.html b/content/docs/0.11.1/snapshot_exporter/index.html index d14c02234d632..49f754f991ea1 100644 --- a/content/docs/0.11.1/snapshot_exporter/index.html +++ b/content/docs/0.11.1/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/structure/index.html b/content/docs/0.11.1/structure/index.html index 4155a4360819f..f7f0bf164cb1e 100644 --- a/content/docs/0.11.1/structure/index.html +++ b/content/docs/0.11.1/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/syncing_aws_glue_data_catalog/index.html b/content/docs/0.11.1/syncing_aws_glue_data_catalog/index.html index 1ef9911a7765b..892042ae09eea 100644 --- a/content/docs/0.11.1/syncing_aws_glue_data_catalog/index.html +++ b/content/docs/0.11.1/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/syncing_datahub/index.html b/content/docs/0.11.1/syncing_datahub/index.html index 9dbc03c4e5580..0fba0cd0ce1f5 100644 --- a/content/docs/0.11.1/syncing_datahub/index.html +++ b/content/docs/0.11.1/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/syncing_metastore/index.html b/content/docs/0.11.1/syncing_metastore/index.html index 91b4f1f86d209..d08048915e438 100644 --- a/content/docs/0.11.1/syncing_metastore/index.html +++ b/content/docs/0.11.1/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/table_management/index.html b/content/docs/0.11.1/table_management/index.html index 1bb1c71c8b6fb..d4faed023c41c 100644 --- a/content/docs/0.11.1/table_management/index.html +++ b/content/docs/0.11.1/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/table_types/index.html b/content/docs/0.11.1/table_types/index.html index 886ff5b676378..b2d5965bae53c 100644 --- a/content/docs/0.11.1/table_types/index.html +++ b/content/docs/0.11.1/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/timeline/index.html b/content/docs/0.11.1/timeline/index.html index d71ab1ac42dd8..5e84ef908dfaa 100644 --- a/content/docs/0.11.1/timeline/index.html +++ b/content/docs/0.11.1/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/transforms/index.html b/content/docs/0.11.1/transforms/index.html index 382e02b3acafa..c7667bcfeef79 100644 --- a/content/docs/0.11.1/transforms/index.html +++ b/content/docs/0.11.1/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/troubleshooting/index.html b/content/docs/0.11.1/troubleshooting/index.html index 1c82ce293f973..26511f08a1549 100644 --- a/content/docs/0.11.1/troubleshooting/index.html +++ b/content/docs/0.11.1/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/tuning-guide/index.html b/content/docs/0.11.1/tuning-guide/index.html index a4908c0d5798e..57d7f1ff146d7 100644 --- a/content/docs/0.11.1/tuning-guide/index.html +++ b/content/docs/0.11.1/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/use_cases/index.html b/content/docs/0.11.1/use_cases/index.html index 4f8a0ce2a036b..c9d99f4a766fc 100644 --- a/content/docs/0.11.1/use_cases/index.html +++ b/content/docs/0.11.1/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/write_operations/index.html b/content/docs/0.11.1/write_operations/index.html index 2955dbbb9d4d8..5a1f858f3c205 100644 --- a/content/docs/0.11.1/write_operations/index.html +++ b/content/docs/0.11.1/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.11.1/writing_data/index.html b/content/docs/0.11.1/writing_data/index.html index 0ab55009ac5d3..f5f22580d6b3c 100644 --- a/content/docs/0.11.1/writing_data/index.html +++ b/content/docs/0.11.1/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/azure_hoodie/index.html b/content/docs/0.12.0/azure_hoodie/index.html index e1ba422b887d4..a580f71f47ca2 100644 --- a/content/docs/0.12.0/azure_hoodie/index.html +++ b/content/docs/0.12.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/basic_configurations/index.html b/content/docs/0.12.0/basic_configurations/index.html index fef224547205f..3e7adc9377108 100644 --- a/content/docs/0.12.0/basic_configurations/index.html +++ b/content/docs/0.12.0/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/bos_hoodie/index.html b/content/docs/0.12.0/bos_hoodie/index.html index c17e3310fff79..0062c261ce68f 100644 --- a/content/docs/0.12.0/bos_hoodie/index.html +++ b/content/docs/0.12.0/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/cli/index.html b/content/docs/0.12.0/cli/index.html index b9a047d2d4a01..bf4a0216dc45f 100644 --- a/content/docs/0.12.0/cli/index.html +++ b/content/docs/0.12.0/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/cloud/index.html b/content/docs/0.12.0/cloud/index.html index 85edb1eb26681..d9650ec4dd9d5 100644 --- a/content/docs/0.12.0/cloud/index.html +++ b/content/docs/0.12.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/clustering/index.html b/content/docs/0.12.0/clustering/index.html index 9c73a565bdd21..b8a550e74c14b 100644 --- a/content/docs/0.12.0/clustering/index.html +++ b/content/docs/0.12.0/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/compaction/index.html b/content/docs/0.12.0/compaction/index.html index 79ae90fd04cc5..e74abd87820e6 100644 --- a/content/docs/0.12.0/compaction/index.html +++ b/content/docs/0.12.0/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/comparison/index.html b/content/docs/0.12.0/comparison/index.html index a99fa3ceff512..5360fa08b781e 100644 --- a/content/docs/0.12.0/comparison/index.html +++ b/content/docs/0.12.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/concepts/index.html b/content/docs/0.12.0/concepts/index.html index 5c74db0230047..30fcb12a3e950 100644 --- a/content/docs/0.12.0/concepts/index.html +++ b/content/docs/0.12.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/concurrency_control/index.html b/content/docs/0.12.0/concurrency_control/index.html index 60a13d6e310af..fd0a93a1f6214 100644 --- a/content/docs/0.12.0/concurrency_control/index.html +++ b/content/docs/0.12.0/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/configurations/index.html b/content/docs/0.12.0/configurations/index.html index 8eb061577e5b1..3ddf2cc6ca2a9 100644 --- a/content/docs/0.12.0/configurations/index.html +++ b/content/docs/0.12.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/cos_hoodie/index.html b/content/docs/0.12.0/cos_hoodie/index.html index 28555fe6b4664..7992406de6d60 100644 --- a/content/docs/0.12.0/cos_hoodie/index.html +++ b/content/docs/0.12.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/deployment/index.html b/content/docs/0.12.0/deployment/index.html index 8e1bdc1a2ae37..2733192c90055 100644 --- a/content/docs/0.12.0/deployment/index.html +++ b/content/docs/0.12.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/disaster_recovery/index.html b/content/docs/0.12.0/disaster_recovery/index.html index 129e0fe356433..0bab538d332fb 100644 --- a/content/docs/0.12.0/disaster_recovery/index.html +++ b/content/docs/0.12.0/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/docker_demo/index.html b/content/docs/0.12.0/docker_demo/index.html index 59b1755fd55a7..51af0bc49d058 100644 --- a/content/docs/0.12.0/docker_demo/index.html +++ b/content/docs/0.12.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/encryption/index.html b/content/docs/0.12.0/encryption/index.html index 7b3d42d32e7d4..8ac2ab3243cd2 100644 --- a/content/docs/0.12.0/encryption/index.html +++ b/content/docs/0.12.0/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/faq/index.html b/content/docs/0.12.0/faq/index.html index a9d8cdcb019e7..b66d674e1c935 100644 --- a/content/docs/0.12.0/faq/index.html +++ b/content/docs/0.12.0/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/file_layouts/index.html b/content/docs/0.12.0/file_layouts/index.html index 5a6452707c83c..1683abc6e33f1 100644 --- a/content/docs/0.12.0/file_layouts/index.html +++ b/content/docs/0.12.0/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/file_sizing/index.html b/content/docs/0.12.0/file_sizing/index.html index cd71e6e08e53f..0d30e04637fb7 100644 --- a/content/docs/0.12.0/file_sizing/index.html +++ b/content/docs/0.12.0/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/flink-quick-start-guide/index.html b/content/docs/0.12.0/flink-quick-start-guide/index.html index 823992fb6ec86..433599d724cc5 100644 --- a/content/docs/0.12.0/flink-quick-start-guide/index.html +++ b/content/docs/0.12.0/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/flink_configuration/index.html b/content/docs/0.12.0/flink_configuration/index.html index 2510b8a3089b3..e0f224a91a2ef 100644 --- a/content/docs/0.12.0/flink_configuration/index.html +++ b/content/docs/0.12.0/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/gcp_bigquery/index.html b/content/docs/0.12.0/gcp_bigquery/index.html index d9b681d2bd225..e93c4c994a80b 100644 --- a/content/docs/0.12.0/gcp_bigquery/index.html +++ b/content/docs/0.12.0/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/gcs_hoodie/index.html b/content/docs/0.12.0/gcs_hoodie/index.html index eb084325fa6ad..e00efb251f671 100644 --- a/content/docs/0.12.0/gcs_hoodie/index.html +++ b/content/docs/0.12.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/hoodie_cleaner/index.html b/content/docs/0.12.0/hoodie_cleaner/index.html index ff9967d847f4f..54497ad79ed8b 100644 --- a/content/docs/0.12.0/hoodie_cleaner/index.html +++ b/content/docs/0.12.0/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/hoodie_deltastreamer/index.html b/content/docs/0.12.0/hoodie_deltastreamer/index.html index 8e8cbeab8aa92..ef2a32999df9f 100644 --- a/content/docs/0.12.0/hoodie_deltastreamer/index.html +++ b/content/docs/0.12.0/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/ibm_cos_hoodie/index.html b/content/docs/0.12.0/ibm_cos_hoodie/index.html index af6d76b488dd9..3b5287e4ce25a 100644 --- a/content/docs/0.12.0/ibm_cos_hoodie/index.html +++ b/content/docs/0.12.0/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/indexing/index.html b/content/docs/0.12.0/indexing/index.html index 8d31520e23e21..e8405e6b4537c 100644 --- a/content/docs/0.12.0/indexing/index.html +++ b/content/docs/0.12.0/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/jfs_hoodie/index.html b/content/docs/0.12.0/jfs_hoodie/index.html index 35b3870710414..a4ceec28ae0a7 100644 --- a/content/docs/0.12.0/jfs_hoodie/index.html +++ b/content/docs/0.12.0/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/key_generation/index.html b/content/docs/0.12.0/key_generation/index.html index 40843e94d0f15..741f96e6caf8c 100644 --- a/content/docs/0.12.0/key_generation/index.html +++ b/content/docs/0.12.0/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/markers/index.html b/content/docs/0.12.0/markers/index.html index 0dfb2f040bcdd..7c3680e598ccc 100644 --- a/content/docs/0.12.0/markers/index.html +++ b/content/docs/0.12.0/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/metadata/index.html b/content/docs/0.12.0/metadata/index.html index 0b187c9847487..830cd64ba01c3 100644 --- a/content/docs/0.12.0/metadata/index.html +++ b/content/docs/0.12.0/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/metadata_indexing/index.html b/content/docs/0.12.0/metadata_indexing/index.html index 777a7419f42d6..5baf86570b1e2 100644 --- a/content/docs/0.12.0/metadata_indexing/index.html +++ b/content/docs/0.12.0/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/metrics/index.html b/content/docs/0.12.0/metrics/index.html index 2f5a054684ed8..01fc65b049566 100644 --- a/content/docs/0.12.0/metrics/index.html +++ b/content/docs/0.12.0/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/migration_guide/index.html b/content/docs/0.12.0/migration_guide/index.html index 5e5d7f6895c77..554d3ed1546d0 100644 --- a/content/docs/0.12.0/migration_guide/index.html +++ b/content/docs/0.12.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/oci_hoodie/index.html b/content/docs/0.12.0/oci_hoodie/index.html index a8c0e3a95b47c..bc84c84a67db3 100644 --- a/content/docs/0.12.0/oci_hoodie/index.html +++ b/content/docs/0.12.0/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/oss_hoodie/index.html b/content/docs/0.12.0/oss_hoodie/index.html index 2e722e0a30bfe..7a2e3a7fdb3d3 100644 --- a/content/docs/0.12.0/oss_hoodie/index.html +++ b/content/docs/0.12.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/overview/index.html b/content/docs/0.12.0/overview/index.html index 4f792d171b291..42e9c3eec1cc7 100644 --- a/content/docs/0.12.0/overview/index.html +++ b/content/docs/0.12.0/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/performance/index.html b/content/docs/0.12.0/performance/index.html index d3645f24bfe38..c9131f2349146 100644 --- a/content/docs/0.12.0/performance/index.html +++ b/content/docs/0.12.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/precommit_validator/index.html b/content/docs/0.12.0/precommit_validator/index.html index ba289691513f1..a80f5b0848fc0 100644 --- a/content/docs/0.12.0/precommit_validator/index.html +++ b/content/docs/0.12.0/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/privacy/index.html b/content/docs/0.12.0/privacy/index.html index ba06e73336a9e..25483140514d4 100644 --- a/content/docs/0.12.0/privacy/index.html +++ b/content/docs/0.12.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/procedures/index.html b/content/docs/0.12.0/procedures/index.html index cca038f5f05b7..c806b086932c9 100644 --- a/content/docs/0.12.0/procedures/index.html +++ b/content/docs/0.12.0/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/query_engine_setup/index.html b/content/docs/0.12.0/query_engine_setup/index.html index cd2c360277c8e..337b0b1e3c5b6 100644 --- a/content/docs/0.12.0/query_engine_setup/index.html +++ b/content/docs/0.12.0/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/querying_data/index.html b/content/docs/0.12.0/querying_data/index.html index c1c9e1c3e8c20..76da415a3e173 100644 --- a/content/docs/0.12.0/querying_data/index.html +++ b/content/docs/0.12.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/quick-start-guide/index.html b/content/docs/0.12.0/quick-start-guide/index.html index a340578649bec..c7554e60b6311 100644 --- a/content/docs/0.12.0/quick-start-guide/index.html +++ b/content/docs/0.12.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/s3_hoodie/index.html b/content/docs/0.12.0/s3_hoodie/index.html index 876333ab0a763..951bea945d5d3 100644 --- a/content/docs/0.12.0/s3_hoodie/index.html +++ b/content/docs/0.12.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/schema_evolution/index.html b/content/docs/0.12.0/schema_evolution/index.html index 08c85a6934485..1addc5cc8e915 100644 --- a/content/docs/0.12.0/schema_evolution/index.html +++ b/content/docs/0.12.0/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/snapshot_exporter/index.html b/content/docs/0.12.0/snapshot_exporter/index.html index d1cc3dfa32180..46449e202530b 100644 --- a/content/docs/0.12.0/snapshot_exporter/index.html +++ b/content/docs/0.12.0/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/structure/index.html b/content/docs/0.12.0/structure/index.html index db680bd326fcc..4a81481572f03 100644 --- a/content/docs/0.12.0/structure/index.html +++ b/content/docs/0.12.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/syncing_aws_glue_data_catalog/index.html b/content/docs/0.12.0/syncing_aws_glue_data_catalog/index.html index 8ed5f4946ff3f..752c7898c3f5e 100644 --- a/content/docs/0.12.0/syncing_aws_glue_data_catalog/index.html +++ b/content/docs/0.12.0/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/syncing_datahub/index.html b/content/docs/0.12.0/syncing_datahub/index.html index 83bf8349c1663..cf61fd93505d9 100644 --- a/content/docs/0.12.0/syncing_datahub/index.html +++ b/content/docs/0.12.0/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/syncing_metastore/index.html b/content/docs/0.12.0/syncing_metastore/index.html index 1ea65a7932d52..d090fccd6c629 100644 --- a/content/docs/0.12.0/syncing_metastore/index.html +++ b/content/docs/0.12.0/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/table_management/index.html b/content/docs/0.12.0/table_management/index.html index 0d5e0c524428b..4ab61ec226484 100644 --- a/content/docs/0.12.0/table_management/index.html +++ b/content/docs/0.12.0/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/table_types/index.html b/content/docs/0.12.0/table_types/index.html index 7b9837c66d764..49d8a45a27bae 100644 --- a/content/docs/0.12.0/table_types/index.html +++ b/content/docs/0.12.0/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/timeline/index.html b/content/docs/0.12.0/timeline/index.html index f33051b4745ff..4926dee0bdc06 100644 --- a/content/docs/0.12.0/timeline/index.html +++ b/content/docs/0.12.0/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/transforms/index.html b/content/docs/0.12.0/transforms/index.html index fd8d0b8104172..0dc56250a3825 100644 --- a/content/docs/0.12.0/transforms/index.html +++ b/content/docs/0.12.0/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/troubleshooting/index.html b/content/docs/0.12.0/troubleshooting/index.html index 089eb2521f2d8..cd42cb05389a2 100644 --- a/content/docs/0.12.0/troubleshooting/index.html +++ b/content/docs/0.12.0/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/tuning-guide/index.html b/content/docs/0.12.0/tuning-guide/index.html index aaa9eec9092ca..765ee1fb0fc71 100644 --- a/content/docs/0.12.0/tuning-guide/index.html +++ b/content/docs/0.12.0/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/use_cases/index.html b/content/docs/0.12.0/use_cases/index.html index bddde297c6afa..bae2b64360922 100644 --- a/content/docs/0.12.0/use_cases/index.html +++ b/content/docs/0.12.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/write_operations/index.html b/content/docs/0.12.0/write_operations/index.html index b843ce350dbcf..98bedf621624c 100644 --- a/content/docs/0.12.0/write_operations/index.html +++ b/content/docs/0.12.0/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.0/writing_data/index.html b/content/docs/0.12.0/writing_data/index.html index aae4922267693..bfe846ba67d2c 100644 --- a/content/docs/0.12.0/writing_data/index.html +++ b/content/docs/0.12.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/azure_hoodie/index.html b/content/docs/0.12.1/azure_hoodie/index.html index 9a7bdbba37de1..ac3bf36491be1 100644 --- a/content/docs/0.12.1/azure_hoodie/index.html +++ b/content/docs/0.12.1/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/basic_configurations/index.html b/content/docs/0.12.1/basic_configurations/index.html index 733a4ef90ecf8..01ef3fa70b5af 100644 --- a/content/docs/0.12.1/basic_configurations/index.html +++ b/content/docs/0.12.1/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/bos_hoodie/index.html b/content/docs/0.12.1/bos_hoodie/index.html index bbb9cd8fc1b71..ace5587a44a44 100644 --- a/content/docs/0.12.1/bos_hoodie/index.html +++ b/content/docs/0.12.1/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/cli/index.html b/content/docs/0.12.1/cli/index.html index 8d4ac63a2f8f9..e10e97f3ff68e 100644 --- a/content/docs/0.12.1/cli/index.html +++ b/content/docs/0.12.1/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/cloud/index.html b/content/docs/0.12.1/cloud/index.html index c91dd0fc19d00..b8346f8e5ade3 100644 --- a/content/docs/0.12.1/cloud/index.html +++ b/content/docs/0.12.1/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/clustering/index.html b/content/docs/0.12.1/clustering/index.html index e17b5a6cf3d1c..703bdb92949ce 100644 --- a/content/docs/0.12.1/clustering/index.html +++ b/content/docs/0.12.1/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/compaction/index.html b/content/docs/0.12.1/compaction/index.html index 929b638a0e248..a951b83c8395a 100644 --- a/content/docs/0.12.1/compaction/index.html +++ b/content/docs/0.12.1/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/comparison/index.html b/content/docs/0.12.1/comparison/index.html index 38d48787ee5bf..4ad17d06d5b3c 100644 --- a/content/docs/0.12.1/comparison/index.html +++ b/content/docs/0.12.1/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/concepts/index.html b/content/docs/0.12.1/concepts/index.html index 6ea36a3f387cd..fdf9c0a0817fa 100644 --- a/content/docs/0.12.1/concepts/index.html +++ b/content/docs/0.12.1/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/concurrency_control/index.html b/content/docs/0.12.1/concurrency_control/index.html index b3b193a2bd64a..5d49105f15183 100644 --- a/content/docs/0.12.1/concurrency_control/index.html +++ b/content/docs/0.12.1/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/configurations/index.html b/content/docs/0.12.1/configurations/index.html index 2698d8bfb616d..7ef6f0552ef17 100644 --- a/content/docs/0.12.1/configurations/index.html +++ b/content/docs/0.12.1/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/cos_hoodie/index.html b/content/docs/0.12.1/cos_hoodie/index.html index d1be7497d895a..3d82282c01252 100644 --- a/content/docs/0.12.1/cos_hoodie/index.html +++ b/content/docs/0.12.1/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/deployment/index.html b/content/docs/0.12.1/deployment/index.html index e029daf6eddc2..41e9607b03056 100644 --- a/content/docs/0.12.1/deployment/index.html +++ b/content/docs/0.12.1/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/disaster_recovery/index.html b/content/docs/0.12.1/disaster_recovery/index.html index b1b1c22411f23..4452422d589af 100644 --- a/content/docs/0.12.1/disaster_recovery/index.html +++ b/content/docs/0.12.1/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/docker_demo/index.html b/content/docs/0.12.1/docker_demo/index.html index 776a86674ed47..9603ad9ee1028 100644 --- a/content/docs/0.12.1/docker_demo/index.html +++ b/content/docs/0.12.1/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/encryption/index.html b/content/docs/0.12.1/encryption/index.html index 136ce269e4cd4..eee601817fc49 100644 --- a/content/docs/0.12.1/encryption/index.html +++ b/content/docs/0.12.1/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/faq/index.html b/content/docs/0.12.1/faq/index.html index dea9873010d25..6ba3fd87da78b 100644 --- a/content/docs/0.12.1/faq/index.html +++ b/content/docs/0.12.1/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/file_layouts/index.html b/content/docs/0.12.1/file_layouts/index.html index 974367c4b33f4..96ed1d5a4a1af 100644 --- a/content/docs/0.12.1/file_layouts/index.html +++ b/content/docs/0.12.1/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/file_sizing/index.html b/content/docs/0.12.1/file_sizing/index.html index fc16cf3e1afab..2e782bc394a07 100644 --- a/content/docs/0.12.1/file_sizing/index.html +++ b/content/docs/0.12.1/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/flink-quick-start-guide/index.html b/content/docs/0.12.1/flink-quick-start-guide/index.html index cfe8127c36a16..3e2155b0a56f0 100644 --- a/content/docs/0.12.1/flink-quick-start-guide/index.html +++ b/content/docs/0.12.1/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/flink_configuration/index.html b/content/docs/0.12.1/flink_configuration/index.html index 88c48b84c5ca7..b73f0695a6358 100644 --- a/content/docs/0.12.1/flink_configuration/index.html +++ b/content/docs/0.12.1/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/gcp_bigquery/index.html b/content/docs/0.12.1/gcp_bigquery/index.html index 92967e6df8439..a8bb254e05a5f 100644 --- a/content/docs/0.12.1/gcp_bigquery/index.html +++ b/content/docs/0.12.1/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/gcs_hoodie/index.html b/content/docs/0.12.1/gcs_hoodie/index.html index 5a026c94aaff0..863b3dff28c29 100644 --- a/content/docs/0.12.1/gcs_hoodie/index.html +++ b/content/docs/0.12.1/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/hoodie_cleaner/index.html b/content/docs/0.12.1/hoodie_cleaner/index.html index 48deaf9db447d..f2f9853e4dc69 100644 --- a/content/docs/0.12.1/hoodie_cleaner/index.html +++ b/content/docs/0.12.1/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/hoodie_deltastreamer/index.html b/content/docs/0.12.1/hoodie_deltastreamer/index.html index bfe95c97620ff..115c1417279aa 100644 --- a/content/docs/0.12.1/hoodie_deltastreamer/index.html +++ b/content/docs/0.12.1/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/ibm_cos_hoodie/index.html b/content/docs/0.12.1/ibm_cos_hoodie/index.html index ffff7ae04ef18..2be873bf96112 100644 --- a/content/docs/0.12.1/ibm_cos_hoodie/index.html +++ b/content/docs/0.12.1/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/indexing/index.html b/content/docs/0.12.1/indexing/index.html index 8431d96b768fa..aef5ec973b0bf 100644 --- a/content/docs/0.12.1/indexing/index.html +++ b/content/docs/0.12.1/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/jfs_hoodie/index.html b/content/docs/0.12.1/jfs_hoodie/index.html index 7c8c42c29cbfa..cad5d28535457 100644 --- a/content/docs/0.12.1/jfs_hoodie/index.html +++ b/content/docs/0.12.1/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/key_generation/index.html b/content/docs/0.12.1/key_generation/index.html index c720a96088051..8dd501679b7e2 100644 --- a/content/docs/0.12.1/key_generation/index.html +++ b/content/docs/0.12.1/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/markers/index.html b/content/docs/0.12.1/markers/index.html index fc5f85720e2c4..540db3f930806 100644 --- a/content/docs/0.12.1/markers/index.html +++ b/content/docs/0.12.1/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/metadata/index.html b/content/docs/0.12.1/metadata/index.html index 234d3c252ab95..7ce0c16dd6006 100644 --- a/content/docs/0.12.1/metadata/index.html +++ b/content/docs/0.12.1/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/metadata_indexing/index.html b/content/docs/0.12.1/metadata_indexing/index.html index af81dcdba4ba5..bb325c1d1295c 100644 --- a/content/docs/0.12.1/metadata_indexing/index.html +++ b/content/docs/0.12.1/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/metrics/index.html b/content/docs/0.12.1/metrics/index.html index 7dc833cf62941..cdd01cdbaf09a 100644 --- a/content/docs/0.12.1/metrics/index.html +++ b/content/docs/0.12.1/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/migration_guide/index.html b/content/docs/0.12.1/migration_guide/index.html index e8d9509b75624..4f3f9e11fd780 100644 --- a/content/docs/0.12.1/migration_guide/index.html +++ b/content/docs/0.12.1/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/oci_hoodie/index.html b/content/docs/0.12.1/oci_hoodie/index.html index d1f0b45583715..d28c3e361c34f 100644 --- a/content/docs/0.12.1/oci_hoodie/index.html +++ b/content/docs/0.12.1/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/oss_hoodie/index.html b/content/docs/0.12.1/oss_hoodie/index.html index 53ddd09428603..27ba8918e1a70 100644 --- a/content/docs/0.12.1/oss_hoodie/index.html +++ b/content/docs/0.12.1/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/overview/index.html b/content/docs/0.12.1/overview/index.html index 0a4a591bfb116..5de6d0c2a729f 100644 --- a/content/docs/0.12.1/overview/index.html +++ b/content/docs/0.12.1/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/performance/index.html b/content/docs/0.12.1/performance/index.html index 9859b7ff0369c..35c8d497ea39b 100644 --- a/content/docs/0.12.1/performance/index.html +++ b/content/docs/0.12.1/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/precommit_validator/index.html b/content/docs/0.12.1/precommit_validator/index.html index 0d7a714670827..617d8813c0b03 100644 --- a/content/docs/0.12.1/precommit_validator/index.html +++ b/content/docs/0.12.1/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/privacy/index.html b/content/docs/0.12.1/privacy/index.html index 3a983f9f5dea0..54b9ec8bdc073 100644 --- a/content/docs/0.12.1/privacy/index.html +++ b/content/docs/0.12.1/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/procedures/index.html b/content/docs/0.12.1/procedures/index.html index 07eacb461202c..7b82b60c276a2 100644 --- a/content/docs/0.12.1/procedures/index.html +++ b/content/docs/0.12.1/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/query_engine_setup/index.html b/content/docs/0.12.1/query_engine_setup/index.html index 59be5feb72318..38be0f625b26e 100644 --- a/content/docs/0.12.1/query_engine_setup/index.html +++ b/content/docs/0.12.1/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/querying_data/index.html b/content/docs/0.12.1/querying_data/index.html index 136fab0acb058..c18a9cac947e0 100644 --- a/content/docs/0.12.1/querying_data/index.html +++ b/content/docs/0.12.1/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/quick-start-guide/index.html b/content/docs/0.12.1/quick-start-guide/index.html index c2c4e386e8c17..efcd901ef02ab 100644 --- a/content/docs/0.12.1/quick-start-guide/index.html +++ b/content/docs/0.12.1/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/s3_hoodie/index.html b/content/docs/0.12.1/s3_hoodie/index.html index 3951f1659a9ff..f89b9b870051f 100644 --- a/content/docs/0.12.1/s3_hoodie/index.html +++ b/content/docs/0.12.1/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/schema_evolution/index.html b/content/docs/0.12.1/schema_evolution/index.html index a56c23632c305..1c5683d7fc1c0 100644 --- a/content/docs/0.12.1/schema_evolution/index.html +++ b/content/docs/0.12.1/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/snapshot_exporter/index.html b/content/docs/0.12.1/snapshot_exporter/index.html index 5d90571850a42..71b39d26b67e6 100644 --- a/content/docs/0.12.1/snapshot_exporter/index.html +++ b/content/docs/0.12.1/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/structure/index.html b/content/docs/0.12.1/structure/index.html index 0831642555e06..903fded77feac 100644 --- a/content/docs/0.12.1/structure/index.html +++ b/content/docs/0.12.1/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/syncing_aws_glue_data_catalog/index.html b/content/docs/0.12.1/syncing_aws_glue_data_catalog/index.html index 9b375520963fa..4febedcddd17e 100644 --- a/content/docs/0.12.1/syncing_aws_glue_data_catalog/index.html +++ b/content/docs/0.12.1/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/syncing_datahub/index.html b/content/docs/0.12.1/syncing_datahub/index.html index b92d37ce62bb6..1b6813e4ef751 100644 --- a/content/docs/0.12.1/syncing_datahub/index.html +++ b/content/docs/0.12.1/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/syncing_metastore/index.html b/content/docs/0.12.1/syncing_metastore/index.html index 484dcebc0dbe9..2f9f3036c866e 100644 --- a/content/docs/0.12.1/syncing_metastore/index.html +++ b/content/docs/0.12.1/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/table_management/index.html b/content/docs/0.12.1/table_management/index.html index 30d5c19968acb..b49619db00da7 100644 --- a/content/docs/0.12.1/table_management/index.html +++ b/content/docs/0.12.1/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/table_types/index.html b/content/docs/0.12.1/table_types/index.html index 5b9b75f849b97..346778fdd8bf2 100644 --- a/content/docs/0.12.1/table_types/index.html +++ b/content/docs/0.12.1/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/timeline/index.html b/content/docs/0.12.1/timeline/index.html index 7f41c3b08f54d..6dbf374901c7d 100644 --- a/content/docs/0.12.1/timeline/index.html +++ b/content/docs/0.12.1/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/transforms/index.html b/content/docs/0.12.1/transforms/index.html index 897b84d3b730e..0aa9a8ed37576 100644 --- a/content/docs/0.12.1/transforms/index.html +++ b/content/docs/0.12.1/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/troubleshooting/index.html b/content/docs/0.12.1/troubleshooting/index.html index e9833bd423081..fd6ac5ddac6b6 100644 --- a/content/docs/0.12.1/troubleshooting/index.html +++ b/content/docs/0.12.1/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/tuning-guide/index.html b/content/docs/0.12.1/tuning-guide/index.html index 53f7c102deb8b..3ed41cd0ae73d 100644 --- a/content/docs/0.12.1/tuning-guide/index.html +++ b/content/docs/0.12.1/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/use_cases/index.html b/content/docs/0.12.1/use_cases/index.html index 22da84ad212b7..81551390cc980 100644 --- a/content/docs/0.12.1/use_cases/index.html +++ b/content/docs/0.12.1/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/write_operations/index.html b/content/docs/0.12.1/write_operations/index.html index 810f60e795909..82c970557ef00 100644 --- a/content/docs/0.12.1/write_operations/index.html +++ b/content/docs/0.12.1/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.1/writing_data/index.html b/content/docs/0.12.1/writing_data/index.html index cb67740dafe7e..efbd4da7fdd22 100644 --- a/content/docs/0.12.1/writing_data/index.html +++ b/content/docs/0.12.1/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/azure_hoodie/index.html b/content/docs/0.12.2/azure_hoodie/index.html index 0ae5a76c46f9d..a894dd5cf6f6a 100644 --- a/content/docs/0.12.2/azure_hoodie/index.html +++ b/content/docs/0.12.2/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/basic_configurations/index.html b/content/docs/0.12.2/basic_configurations/index.html index 92f6f4e4147d2..ed83b1b08194b 100644 --- a/content/docs/0.12.2/basic_configurations/index.html +++ b/content/docs/0.12.2/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/bos_hoodie/index.html b/content/docs/0.12.2/bos_hoodie/index.html index 54cfb3d1a5ede..940155c89669b 100644 --- a/content/docs/0.12.2/bos_hoodie/index.html +++ b/content/docs/0.12.2/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/cli/index.html b/content/docs/0.12.2/cli/index.html index 5d4bfe02952c5..fbdad1c64a0d1 100644 --- a/content/docs/0.12.2/cli/index.html +++ b/content/docs/0.12.2/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/cloud/index.html b/content/docs/0.12.2/cloud/index.html index 4a39a5ea06162..ab98d52cd1299 100644 --- a/content/docs/0.12.2/cloud/index.html +++ b/content/docs/0.12.2/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/clustering/index.html b/content/docs/0.12.2/clustering/index.html index 8157595aa3c41..a91d223219548 100644 --- a/content/docs/0.12.2/clustering/index.html +++ b/content/docs/0.12.2/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/compaction/index.html b/content/docs/0.12.2/compaction/index.html index c331d208473f7..6e7465f73e8d8 100644 --- a/content/docs/0.12.2/compaction/index.html +++ b/content/docs/0.12.2/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/comparison/index.html b/content/docs/0.12.2/comparison/index.html index b33bd15db002d..90fc01e208c29 100644 --- a/content/docs/0.12.2/comparison/index.html +++ b/content/docs/0.12.2/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/concepts/index.html b/content/docs/0.12.2/concepts/index.html index 5646fdf31ee9b..4c5e83a1379ad 100644 --- a/content/docs/0.12.2/concepts/index.html +++ b/content/docs/0.12.2/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/concurrency_control/index.html b/content/docs/0.12.2/concurrency_control/index.html index 97ca79372f231..b8833ff6d194f 100644 --- a/content/docs/0.12.2/concurrency_control/index.html +++ b/content/docs/0.12.2/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/configurations/index.html b/content/docs/0.12.2/configurations/index.html index 56446da2cf873..049a3807d5efc 100644 --- a/content/docs/0.12.2/configurations/index.html +++ b/content/docs/0.12.2/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/cos_hoodie/index.html b/content/docs/0.12.2/cos_hoodie/index.html index 08fb430b28e07..4a939bbd82330 100644 --- a/content/docs/0.12.2/cos_hoodie/index.html +++ b/content/docs/0.12.2/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/deployment/index.html b/content/docs/0.12.2/deployment/index.html index c1ce11378efb0..8343985544b0b 100644 --- a/content/docs/0.12.2/deployment/index.html +++ b/content/docs/0.12.2/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/disaster_recovery/index.html b/content/docs/0.12.2/disaster_recovery/index.html index 5302d00e66aea..726116e21e9fe 100644 --- a/content/docs/0.12.2/disaster_recovery/index.html +++ b/content/docs/0.12.2/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/docker_demo/index.html b/content/docs/0.12.2/docker_demo/index.html index bfe396d619541..5973e998b303c 100644 --- a/content/docs/0.12.2/docker_demo/index.html +++ b/content/docs/0.12.2/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/encryption/index.html b/content/docs/0.12.2/encryption/index.html index 77431ee6ac9af..f7d4d42367da2 100644 --- a/content/docs/0.12.2/encryption/index.html +++ b/content/docs/0.12.2/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/faq/index.html b/content/docs/0.12.2/faq/index.html index ab3cef1d44924..a152ba3300154 100644 --- a/content/docs/0.12.2/faq/index.html +++ b/content/docs/0.12.2/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/file_layouts/index.html b/content/docs/0.12.2/file_layouts/index.html index 53076af01b501..c13c403bcfa21 100644 --- a/content/docs/0.12.2/file_layouts/index.html +++ b/content/docs/0.12.2/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/file_sizing/index.html b/content/docs/0.12.2/file_sizing/index.html index d63996078a15a..8b62fb102f7ea 100644 --- a/content/docs/0.12.2/file_sizing/index.html +++ b/content/docs/0.12.2/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/flink-quick-start-guide/index.html b/content/docs/0.12.2/flink-quick-start-guide/index.html index dfc610576a094..d592ec9fb9fde 100644 --- a/content/docs/0.12.2/flink-quick-start-guide/index.html +++ b/content/docs/0.12.2/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/flink_configuration/index.html b/content/docs/0.12.2/flink_configuration/index.html index aa6d1354f0cd5..dd29ffeda8b45 100644 --- a/content/docs/0.12.2/flink_configuration/index.html +++ b/content/docs/0.12.2/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/gcp_bigquery/index.html b/content/docs/0.12.2/gcp_bigquery/index.html index 2dddf1ada409b..64fa6de4cfd66 100644 --- a/content/docs/0.12.2/gcp_bigquery/index.html +++ b/content/docs/0.12.2/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/gcs_hoodie/index.html b/content/docs/0.12.2/gcs_hoodie/index.html index 36a2b96ff04bc..ebfd16a920266 100644 --- a/content/docs/0.12.2/gcs_hoodie/index.html +++ b/content/docs/0.12.2/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/hoodie_cleaner/index.html b/content/docs/0.12.2/hoodie_cleaner/index.html index 08030fd7e1a3b..0d3389e9b1413 100644 --- a/content/docs/0.12.2/hoodie_cleaner/index.html +++ b/content/docs/0.12.2/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/hoodie_deltastreamer/index.html b/content/docs/0.12.2/hoodie_deltastreamer/index.html index 57468612cb414..892038b4c5071 100644 --- a/content/docs/0.12.2/hoodie_deltastreamer/index.html +++ b/content/docs/0.12.2/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/ibm_cos_hoodie/index.html b/content/docs/0.12.2/ibm_cos_hoodie/index.html index a1344fdc77c41..b429191049496 100644 --- a/content/docs/0.12.2/ibm_cos_hoodie/index.html +++ b/content/docs/0.12.2/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/indexing/index.html b/content/docs/0.12.2/indexing/index.html index 77678f8bf426e..bcada9b7ac3de 100644 --- a/content/docs/0.12.2/indexing/index.html +++ b/content/docs/0.12.2/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/jfs_hoodie/index.html b/content/docs/0.12.2/jfs_hoodie/index.html index 230ac4021d5a2..2b745f9f60379 100644 --- a/content/docs/0.12.2/jfs_hoodie/index.html +++ b/content/docs/0.12.2/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/key_generation/index.html b/content/docs/0.12.2/key_generation/index.html index b82f285e406be..5c99d02588037 100644 --- a/content/docs/0.12.2/key_generation/index.html +++ b/content/docs/0.12.2/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/markers/index.html b/content/docs/0.12.2/markers/index.html index cbacd50687487..cf3e3d99e5cf7 100644 --- a/content/docs/0.12.2/markers/index.html +++ b/content/docs/0.12.2/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/metadata/index.html b/content/docs/0.12.2/metadata/index.html index dbe9e5273e14d..3f13c82a889d0 100644 --- a/content/docs/0.12.2/metadata/index.html +++ b/content/docs/0.12.2/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/metadata_indexing/index.html b/content/docs/0.12.2/metadata_indexing/index.html index 9c75233249b9c..755d800033225 100644 --- a/content/docs/0.12.2/metadata_indexing/index.html +++ b/content/docs/0.12.2/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/metrics/index.html b/content/docs/0.12.2/metrics/index.html index 32490b3a074e2..2cc1d506ec6e2 100644 --- a/content/docs/0.12.2/metrics/index.html +++ b/content/docs/0.12.2/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/migration_guide/index.html b/content/docs/0.12.2/migration_guide/index.html index 55a496af63e76..b12af96c51ee8 100644 --- a/content/docs/0.12.2/migration_guide/index.html +++ b/content/docs/0.12.2/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/oci_hoodie/index.html b/content/docs/0.12.2/oci_hoodie/index.html index 260513cfbb19c..491923a654120 100644 --- a/content/docs/0.12.2/oci_hoodie/index.html +++ b/content/docs/0.12.2/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/oss_hoodie/index.html b/content/docs/0.12.2/oss_hoodie/index.html index 6e87c23d93cc9..1b80db926a140 100644 --- a/content/docs/0.12.2/oss_hoodie/index.html +++ b/content/docs/0.12.2/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/overview/index.html b/content/docs/0.12.2/overview/index.html index 27f86acb56a3c..9fcd4ca10ae76 100644 --- a/content/docs/0.12.2/overview/index.html +++ b/content/docs/0.12.2/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/performance/index.html b/content/docs/0.12.2/performance/index.html index 1602ae3ad3adb..bebc2f64bb7ce 100644 --- a/content/docs/0.12.2/performance/index.html +++ b/content/docs/0.12.2/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/precommit_validator/index.html b/content/docs/0.12.2/precommit_validator/index.html index 018487e9db44c..1f5d790b88a3c 100644 --- a/content/docs/0.12.2/precommit_validator/index.html +++ b/content/docs/0.12.2/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/privacy/index.html b/content/docs/0.12.2/privacy/index.html index 47d11916573f3..def92fadf8b07 100644 --- a/content/docs/0.12.2/privacy/index.html +++ b/content/docs/0.12.2/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/procedures/index.html b/content/docs/0.12.2/procedures/index.html index f7d0e5336af9b..7d687894bf15f 100644 --- a/content/docs/0.12.2/procedures/index.html +++ b/content/docs/0.12.2/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/query_engine_setup/index.html b/content/docs/0.12.2/query_engine_setup/index.html index c368f0ec71f90..cb1ed10b8f175 100644 --- a/content/docs/0.12.2/query_engine_setup/index.html +++ b/content/docs/0.12.2/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/querying_data/index.html b/content/docs/0.12.2/querying_data/index.html index 09f66f847ede9..88c485e555b40 100644 --- a/content/docs/0.12.2/querying_data/index.html +++ b/content/docs/0.12.2/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/quick-start-guide/index.html b/content/docs/0.12.2/quick-start-guide/index.html index 6e4799caf9d6a..0cc0409c3e563 100644 --- a/content/docs/0.12.2/quick-start-guide/index.html +++ b/content/docs/0.12.2/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/s3_hoodie/index.html b/content/docs/0.12.2/s3_hoodie/index.html index db09568c261ab..2dd15d48c6ba8 100644 --- a/content/docs/0.12.2/s3_hoodie/index.html +++ b/content/docs/0.12.2/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/schema_evolution/index.html b/content/docs/0.12.2/schema_evolution/index.html index 109558b3d1e93..d996e25f94fda 100644 --- a/content/docs/0.12.2/schema_evolution/index.html +++ b/content/docs/0.12.2/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/snapshot_exporter/index.html b/content/docs/0.12.2/snapshot_exporter/index.html index a0dc8467ed0a5..cad8c3973dd71 100644 --- a/content/docs/0.12.2/snapshot_exporter/index.html +++ b/content/docs/0.12.2/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/structure/index.html b/content/docs/0.12.2/structure/index.html index e9e4469b0852a..07ccfc5387263 100644 --- a/content/docs/0.12.2/structure/index.html +++ b/content/docs/0.12.2/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/syncing_aws_glue_data_catalog/index.html b/content/docs/0.12.2/syncing_aws_glue_data_catalog/index.html index d8d4e2b1bf7cc..fa2918c5f921f 100644 --- a/content/docs/0.12.2/syncing_aws_glue_data_catalog/index.html +++ b/content/docs/0.12.2/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/syncing_datahub/index.html b/content/docs/0.12.2/syncing_datahub/index.html index 58d4d44116b6a..f12068f647c5f 100644 --- a/content/docs/0.12.2/syncing_datahub/index.html +++ b/content/docs/0.12.2/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/syncing_metastore/index.html b/content/docs/0.12.2/syncing_metastore/index.html index ab1f162b8eeae..a9c0ce24a4b37 100644 --- a/content/docs/0.12.2/syncing_metastore/index.html +++ b/content/docs/0.12.2/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/table_management/index.html b/content/docs/0.12.2/table_management/index.html index 2ca44c147810e..671698be70626 100644 --- a/content/docs/0.12.2/table_management/index.html +++ b/content/docs/0.12.2/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/table_types/index.html b/content/docs/0.12.2/table_types/index.html index d6154862e40e9..d986238f632e8 100644 --- a/content/docs/0.12.2/table_types/index.html +++ b/content/docs/0.12.2/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/timeline/index.html b/content/docs/0.12.2/timeline/index.html index e225ec8d224d2..ac6c76de6c9b0 100644 --- a/content/docs/0.12.2/timeline/index.html +++ b/content/docs/0.12.2/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/transforms/index.html b/content/docs/0.12.2/transforms/index.html index 4a48be4861131..6d4a254086dce 100644 --- a/content/docs/0.12.2/transforms/index.html +++ b/content/docs/0.12.2/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/troubleshooting/index.html b/content/docs/0.12.2/troubleshooting/index.html index 15231c9c09654..fb417d172983f 100644 --- a/content/docs/0.12.2/troubleshooting/index.html +++ b/content/docs/0.12.2/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/tuning-guide/index.html b/content/docs/0.12.2/tuning-guide/index.html index 61000fb8e2eb0..174b9d4e1f638 100644 --- a/content/docs/0.12.2/tuning-guide/index.html +++ b/content/docs/0.12.2/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/use_cases/index.html b/content/docs/0.12.2/use_cases/index.html index c4165b62a4b7b..5109f769a503a 100644 --- a/content/docs/0.12.2/use_cases/index.html +++ b/content/docs/0.12.2/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/write_operations/index.html b/content/docs/0.12.2/write_operations/index.html index bdad3b2c43b1b..0055b5b201b7f 100644 --- a/content/docs/0.12.2/write_operations/index.html +++ b/content/docs/0.12.2/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.2/writing_data/index.html b/content/docs/0.12.2/writing_data/index.html index bf02fe0a89e28..09c95c4e3ef8d 100644 --- a/content/docs/0.12.2/writing_data/index.html +++ b/content/docs/0.12.2/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/azure_hoodie/index.html b/content/docs/0.12.3/azure_hoodie/index.html index b7422fe470ae8..58dcb59647ec3 100644 --- a/content/docs/0.12.3/azure_hoodie/index.html +++ b/content/docs/0.12.3/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/basic_configurations/index.html b/content/docs/0.12.3/basic_configurations/index.html index 4c6caa84808ea..4c6a8ccdbe5e6 100644 --- a/content/docs/0.12.3/basic_configurations/index.html +++ b/content/docs/0.12.3/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/bos_hoodie/index.html b/content/docs/0.12.3/bos_hoodie/index.html index 9daacb5c2d14c..8c7f65672132c 100644 --- a/content/docs/0.12.3/bos_hoodie/index.html +++ b/content/docs/0.12.3/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/cli/index.html b/content/docs/0.12.3/cli/index.html index dd6053d51e72e..724f86b1e9b55 100644 --- a/content/docs/0.12.3/cli/index.html +++ b/content/docs/0.12.3/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/cloud/index.html b/content/docs/0.12.3/cloud/index.html index 5a61f686b0e69..20087523e780c 100644 --- a/content/docs/0.12.3/cloud/index.html +++ b/content/docs/0.12.3/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/clustering/index.html b/content/docs/0.12.3/clustering/index.html index ff258b0953ddf..fd7ca4a5e8033 100644 --- a/content/docs/0.12.3/clustering/index.html +++ b/content/docs/0.12.3/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/compaction/index.html b/content/docs/0.12.3/compaction/index.html index be55360b68479..4dc71dc17dff4 100644 --- a/content/docs/0.12.3/compaction/index.html +++ b/content/docs/0.12.3/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/comparison/index.html b/content/docs/0.12.3/comparison/index.html index c3adb5bdc03e2..5b08ea20e0165 100644 --- a/content/docs/0.12.3/comparison/index.html +++ b/content/docs/0.12.3/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/concepts/index.html b/content/docs/0.12.3/concepts/index.html index 2a9ac01757218..61f5fcdf7d9f8 100644 --- a/content/docs/0.12.3/concepts/index.html +++ b/content/docs/0.12.3/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/concurrency_control/index.html b/content/docs/0.12.3/concurrency_control/index.html index 5bedb88f4eebb..3ee76c1ef5c3e 100644 --- a/content/docs/0.12.3/concurrency_control/index.html +++ b/content/docs/0.12.3/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/configurations/index.html b/content/docs/0.12.3/configurations/index.html index bfceb880dbc26..af437b62c4f6a 100644 --- a/content/docs/0.12.3/configurations/index.html +++ b/content/docs/0.12.3/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/cos_hoodie/index.html b/content/docs/0.12.3/cos_hoodie/index.html index 589168a225848..f029eae37c15b 100644 --- a/content/docs/0.12.3/cos_hoodie/index.html +++ b/content/docs/0.12.3/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/deployment/index.html b/content/docs/0.12.3/deployment/index.html index a3aee79257237..508ef33694b1a 100644 --- a/content/docs/0.12.3/deployment/index.html +++ b/content/docs/0.12.3/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/disaster_recovery/index.html b/content/docs/0.12.3/disaster_recovery/index.html index f26ad1ae235d8..9414be6a9f106 100644 --- a/content/docs/0.12.3/disaster_recovery/index.html +++ b/content/docs/0.12.3/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/docker_demo/index.html b/content/docs/0.12.3/docker_demo/index.html index 8fcf488342efd..68246b3a481a4 100644 --- a/content/docs/0.12.3/docker_demo/index.html +++ b/content/docs/0.12.3/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/encryption/index.html b/content/docs/0.12.3/encryption/index.html index d5ba8648e16e4..0e7d1ca49395e 100644 --- a/content/docs/0.12.3/encryption/index.html +++ b/content/docs/0.12.3/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/faq/index.html b/content/docs/0.12.3/faq/index.html index a0838f0a17899..b7963dfde6c07 100644 --- a/content/docs/0.12.3/faq/index.html +++ b/content/docs/0.12.3/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/file_layouts/index.html b/content/docs/0.12.3/file_layouts/index.html index 25562a2ecd427..5a8ac5a91076c 100644 --- a/content/docs/0.12.3/file_layouts/index.html +++ b/content/docs/0.12.3/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/file_sizing/index.html b/content/docs/0.12.3/file_sizing/index.html index 6ed2434a6c517..007031aaed5e9 100644 --- a/content/docs/0.12.3/file_sizing/index.html +++ b/content/docs/0.12.3/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/flink-quick-start-guide/index.html b/content/docs/0.12.3/flink-quick-start-guide/index.html index 9d2761239a475..faf1bb61024cc 100644 --- a/content/docs/0.12.3/flink-quick-start-guide/index.html +++ b/content/docs/0.12.3/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/flink_configuration/index.html b/content/docs/0.12.3/flink_configuration/index.html index 5ec9a187c88f6..150faf2033027 100644 --- a/content/docs/0.12.3/flink_configuration/index.html +++ b/content/docs/0.12.3/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/gcp_bigquery/index.html b/content/docs/0.12.3/gcp_bigquery/index.html index 95c16025eada2..8a762e8b09c87 100644 --- a/content/docs/0.12.3/gcp_bigquery/index.html +++ b/content/docs/0.12.3/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/gcs_hoodie/index.html b/content/docs/0.12.3/gcs_hoodie/index.html index 290905a25e9e7..d2c147be55dc6 100644 --- a/content/docs/0.12.3/gcs_hoodie/index.html +++ b/content/docs/0.12.3/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/hoodie_cleaner/index.html b/content/docs/0.12.3/hoodie_cleaner/index.html index c250d335604fa..28db9089d1d01 100644 --- a/content/docs/0.12.3/hoodie_cleaner/index.html +++ b/content/docs/0.12.3/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/hoodie_deltastreamer/index.html b/content/docs/0.12.3/hoodie_deltastreamer/index.html index 6244eea7536da..53f3e40c6c3aa 100644 --- a/content/docs/0.12.3/hoodie_deltastreamer/index.html +++ b/content/docs/0.12.3/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/ibm_cos_hoodie/index.html b/content/docs/0.12.3/ibm_cos_hoodie/index.html index 831934c5b735b..360c2170ecf4b 100644 --- a/content/docs/0.12.3/ibm_cos_hoodie/index.html +++ b/content/docs/0.12.3/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/indexing/index.html b/content/docs/0.12.3/indexing/index.html index 9e1163feeb074..ae98de6b413ac 100644 --- a/content/docs/0.12.3/indexing/index.html +++ b/content/docs/0.12.3/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/jfs_hoodie/index.html b/content/docs/0.12.3/jfs_hoodie/index.html index 39ce525babf5b..4b53320b9c2e2 100644 --- a/content/docs/0.12.3/jfs_hoodie/index.html +++ b/content/docs/0.12.3/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/key_generation/index.html b/content/docs/0.12.3/key_generation/index.html index 63bc04c981441..12c2678a2c9ae 100644 --- a/content/docs/0.12.3/key_generation/index.html +++ b/content/docs/0.12.3/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/markers/index.html b/content/docs/0.12.3/markers/index.html index 676010003f2ab..e99cbbd5245bd 100644 --- a/content/docs/0.12.3/markers/index.html +++ b/content/docs/0.12.3/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/metadata/index.html b/content/docs/0.12.3/metadata/index.html index 5093a8023ebb3..a2498cc3dee9b 100644 --- a/content/docs/0.12.3/metadata/index.html +++ b/content/docs/0.12.3/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/metadata_indexing/index.html b/content/docs/0.12.3/metadata_indexing/index.html index d3dadf42ad81b..a162fb2d00c06 100644 --- a/content/docs/0.12.3/metadata_indexing/index.html +++ b/content/docs/0.12.3/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/metrics/index.html b/content/docs/0.12.3/metrics/index.html index 0f355c137d3cb..0b236ca6e5b50 100644 --- a/content/docs/0.12.3/metrics/index.html +++ b/content/docs/0.12.3/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/migration_guide/index.html b/content/docs/0.12.3/migration_guide/index.html index c61a420932a14..691b6d2a63409 100644 --- a/content/docs/0.12.3/migration_guide/index.html +++ b/content/docs/0.12.3/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/oci_hoodie/index.html b/content/docs/0.12.3/oci_hoodie/index.html index 3695bf3257a09..4efdfc97aa8ee 100644 --- a/content/docs/0.12.3/oci_hoodie/index.html +++ b/content/docs/0.12.3/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/oss_hoodie/index.html b/content/docs/0.12.3/oss_hoodie/index.html index a4a5d2502271f..c25887281fc2d 100644 --- a/content/docs/0.12.3/oss_hoodie/index.html +++ b/content/docs/0.12.3/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/overview/index.html b/content/docs/0.12.3/overview/index.html index a6b41ef440c14..636abc4d9c89d 100644 --- a/content/docs/0.12.3/overview/index.html +++ b/content/docs/0.12.3/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/performance/index.html b/content/docs/0.12.3/performance/index.html index b3f5191242d41..42e60a17d7bae 100644 --- a/content/docs/0.12.3/performance/index.html +++ b/content/docs/0.12.3/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/precommit_validator/index.html b/content/docs/0.12.3/precommit_validator/index.html index 84de82c3fee8e..8e7c9bc280b87 100644 --- a/content/docs/0.12.3/precommit_validator/index.html +++ b/content/docs/0.12.3/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/privacy/index.html b/content/docs/0.12.3/privacy/index.html index badbe525f17b9..c696bc17d8ace 100644 --- a/content/docs/0.12.3/privacy/index.html +++ b/content/docs/0.12.3/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/procedures/index.html b/content/docs/0.12.3/procedures/index.html index 09c4d56f51cb4..27ada50ee754b 100644 --- a/content/docs/0.12.3/procedures/index.html +++ b/content/docs/0.12.3/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/query_engine_setup/index.html b/content/docs/0.12.3/query_engine_setup/index.html index 541dafe8c6d76..988d78ba758e8 100644 --- a/content/docs/0.12.3/query_engine_setup/index.html +++ b/content/docs/0.12.3/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/querying_data/index.html b/content/docs/0.12.3/querying_data/index.html index 31ad793f78515..1ddc818c90b4d 100644 --- a/content/docs/0.12.3/querying_data/index.html +++ b/content/docs/0.12.3/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/quick-start-guide/index.html b/content/docs/0.12.3/quick-start-guide/index.html index 1d155a2e09e88..d78c11a0b1c51 100644 --- a/content/docs/0.12.3/quick-start-guide/index.html +++ b/content/docs/0.12.3/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/s3_hoodie/index.html b/content/docs/0.12.3/s3_hoodie/index.html index 365ba450eff5b..a500f7d906bf0 100644 --- a/content/docs/0.12.3/s3_hoodie/index.html +++ b/content/docs/0.12.3/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/schema_evolution/index.html b/content/docs/0.12.3/schema_evolution/index.html index 4ec4a47b9a949..c8cf2a2024084 100644 --- a/content/docs/0.12.3/schema_evolution/index.html +++ b/content/docs/0.12.3/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/snapshot_exporter/index.html b/content/docs/0.12.3/snapshot_exporter/index.html index 06e060db7dd2d..4be40db504c12 100644 --- a/content/docs/0.12.3/snapshot_exporter/index.html +++ b/content/docs/0.12.3/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/structure/index.html b/content/docs/0.12.3/structure/index.html index b5a7ae4844056..3ae493c46200d 100644 --- a/content/docs/0.12.3/structure/index.html +++ b/content/docs/0.12.3/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/syncing_aws_glue_data_catalog/index.html b/content/docs/0.12.3/syncing_aws_glue_data_catalog/index.html index 02522fcea259f..8820a8b72785c 100644 --- a/content/docs/0.12.3/syncing_aws_glue_data_catalog/index.html +++ b/content/docs/0.12.3/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/syncing_datahub/index.html b/content/docs/0.12.3/syncing_datahub/index.html index eee1779782aec..f4fcbd5f32cb8 100644 --- a/content/docs/0.12.3/syncing_datahub/index.html +++ b/content/docs/0.12.3/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/syncing_metastore/index.html b/content/docs/0.12.3/syncing_metastore/index.html index 92be796a0fafc..953b3f6d3f560 100644 --- a/content/docs/0.12.3/syncing_metastore/index.html +++ b/content/docs/0.12.3/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/table_management/index.html b/content/docs/0.12.3/table_management/index.html index e969005139773..79a204d666c53 100644 --- a/content/docs/0.12.3/table_management/index.html +++ b/content/docs/0.12.3/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/table_types/index.html b/content/docs/0.12.3/table_types/index.html index 8ac45c98ef3dc..65cd2d21a8292 100644 --- a/content/docs/0.12.3/table_types/index.html +++ b/content/docs/0.12.3/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/timeline/index.html b/content/docs/0.12.3/timeline/index.html index a25333686e78e..5eb8f19fd06f2 100644 --- a/content/docs/0.12.3/timeline/index.html +++ b/content/docs/0.12.3/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/transforms/index.html b/content/docs/0.12.3/transforms/index.html index 478ad9db99ecd..f4362cbd65cbf 100644 --- a/content/docs/0.12.3/transforms/index.html +++ b/content/docs/0.12.3/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/troubleshooting/index.html b/content/docs/0.12.3/troubleshooting/index.html index cca22edbb3cca..9c0178bcd9c88 100644 --- a/content/docs/0.12.3/troubleshooting/index.html +++ b/content/docs/0.12.3/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/tuning-guide/index.html b/content/docs/0.12.3/tuning-guide/index.html index 5d42d8b1b5804..600f210a968c3 100644 --- a/content/docs/0.12.3/tuning-guide/index.html +++ b/content/docs/0.12.3/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/use_cases/index.html b/content/docs/0.12.3/use_cases/index.html index aa9827ca65632..5df999523f9df 100644 --- a/content/docs/0.12.3/use_cases/index.html +++ b/content/docs/0.12.3/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/write_operations/index.html b/content/docs/0.12.3/write_operations/index.html index 6be64b7da283d..f9c9231b6d11a 100644 --- a/content/docs/0.12.3/write_operations/index.html +++ b/content/docs/0.12.3/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.12.3/writing_data/index.html b/content/docs/0.12.3/writing_data/index.html index edc2b184cfba6..3f31343afb3ca 100644 --- a/content/docs/0.12.3/writing_data/index.html +++ b/content/docs/0.12.3/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/azure_hoodie/index.html b/content/docs/0.13.0/azure_hoodie/index.html index 39d7cb146826c..e618915da803e 100644 --- a/content/docs/0.13.0/azure_hoodie/index.html +++ b/content/docs/0.13.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/basic_configurations/index.html b/content/docs/0.13.0/basic_configurations/index.html index 67d7729aaf89c..29ffded36b70c 100644 --- a/content/docs/0.13.0/basic_configurations/index.html +++ b/content/docs/0.13.0/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/bos_hoodie/index.html b/content/docs/0.13.0/bos_hoodie/index.html index f3934c8065797..60ddfb929cd28 100644 --- a/content/docs/0.13.0/bos_hoodie/index.html +++ b/content/docs/0.13.0/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/cli/index.html b/content/docs/0.13.0/cli/index.html index f94d5088f61c5..6532b1f5dec18 100644 --- a/content/docs/0.13.0/cli/index.html +++ b/content/docs/0.13.0/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/cloud/index.html b/content/docs/0.13.0/cloud/index.html index 185e73adc3fda..9996887a81534 100644 --- a/content/docs/0.13.0/cloud/index.html +++ b/content/docs/0.13.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/clustering/index.html b/content/docs/0.13.0/clustering/index.html index 93dc537f9061e..5204f9b2fa6f4 100644 --- a/content/docs/0.13.0/clustering/index.html +++ b/content/docs/0.13.0/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/compaction/index.html b/content/docs/0.13.0/compaction/index.html index ecc259806fac2..519aea5e1b721 100644 --- a/content/docs/0.13.0/compaction/index.html +++ b/content/docs/0.13.0/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/comparison/index.html b/content/docs/0.13.0/comparison/index.html index 8a108cdf5b1f5..bf614c4e71ed1 100644 --- a/content/docs/0.13.0/comparison/index.html +++ b/content/docs/0.13.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/concepts/index.html b/content/docs/0.13.0/concepts/index.html index e2a839cb63983..bd05f57dd9420 100644 --- a/content/docs/0.13.0/concepts/index.html +++ b/content/docs/0.13.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/concurrency_control/index.html b/content/docs/0.13.0/concurrency_control/index.html index 66cfe18069096..372f893bf66f9 100644 --- a/content/docs/0.13.0/concurrency_control/index.html +++ b/content/docs/0.13.0/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/configurations/index.html b/content/docs/0.13.0/configurations/index.html index e5459390d334f..8529d2a064aff 100644 --- a/content/docs/0.13.0/configurations/index.html +++ b/content/docs/0.13.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/cos_hoodie/index.html b/content/docs/0.13.0/cos_hoodie/index.html index 04c00880519d1..3defd378eb7fd 100644 --- a/content/docs/0.13.0/cos_hoodie/index.html +++ b/content/docs/0.13.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/deployment/index.html b/content/docs/0.13.0/deployment/index.html index 07574489a9554..b1cdceb64b8da 100644 --- a/content/docs/0.13.0/deployment/index.html +++ b/content/docs/0.13.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/disaster_recovery/index.html b/content/docs/0.13.0/disaster_recovery/index.html index 5892486d3f3ff..691c7ea84d7e8 100644 --- a/content/docs/0.13.0/disaster_recovery/index.html +++ b/content/docs/0.13.0/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/docker_demo/index.html b/content/docs/0.13.0/docker_demo/index.html index cb1b85ed699a1..e8229b71f0384 100644 --- a/content/docs/0.13.0/docker_demo/index.html +++ b/content/docs/0.13.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/encryption/index.html b/content/docs/0.13.0/encryption/index.html index 061421a563ae4..24d82541e7b06 100644 --- a/content/docs/0.13.0/encryption/index.html +++ b/content/docs/0.13.0/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/faq/index.html b/content/docs/0.13.0/faq/index.html index bfb8e2857e654..17cfecb10b906 100644 --- a/content/docs/0.13.0/faq/index.html +++ b/content/docs/0.13.0/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/file_layouts/index.html b/content/docs/0.13.0/file_layouts/index.html index b46180e7c0f97..8c820dd861b4a 100644 --- a/content/docs/0.13.0/file_layouts/index.html +++ b/content/docs/0.13.0/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/file_sizing/index.html b/content/docs/0.13.0/file_sizing/index.html index 2114d78a4a90c..e4ef4f063c9d2 100644 --- a/content/docs/0.13.0/file_sizing/index.html +++ b/content/docs/0.13.0/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/flink-quick-start-guide/index.html b/content/docs/0.13.0/flink-quick-start-guide/index.html index 9290daf294012..c129f52cc6276 100644 --- a/content/docs/0.13.0/flink-quick-start-guide/index.html +++ b/content/docs/0.13.0/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/flink_configuration/index.html b/content/docs/0.13.0/flink_configuration/index.html index 71a4e477eb788..cf5a7b50db3c5 100644 --- a/content/docs/0.13.0/flink_configuration/index.html +++ b/content/docs/0.13.0/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/gcp_bigquery/index.html b/content/docs/0.13.0/gcp_bigquery/index.html index a91ef8932be17..1664d17feb1de 100644 --- a/content/docs/0.13.0/gcp_bigquery/index.html +++ b/content/docs/0.13.0/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/gcs_hoodie/index.html b/content/docs/0.13.0/gcs_hoodie/index.html index 50cb128a422ed..a35ff04c13f3d 100644 --- a/content/docs/0.13.0/gcs_hoodie/index.html +++ b/content/docs/0.13.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/hoodie_cleaner/index.html b/content/docs/0.13.0/hoodie_cleaner/index.html index a408f2bcdc416..a8d925b662765 100644 --- a/content/docs/0.13.0/hoodie_cleaner/index.html +++ b/content/docs/0.13.0/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/hoodie_deltastreamer/index.html b/content/docs/0.13.0/hoodie_deltastreamer/index.html index 77ea60c3f0c02..90d140a23859a 100644 --- a/content/docs/0.13.0/hoodie_deltastreamer/index.html +++ b/content/docs/0.13.0/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/ibm_cos_hoodie/index.html b/content/docs/0.13.0/ibm_cos_hoodie/index.html index 123f598204e5a..0a04c64aeeec9 100644 --- a/content/docs/0.13.0/ibm_cos_hoodie/index.html +++ b/content/docs/0.13.0/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/indexing/index.html b/content/docs/0.13.0/indexing/index.html index bcb9a264b77a9..660d7cc93de71 100644 --- a/content/docs/0.13.0/indexing/index.html +++ b/content/docs/0.13.0/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/jfs_hoodie/index.html b/content/docs/0.13.0/jfs_hoodie/index.html index 079005327f909..19898daa4abfb 100644 --- a/content/docs/0.13.0/jfs_hoodie/index.html +++ b/content/docs/0.13.0/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/key_generation/index.html b/content/docs/0.13.0/key_generation/index.html index 31486a5769732..1ba8aeff99714 100644 --- a/content/docs/0.13.0/key_generation/index.html +++ b/content/docs/0.13.0/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/markers/index.html b/content/docs/0.13.0/markers/index.html index 785ca63678e82..e237614b33da5 100644 --- a/content/docs/0.13.0/markers/index.html +++ b/content/docs/0.13.0/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/metadata/index.html b/content/docs/0.13.0/metadata/index.html index d4b6807ef11d4..aa85b39c717bd 100644 --- a/content/docs/0.13.0/metadata/index.html +++ b/content/docs/0.13.0/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/metadata_indexing/index.html b/content/docs/0.13.0/metadata_indexing/index.html index 355013625fb9a..e093aca16a51b 100644 --- a/content/docs/0.13.0/metadata_indexing/index.html +++ b/content/docs/0.13.0/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/metrics/index.html b/content/docs/0.13.0/metrics/index.html index 1dc7721975b3f..3657a95622c70 100644 --- a/content/docs/0.13.0/metrics/index.html +++ b/content/docs/0.13.0/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/migration_guide/index.html b/content/docs/0.13.0/migration_guide/index.html index feb5174d110f6..fe455e8a8abd7 100644 --- a/content/docs/0.13.0/migration_guide/index.html +++ b/content/docs/0.13.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/oci_hoodie/index.html b/content/docs/0.13.0/oci_hoodie/index.html index a2ffc41d2090a..a9bc2132a18cf 100644 --- a/content/docs/0.13.0/oci_hoodie/index.html +++ b/content/docs/0.13.0/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/oss_hoodie/index.html b/content/docs/0.13.0/oss_hoodie/index.html index 68cfeb9b32898..c7a4b7339d2fa 100644 --- a/content/docs/0.13.0/oss_hoodie/index.html +++ b/content/docs/0.13.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/overview/index.html b/content/docs/0.13.0/overview/index.html index 5b56ef271df7c..df7852d1dd103 100644 --- a/content/docs/0.13.0/overview/index.html +++ b/content/docs/0.13.0/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/performance/index.html b/content/docs/0.13.0/performance/index.html index fb1a332475d1e..cdecc0db3f712 100644 --- a/content/docs/0.13.0/performance/index.html +++ b/content/docs/0.13.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/precommit_validator/index.html b/content/docs/0.13.0/precommit_validator/index.html index e0e9e3b6a083c..819b62de0f249 100644 --- a/content/docs/0.13.0/precommit_validator/index.html +++ b/content/docs/0.13.0/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/privacy/index.html b/content/docs/0.13.0/privacy/index.html index 028bae62bbb1e..60d36f193ffac 100644 --- a/content/docs/0.13.0/privacy/index.html +++ b/content/docs/0.13.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/procedures/index.html b/content/docs/0.13.0/procedures/index.html index 8636378a6bac2..460ca4076ad41 100644 --- a/content/docs/0.13.0/procedures/index.html +++ b/content/docs/0.13.0/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/query_engine_setup/index.html b/content/docs/0.13.0/query_engine_setup/index.html index 5a4c0523a367d..54cf69f359254 100644 --- a/content/docs/0.13.0/query_engine_setup/index.html +++ b/content/docs/0.13.0/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/querying_data/index.html b/content/docs/0.13.0/querying_data/index.html index 07eb50ada14b2..9a842e835d987 100644 --- a/content/docs/0.13.0/querying_data/index.html +++ b/content/docs/0.13.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/quick-start-guide/index.html b/content/docs/0.13.0/quick-start-guide/index.html index 82cb934408e57..de50d456493d2 100644 --- a/content/docs/0.13.0/quick-start-guide/index.html +++ b/content/docs/0.13.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/s3_hoodie/index.html b/content/docs/0.13.0/s3_hoodie/index.html index 9f4725fe84825..b1dffc49c9405 100644 --- a/content/docs/0.13.0/s3_hoodie/index.html +++ b/content/docs/0.13.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/schema_evolution/index.html b/content/docs/0.13.0/schema_evolution/index.html index ce53dcfa782a2..10feac39b2f2f 100644 --- a/content/docs/0.13.0/schema_evolution/index.html +++ b/content/docs/0.13.0/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/snapshot_exporter/index.html b/content/docs/0.13.0/snapshot_exporter/index.html index afae508bdf1a7..c8acf8fa6972e 100644 --- a/content/docs/0.13.0/snapshot_exporter/index.html +++ b/content/docs/0.13.0/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/structure/index.html b/content/docs/0.13.0/structure/index.html index 473c4a71a8e1a..02e1a68934d99 100644 --- a/content/docs/0.13.0/structure/index.html +++ b/content/docs/0.13.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/syncing_aws_glue_data_catalog/index.html b/content/docs/0.13.0/syncing_aws_glue_data_catalog/index.html index c59ffc140748e..ebb16a4d853e4 100644 --- a/content/docs/0.13.0/syncing_aws_glue_data_catalog/index.html +++ b/content/docs/0.13.0/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/syncing_datahub/index.html b/content/docs/0.13.0/syncing_datahub/index.html index af6667f15342e..bf45686f23dcd 100644 --- a/content/docs/0.13.0/syncing_datahub/index.html +++ b/content/docs/0.13.0/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/syncing_metastore/index.html b/content/docs/0.13.0/syncing_metastore/index.html index d2e9d47f2826e..ba788baa521b1 100644 --- a/content/docs/0.13.0/syncing_metastore/index.html +++ b/content/docs/0.13.0/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/table_management/index.html b/content/docs/0.13.0/table_management/index.html index c97c18cbafccf..61913798f70ce 100644 --- a/content/docs/0.13.0/table_management/index.html +++ b/content/docs/0.13.0/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/table_types/index.html b/content/docs/0.13.0/table_types/index.html index 14fe27b8c9ad3..d05c5bf49a87b 100644 --- a/content/docs/0.13.0/table_types/index.html +++ b/content/docs/0.13.0/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/timeline/index.html b/content/docs/0.13.0/timeline/index.html index c9bd74ae06a81..1f8295583c727 100644 --- a/content/docs/0.13.0/timeline/index.html +++ b/content/docs/0.13.0/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/transforms/index.html b/content/docs/0.13.0/transforms/index.html index b82884153c8de..359b895f258fd 100644 --- a/content/docs/0.13.0/transforms/index.html +++ b/content/docs/0.13.0/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/troubleshooting/index.html b/content/docs/0.13.0/troubleshooting/index.html index 6a6e68bd78ef1..602199b7b3616 100644 --- a/content/docs/0.13.0/troubleshooting/index.html +++ b/content/docs/0.13.0/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/tuning-guide/index.html b/content/docs/0.13.0/tuning-guide/index.html index c243a8d44d3af..1cbcaf1e5ae0e 100644 --- a/content/docs/0.13.0/tuning-guide/index.html +++ b/content/docs/0.13.0/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/use_cases/index.html b/content/docs/0.13.0/use_cases/index.html index 00aba07531732..df9c7153668ed 100644 --- a/content/docs/0.13.0/use_cases/index.html +++ b/content/docs/0.13.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/write_operations/index.html b/content/docs/0.13.0/write_operations/index.html index e4f57a5e5c215..b40d8694c263d 100644 --- a/content/docs/0.13.0/write_operations/index.html +++ b/content/docs/0.13.0/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.0/writing_data/index.html b/content/docs/0.13.0/writing_data/index.html index bf983ae1a067e..876a8a2f77f7c 100644 --- a/content/docs/0.13.0/writing_data/index.html +++ b/content/docs/0.13.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/azure_hoodie/index.html b/content/docs/0.13.1/azure_hoodie/index.html index b781b01a5ec8a..ad2cf764e7b24 100644 --- a/content/docs/0.13.1/azure_hoodie/index.html +++ b/content/docs/0.13.1/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/basic_configurations/index.html b/content/docs/0.13.1/basic_configurations/index.html index 02563e785fd96..bf9b2701b1e91 100644 --- a/content/docs/0.13.1/basic_configurations/index.html +++ b/content/docs/0.13.1/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/bos_hoodie/index.html b/content/docs/0.13.1/bos_hoodie/index.html index ee2089b0c099c..bdea11649423d 100644 --- a/content/docs/0.13.1/bos_hoodie/index.html +++ b/content/docs/0.13.1/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/cli/index.html b/content/docs/0.13.1/cli/index.html index ff79326cce6a4..eca0e017b1b6e 100644 --- a/content/docs/0.13.1/cli/index.html +++ b/content/docs/0.13.1/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/cloud/index.html b/content/docs/0.13.1/cloud/index.html index e2818f2559acf..962a20539c50e 100644 --- a/content/docs/0.13.1/cloud/index.html +++ b/content/docs/0.13.1/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/clustering/index.html b/content/docs/0.13.1/clustering/index.html index 873f833ec226c..ece90e4020a83 100644 --- a/content/docs/0.13.1/clustering/index.html +++ b/content/docs/0.13.1/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/compaction/index.html b/content/docs/0.13.1/compaction/index.html index c6cbd2763ae74..326cf99538746 100644 --- a/content/docs/0.13.1/compaction/index.html +++ b/content/docs/0.13.1/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/comparison/index.html b/content/docs/0.13.1/comparison/index.html index 90860ffb99167..cddcc5dcec33c 100644 --- a/content/docs/0.13.1/comparison/index.html +++ b/content/docs/0.13.1/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/concepts/index.html b/content/docs/0.13.1/concepts/index.html index 7b79cd71ec215..5eecbc4db3a70 100644 --- a/content/docs/0.13.1/concepts/index.html +++ b/content/docs/0.13.1/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/concurrency_control/index.html b/content/docs/0.13.1/concurrency_control/index.html index c878712f3826c..94f9fa2b5ea85 100644 --- a/content/docs/0.13.1/concurrency_control/index.html +++ b/content/docs/0.13.1/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/configurations/index.html b/content/docs/0.13.1/configurations/index.html index 7d7211e5285c8..309bede09c455 100644 --- a/content/docs/0.13.1/configurations/index.html +++ b/content/docs/0.13.1/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/cos_hoodie/index.html b/content/docs/0.13.1/cos_hoodie/index.html index 5fa1c28dcca0c..1256065c0c340 100644 --- a/content/docs/0.13.1/cos_hoodie/index.html +++ b/content/docs/0.13.1/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/deployment/index.html b/content/docs/0.13.1/deployment/index.html index 491268725e3d5..893ff487e57c2 100644 --- a/content/docs/0.13.1/deployment/index.html +++ b/content/docs/0.13.1/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/disaster_recovery/index.html b/content/docs/0.13.1/disaster_recovery/index.html index f4100fde00e2f..94101448ba039 100644 --- a/content/docs/0.13.1/disaster_recovery/index.html +++ b/content/docs/0.13.1/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/docker_demo/index.html b/content/docs/0.13.1/docker_demo/index.html index 4ce06c8181250..b50a463f26793 100644 --- a/content/docs/0.13.1/docker_demo/index.html +++ b/content/docs/0.13.1/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/encryption/index.html b/content/docs/0.13.1/encryption/index.html index ff9fcd2a23cc3..eda092a7308ac 100644 --- a/content/docs/0.13.1/encryption/index.html +++ b/content/docs/0.13.1/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/faq/index.html b/content/docs/0.13.1/faq/index.html index 7127f2584ccb0..006e00372a25d 100644 --- a/content/docs/0.13.1/faq/index.html +++ b/content/docs/0.13.1/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/file_layouts/index.html b/content/docs/0.13.1/file_layouts/index.html index 60055667d23fd..a558895c10736 100644 --- a/content/docs/0.13.1/file_layouts/index.html +++ b/content/docs/0.13.1/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/file_sizing/index.html b/content/docs/0.13.1/file_sizing/index.html index b5c549161ab55..b8f0a50cc2117 100644 --- a/content/docs/0.13.1/file_sizing/index.html +++ b/content/docs/0.13.1/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/flink-quick-start-guide/index.html b/content/docs/0.13.1/flink-quick-start-guide/index.html index ff677b26e6ff6..9ee365f801d64 100644 --- a/content/docs/0.13.1/flink-quick-start-guide/index.html +++ b/content/docs/0.13.1/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/flink_configuration/index.html b/content/docs/0.13.1/flink_configuration/index.html index d8dd5219a7ecb..2ebe6508df1c6 100644 --- a/content/docs/0.13.1/flink_configuration/index.html +++ b/content/docs/0.13.1/flink_configuration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/gcp_bigquery/index.html b/content/docs/0.13.1/gcp_bigquery/index.html index adbe38292b2b9..7691b0489f7c7 100644 --- a/content/docs/0.13.1/gcp_bigquery/index.html +++ b/content/docs/0.13.1/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/gcs_hoodie/index.html b/content/docs/0.13.1/gcs_hoodie/index.html index 356facc344015..56054d49234a7 100644 --- a/content/docs/0.13.1/gcs_hoodie/index.html +++ b/content/docs/0.13.1/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/hoodie_cleaner/index.html b/content/docs/0.13.1/hoodie_cleaner/index.html index 1ccfcc54e5352..c7f2ec6d60e23 100644 --- a/content/docs/0.13.1/hoodie_cleaner/index.html +++ b/content/docs/0.13.1/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/hoodie_deltastreamer/index.html b/content/docs/0.13.1/hoodie_deltastreamer/index.html index 6ed433313b6aa..71c9887f13a33 100644 --- a/content/docs/0.13.1/hoodie_deltastreamer/index.html +++ b/content/docs/0.13.1/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/ibm_cos_hoodie/index.html b/content/docs/0.13.1/ibm_cos_hoodie/index.html index 2d0757330a604..a4a8bd36cb745 100644 --- a/content/docs/0.13.1/ibm_cos_hoodie/index.html +++ b/content/docs/0.13.1/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/indexing/index.html b/content/docs/0.13.1/indexing/index.html index 96cf2d3ebfa3d..0284961b862b1 100644 --- a/content/docs/0.13.1/indexing/index.html +++ b/content/docs/0.13.1/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/jfs_hoodie/index.html b/content/docs/0.13.1/jfs_hoodie/index.html index ff7b633416326..9a58dad61d34a 100644 --- a/content/docs/0.13.1/jfs_hoodie/index.html +++ b/content/docs/0.13.1/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/key_generation/index.html b/content/docs/0.13.1/key_generation/index.html index 26aee84bb5425..b740af1f03641 100644 --- a/content/docs/0.13.1/key_generation/index.html +++ b/content/docs/0.13.1/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/markers/index.html b/content/docs/0.13.1/markers/index.html index 281cc84bcbc51..224061af3edb3 100644 --- a/content/docs/0.13.1/markers/index.html +++ b/content/docs/0.13.1/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/metadata/index.html b/content/docs/0.13.1/metadata/index.html index 6a8b912c4f7f0..9a76458e3965e 100644 --- a/content/docs/0.13.1/metadata/index.html +++ b/content/docs/0.13.1/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/metadata_indexing/index.html b/content/docs/0.13.1/metadata_indexing/index.html index 1599315d2b9a7..a821c9739db86 100644 --- a/content/docs/0.13.1/metadata_indexing/index.html +++ b/content/docs/0.13.1/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/metrics/index.html b/content/docs/0.13.1/metrics/index.html index 8cd3593c7ee63..e79cf41e62682 100644 --- a/content/docs/0.13.1/metrics/index.html +++ b/content/docs/0.13.1/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/migration_guide/index.html b/content/docs/0.13.1/migration_guide/index.html index efb956dd93016..ffd5438046957 100644 --- a/content/docs/0.13.1/migration_guide/index.html +++ b/content/docs/0.13.1/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/oci_hoodie/index.html b/content/docs/0.13.1/oci_hoodie/index.html index 47aa26be38dd9..f44ce9bde4713 100644 --- a/content/docs/0.13.1/oci_hoodie/index.html +++ b/content/docs/0.13.1/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/oss_hoodie/index.html b/content/docs/0.13.1/oss_hoodie/index.html index 17cdd33b410d7..4f6b68ead85ea 100644 --- a/content/docs/0.13.1/oss_hoodie/index.html +++ b/content/docs/0.13.1/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/overview/index.html b/content/docs/0.13.1/overview/index.html index bb81fa1129d9b..a6fe429e37119 100644 --- a/content/docs/0.13.1/overview/index.html +++ b/content/docs/0.13.1/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/performance/index.html b/content/docs/0.13.1/performance/index.html index 5a7b07f848888..358370e660e8e 100644 --- a/content/docs/0.13.1/performance/index.html +++ b/content/docs/0.13.1/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/precommit_validator/index.html b/content/docs/0.13.1/precommit_validator/index.html index f14e601e723bc..adbf50c4b2350 100644 --- a/content/docs/0.13.1/precommit_validator/index.html +++ b/content/docs/0.13.1/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/privacy/index.html b/content/docs/0.13.1/privacy/index.html index 57ba2db7e1de6..a0792888cedf4 100644 --- a/content/docs/0.13.1/privacy/index.html +++ b/content/docs/0.13.1/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/procedures/index.html b/content/docs/0.13.1/procedures/index.html index fda8f26a763df..1fee2e2425c28 100644 --- a/content/docs/0.13.1/procedures/index.html +++ b/content/docs/0.13.1/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/querying_data/index.html b/content/docs/0.13.1/querying_data/index.html index 625c251cb143a..3bc102d845ab0 100644 --- a/content/docs/0.13.1/querying_data/index.html +++ b/content/docs/0.13.1/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/quick-start-guide/index.html b/content/docs/0.13.1/quick-start-guide/index.html index 9c960e7d6b58b..af2f327d8c22a 100644 --- a/content/docs/0.13.1/quick-start-guide/index.html +++ b/content/docs/0.13.1/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/record_payload/index.html b/content/docs/0.13.1/record_payload/index.html index dc36b820dc3ee..a0afb16413f04 100644 --- a/content/docs/0.13.1/record_payload/index.html +++ b/content/docs/0.13.1/record_payload/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/s3_hoodie/index.html b/content/docs/0.13.1/s3_hoodie/index.html index 5932ac105abd8..cc682bbb62042 100644 --- a/content/docs/0.13.1/s3_hoodie/index.html +++ b/content/docs/0.13.1/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/schema_evolution/index.html b/content/docs/0.13.1/schema_evolution/index.html index 263bc5b24fa2b..63bb57c083e47 100644 --- a/content/docs/0.13.1/schema_evolution/index.html +++ b/content/docs/0.13.1/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/snapshot_exporter/index.html b/content/docs/0.13.1/snapshot_exporter/index.html index 673227babd9cd..deaabbb851a4f 100644 --- a/content/docs/0.13.1/snapshot_exporter/index.html +++ b/content/docs/0.13.1/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/structure/index.html b/content/docs/0.13.1/structure/index.html index 291ae944a43ee..f4f505f227f47 100644 --- a/content/docs/0.13.1/structure/index.html +++ b/content/docs/0.13.1/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/syncing_aws_glue_data_catalog/index.html b/content/docs/0.13.1/syncing_aws_glue_data_catalog/index.html index b4ac870a368ce..19c0d7526ec4c 100644 --- a/content/docs/0.13.1/syncing_aws_glue_data_catalog/index.html +++ b/content/docs/0.13.1/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/syncing_datahub/index.html b/content/docs/0.13.1/syncing_datahub/index.html index eadf1f8e64be7..68b6d5748766c 100644 --- a/content/docs/0.13.1/syncing_datahub/index.html +++ b/content/docs/0.13.1/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/syncing_metastore/index.html b/content/docs/0.13.1/syncing_metastore/index.html index 68aa14cf3833a..e7fcf5fa88143 100644 --- a/content/docs/0.13.1/syncing_metastore/index.html +++ b/content/docs/0.13.1/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/table_management/index.html b/content/docs/0.13.1/table_management/index.html index 752b7391bdad1..eda4853aabc07 100644 --- a/content/docs/0.13.1/table_management/index.html +++ b/content/docs/0.13.1/table_management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/table_types/index.html b/content/docs/0.13.1/table_types/index.html index 11e7c73688b16..16277202958e1 100644 --- a/content/docs/0.13.1/table_types/index.html +++ b/content/docs/0.13.1/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/timeline/index.html b/content/docs/0.13.1/timeline/index.html index 25efaa2dd9ee3..07ed1a38ecdbd 100644 --- a/content/docs/0.13.1/timeline/index.html +++ b/content/docs/0.13.1/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/transforms/index.html b/content/docs/0.13.1/transforms/index.html index 8bcf9bfe79d99..eaffff66a6bb6 100644 --- a/content/docs/0.13.1/transforms/index.html +++ b/content/docs/0.13.1/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/troubleshooting/index.html b/content/docs/0.13.1/troubleshooting/index.html index a24804cad0694..3feb91c941d98 100644 --- a/content/docs/0.13.1/troubleshooting/index.html +++ b/content/docs/0.13.1/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/tuning-guide/index.html b/content/docs/0.13.1/tuning-guide/index.html index 835ab352a0fc8..08f82527bc63d 100644 --- a/content/docs/0.13.1/tuning-guide/index.html +++ b/content/docs/0.13.1/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/use_cases/index.html b/content/docs/0.13.1/use_cases/index.html index 9825ed12e43b8..7cb2fd9876002 100644 --- a/content/docs/0.13.1/use_cases/index.html +++ b/content/docs/0.13.1/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/write_operations/index.html b/content/docs/0.13.1/write_operations/index.html index e9c0923c76680..48d3f324a010f 100644 --- a/content/docs/0.13.1/write_operations/index.html +++ b/content/docs/0.13.1/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.13.1/writing_data/index.html b/content/docs/0.13.1/writing_data/index.html index 6b91a47c10ddd..b4d4194a3384d 100644 --- a/content/docs/0.13.1/writing_data/index.html +++ b/content/docs/0.13.1/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/azure_hoodie/index.html b/content/docs/0.14.0/azure_hoodie/index.html index 69ef3273432c0..e8d2a955174e2 100644 --- a/content/docs/0.14.0/azure_hoodie/index.html +++ b/content/docs/0.14.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/basic_configurations/index.html b/content/docs/0.14.0/basic_configurations/index.html index 3f6131a22ade5..6f6308248c8bf 100644 --- a/content/docs/0.14.0/basic_configurations/index.html +++ b/content/docs/0.14.0/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/bos_hoodie/index.html b/content/docs/0.14.0/bos_hoodie/index.html index 3df84d8c19531..b8b8f201759ac 100644 --- a/content/docs/0.14.0/bos_hoodie/index.html +++ b/content/docs/0.14.0/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/cli/index.html b/content/docs/0.14.0/cli/index.html index 62fc8aecde318..111b076c7ed11 100644 --- a/content/docs/0.14.0/cli/index.html +++ b/content/docs/0.14.0/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/cloud/index.html b/content/docs/0.14.0/cloud/index.html index ccce15ae3bd76..e5f63ecfa2c51 100644 --- a/content/docs/0.14.0/cloud/index.html +++ b/content/docs/0.14.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/clustering/index.html b/content/docs/0.14.0/clustering/index.html index 4f10a4f2248a9..6476b39ee8158 100644 --- a/content/docs/0.14.0/clustering/index.html +++ b/content/docs/0.14.0/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/compaction/index.html b/content/docs/0.14.0/compaction/index.html index af0be7f1a1285..d21c9eba4ced4 100644 --- a/content/docs/0.14.0/compaction/index.html +++ b/content/docs/0.14.0/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/comparison/index.html b/content/docs/0.14.0/comparison/index.html index c0880f0190470..53561748ae746 100644 --- a/content/docs/0.14.0/comparison/index.html +++ b/content/docs/0.14.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/concepts/index.html b/content/docs/0.14.0/concepts/index.html index 168dab00e626c..d0f4e40e18110 100644 --- a/content/docs/0.14.0/concepts/index.html +++ b/content/docs/0.14.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/concurrency_control/index.html b/content/docs/0.14.0/concurrency_control/index.html index d95db17df439e..b74660430d124 100644 --- a/content/docs/0.14.0/concurrency_control/index.html +++ b/content/docs/0.14.0/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/configurations/index.html b/content/docs/0.14.0/configurations/index.html index b7d01479a35b2..f564f46a3e1a6 100644 --- a/content/docs/0.14.0/configurations/index.html +++ b/content/docs/0.14.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/cos_hoodie/index.html b/content/docs/0.14.0/cos_hoodie/index.html index f5859a3be60ee..3b136389b586c 100644 --- a/content/docs/0.14.0/cos_hoodie/index.html +++ b/content/docs/0.14.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/deployment/index.html b/content/docs/0.14.0/deployment/index.html index dc55459e24e84..52f440dbca8f2 100644 --- a/content/docs/0.14.0/deployment/index.html +++ b/content/docs/0.14.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/disaster_recovery/index.html b/content/docs/0.14.0/disaster_recovery/index.html index e4ed801c88859..88a5bb698974d 100644 --- a/content/docs/0.14.0/disaster_recovery/index.html +++ b/content/docs/0.14.0/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/docker_demo/index.html b/content/docs/0.14.0/docker_demo/index.html index 8951a109a624f..f8fb3469b2f4d 100644 --- a/content/docs/0.14.0/docker_demo/index.html +++ b/content/docs/0.14.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/encryption/index.html b/content/docs/0.14.0/encryption/index.html index 6989c64ee59e4..93ab0798a0466 100644 --- a/content/docs/0.14.0/encryption/index.html +++ b/content/docs/0.14.0/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/faq/index.html b/content/docs/0.14.0/faq/index.html index 9fe640bd3bcc1..5b29f71fad0fa 100644 --- a/content/docs/0.14.0/faq/index.html +++ b/content/docs/0.14.0/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/file_layouts/index.html b/content/docs/0.14.0/file_layouts/index.html index 0b2886b1ff781..154cacc3b58e9 100644 --- a/content/docs/0.14.0/file_layouts/index.html +++ b/content/docs/0.14.0/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/file_sizing/index.html b/content/docs/0.14.0/file_sizing/index.html index bcea5aab185db..21857b9904130 100644 --- a/content/docs/0.14.0/file_sizing/index.html +++ b/content/docs/0.14.0/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/flink-quick-start-guide/index.html b/content/docs/0.14.0/flink-quick-start-guide/index.html index e6bd2f24bc7ee..8320720033d65 100644 --- a/content/docs/0.14.0/flink-quick-start-guide/index.html +++ b/content/docs/0.14.0/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/flink_tuning/index.html b/content/docs/0.14.0/flink_tuning/index.html index 59a2e7e1ed7a5..bbbe8a89a89de 100644 --- a/content/docs/0.14.0/flink_tuning/index.html +++ b/content/docs/0.14.0/flink_tuning/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/gcp_bigquery/index.html b/content/docs/0.14.0/gcp_bigquery/index.html index ca0747b1ec0ab..bf9ff10b842fe 100644 --- a/content/docs/0.14.0/gcp_bigquery/index.html +++ b/content/docs/0.14.0/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/gcs_hoodie/index.html b/content/docs/0.14.0/gcs_hoodie/index.html index f401e1d1025e0..866dab7ab8521 100644 --- a/content/docs/0.14.0/gcs_hoodie/index.html +++ b/content/docs/0.14.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/hoodie_cleaner/index.html b/content/docs/0.14.0/hoodie_cleaner/index.html index f868e7213ffbd..ea34852f0ee77 100644 --- a/content/docs/0.14.0/hoodie_cleaner/index.html +++ b/content/docs/0.14.0/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/hoodie_streaming_ingestion/index.html b/content/docs/0.14.0/hoodie_streaming_ingestion/index.html index 24c9e65a15494..cfca6a83d8379 100644 --- a/content/docs/0.14.0/hoodie_streaming_ingestion/index.html +++ b/content/docs/0.14.0/hoodie_streaming_ingestion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/ibm_cos_hoodie/index.html b/content/docs/0.14.0/ibm_cos_hoodie/index.html index 685323e63128f..169c2e8d42608 100644 --- a/content/docs/0.14.0/ibm_cos_hoodie/index.html +++ b/content/docs/0.14.0/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/indexing/index.html b/content/docs/0.14.0/indexing/index.html index 947cfe30c1b43..982b3bad4b1ee 100644 --- a/content/docs/0.14.0/indexing/index.html +++ b/content/docs/0.14.0/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/jfs_hoodie/index.html b/content/docs/0.14.0/jfs_hoodie/index.html index 65fa97919e651..079e4001d617a 100644 --- a/content/docs/0.14.0/jfs_hoodie/index.html +++ b/content/docs/0.14.0/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/key_generation/index.html b/content/docs/0.14.0/key_generation/index.html index 0ad3a38feb98b..3827a88a49b19 100644 --- a/content/docs/0.14.0/key_generation/index.html +++ b/content/docs/0.14.0/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/markers/index.html b/content/docs/0.14.0/markers/index.html index 37064c5f03d25..d71a655e01cb0 100644 --- a/content/docs/0.14.0/markers/index.html +++ b/content/docs/0.14.0/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/metadata/index.html b/content/docs/0.14.0/metadata/index.html index df9b0a3923375..70c58901f0e6e 100644 --- a/content/docs/0.14.0/metadata/index.html +++ b/content/docs/0.14.0/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/metadata_indexing/index.html b/content/docs/0.14.0/metadata_indexing/index.html index d6409e74758c6..28aee2b5aab20 100644 --- a/content/docs/0.14.0/metadata_indexing/index.html +++ b/content/docs/0.14.0/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/metrics/index.html b/content/docs/0.14.0/metrics/index.html index 81dd7ec9ea644..a4ed6cf773e5d 100644 --- a/content/docs/0.14.0/metrics/index.html +++ b/content/docs/0.14.0/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/migration_guide/index.html b/content/docs/0.14.0/migration_guide/index.html index 19e3f5be5330b..50eddd051c022 100644 --- a/content/docs/0.14.0/migration_guide/index.html +++ b/content/docs/0.14.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/oci_hoodie/index.html b/content/docs/0.14.0/oci_hoodie/index.html index 35819e26c61c5..4ddcf1290ebda 100644 --- a/content/docs/0.14.0/oci_hoodie/index.html +++ b/content/docs/0.14.0/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/oss_hoodie/index.html b/content/docs/0.14.0/oss_hoodie/index.html index 84340951f145f..b28dc4da2cc94 100644 --- a/content/docs/0.14.0/oss_hoodie/index.html +++ b/content/docs/0.14.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/overview/index.html b/content/docs/0.14.0/overview/index.html index 207290e44e0c2..f06cdba115457 100644 --- a/content/docs/0.14.0/overview/index.html +++ b/content/docs/0.14.0/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/performance/index.html b/content/docs/0.14.0/performance/index.html index eca50691b7f4f..8ad735c7a1c25 100644 --- a/content/docs/0.14.0/performance/index.html +++ b/content/docs/0.14.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/precommit_validator/index.html b/content/docs/0.14.0/precommit_validator/index.html index 421b33b92ef0c..a255ef139bcda 100644 --- a/content/docs/0.14.0/precommit_validator/index.html +++ b/content/docs/0.14.0/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/privacy/index.html b/content/docs/0.14.0/privacy/index.html index 8592883d082bb..7d71c825c7bcd 100644 --- a/content/docs/0.14.0/privacy/index.html +++ b/content/docs/0.14.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/procedures/index.html b/content/docs/0.14.0/procedures/index.html index 4788ce70eb7aa..907482ee614f3 100644 --- a/content/docs/0.14.0/procedures/index.html +++ b/content/docs/0.14.0/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/querying_data/index.html b/content/docs/0.14.0/querying_data/index.html index 08a9bf98bc499..721b673c914bd 100644 --- a/content/docs/0.14.0/querying_data/index.html +++ b/content/docs/0.14.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/quick-start-guide/index.html b/content/docs/0.14.0/quick-start-guide/index.html index 8c0be57fddc5f..db8663e605b15 100644 --- a/content/docs/0.14.0/quick-start-guide/index.html +++ b/content/docs/0.14.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/record_payload/index.html b/content/docs/0.14.0/record_payload/index.html index 56cbde0b24d45..cd6577fdd7ea4 100644 --- a/content/docs/0.14.0/record_payload/index.html +++ b/content/docs/0.14.0/record_payload/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/rollbacks/index.html b/content/docs/0.14.0/rollbacks/index.html index 015a101fe706e..87c4d87df0960 100644 --- a/content/docs/0.14.0/rollbacks/index.html +++ b/content/docs/0.14.0/rollbacks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/s3_hoodie/index.html b/content/docs/0.14.0/s3_hoodie/index.html index 2305ac440c4fc..30013e1bd64d1 100644 --- a/content/docs/0.14.0/s3_hoodie/index.html +++ b/content/docs/0.14.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/schema_evolution/index.html b/content/docs/0.14.0/schema_evolution/index.html index 1b3af5c8ea08e..b25eabaff7085 100644 --- a/content/docs/0.14.0/schema_evolution/index.html +++ b/content/docs/0.14.0/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/snapshot_exporter/index.html b/content/docs/0.14.0/snapshot_exporter/index.html index 6f581f97390d2..fa3c52e94ecc7 100644 --- a/content/docs/0.14.0/snapshot_exporter/index.html +++ b/content/docs/0.14.0/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/sql_ddl/index.html b/content/docs/0.14.0/sql_ddl/index.html index 9a65ef824d6b1..819ad2f8f82a6 100644 --- a/content/docs/0.14.0/sql_ddl/index.html +++ b/content/docs/0.14.0/sql_ddl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/sql_dml/index.html b/content/docs/0.14.0/sql_dml/index.html index 630d169eeeafc..d6bcd79576d89 100644 --- a/content/docs/0.14.0/sql_dml/index.html +++ b/content/docs/0.14.0/sql_dml/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/sql_queries/index.html b/content/docs/0.14.0/sql_queries/index.html index 54568b34e08a8..503e314c0be31 100644 --- a/content/docs/0.14.0/sql_queries/index.html +++ b/content/docs/0.14.0/sql_queries/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/structure/index.html b/content/docs/0.14.0/structure/index.html index f0a65a9eb0f64..d94c790c3b9f1 100644 --- a/content/docs/0.14.0/structure/index.html +++ b/content/docs/0.14.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/syncing_aws_glue_data_catalog/index.html b/content/docs/0.14.0/syncing_aws_glue_data_catalog/index.html index 5e9de6f2720f3..cdea8bf5df29b 100644 --- a/content/docs/0.14.0/syncing_aws_glue_data_catalog/index.html +++ b/content/docs/0.14.0/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/syncing_datahub/index.html b/content/docs/0.14.0/syncing_datahub/index.html index e17bc472fec5f..49787695d0e53 100644 --- a/content/docs/0.14.0/syncing_datahub/index.html +++ b/content/docs/0.14.0/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/syncing_metastore/index.html b/content/docs/0.14.0/syncing_metastore/index.html index d3f3924d1523c..45a849a4756ee 100644 --- a/content/docs/0.14.0/syncing_metastore/index.html +++ b/content/docs/0.14.0/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/syncing_xtable/index.html b/content/docs/0.14.0/syncing_xtable/index.html index 61086d71ae19c..8edebd98e7f10 100644 --- a/content/docs/0.14.0/syncing_xtable/index.html +++ b/content/docs/0.14.0/syncing_xtable/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/table_types/index.html b/content/docs/0.14.0/table_types/index.html index f4d6997e5eeb2..389793a32a6fd 100644 --- a/content/docs/0.14.0/table_types/index.html +++ b/content/docs/0.14.0/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/timeline/index.html b/content/docs/0.14.0/timeline/index.html index 05a06219e5478..b2864919a17a1 100644 --- a/content/docs/0.14.0/timeline/index.html +++ b/content/docs/0.14.0/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/transforms/index.html b/content/docs/0.14.0/transforms/index.html index 06348f3ccaaa3..350f1bdb62606 100644 --- a/content/docs/0.14.0/transforms/index.html +++ b/content/docs/0.14.0/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/troubleshooting/index.html b/content/docs/0.14.0/troubleshooting/index.html index b11c85cee7d25..07d3261bc8209 100644 --- a/content/docs/0.14.0/troubleshooting/index.html +++ b/content/docs/0.14.0/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/tuning-guide/index.html b/content/docs/0.14.0/tuning-guide/index.html index e09500b6d7c05..734bd5b8ad315 100644 --- a/content/docs/0.14.0/tuning-guide/index.html +++ b/content/docs/0.14.0/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/use_cases/index.html b/content/docs/0.14.0/use_cases/index.html index fa8761bbd4fa8..41a73ae5a718d 100644 --- a/content/docs/0.14.0/use_cases/index.html +++ b/content/docs/0.14.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/write_operations/index.html b/content/docs/0.14.0/write_operations/index.html index e7400781f85e9..4c40f8f01a4d7 100644 --- a/content/docs/0.14.0/write_operations/index.html +++ b/content/docs/0.14.0/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.0/writing_data/index.html b/content/docs/0.14.0/writing_data/index.html index 3a1574e7e5536..d3d0d9f3a3ce6 100644 --- a/content/docs/0.14.0/writing_data/index.html +++ b/content/docs/0.14.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/azure_hoodie/index.html b/content/docs/0.14.1/azure_hoodie/index.html index c73b92ad5f956..141ac7845b8ce 100644 --- a/content/docs/0.14.1/azure_hoodie/index.html +++ b/content/docs/0.14.1/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/basic_configurations/index.html b/content/docs/0.14.1/basic_configurations/index.html index 73ce4c7682078..37814759d8ff3 100644 --- a/content/docs/0.14.1/basic_configurations/index.html +++ b/content/docs/0.14.1/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/bos_hoodie/index.html b/content/docs/0.14.1/bos_hoodie/index.html index 1c1bce2a97e6d..f651b159530ba 100644 --- a/content/docs/0.14.1/bos_hoodie/index.html +++ b/content/docs/0.14.1/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/cli/index.html b/content/docs/0.14.1/cli/index.html index 833a1c6fb3710..5ed073faf3bdb 100644 --- a/content/docs/0.14.1/cli/index.html +++ b/content/docs/0.14.1/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/cloud/index.html b/content/docs/0.14.1/cloud/index.html index ac7603199ed9e..18e4e7cbbf252 100644 --- a/content/docs/0.14.1/cloud/index.html +++ b/content/docs/0.14.1/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/clustering/index.html b/content/docs/0.14.1/clustering/index.html index e7e12b5b333a5..3ba13d93347fe 100644 --- a/content/docs/0.14.1/clustering/index.html +++ b/content/docs/0.14.1/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/compaction/index.html b/content/docs/0.14.1/compaction/index.html index 6f10baefe8a72..14663d86a1402 100644 --- a/content/docs/0.14.1/compaction/index.html +++ b/content/docs/0.14.1/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/comparison/index.html b/content/docs/0.14.1/comparison/index.html index 670b04e5599f7..f00202f69e373 100644 --- a/content/docs/0.14.1/comparison/index.html +++ b/content/docs/0.14.1/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/concepts/index.html b/content/docs/0.14.1/concepts/index.html index 94767142fe5b9..d832f3664b650 100644 --- a/content/docs/0.14.1/concepts/index.html +++ b/content/docs/0.14.1/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/concurrency_control/index.html b/content/docs/0.14.1/concurrency_control/index.html index 25c4e2f962e14..ed02c2fe79180 100644 --- a/content/docs/0.14.1/concurrency_control/index.html +++ b/content/docs/0.14.1/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/configurations/index.html b/content/docs/0.14.1/configurations/index.html index 57f8e0c107e31..e4ca8a795fab1 100644 --- a/content/docs/0.14.1/configurations/index.html +++ b/content/docs/0.14.1/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/cos_hoodie/index.html b/content/docs/0.14.1/cos_hoodie/index.html index 3376c5e8ebb83..c69e01f11c297 100644 --- a/content/docs/0.14.1/cos_hoodie/index.html +++ b/content/docs/0.14.1/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/deployment/index.html b/content/docs/0.14.1/deployment/index.html index 2210eeff6abc4..213800581741a 100644 --- a/content/docs/0.14.1/deployment/index.html +++ b/content/docs/0.14.1/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/disaster_recovery/index.html b/content/docs/0.14.1/disaster_recovery/index.html index 2b5356e7b892e..5e497a9feca4b 100644 --- a/content/docs/0.14.1/disaster_recovery/index.html +++ b/content/docs/0.14.1/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/docker_demo/index.html b/content/docs/0.14.1/docker_demo/index.html index 3a9affbc39480..9f35a40deefe2 100644 --- a/content/docs/0.14.1/docker_demo/index.html +++ b/content/docs/0.14.1/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/encryption/index.html b/content/docs/0.14.1/encryption/index.html index 7891c43336725..1299fff0836db 100644 --- a/content/docs/0.14.1/encryption/index.html +++ b/content/docs/0.14.1/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/faq/index.html b/content/docs/0.14.1/faq/index.html index 23c6f330130c8..f2cc5d3976d30 100644 --- a/content/docs/0.14.1/faq/index.html +++ b/content/docs/0.14.1/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/faq_design_and_concepts/index.html b/content/docs/0.14.1/faq_design_and_concepts/index.html index e191116af76c5..321104ca72982 100644 --- a/content/docs/0.14.1/faq_design_and_concepts/index.html +++ b/content/docs/0.14.1/faq_design_and_concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/faq_general/index.html b/content/docs/0.14.1/faq_general/index.html index 115e384e871fb..958857edfe438 100644 --- a/content/docs/0.14.1/faq_general/index.html +++ b/content/docs/0.14.1/faq_general/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/faq_integrations/index.html b/content/docs/0.14.1/faq_integrations/index.html index 2d420db70a593..46bc4e49550c6 100644 --- a/content/docs/0.14.1/faq_integrations/index.html +++ b/content/docs/0.14.1/faq_integrations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/faq_querying_tables/index.html b/content/docs/0.14.1/faq_querying_tables/index.html index cd83de6f4d001..754a17160b543 100644 --- a/content/docs/0.14.1/faq_querying_tables/index.html +++ b/content/docs/0.14.1/faq_querying_tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/faq_storage/index.html b/content/docs/0.14.1/faq_storage/index.html index 4767df7a50a3d..f3408c6898456 100644 --- a/content/docs/0.14.1/faq_storage/index.html +++ b/content/docs/0.14.1/faq_storage/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/faq_table_services/index.html b/content/docs/0.14.1/faq_table_services/index.html index 8245e7f00faec..4b46eaff4d63a 100644 --- a/content/docs/0.14.1/faq_table_services/index.html +++ b/content/docs/0.14.1/faq_table_services/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/faq_writing_tables/index.html b/content/docs/0.14.1/faq_writing_tables/index.html index 0f409d875de90..d7db6150063dc 100644 --- a/content/docs/0.14.1/faq_writing_tables/index.html +++ b/content/docs/0.14.1/faq_writing_tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/file_layouts/index.html b/content/docs/0.14.1/file_layouts/index.html index be8897ab4ecb6..db1d5dc6cbbfa 100644 --- a/content/docs/0.14.1/file_layouts/index.html +++ b/content/docs/0.14.1/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/file_sizing/index.html b/content/docs/0.14.1/file_sizing/index.html index 14de8a50fbee1..0c0c12a8dd22a 100644 --- a/content/docs/0.14.1/file_sizing/index.html +++ b/content/docs/0.14.1/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/flink-quick-start-guide/index.html b/content/docs/0.14.1/flink-quick-start-guide/index.html index 952d7f1eb15b1..dde4fdae7158b 100644 --- a/content/docs/0.14.1/flink-quick-start-guide/index.html +++ b/content/docs/0.14.1/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/flink_tuning/index.html b/content/docs/0.14.1/flink_tuning/index.html index 8f79937e07d1b..d13a39ee94f6a 100644 --- a/content/docs/0.14.1/flink_tuning/index.html +++ b/content/docs/0.14.1/flink_tuning/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/gcp_bigquery/index.html b/content/docs/0.14.1/gcp_bigquery/index.html index 27b3d50d22870..46d8e08ce840f 100644 --- a/content/docs/0.14.1/gcp_bigquery/index.html +++ b/content/docs/0.14.1/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/gcs_hoodie/index.html b/content/docs/0.14.1/gcs_hoodie/index.html index dabd0ab882553..c7f603fe90692 100644 --- a/content/docs/0.14.1/gcs_hoodie/index.html +++ b/content/docs/0.14.1/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/hoodie_cleaner/index.html b/content/docs/0.14.1/hoodie_cleaner/index.html index eb389956ff6f1..df1074d4d4021 100644 --- a/content/docs/0.14.1/hoodie_cleaner/index.html +++ b/content/docs/0.14.1/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/hoodie_streaming_ingestion/index.html b/content/docs/0.14.1/hoodie_streaming_ingestion/index.html index fa8ddfc2e3488..162d119beeacd 100644 --- a/content/docs/0.14.1/hoodie_streaming_ingestion/index.html +++ b/content/docs/0.14.1/hoodie_streaming_ingestion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/ibm_cos_hoodie/index.html b/content/docs/0.14.1/ibm_cos_hoodie/index.html index dac9c7186887d..2398ee5cd36e2 100644 --- a/content/docs/0.14.1/ibm_cos_hoodie/index.html +++ b/content/docs/0.14.1/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/indexing/index.html b/content/docs/0.14.1/indexing/index.html index 81a6b4c8d32b5..dede5ebf07185 100644 --- a/content/docs/0.14.1/indexing/index.html +++ b/content/docs/0.14.1/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/jfs_hoodie/index.html b/content/docs/0.14.1/jfs_hoodie/index.html index 1cf6afffbf9f4..6f2511f7bf095 100644 --- a/content/docs/0.14.1/jfs_hoodie/index.html +++ b/content/docs/0.14.1/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/key_generation/index.html b/content/docs/0.14.1/key_generation/index.html index 6dff02522127e..6aaa54dc66c19 100644 --- a/content/docs/0.14.1/key_generation/index.html +++ b/content/docs/0.14.1/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/markers/index.html b/content/docs/0.14.1/markers/index.html index 88e7fddc0e079..6a88cbb7f23e0 100644 --- a/content/docs/0.14.1/markers/index.html +++ b/content/docs/0.14.1/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/metadata/index.html b/content/docs/0.14.1/metadata/index.html index 3979a2dbacb45..be9cadb282e23 100644 --- a/content/docs/0.14.1/metadata/index.html +++ b/content/docs/0.14.1/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/metadata_indexing/index.html b/content/docs/0.14.1/metadata_indexing/index.html index b0a7a630240a6..27a89b8266426 100644 --- a/content/docs/0.14.1/metadata_indexing/index.html +++ b/content/docs/0.14.1/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/metrics/index.html b/content/docs/0.14.1/metrics/index.html index 7897d147ab45c..134012539b6c4 100644 --- a/content/docs/0.14.1/metrics/index.html +++ b/content/docs/0.14.1/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/migration_guide/index.html b/content/docs/0.14.1/migration_guide/index.html index a24ca62d19fcc..4bfec64627ec2 100644 --- a/content/docs/0.14.1/migration_guide/index.html +++ b/content/docs/0.14.1/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/oci_hoodie/index.html b/content/docs/0.14.1/oci_hoodie/index.html index 12b87a3f8725f..ede74775c4fda 100644 --- a/content/docs/0.14.1/oci_hoodie/index.html +++ b/content/docs/0.14.1/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/oss_hoodie/index.html b/content/docs/0.14.1/oss_hoodie/index.html index 2db82584e1019..e06513121253e 100644 --- a/content/docs/0.14.1/oss_hoodie/index.html +++ b/content/docs/0.14.1/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/overview/index.html b/content/docs/0.14.1/overview/index.html index c329f28e156a5..9a239b9cad5fe 100644 --- a/content/docs/0.14.1/overview/index.html +++ b/content/docs/0.14.1/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/performance/index.html b/content/docs/0.14.1/performance/index.html index 3345df363beed..40c449d4bcb45 100644 --- a/content/docs/0.14.1/performance/index.html +++ b/content/docs/0.14.1/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/precommit_validator/index.html b/content/docs/0.14.1/precommit_validator/index.html index 7360c1aacdf24..fd5b04255ca85 100644 --- a/content/docs/0.14.1/precommit_validator/index.html +++ b/content/docs/0.14.1/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/privacy/index.html b/content/docs/0.14.1/privacy/index.html index 60b3acc928a44..0698b5055470b 100644 --- a/content/docs/0.14.1/privacy/index.html +++ b/content/docs/0.14.1/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/procedures/index.html b/content/docs/0.14.1/procedures/index.html index 5d514f4f3e70d..560f320ee35e4 100644 --- a/content/docs/0.14.1/procedures/index.html +++ b/content/docs/0.14.1/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/querying_data/index.html b/content/docs/0.14.1/querying_data/index.html index 8ee06500e441a..9214d711649c4 100644 --- a/content/docs/0.14.1/querying_data/index.html +++ b/content/docs/0.14.1/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/quick-start-guide/index.html b/content/docs/0.14.1/quick-start-guide/index.html index 41bbb5ba408ae..1e806e7981550 100644 --- a/content/docs/0.14.1/quick-start-guide/index.html +++ b/content/docs/0.14.1/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/record_payload/index.html b/content/docs/0.14.1/record_payload/index.html index 6cfcdb4670da8..700a0a0194d8a 100644 --- a/content/docs/0.14.1/record_payload/index.html +++ b/content/docs/0.14.1/record_payload/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/rollbacks/index.html b/content/docs/0.14.1/rollbacks/index.html index 60b18fe9df415..6e1c9509772ff 100644 --- a/content/docs/0.14.1/rollbacks/index.html +++ b/content/docs/0.14.1/rollbacks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/s3_hoodie/index.html b/content/docs/0.14.1/s3_hoodie/index.html index caf3fda93efc4..b22473e3c903f 100644 --- a/content/docs/0.14.1/s3_hoodie/index.html +++ b/content/docs/0.14.1/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/schema_evolution/index.html b/content/docs/0.14.1/schema_evolution/index.html index 3ae0c7a8274b4..e265096c1ec22 100644 --- a/content/docs/0.14.1/schema_evolution/index.html +++ b/content/docs/0.14.1/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/snapshot_exporter/index.html b/content/docs/0.14.1/snapshot_exporter/index.html index 8680669209f88..83854d368eb1e 100644 --- a/content/docs/0.14.1/snapshot_exporter/index.html +++ b/content/docs/0.14.1/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/sql_ddl/index.html b/content/docs/0.14.1/sql_ddl/index.html index f6adc0e564604..926d7444adbe2 100644 --- a/content/docs/0.14.1/sql_ddl/index.html +++ b/content/docs/0.14.1/sql_ddl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/sql_dml/index.html b/content/docs/0.14.1/sql_dml/index.html index a9b33b55785a0..610c4aad8e4c1 100644 --- a/content/docs/0.14.1/sql_dml/index.html +++ b/content/docs/0.14.1/sql_dml/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/sql_queries/index.html b/content/docs/0.14.1/sql_queries/index.html index 4bf0ac7d27cd3..d971244384ba1 100644 --- a/content/docs/0.14.1/sql_queries/index.html +++ b/content/docs/0.14.1/sql_queries/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/structure/index.html b/content/docs/0.14.1/structure/index.html index 1094d25e3c1f2..32e4f37ec410c 100644 --- a/content/docs/0.14.1/structure/index.html +++ b/content/docs/0.14.1/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/syncing_aws_glue_data_catalog/index.html b/content/docs/0.14.1/syncing_aws_glue_data_catalog/index.html index 7d7220f5d365a..1083432fb56d6 100644 --- a/content/docs/0.14.1/syncing_aws_glue_data_catalog/index.html +++ b/content/docs/0.14.1/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/syncing_datahub/index.html b/content/docs/0.14.1/syncing_datahub/index.html index eb06eb0091f48..dc060b49f8484 100644 --- a/content/docs/0.14.1/syncing_datahub/index.html +++ b/content/docs/0.14.1/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/syncing_metastore/index.html b/content/docs/0.14.1/syncing_metastore/index.html index 6f995f3707fc8..2a6486fd08afc 100644 --- a/content/docs/0.14.1/syncing_metastore/index.html +++ b/content/docs/0.14.1/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/syncing_xtable/index.html b/content/docs/0.14.1/syncing_xtable/index.html index 86a1a9b3012d7..62af27088a038 100644 --- a/content/docs/0.14.1/syncing_xtable/index.html +++ b/content/docs/0.14.1/syncing_xtable/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/table_types/index.html b/content/docs/0.14.1/table_types/index.html index aa45edfbeefe9..b0c2631a72633 100644 --- a/content/docs/0.14.1/table_types/index.html +++ b/content/docs/0.14.1/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/timeline/index.html b/content/docs/0.14.1/timeline/index.html index c9aefd8859d30..7875d76f339cb 100644 --- a/content/docs/0.14.1/timeline/index.html +++ b/content/docs/0.14.1/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/transforms/index.html b/content/docs/0.14.1/transforms/index.html index 6bcca0bccb121..85f14808be1a8 100644 --- a/content/docs/0.14.1/transforms/index.html +++ b/content/docs/0.14.1/transforms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/troubleshooting/index.html b/content/docs/0.14.1/troubleshooting/index.html index 80abe9f7d87e9..f20ae57f9765a 100644 --- a/content/docs/0.14.1/troubleshooting/index.html +++ b/content/docs/0.14.1/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/tuning-guide/index.html b/content/docs/0.14.1/tuning-guide/index.html index 4bbc388d7c44a..16fbd0a1f1700 100644 --- a/content/docs/0.14.1/tuning-guide/index.html +++ b/content/docs/0.14.1/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/use_cases/index.html b/content/docs/0.14.1/use_cases/index.html index 44ce28006cf78..f1cb4c82b4b97 100644 --- a/content/docs/0.14.1/use_cases/index.html +++ b/content/docs/0.14.1/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/write_operations/index.html b/content/docs/0.14.1/write_operations/index.html index 1ae1a9ff173df..f68b05395c249 100644 --- a/content/docs/0.14.1/write_operations/index.html +++ b/content/docs/0.14.1/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.14.1/writing_data/index.html b/content/docs/0.14.1/writing_data/index.html index 822215071d8df..942445ca74389 100644 --- a/content/docs/0.14.1/writing_data/index.html +++ b/content/docs/0.14.1/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/azure_hoodie/index.html b/content/docs/0.15.0/azure_hoodie/index.html index 5c5e834f0734f..0b2ea6e1aaf7d 100644 --- a/content/docs/0.15.0/azure_hoodie/index.html +++ b/content/docs/0.15.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/basic_configurations/index.html b/content/docs/0.15.0/basic_configurations/index.html index c41471e44d46a..feeaafd2bb0e3 100644 --- a/content/docs/0.15.0/basic_configurations/index.html +++ b/content/docs/0.15.0/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/bos_hoodie/index.html b/content/docs/0.15.0/bos_hoodie/index.html index bda7f2983fb84..ed22b8d5a5c21 100644 --- a/content/docs/0.15.0/bos_hoodie/index.html +++ b/content/docs/0.15.0/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/cli/index.html b/content/docs/0.15.0/cli/index.html index 26ebdb296b357..8955ab2418f28 100644 --- a/content/docs/0.15.0/cli/index.html +++ b/content/docs/0.15.0/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/cloud/index.html b/content/docs/0.15.0/cloud/index.html index 4ea41dc7a81ad..4d1c8832725f7 100644 --- a/content/docs/0.15.0/cloud/index.html +++ b/content/docs/0.15.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/clustering/index.html b/content/docs/0.15.0/clustering/index.html index 060c44a1da4ff..9f027331e8b39 100644 --- a/content/docs/0.15.0/clustering/index.html +++ b/content/docs/0.15.0/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/compaction/index.html b/content/docs/0.15.0/compaction/index.html index 52684dc044169..0094bd456d91c 100644 --- a/content/docs/0.15.0/compaction/index.html +++ b/content/docs/0.15.0/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/comparison/index.html b/content/docs/0.15.0/comparison/index.html index 747d69764a03f..e7562ac86dc79 100644 --- a/content/docs/0.15.0/comparison/index.html +++ b/content/docs/0.15.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/concepts/index.html b/content/docs/0.15.0/concepts/index.html index fe6334a15b19e..7173d9df87310 100644 --- a/content/docs/0.15.0/concepts/index.html +++ b/content/docs/0.15.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/concurrency_control/index.html b/content/docs/0.15.0/concurrency_control/index.html index 512c18f419691..88fa5b5e4e884 100644 --- a/content/docs/0.15.0/concurrency_control/index.html +++ b/content/docs/0.15.0/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/configurations/index.html b/content/docs/0.15.0/configurations/index.html index c51cadd1850bf..325bfc0dcb428 100644 --- a/content/docs/0.15.0/configurations/index.html +++ b/content/docs/0.15.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/cos_hoodie/index.html b/content/docs/0.15.0/cos_hoodie/index.html index bb050e86c0dcc..cc8e4eb564caf 100644 --- a/content/docs/0.15.0/cos_hoodie/index.html +++ b/content/docs/0.15.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/deployment/index.html b/content/docs/0.15.0/deployment/index.html index 4896ba9631cb5..4b277e568450f 100644 --- a/content/docs/0.15.0/deployment/index.html +++ b/content/docs/0.15.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/disaster_recovery/index.html b/content/docs/0.15.0/disaster_recovery/index.html index 57698ec3e4bd7..7f2e2b5c60bc1 100644 --- a/content/docs/0.15.0/disaster_recovery/index.html +++ b/content/docs/0.15.0/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/docker_demo/index.html b/content/docs/0.15.0/docker_demo/index.html index 552e5b1675808..b33150677d910 100644 --- a/content/docs/0.15.0/docker_demo/index.html +++ b/content/docs/0.15.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/encryption/index.html b/content/docs/0.15.0/encryption/index.html index 0dfdd88e43fd5..9d63a041c1ac9 100644 --- a/content/docs/0.15.0/encryption/index.html +++ b/content/docs/0.15.0/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/faq/index.html b/content/docs/0.15.0/faq/index.html index 1cb646f699600..a7de93744edbe 100644 --- a/content/docs/0.15.0/faq/index.html +++ b/content/docs/0.15.0/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/faq_design_and_concepts/index.html b/content/docs/0.15.0/faq_design_and_concepts/index.html index e4155fd0a7a00..4b2e5f7816840 100644 --- a/content/docs/0.15.0/faq_design_and_concepts/index.html +++ b/content/docs/0.15.0/faq_design_and_concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/faq_general/index.html b/content/docs/0.15.0/faq_general/index.html index 543b26c9033dc..93762f441ca22 100644 --- a/content/docs/0.15.0/faq_general/index.html +++ b/content/docs/0.15.0/faq_general/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/faq_integrations/index.html b/content/docs/0.15.0/faq_integrations/index.html index 52825fc2173f1..e9b3e03f1c79d 100644 --- a/content/docs/0.15.0/faq_integrations/index.html +++ b/content/docs/0.15.0/faq_integrations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/faq_reading_tables/index.html b/content/docs/0.15.0/faq_reading_tables/index.html index 9551842aaef3b..8ab2f4d1d064d 100644 --- a/content/docs/0.15.0/faq_reading_tables/index.html +++ b/content/docs/0.15.0/faq_reading_tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/faq_storage/index.html b/content/docs/0.15.0/faq_storage/index.html index 57f6a74b79bd5..36576c892be85 100644 --- a/content/docs/0.15.0/faq_storage/index.html +++ b/content/docs/0.15.0/faq_storage/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/faq_table_services/index.html b/content/docs/0.15.0/faq_table_services/index.html index 2a1b841e00291..2c682ca16d15c 100644 --- a/content/docs/0.15.0/faq_table_services/index.html +++ b/content/docs/0.15.0/faq_table_services/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/faq_writing_tables/index.html b/content/docs/0.15.0/faq_writing_tables/index.html index c4155279b0ee4..9d15665ff2f0b 100644 --- a/content/docs/0.15.0/faq_writing_tables/index.html +++ b/content/docs/0.15.0/faq_writing_tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/file_layouts/index.html b/content/docs/0.15.0/file_layouts/index.html index 174bc8f85097d..6ff598346a23e 100644 --- a/content/docs/0.15.0/file_layouts/index.html +++ b/content/docs/0.15.0/file_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/file_sizing/index.html b/content/docs/0.15.0/file_sizing/index.html index dcc7c69cd8f33..78f5b4bd45766 100644 --- a/content/docs/0.15.0/file_sizing/index.html +++ b/content/docs/0.15.0/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/flink-quick-start-guide/index.html b/content/docs/0.15.0/flink-quick-start-guide/index.html index 50d21191a410a..a19f54bc4641c 100644 --- a/content/docs/0.15.0/flink-quick-start-guide/index.html +++ b/content/docs/0.15.0/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/flink_tuning/index.html b/content/docs/0.15.0/flink_tuning/index.html index ce0cbfb586c36..219191e38a5c1 100644 --- a/content/docs/0.15.0/flink_tuning/index.html +++ b/content/docs/0.15.0/flink_tuning/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/gcp_bigquery/index.html b/content/docs/0.15.0/gcp_bigquery/index.html index 0016a508aba1c..81e0d2ee9a850 100644 --- a/content/docs/0.15.0/gcp_bigquery/index.html +++ b/content/docs/0.15.0/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/gcs_hoodie/index.html b/content/docs/0.15.0/gcs_hoodie/index.html index 74732f24d0784..833f5a41f10d9 100644 --- a/content/docs/0.15.0/gcs_hoodie/index.html +++ b/content/docs/0.15.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/hoodie_cleaner/index.html b/content/docs/0.15.0/hoodie_cleaner/index.html index dbed0ff7b50bb..5317b470ef96e 100644 --- a/content/docs/0.15.0/hoodie_cleaner/index.html +++ b/content/docs/0.15.0/hoodie_cleaner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/hoodie_streaming_ingestion/index.html b/content/docs/0.15.0/hoodie_streaming_ingestion/index.html index 5ddcc57f99c7e..850d9338fb9ae 100644 --- a/content/docs/0.15.0/hoodie_streaming_ingestion/index.html +++ b/content/docs/0.15.0/hoodie_streaming_ingestion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/hudi_stack/index.html b/content/docs/0.15.0/hudi_stack/index.html index 12cefcf86d51e..72a703325df0d 100644 --- a/content/docs/0.15.0/hudi_stack/index.html +++ b/content/docs/0.15.0/hudi_stack/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/ibm_cos_hoodie/index.html b/content/docs/0.15.0/ibm_cos_hoodie/index.html index 23eb8ba51976d..410e8ca0aebaa 100644 --- a/content/docs/0.15.0/ibm_cos_hoodie/index.html +++ b/content/docs/0.15.0/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/indexing/index.html b/content/docs/0.15.0/indexing/index.html index e6381ccf25973..e914463b04815 100644 --- a/content/docs/0.15.0/indexing/index.html +++ b/content/docs/0.15.0/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/ingestion_flink/index.html b/content/docs/0.15.0/ingestion_flink/index.html index 76aeef47bb8c8..b288173ecbd69 100644 --- a/content/docs/0.15.0/ingestion_flink/index.html +++ b/content/docs/0.15.0/ingestion_flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/ingestion_kafka_connect/index.html b/content/docs/0.15.0/ingestion_kafka_connect/index.html index 40288a98ffdfd..587663c48ac0a 100644 --- a/content/docs/0.15.0/ingestion_kafka_connect/index.html +++ b/content/docs/0.15.0/ingestion_kafka_connect/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/jfs_hoodie/index.html b/content/docs/0.15.0/jfs_hoodie/index.html index c08a944765761..333e215c92128 100644 --- a/content/docs/0.15.0/jfs_hoodie/index.html +++ b/content/docs/0.15.0/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/key_generation/index.html b/content/docs/0.15.0/key_generation/index.html index 1eed9dd52c139..a605ccc3dfe9d 100644 --- a/content/docs/0.15.0/key_generation/index.html +++ b/content/docs/0.15.0/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/markers/index.html b/content/docs/0.15.0/markers/index.html index 6c5fc840d2c0a..30dc640e250f2 100644 --- a/content/docs/0.15.0/markers/index.html +++ b/content/docs/0.15.0/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/metadata/index.html b/content/docs/0.15.0/metadata/index.html index 9c77b9536c0e3..e80972e40024b 100644 --- a/content/docs/0.15.0/metadata/index.html +++ b/content/docs/0.15.0/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/metadata_indexing/index.html b/content/docs/0.15.0/metadata_indexing/index.html index ce7f0c4b12a6d..d69a1d15b542e 100644 --- a/content/docs/0.15.0/metadata_indexing/index.html +++ b/content/docs/0.15.0/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/metrics/index.html b/content/docs/0.15.0/metrics/index.html index 88239b903bcf3..04ef66cc6b73a 100644 --- a/content/docs/0.15.0/metrics/index.html +++ b/content/docs/0.15.0/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/migration_guide/index.html b/content/docs/0.15.0/migration_guide/index.html index 56b84c0dbbe30..eb257bab0fad1 100644 --- a/content/docs/0.15.0/migration_guide/index.html +++ b/content/docs/0.15.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/oci_hoodie/index.html b/content/docs/0.15.0/oci_hoodie/index.html index 46ae9cd965da1..68d43e4bb34c7 100644 --- a/content/docs/0.15.0/oci_hoodie/index.html +++ b/content/docs/0.15.0/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/oss_hoodie/index.html b/content/docs/0.15.0/oss_hoodie/index.html index 8e67480eb16be..9670c330f5608 100644 --- a/content/docs/0.15.0/oss_hoodie/index.html +++ b/content/docs/0.15.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/overview/index.html b/content/docs/0.15.0/overview/index.html index 8567371473989..8d9e7e8ef34bd 100644 --- a/content/docs/0.15.0/overview/index.html +++ b/content/docs/0.15.0/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/performance/index.html b/content/docs/0.15.0/performance/index.html index 53c17fd27d37b..9dbd32d0ac6ba 100644 --- a/content/docs/0.15.0/performance/index.html +++ b/content/docs/0.15.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/platform_services_post_commit_callback/index.html b/content/docs/0.15.0/platform_services_post_commit_callback/index.html index 7a8f4fbb8c497..10efdae2495c3 100644 --- a/content/docs/0.15.0/platform_services_post_commit_callback/index.html +++ b/content/docs/0.15.0/platform_services_post_commit_callback/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/precommit_validator/index.html b/content/docs/0.15.0/precommit_validator/index.html index 1841295cf4bde..96bcf84d0432d 100644 --- a/content/docs/0.15.0/precommit_validator/index.html +++ b/content/docs/0.15.0/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/privacy/index.html b/content/docs/0.15.0/privacy/index.html index a8821e562b38a..cffc235148275 100644 --- a/content/docs/0.15.0/privacy/index.html +++ b/content/docs/0.15.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/procedures/index.html b/content/docs/0.15.0/procedures/index.html index 4730341264393..fbc213bf7efbd 100644 --- a/content/docs/0.15.0/procedures/index.html +++ b/content/docs/0.15.0/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/python-rust-quick-start-guide/index.html b/content/docs/0.15.0/python-rust-quick-start-guide/index.html index 33eab82049405..8bff2b13199d2 100644 --- a/content/docs/0.15.0/python-rust-quick-start-guide/index.html +++ b/content/docs/0.15.0/python-rust-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/querying_data/index.html b/content/docs/0.15.0/querying_data/index.html index bc8c3bbf9d2db..63f1691ca8ac3 100644 --- a/content/docs/0.15.0/querying_data/index.html +++ b/content/docs/0.15.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/quick-start-guide/index.html b/content/docs/0.15.0/quick-start-guide/index.html index fbcded640f67c..431533f3be8d3 100644 --- a/content/docs/0.15.0/quick-start-guide/index.html +++ b/content/docs/0.15.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/reading_tables_batch_reads/index.html b/content/docs/0.15.0/reading_tables_batch_reads/index.html index 363a4e1ed9e90..3c8f81bd5a6e8 100644 --- a/content/docs/0.15.0/reading_tables_batch_reads/index.html +++ b/content/docs/0.15.0/reading_tables_batch_reads/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/reading_tables_streaming_reads/index.html b/content/docs/0.15.0/reading_tables_streaming_reads/index.html index 7b05ba8378f3c..e41e834e5fce9 100644 --- a/content/docs/0.15.0/reading_tables_streaming_reads/index.html +++ b/content/docs/0.15.0/reading_tables_streaming_reads/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/record_payload/index.html b/content/docs/0.15.0/record_payload/index.html index 42bc77961db3e..cd114abe2d669 100644 --- a/content/docs/0.15.0/record_payload/index.html +++ b/content/docs/0.15.0/record_payload/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/rollbacks/index.html b/content/docs/0.15.0/rollbacks/index.html index 13f39fea04520..73479b26b2611 100644 --- a/content/docs/0.15.0/rollbacks/index.html +++ b/content/docs/0.15.0/rollbacks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/s3_hoodie/index.html b/content/docs/0.15.0/s3_hoodie/index.html index ff2281ca8dcda..be589d957e603 100644 --- a/content/docs/0.15.0/s3_hoodie/index.html +++ b/content/docs/0.15.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/schema_evolution/index.html b/content/docs/0.15.0/schema_evolution/index.html index e6c2316d47fc9..d912f2d20660f 100644 --- a/content/docs/0.15.0/schema_evolution/index.html +++ b/content/docs/0.15.0/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/snapshot_exporter/index.html b/content/docs/0.15.0/snapshot_exporter/index.html index 58bcfe1d70b8f..9135bce660793 100644 --- a/content/docs/0.15.0/snapshot_exporter/index.html +++ b/content/docs/0.15.0/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/sql_ddl/index.html b/content/docs/0.15.0/sql_ddl/index.html index 30246e1b25f57..66e824fd8fd19 100644 --- a/content/docs/0.15.0/sql_ddl/index.html +++ b/content/docs/0.15.0/sql_ddl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/sql_dml/index.html b/content/docs/0.15.0/sql_dml/index.html index 79c9cd9079fa1..bfbc67a8bbfc5 100644 --- a/content/docs/0.15.0/sql_dml/index.html +++ b/content/docs/0.15.0/sql_dml/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/sql_queries/index.html b/content/docs/0.15.0/sql_queries/index.html index 66bb2698b0cb9..4070c5cd809c0 100644 --- a/content/docs/0.15.0/sql_queries/index.html +++ b/content/docs/0.15.0/sql_queries/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/structure/index.html b/content/docs/0.15.0/structure/index.html index 9b61dedd5d148..bdd71afaa1c3d 100644 --- a/content/docs/0.15.0/structure/index.html +++ b/content/docs/0.15.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/syncing_aws_glue_data_catalog/index.html b/content/docs/0.15.0/syncing_aws_glue_data_catalog/index.html index 50668132cef25..e406f4e63118b 100644 --- a/content/docs/0.15.0/syncing_aws_glue_data_catalog/index.html +++ b/content/docs/0.15.0/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/syncing_datahub/index.html b/content/docs/0.15.0/syncing_datahub/index.html index 977ee095270c7..d324b3ed343f2 100644 --- a/content/docs/0.15.0/syncing_datahub/index.html +++ b/content/docs/0.15.0/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/syncing_metastore/index.html b/content/docs/0.15.0/syncing_metastore/index.html index 3ca04513ee0c0..4d9e96d763066 100644 --- a/content/docs/0.15.0/syncing_metastore/index.html +++ b/content/docs/0.15.0/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/syncing_xtable/index.html b/content/docs/0.15.0/syncing_xtable/index.html index 59e3f9c1f7b02..dbf4164baacac 100644 --- a/content/docs/0.15.0/syncing_xtable/index.html +++ b/content/docs/0.15.0/syncing_xtable/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/table_types/index.html b/content/docs/0.15.0/table_types/index.html index b8c2be2cf9daa..0c94e3a76c03c 100644 --- a/content/docs/0.15.0/table_types/index.html +++ b/content/docs/0.15.0/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/timeline/index.html b/content/docs/0.15.0/timeline/index.html index 296e06bb7ebdd..c6bdf31c67a6a 100644 --- a/content/docs/0.15.0/timeline/index.html +++ b/content/docs/0.15.0/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/troubleshooting/index.html b/content/docs/0.15.0/troubleshooting/index.html index d307c1a85f7c4..36accd4242651 100644 --- a/content/docs/0.15.0/troubleshooting/index.html +++ b/content/docs/0.15.0/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/tuning-guide/index.html b/content/docs/0.15.0/tuning-guide/index.html index 411db25d93910..e7099558cc514 100644 --- a/content/docs/0.15.0/tuning-guide/index.html +++ b/content/docs/0.15.0/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/use_cases/index.html b/content/docs/0.15.0/use_cases/index.html index fe6848873ce6b..73fdf60e94104 100644 --- a/content/docs/0.15.0/use_cases/index.html +++ b/content/docs/0.15.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/write_operations/index.html b/content/docs/0.15.0/write_operations/index.html index 9241f9efd71bc..d9c3cc62b20e5 100644 --- a/content/docs/0.15.0/write_operations/index.html +++ b/content/docs/0.15.0/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/writing_data/index.html b/content/docs/0.15.0/writing_data/index.html index b3e470feca3d9..de5547c9827f3 100644 --- a/content/docs/0.15.0/writing_data/index.html +++ b/content/docs/0.15.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.15.0/writing_tables_streaming_writes/index.html b/content/docs/0.15.0/writing_tables_streaming_writes/index.html index 341c07a98be64..3dab8b5441075 100644 --- a/content/docs/0.15.0/writing_tables_streaming_writes/index.html +++ b/content/docs/0.15.0/writing_tables_streaming_writes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.0/admin_guide/index.html b/content/docs/0.5.0/admin_guide/index.html index dcffc74a37242..885186c286e3f 100644 --- a/content/docs/0.5.0/admin_guide/index.html +++ b/content/docs/0.5.0/admin_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.0/comparison/index.html b/content/docs/0.5.0/comparison/index.html index 473a48c217126..4a11830d56b86 100644 --- a/content/docs/0.5.0/comparison/index.html +++ b/content/docs/0.5.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.0/concepts/index.html b/content/docs/0.5.0/concepts/index.html index 5336bd9106b00..7f838fa14ea12 100644 --- a/content/docs/0.5.0/concepts/index.html +++ b/content/docs/0.5.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.0/configurations/index.html b/content/docs/0.5.0/configurations/index.html index 75db38b0b020b..57b763f436a8d 100644 --- a/content/docs/0.5.0/configurations/index.html +++ b/content/docs/0.5.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.0/docker_demo/index.html b/content/docs/0.5.0/docker_demo/index.html index a7dc1bfc82688..a21b2896987c8 100644 --- a/content/docs/0.5.0/docker_demo/index.html +++ b/content/docs/0.5.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.0/gcs_hoodie/index.html b/content/docs/0.5.0/gcs_hoodie/index.html index 7fbb9dacd0cb6..32986f1a231ac 100644 --- a/content/docs/0.5.0/gcs_hoodie/index.html +++ b/content/docs/0.5.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.0/migration_guide/index.html b/content/docs/0.5.0/migration_guide/index.html index 418eed9f56933..354a4eb395c65 100644 --- a/content/docs/0.5.0/migration_guide/index.html +++ b/content/docs/0.5.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.0/performance/index.html b/content/docs/0.5.0/performance/index.html index 69c34607e9e3d..fd42644cf1d6c 100644 --- a/content/docs/0.5.0/performance/index.html +++ b/content/docs/0.5.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.0/powered_by/index.html b/content/docs/0.5.0/powered_by/index.html index a4aebf31c5332..a5ab4a920bb5d 100644 --- a/content/docs/0.5.0/powered_by/index.html +++ b/content/docs/0.5.0/powered_by/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.0/privacy/index.html b/content/docs/0.5.0/privacy/index.html index 0d1c13a0448bc..6294d56637e03 100644 --- a/content/docs/0.5.0/privacy/index.html +++ b/content/docs/0.5.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.0/querying_data/index.html b/content/docs/0.5.0/querying_data/index.html index e6315df5d5f63..be5f7589e2ae5 100644 --- a/content/docs/0.5.0/querying_data/index.html +++ b/content/docs/0.5.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.0/quick-start-guide/index.html b/content/docs/0.5.0/quick-start-guide/index.html index 463095cfc1319..05d9fdf7d718b 100644 --- a/content/docs/0.5.0/quick-start-guide/index.html +++ b/content/docs/0.5.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.0/s3_hoodie/index.html b/content/docs/0.5.0/s3_hoodie/index.html index fb1c08e5dcc0a..895415f3c5e28 100644 --- a/content/docs/0.5.0/s3_hoodie/index.html +++ b/content/docs/0.5.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.0/structure/index.html b/content/docs/0.5.0/structure/index.html index 352e715a57fe6..956612dbb8229 100644 --- a/content/docs/0.5.0/structure/index.html +++ b/content/docs/0.5.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.0/use_cases/index.html b/content/docs/0.5.0/use_cases/index.html index 10ab9173f977e..0976aac361f85 100644 --- a/content/docs/0.5.0/use_cases/index.html +++ b/content/docs/0.5.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.0/writing_data/index.html b/content/docs/0.5.0/writing_data/index.html index 53393b9d848dc..6b4f18aa4cc9c 100644 --- a/content/docs/0.5.0/writing_data/index.html +++ b/content/docs/0.5.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.1/comparison/index.html b/content/docs/0.5.1/comparison/index.html index ba48e4a988b1a..c43e7d961d297 100644 --- a/content/docs/0.5.1/comparison/index.html +++ b/content/docs/0.5.1/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.1/concepts/index.html b/content/docs/0.5.1/concepts/index.html index fabdc9d699d3b..bcceecc1bed26 100644 --- a/content/docs/0.5.1/concepts/index.html +++ b/content/docs/0.5.1/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.1/configurations/index.html b/content/docs/0.5.1/configurations/index.html index e6ea3e4d35653..318684d39462f 100644 --- a/content/docs/0.5.1/configurations/index.html +++ b/content/docs/0.5.1/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.1/deployment/index.html b/content/docs/0.5.1/deployment/index.html index 39ef4d8a143b9..a2e58f01ac36d 100644 --- a/content/docs/0.5.1/deployment/index.html +++ b/content/docs/0.5.1/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.1/docker_demo/index.html b/content/docs/0.5.1/docker_demo/index.html index c3fef7ad9aac2..f890fc43bc2b9 100644 --- a/content/docs/0.5.1/docker_demo/index.html +++ b/content/docs/0.5.1/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.1/gcs_hoodie/index.html b/content/docs/0.5.1/gcs_hoodie/index.html index f6944003d5a5a..be9a246c11c7b 100644 --- a/content/docs/0.5.1/gcs_hoodie/index.html +++ b/content/docs/0.5.1/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.1/migration_guide/index.html b/content/docs/0.5.1/migration_guide/index.html index f7ea6d699671c..6dbfbcf2e9953 100644 --- a/content/docs/0.5.1/migration_guide/index.html +++ b/content/docs/0.5.1/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.1/performance/index.html b/content/docs/0.5.1/performance/index.html index 504da143f960e..2613cf772d596 100644 --- a/content/docs/0.5.1/performance/index.html +++ b/content/docs/0.5.1/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.1/powered_by/index.html b/content/docs/0.5.1/powered_by/index.html index ce64cdbfeec5b..ddba03f2e7f5a 100644 --- a/content/docs/0.5.1/powered_by/index.html +++ b/content/docs/0.5.1/powered_by/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.1/privacy/index.html b/content/docs/0.5.1/privacy/index.html index 4200b1f96b8e8..04f24caff265a 100644 --- a/content/docs/0.5.1/privacy/index.html +++ b/content/docs/0.5.1/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.1/querying_data/index.html b/content/docs/0.5.1/querying_data/index.html index 04deddf97aeb0..d39b52353a1c8 100644 --- a/content/docs/0.5.1/querying_data/index.html +++ b/content/docs/0.5.1/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.1/quick-start-guide/index.html b/content/docs/0.5.1/quick-start-guide/index.html index 299648e47798e..8211cc7f93c3f 100644 --- a/content/docs/0.5.1/quick-start-guide/index.html +++ b/content/docs/0.5.1/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.1/s3_hoodie/index.html b/content/docs/0.5.1/s3_hoodie/index.html index 0f5c2064acc17..bb3e92dc167df 100644 --- a/content/docs/0.5.1/s3_hoodie/index.html +++ b/content/docs/0.5.1/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.1/structure/index.html b/content/docs/0.5.1/structure/index.html index 303a4b083c023..00b67473a2588 100644 --- a/content/docs/0.5.1/structure/index.html +++ b/content/docs/0.5.1/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.1/use_cases/index.html b/content/docs/0.5.1/use_cases/index.html index 7fa2cc1db2a48..bdd1746c4cc13 100644 --- a/content/docs/0.5.1/use_cases/index.html +++ b/content/docs/0.5.1/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.1/writing_data/index.html b/content/docs/0.5.1/writing_data/index.html index 471071d7abc2d..10aa8a537fd14 100644 --- a/content/docs/0.5.1/writing_data/index.html +++ b/content/docs/0.5.1/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.2/comparison/index.html b/content/docs/0.5.2/comparison/index.html index 4dda9b57af0f1..c87ae0c7556e2 100644 --- a/content/docs/0.5.2/comparison/index.html +++ b/content/docs/0.5.2/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.2/concepts/index.html b/content/docs/0.5.2/concepts/index.html index 7c4674dab1734..f17fb7c153bd5 100644 --- a/content/docs/0.5.2/concepts/index.html +++ b/content/docs/0.5.2/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.2/configurations/index.html b/content/docs/0.5.2/configurations/index.html index 882336f5810c8..ef56c301ece0e 100644 --- a/content/docs/0.5.2/configurations/index.html +++ b/content/docs/0.5.2/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.2/deployment/index.html b/content/docs/0.5.2/deployment/index.html index 0943f4a17b338..0d113f20001da 100644 --- a/content/docs/0.5.2/deployment/index.html +++ b/content/docs/0.5.2/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.2/docker_demo/index.html b/content/docs/0.5.2/docker_demo/index.html index 6115b20eb5863..b817d78a2aca1 100644 --- a/content/docs/0.5.2/docker_demo/index.html +++ b/content/docs/0.5.2/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.2/gcs_hoodie/index.html b/content/docs/0.5.2/gcs_hoodie/index.html index 6db2a0db2242b..4bc998c9171a6 100644 --- a/content/docs/0.5.2/gcs_hoodie/index.html +++ b/content/docs/0.5.2/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.2/migration_guide/index.html b/content/docs/0.5.2/migration_guide/index.html index 3233787557e38..611b68172fe49 100644 --- a/content/docs/0.5.2/migration_guide/index.html +++ b/content/docs/0.5.2/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.2/performance/index.html b/content/docs/0.5.2/performance/index.html index ce6d25d022901..7719d762765da 100644 --- a/content/docs/0.5.2/performance/index.html +++ b/content/docs/0.5.2/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.2/powered_by/index.html b/content/docs/0.5.2/powered_by/index.html index 976e92ee608a8..b05ec62e3abf1 100644 --- a/content/docs/0.5.2/powered_by/index.html +++ b/content/docs/0.5.2/powered_by/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.2/privacy/index.html b/content/docs/0.5.2/privacy/index.html index a3d17d756f7c3..428561856368f 100644 --- a/content/docs/0.5.2/privacy/index.html +++ b/content/docs/0.5.2/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.2/querying_data/index.html b/content/docs/0.5.2/querying_data/index.html index e1c9a09770244..2bd30448c25f4 100644 --- a/content/docs/0.5.2/querying_data/index.html +++ b/content/docs/0.5.2/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.2/quick-start-guide/index.html b/content/docs/0.5.2/quick-start-guide/index.html index 99c7b426423ac..cd91483ad0018 100644 --- a/content/docs/0.5.2/quick-start-guide/index.html +++ b/content/docs/0.5.2/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.2/s3_hoodie/index.html b/content/docs/0.5.2/s3_hoodie/index.html index 54e4b1dbf68c5..66d9a30034acb 100644 --- a/content/docs/0.5.2/s3_hoodie/index.html +++ b/content/docs/0.5.2/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.2/structure/index.html b/content/docs/0.5.2/structure/index.html index dc0416a86eed4..9033cda07a8c2 100644 --- a/content/docs/0.5.2/structure/index.html +++ b/content/docs/0.5.2/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.2/use_cases/index.html b/content/docs/0.5.2/use_cases/index.html index 3ad7a79469ca3..f0a85f0fe10f7 100644 --- a/content/docs/0.5.2/use_cases/index.html +++ b/content/docs/0.5.2/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.2/writing_data/index.html b/content/docs/0.5.2/writing_data/index.html index 73f9bc5cce4c5..fa9c70e3f8efc 100644 --- a/content/docs/0.5.2/writing_data/index.html +++ b/content/docs/0.5.2/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.3/azure_hoodie/index.html b/content/docs/0.5.3/azure_hoodie/index.html index a107b43143b4c..e4b7a9c53afae 100644 --- a/content/docs/0.5.3/azure_hoodie/index.html +++ b/content/docs/0.5.3/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.3/cloud/index.html b/content/docs/0.5.3/cloud/index.html index 6738d498e3826..312f3246a2f4c 100644 --- a/content/docs/0.5.3/cloud/index.html +++ b/content/docs/0.5.3/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.3/comparison/index.html b/content/docs/0.5.3/comparison/index.html index 6bb95246c25ee..af15ab7cf5ef8 100644 --- a/content/docs/0.5.3/comparison/index.html +++ b/content/docs/0.5.3/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.3/concepts/index.html b/content/docs/0.5.3/concepts/index.html index f8d037ef08d43..1aec7d26f51e4 100644 --- a/content/docs/0.5.3/concepts/index.html +++ b/content/docs/0.5.3/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.3/configurations/index.html b/content/docs/0.5.3/configurations/index.html index 2819b6b83ac45..89785788d23d2 100644 --- a/content/docs/0.5.3/configurations/index.html +++ b/content/docs/0.5.3/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.3/deployment/index.html b/content/docs/0.5.3/deployment/index.html index 866012227d902..623c5a5205da1 100644 --- a/content/docs/0.5.3/deployment/index.html +++ b/content/docs/0.5.3/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.3/docker_demo/index.html b/content/docs/0.5.3/docker_demo/index.html index 08d959521af06..331d61f3d73c9 100644 --- a/content/docs/0.5.3/docker_demo/index.html +++ b/content/docs/0.5.3/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.3/gcs_hoodie/index.html b/content/docs/0.5.3/gcs_hoodie/index.html index 5b31a641f6a26..a04b752fe2213 100644 --- a/content/docs/0.5.3/gcs_hoodie/index.html +++ b/content/docs/0.5.3/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.3/migration_guide/index.html b/content/docs/0.5.3/migration_guide/index.html index 9e0c84ae82601..faec5da3c8484 100644 --- a/content/docs/0.5.3/migration_guide/index.html +++ b/content/docs/0.5.3/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.3/oss_hoodie/index.html b/content/docs/0.5.3/oss_hoodie/index.html index bf6c10a5179db..35c78b7a7a0ef 100644 --- a/content/docs/0.5.3/oss_hoodie/index.html +++ b/content/docs/0.5.3/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.3/performance/index.html b/content/docs/0.5.3/performance/index.html index 8d2865ad14d76..a270d446f7086 100644 --- a/content/docs/0.5.3/performance/index.html +++ b/content/docs/0.5.3/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.3/powered_by/index.html b/content/docs/0.5.3/powered_by/index.html index 2f671449baf56..eef7dfa4489bf 100644 --- a/content/docs/0.5.3/powered_by/index.html +++ b/content/docs/0.5.3/powered_by/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.3/privacy/index.html b/content/docs/0.5.3/privacy/index.html index 5f1b1077a5ecf..dc06d89b642c9 100644 --- a/content/docs/0.5.3/privacy/index.html +++ b/content/docs/0.5.3/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.3/querying_data/index.html b/content/docs/0.5.3/querying_data/index.html index 447dc1c1dab3a..5591631a48df3 100644 --- a/content/docs/0.5.3/querying_data/index.html +++ b/content/docs/0.5.3/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.3/quick-start-guide/index.html b/content/docs/0.5.3/quick-start-guide/index.html index e00f33b70cd97..3c21960e7042b 100644 --- a/content/docs/0.5.3/quick-start-guide/index.html +++ b/content/docs/0.5.3/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.3/s3_hoodie/index.html b/content/docs/0.5.3/s3_hoodie/index.html index d287785aae5ce..669f3cacb9962 100644 --- a/content/docs/0.5.3/s3_hoodie/index.html +++ b/content/docs/0.5.3/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.3/structure/index.html b/content/docs/0.5.3/structure/index.html index a97c5c22c8005..18bdc9c058001 100644 --- a/content/docs/0.5.3/structure/index.html +++ b/content/docs/0.5.3/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.3/use_cases/index.html b/content/docs/0.5.3/use_cases/index.html index 0b0cfd13e1dd5..03e3c1e798a71 100644 --- a/content/docs/0.5.3/use_cases/index.html +++ b/content/docs/0.5.3/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.5.3/writing_data/index.html b/content/docs/0.5.3/writing_data/index.html index 0baa2d6d80568..a664b02b3f56e 100644 --- a/content/docs/0.5.3/writing_data/index.html +++ b/content/docs/0.5.3/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/1_2_structure/index.html b/content/docs/0.6.0/1_2_structure/index.html index 8a68b5b4606e2..97818d987ac32 100644 --- a/content/docs/0.6.0/1_2_structure/index.html +++ b/content/docs/0.6.0/1_2_structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/2_8_metrics/index.html b/content/docs/0.6.0/2_8_metrics/index.html index 59f42b43f8127..b5538152ad463 100644 --- a/content/docs/0.6.0/2_8_metrics/index.html +++ b/content/docs/0.6.0/2_8_metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/azure_hoodie/index.html b/content/docs/0.6.0/azure_hoodie/index.html index 2bda03b7579ee..52fd14f7acc83 100644 --- a/content/docs/0.6.0/azure_hoodie/index.html +++ b/content/docs/0.6.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/cloud/index.html b/content/docs/0.6.0/cloud/index.html index 27d086083d6f2..1de94b2e54b3a 100644 --- a/content/docs/0.6.0/cloud/index.html +++ b/content/docs/0.6.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/comparison/index.html b/content/docs/0.6.0/comparison/index.html index e714e369fa09e..863d3de595eb1 100644 --- a/content/docs/0.6.0/comparison/index.html +++ b/content/docs/0.6.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/concepts/index.html b/content/docs/0.6.0/concepts/index.html index 3c5b9cbecc99e..e1a8b0b5e2b80 100644 --- a/content/docs/0.6.0/concepts/index.html +++ b/content/docs/0.6.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/configurations/index.html b/content/docs/0.6.0/configurations/index.html index 5d210642646c6..742309196de81 100644 --- a/content/docs/0.6.0/configurations/index.html +++ b/content/docs/0.6.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/cos_hoodie/index.html b/content/docs/0.6.0/cos_hoodie/index.html index 70dac107bccc6..107d89d5d18fc 100644 --- a/content/docs/0.6.0/cos_hoodie/index.html +++ b/content/docs/0.6.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/deployment/index.html b/content/docs/0.6.0/deployment/index.html index 4b71c05399794..5ba3984fc7d19 100644 --- a/content/docs/0.6.0/deployment/index.html +++ b/content/docs/0.6.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/docker_demo/index.html b/content/docs/0.6.0/docker_demo/index.html index 136fbf8b34bdf..e7bb8df409d3f 100644 --- a/content/docs/0.6.0/docker_demo/index.html +++ b/content/docs/0.6.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/gcs_hoodie/index.html b/content/docs/0.6.0/gcs_hoodie/index.html index c87a575ba44c2..eb35e1bcd83b5 100644 --- a/content/docs/0.6.0/gcs_hoodie/index.html +++ b/content/docs/0.6.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/migration_guide/index.html b/content/docs/0.6.0/migration_guide/index.html index 577d41193102e..a0a8ad22c75b9 100644 --- a/content/docs/0.6.0/migration_guide/index.html +++ b/content/docs/0.6.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/oss_hoodie/index.html b/content/docs/0.6.0/oss_hoodie/index.html index 0b4f922ccaf67..b568385de9b2e 100644 --- a/content/docs/0.6.0/oss_hoodie/index.html +++ b/content/docs/0.6.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/performance/index.html b/content/docs/0.6.0/performance/index.html index 2422b5d6b8df0..56671e7e19715 100644 --- a/content/docs/0.6.0/performance/index.html +++ b/content/docs/0.6.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/powered_by/index.html b/content/docs/0.6.0/powered_by/index.html index c93d41e0c4cb9..4944430ad780e 100644 --- a/content/docs/0.6.0/powered_by/index.html +++ b/content/docs/0.6.0/powered_by/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/privacy/index.html b/content/docs/0.6.0/privacy/index.html index c03b7d986417a..987088d3d5431 100644 --- a/content/docs/0.6.0/privacy/index.html +++ b/content/docs/0.6.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/querying_data/index.html b/content/docs/0.6.0/querying_data/index.html index bc15fa058481e..12b1205feab6f 100644 --- a/content/docs/0.6.0/querying_data/index.html +++ b/content/docs/0.6.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/quick-start-guide/index.html b/content/docs/0.6.0/quick-start-guide/index.html index 10b135f6cc0b8..4110d7ec9ade9 100644 --- a/content/docs/0.6.0/quick-start-guide/index.html +++ b/content/docs/0.6.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/s3_hoodie/index.html b/content/docs/0.6.0/s3_hoodie/index.html index 4fe15eb65be6d..afd2c2d55ee49 100644 --- a/content/docs/0.6.0/s3_hoodie/index.html +++ b/content/docs/0.6.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/use_cases/index.html b/content/docs/0.6.0/use_cases/index.html index 08fdd0ab26a5f..fb371b407fd99 100644 --- a/content/docs/0.6.0/use_cases/index.html +++ b/content/docs/0.6.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.6.0/writing_data/index.html b/content/docs/0.6.0/writing_data/index.html index 355cda54bca9b..3b3f7bf4561af 100644 --- a/content/docs/0.6.0/writing_data/index.html +++ b/content/docs/0.6.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/azure_hoodie/index.html b/content/docs/0.7.0/azure_hoodie/index.html index 465b965b973fa..0e7443875a787 100644 --- a/content/docs/0.7.0/azure_hoodie/index.html +++ b/content/docs/0.7.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/cloud/index.html b/content/docs/0.7.0/cloud/index.html index 1e04ca8099319..51a4bed1f2663 100644 --- a/content/docs/0.7.0/cloud/index.html +++ b/content/docs/0.7.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/comparison/index.html b/content/docs/0.7.0/comparison/index.html index 7421252b32033..4608da7f17b16 100644 --- a/content/docs/0.7.0/comparison/index.html +++ b/content/docs/0.7.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/concepts/index.html b/content/docs/0.7.0/concepts/index.html index 7d06f1d8b16fe..eeabe7ec76a46 100644 --- a/content/docs/0.7.0/concepts/index.html +++ b/content/docs/0.7.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/configurations/index.html b/content/docs/0.7.0/configurations/index.html index d1ea484c44367..30672e2c24844 100644 --- a/content/docs/0.7.0/configurations/index.html +++ b/content/docs/0.7.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/cos_hoodie/index.html b/content/docs/0.7.0/cos_hoodie/index.html index 9542bb1f4a788..04ddbceafb421 100644 --- a/content/docs/0.7.0/cos_hoodie/index.html +++ b/content/docs/0.7.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/deployment/index.html b/content/docs/0.7.0/deployment/index.html index 058da3d1d35ed..bb865b59fdf97 100644 --- a/content/docs/0.7.0/deployment/index.html +++ b/content/docs/0.7.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/docker_demo/index.html b/content/docs/0.7.0/docker_demo/index.html index e8cfb77b8fb12..4ca3aa2ea0fe2 100644 --- a/content/docs/0.7.0/docker_demo/index.html +++ b/content/docs/0.7.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/gcs_hoodie/index.html b/content/docs/0.7.0/gcs_hoodie/index.html index e7b8a14dffa48..d4d7b22931980 100644 --- a/content/docs/0.7.0/gcs_hoodie/index.html +++ b/content/docs/0.7.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/ibm_cos_hoodie/index.html b/content/docs/0.7.0/ibm_cos_hoodie/index.html index 1d676bb771a94..7f2021c30f7d0 100644 --- a/content/docs/0.7.0/ibm_cos_hoodie/index.html +++ b/content/docs/0.7.0/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/metrics/index.html b/content/docs/0.7.0/metrics/index.html index 5f0fe9401c477..853e99a93325e 100644 --- a/content/docs/0.7.0/metrics/index.html +++ b/content/docs/0.7.0/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/migration_guide/index.html b/content/docs/0.7.0/migration_guide/index.html index a02dbc68e405d..af649ba640af1 100644 --- a/content/docs/0.7.0/migration_guide/index.html +++ b/content/docs/0.7.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/oss_hoodie/index.html b/content/docs/0.7.0/oss_hoodie/index.html index fea02f1e44fca..f6296333ba032 100644 --- a/content/docs/0.7.0/oss_hoodie/index.html +++ b/content/docs/0.7.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/overview/index.html b/content/docs/0.7.0/overview/index.html index 4a8d4b6f6e18a..d96a80d695133 100644 --- a/content/docs/0.7.0/overview/index.html +++ b/content/docs/0.7.0/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/performance/index.html b/content/docs/0.7.0/performance/index.html index e1d1587726e2c..d2eddc1013d62 100644 --- a/content/docs/0.7.0/performance/index.html +++ b/content/docs/0.7.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/powered_by/index.html b/content/docs/0.7.0/powered_by/index.html index 2377b98d3b4d7..6141bee191a7f 100644 --- a/content/docs/0.7.0/powered_by/index.html +++ b/content/docs/0.7.0/powered_by/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/privacy/index.html b/content/docs/0.7.0/privacy/index.html index 7d02e2dee533e..51c1079f785a7 100644 --- a/content/docs/0.7.0/privacy/index.html +++ b/content/docs/0.7.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/querying_data/index.html b/content/docs/0.7.0/querying_data/index.html index a835fc8c1602a..de5a162d50503 100644 --- a/content/docs/0.7.0/querying_data/index.html +++ b/content/docs/0.7.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/quick-start-guide/index.html b/content/docs/0.7.0/quick-start-guide/index.html index ce161822d2c69..4880e908586f6 100644 --- a/content/docs/0.7.0/quick-start-guide/index.html +++ b/content/docs/0.7.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/s3_hoodie/index.html b/content/docs/0.7.0/s3_hoodie/index.html index 81a258f28ebac..0636de7236c14 100644 --- a/content/docs/0.7.0/s3_hoodie/index.html +++ b/content/docs/0.7.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/structure/index.html b/content/docs/0.7.0/structure/index.html index 071a9460ea324..38070b5e15b0e 100644 --- a/content/docs/0.7.0/structure/index.html +++ b/content/docs/0.7.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/use_cases/index.html b/content/docs/0.7.0/use_cases/index.html index ca3e5eb260fad..68bcf1a401680 100644 --- a/content/docs/0.7.0/use_cases/index.html +++ b/content/docs/0.7.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.7.0/writing_data/index.html b/content/docs/0.7.0/writing_data/index.html index 8a1132913b7bc..d258dd42b06e0 100644 --- a/content/docs/0.7.0/writing_data/index.html +++ b/content/docs/0.7.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/azure_hoodie/index.html b/content/docs/0.8.0/azure_hoodie/index.html index a97ae5c6c8893..a3c265babf7df 100644 --- a/content/docs/0.8.0/azure_hoodie/index.html +++ b/content/docs/0.8.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/cloud/index.html b/content/docs/0.8.0/cloud/index.html index 3a1b35705f1fe..b374e59b76f08 100644 --- a/content/docs/0.8.0/cloud/index.html +++ b/content/docs/0.8.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/comparison/index.html b/content/docs/0.8.0/comparison/index.html index 418371a9baf3d..e01088fa55772 100644 --- a/content/docs/0.8.0/comparison/index.html +++ b/content/docs/0.8.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/concepts/index.html b/content/docs/0.8.0/concepts/index.html index 0b9b435b5aae1..3610cde1be4f3 100644 --- a/content/docs/0.8.0/concepts/index.html +++ b/content/docs/0.8.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/concurrency_control/index.html b/content/docs/0.8.0/concurrency_control/index.html index 1f2eaeb9da340..185dd8740603b 100644 --- a/content/docs/0.8.0/concurrency_control/index.html +++ b/content/docs/0.8.0/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/configurations/index.html b/content/docs/0.8.0/configurations/index.html index 56a2d59622314..fde633cde600d 100644 --- a/content/docs/0.8.0/configurations/index.html +++ b/content/docs/0.8.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/cos_hoodie/index.html b/content/docs/0.8.0/cos_hoodie/index.html index f60dc138a9fd2..3a55bfcec2d0c 100644 --- a/content/docs/0.8.0/cos_hoodie/index.html +++ b/content/docs/0.8.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/deployment/index.html b/content/docs/0.8.0/deployment/index.html index 9170c6fe3135a..9fcfd0ec0e9c7 100644 --- a/content/docs/0.8.0/deployment/index.html +++ b/content/docs/0.8.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/docker_demo/index.html b/content/docs/0.8.0/docker_demo/index.html index f76c40dcdd958..6615208254d4e 100644 --- a/content/docs/0.8.0/docker_demo/index.html +++ b/content/docs/0.8.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/flink-quick-start-guide/index.html b/content/docs/0.8.0/flink-quick-start-guide/index.html index e3ac5d63a6fba..0ebe55216bf74 100644 --- a/content/docs/0.8.0/flink-quick-start-guide/index.html +++ b/content/docs/0.8.0/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/gcs_hoodie/index.html b/content/docs/0.8.0/gcs_hoodie/index.html index d161977e9ba03..6c8fe15244f9a 100644 --- a/content/docs/0.8.0/gcs_hoodie/index.html +++ b/content/docs/0.8.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/ibm_cos_hoodie/index.html b/content/docs/0.8.0/ibm_cos_hoodie/index.html index b2501c186add2..ec03562bd2cad 100644 --- a/content/docs/0.8.0/ibm_cos_hoodie/index.html +++ b/content/docs/0.8.0/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/metrics/index.html b/content/docs/0.8.0/metrics/index.html index 9c06249afdd5d..42e44531f2677 100644 --- a/content/docs/0.8.0/metrics/index.html +++ b/content/docs/0.8.0/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/migration_guide/index.html b/content/docs/0.8.0/migration_guide/index.html index 330bfe6f9852d..82f9ed48f4522 100644 --- a/content/docs/0.8.0/migration_guide/index.html +++ b/content/docs/0.8.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/oss_hoodie/index.html b/content/docs/0.8.0/oss_hoodie/index.html index 4c4a4e4459c1b..649282cd50d62 100644 --- a/content/docs/0.8.0/oss_hoodie/index.html +++ b/content/docs/0.8.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/overview/index.html b/content/docs/0.8.0/overview/index.html index f0d201137e9c7..aa82ef99754c5 100644 --- a/content/docs/0.8.0/overview/index.html +++ b/content/docs/0.8.0/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/performance/index.html b/content/docs/0.8.0/performance/index.html index 5f919d52874f1..72e3d1a82ba5e 100644 --- a/content/docs/0.8.0/performance/index.html +++ b/content/docs/0.8.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/powered_by/index.html b/content/docs/0.8.0/powered_by/index.html index ad8623e26b280..f26cee611c336 100644 --- a/content/docs/0.8.0/powered_by/index.html +++ b/content/docs/0.8.0/powered_by/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/privacy/index.html b/content/docs/0.8.0/privacy/index.html index c3cbfad6439bc..4a787ced993af 100644 --- a/content/docs/0.8.0/privacy/index.html +++ b/content/docs/0.8.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/querying_data/index.html b/content/docs/0.8.0/querying_data/index.html index 898637abde53a..2314931e9a488 100644 --- a/content/docs/0.8.0/querying_data/index.html +++ b/content/docs/0.8.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/quick-start-guide/index.html b/content/docs/0.8.0/quick-start-guide/index.html index b27fa1d3358ac..33e687b57f1e7 100644 --- a/content/docs/0.8.0/quick-start-guide/index.html +++ b/content/docs/0.8.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/s3_hoodie/index.html b/content/docs/0.8.0/s3_hoodie/index.html index cf60e27ace2d4..dd8e4d068ac76 100644 --- a/content/docs/0.8.0/s3_hoodie/index.html +++ b/content/docs/0.8.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/structure/index.html b/content/docs/0.8.0/structure/index.html index 819c7a8522dea..cdcb9cc21da56 100644 --- a/content/docs/0.8.0/structure/index.html +++ b/content/docs/0.8.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/use_cases/index.html b/content/docs/0.8.0/use_cases/index.html index f8f1aecc794e2..e0b59441b1119 100644 --- a/content/docs/0.8.0/use_cases/index.html +++ b/content/docs/0.8.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.8.0/writing_data/index.html b/content/docs/0.8.0/writing_data/index.html index 6dd58929f066c..2efb37f7cfa0b 100644 --- a/content/docs/0.8.0/writing_data/index.html +++ b/content/docs/0.8.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/azure_hoodie/index.html b/content/docs/0.9.0/azure_hoodie/index.html index 793c4e5291a0b..33f1ff90d886e 100644 --- a/content/docs/0.9.0/azure_hoodie/index.html +++ b/content/docs/0.9.0/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/bos_hoodie/index.html b/content/docs/0.9.0/bos_hoodie/index.html index 874eebb8e910d..46fd10b881fb1 100644 --- a/content/docs/0.9.0/bos_hoodie/index.html +++ b/content/docs/0.9.0/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/cli/index.html b/content/docs/0.9.0/cli/index.html index 490aa4fa61b61..a51649e04ae06 100644 --- a/content/docs/0.9.0/cli/index.html +++ b/content/docs/0.9.0/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/cloud/index.html b/content/docs/0.9.0/cloud/index.html index 64537e6b27030..dc1926b1056dd 100644 --- a/content/docs/0.9.0/cloud/index.html +++ b/content/docs/0.9.0/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/comparison/index.html b/content/docs/0.9.0/comparison/index.html index a856c22ab1198..e0e958955b68f 100644 --- a/content/docs/0.9.0/comparison/index.html +++ b/content/docs/0.9.0/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/concepts/index.html b/content/docs/0.9.0/concepts/index.html index 84e8ab38414a8..df135ba65178e 100644 --- a/content/docs/0.9.0/concepts/index.html +++ b/content/docs/0.9.0/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/concurrency_control/index.html b/content/docs/0.9.0/concurrency_control/index.html index 77304f440d30d..dd2badd46ddaa 100644 --- a/content/docs/0.9.0/concurrency_control/index.html +++ b/content/docs/0.9.0/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/configurations/index.html b/content/docs/0.9.0/configurations/index.html index 402a7db2abcbd..04b53be0cced0 100644 --- a/content/docs/0.9.0/configurations/index.html +++ b/content/docs/0.9.0/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/cos_hoodie/index.html b/content/docs/0.9.0/cos_hoodie/index.html index ca99a51cf6993..fa92ba31ea1e8 100644 --- a/content/docs/0.9.0/cos_hoodie/index.html +++ b/content/docs/0.9.0/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/deployment/index.html b/content/docs/0.9.0/deployment/index.html index 9ed1b2d6d9b90..212388f57e504 100644 --- a/content/docs/0.9.0/deployment/index.html +++ b/content/docs/0.9.0/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/docker_demo/index.html b/content/docs/0.9.0/docker_demo/index.html index 911745bdc584d..79ca43924a6f6 100644 --- a/content/docs/0.9.0/docker_demo/index.html +++ b/content/docs/0.9.0/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/flink-quick-start-guide/index.html b/content/docs/0.9.0/flink-quick-start-guide/index.html index b1d15d1681073..fb6ef17717893 100644 --- a/content/docs/0.9.0/flink-quick-start-guide/index.html +++ b/content/docs/0.9.0/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/gcs_hoodie/index.html b/content/docs/0.9.0/gcs_hoodie/index.html index 7c6fabff493c5..b52faf3f88ba3 100644 --- a/content/docs/0.9.0/gcs_hoodie/index.html +++ b/content/docs/0.9.0/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/hoodie_deltastreamer/index.html b/content/docs/0.9.0/hoodie_deltastreamer/index.html index a4ee2c78be550..9ae1c523ffb4c 100644 --- a/content/docs/0.9.0/hoodie_deltastreamer/index.html +++ b/content/docs/0.9.0/hoodie_deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/ibm_cos_hoodie/index.html b/content/docs/0.9.0/ibm_cos_hoodie/index.html index df6391b6865a2..8072e858dd73b 100644 --- a/content/docs/0.9.0/ibm_cos_hoodie/index.html +++ b/content/docs/0.9.0/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/metrics/index.html b/content/docs/0.9.0/metrics/index.html index 803b7d89bfb4c..23406ba54cfad 100644 --- a/content/docs/0.9.0/metrics/index.html +++ b/content/docs/0.9.0/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/migration_guide/index.html b/content/docs/0.9.0/migration_guide/index.html index 5fe4f9f84ad2c..6445fc4681025 100644 --- a/content/docs/0.9.0/migration_guide/index.html +++ b/content/docs/0.9.0/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/oss_hoodie/index.html b/content/docs/0.9.0/oss_hoodie/index.html index 789a72a2e390c..35d830c69b05e 100644 --- a/content/docs/0.9.0/oss_hoodie/index.html +++ b/content/docs/0.9.0/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/overview/index.html b/content/docs/0.9.0/overview/index.html index 989754c62d949..f441ad5e09962 100644 --- a/content/docs/0.9.0/overview/index.html +++ b/content/docs/0.9.0/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/performance/index.html b/content/docs/0.9.0/performance/index.html index ac1bdc38b87ab..5fd01e47dd9ba 100644 --- a/content/docs/0.9.0/performance/index.html +++ b/content/docs/0.9.0/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/privacy/index.html b/content/docs/0.9.0/privacy/index.html index 4cc2a25018a05..1b0ad39692947 100644 --- a/content/docs/0.9.0/privacy/index.html +++ b/content/docs/0.9.0/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/query_engine_setup/index.html b/content/docs/0.9.0/query_engine_setup/index.html index edac702050fa0..dddea9e764253 100644 --- a/content/docs/0.9.0/query_engine_setup/index.html +++ b/content/docs/0.9.0/query_engine_setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/querying_data/index.html b/content/docs/0.9.0/querying_data/index.html index 2b311134ffed8..67c34676bcf2a 100644 --- a/content/docs/0.9.0/querying_data/index.html +++ b/content/docs/0.9.0/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/quick-start-guide/index.html b/content/docs/0.9.0/quick-start-guide/index.html index 20634a24ed249..60a428fe2d8ff 100644 --- a/content/docs/0.9.0/quick-start-guide/index.html +++ b/content/docs/0.9.0/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/s3_hoodie/index.html b/content/docs/0.9.0/s3_hoodie/index.html index 1689ec735f6ca..3b790b25ce525 100644 --- a/content/docs/0.9.0/s3_hoodie/index.html +++ b/content/docs/0.9.0/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/schema_evolution/index.html b/content/docs/0.9.0/schema_evolution/index.html index f7e9669748b9a..09934c78c98e7 100644 --- a/content/docs/0.9.0/schema_evolution/index.html +++ b/content/docs/0.9.0/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/structure/index.html b/content/docs/0.9.0/structure/index.html index b807dd3c0c4cc..3f5b7007de127 100644 --- a/content/docs/0.9.0/structure/index.html +++ b/content/docs/0.9.0/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/table_types/index.html b/content/docs/0.9.0/table_types/index.html index 098582d48d29f..35ff4a8e310c2 100644 --- a/content/docs/0.9.0/table_types/index.html +++ b/content/docs/0.9.0/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/use_cases/index.html b/content/docs/0.9.0/use_cases/index.html index bfade7094c4fe..a4f8466c9fd13 100644 --- a/content/docs/0.9.0/use_cases/index.html +++ b/content/docs/0.9.0/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/0.9.0/writing_data/index.html b/content/docs/0.9.0/writing_data/index.html index 3546d4ac701b3..6d56bc2ad9b13 100644 --- a/content/docs/0.9.0/writing_data/index.html +++ b/content/docs/0.9.0/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/azure_hoodie/index.html b/content/docs/azure_hoodie/index.html index f0cbbf904c219..86311abe48325 100644 --- a/content/docs/azure_hoodie/index.html +++ b/content/docs/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/basic_configurations/index.html b/content/docs/basic_configurations/index.html index 092f3c9332a9f..5ad2fc6bd0563 100644 --- a/content/docs/basic_configurations/index.html +++ b/content/docs/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/bos_hoodie/index.html b/content/docs/bos_hoodie/index.html index e764cf07ab9c9..d5f6640a00298 100644 --- a/content/docs/bos_hoodie/index.html +++ b/content/docs/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/cleaning/index.html b/content/docs/cleaning/index.html index 5535d8d4a1f97..4933f56d7ebbb 100644 --- a/content/docs/cleaning/index.html +++ b/content/docs/cleaning/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/cli/index.html b/content/docs/cli/index.html index dc1134cb52952..87f9dad582a4b 100644 --- a/content/docs/cli/index.html +++ b/content/docs/cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/cloud/index.html b/content/docs/cloud/index.html index 60d8c27d7a830..05ab807991e78 100644 --- a/content/docs/cloud/index.html +++ b/content/docs/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/clustering/index.html b/content/docs/clustering/index.html index 647235b0d9376..79d80df5bd8af 100644 --- a/content/docs/clustering/index.html +++ b/content/docs/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/compaction/index.html b/content/docs/compaction/index.html index 0005d30987bbe..cc58f30686bde 100644 --- a/content/docs/compaction/index.html +++ b/content/docs/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/comparison/index.html b/content/docs/comparison/index.html index 8602d16af6e3c..002dc400c549c 100644 --- a/content/docs/comparison/index.html +++ b/content/docs/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/concepts/index.html b/content/docs/concepts/index.html index 1c4ef0c2a18c7..60b810454ba1e 100644 --- a/content/docs/concepts/index.html +++ b/content/docs/concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/concurrency_control/index.html b/content/docs/concurrency_control/index.html index b6a603e1acf86..44fd281267ffd 100644 --- a/content/docs/concurrency_control/index.html +++ b/content/docs/concurrency_control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/configurations/index.html b/content/docs/configurations/index.html index 4e431de31cc3c..52ee855b7b3ef 100644 --- a/content/docs/configurations/index.html +++ b/content/docs/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/cos_hoodie/index.html b/content/docs/cos_hoodie/index.html index eb270eb1fb64c..2c3abb8586fb6 100644 --- a/content/docs/cos_hoodie/index.html +++ b/content/docs/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/deployment/index.html b/content/docs/deployment/index.html index 02a1cb9ba0f8e..4882d9128af27 100644 --- a/content/docs/deployment/index.html +++ b/content/docs/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/disaster_recovery/index.html b/content/docs/disaster_recovery/index.html index 18a6d45f897f4..0817422e2ad6e 100644 --- a/content/docs/disaster_recovery/index.html +++ b/content/docs/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/docker_demo/index.html b/content/docs/docker_demo/index.html index 399500d65472e..9f8c5155c8d5a 100644 --- a/content/docs/docker_demo/index.html +++ b/content/docs/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/encryption/index.html b/content/docs/encryption/index.html index 76f58230ded77..8dc74a500cf0c 100644 --- a/content/docs/encryption/index.html +++ b/content/docs/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/faq/index.html b/content/docs/faq/index.html index 95e17ca137616..7542675a9763a 100644 --- a/content/docs/faq/index.html +++ b/content/docs/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/faq_design_and_concepts/index.html b/content/docs/faq_design_and_concepts/index.html index 1fb3b20836682..f52faeef6f69c 100644 --- a/content/docs/faq_design_and_concepts/index.html +++ b/content/docs/faq_design_and_concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/faq_general/index.html b/content/docs/faq_general/index.html index 24095301423ed..093296c125bba 100644 --- a/content/docs/faq_general/index.html +++ b/content/docs/faq_general/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/faq_integrations/index.html b/content/docs/faq_integrations/index.html index a00b0c389e386..7a9848ae2c553 100644 --- a/content/docs/faq_integrations/index.html +++ b/content/docs/faq_integrations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/faq_reading_tables/index.html b/content/docs/faq_reading_tables/index.html index 6553c04c336c8..058f1bcdf37f7 100644 --- a/content/docs/faq_reading_tables/index.html +++ b/content/docs/faq_reading_tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/faq_storage/index.html b/content/docs/faq_storage/index.html index 90fd7415045f8..32355aa20dda2 100644 --- a/content/docs/faq_storage/index.html +++ b/content/docs/faq_storage/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/faq_table_services/index.html b/content/docs/faq_table_services/index.html index 042e668d52438..8a7c91cd8622e 100644 --- a/content/docs/faq_table_services/index.html +++ b/content/docs/faq_table_services/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/faq_writing_tables/index.html b/content/docs/faq_writing_tables/index.html index 26554a1aeef64..0b651f807c8a9 100644 --- a/content/docs/faq_writing_tables/index.html +++ b/content/docs/faq_writing_tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/file_sizing/index.html b/content/docs/file_sizing/index.html index 690badc94b1e3..dacb411c658e0 100644 --- a/content/docs/file_sizing/index.html +++ b/content/docs/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/flink-quick-start-guide/index.html b/content/docs/flink-quick-start-guide/index.html index f236bd83c9493..6ceefe2c56623 100644 --- a/content/docs/flink-quick-start-guide/index.html +++ b/content/docs/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/flink_tuning/index.html b/content/docs/flink_tuning/index.html index 4e351aa1ca21e..a931cff5920aa 100644 --- a/content/docs/flink_tuning/index.html +++ b/content/docs/flink_tuning/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/gcp_bigquery/index.html b/content/docs/gcp_bigquery/index.html index 5e129a0f786a9..263979cc32f17 100644 --- a/content/docs/gcp_bigquery/index.html +++ b/content/docs/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/gcs_hoodie/index.html b/content/docs/gcs_hoodie/index.html index 229bc2bad299c..cfe36e7eb51e1 100644 --- a/content/docs/gcs_hoodie/index.html +++ b/content/docs/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/hoodie_streaming_ingestion/index.html b/content/docs/hoodie_streaming_ingestion/index.html index 935c885a431dd..4800f06216918 100644 --- a/content/docs/hoodie_streaming_ingestion/index.html +++ b/content/docs/hoodie_streaming_ingestion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/hudi_stack/index.html b/content/docs/hudi_stack/index.html index 19c13a90bf846..20909b709f25f 100644 --- a/content/docs/hudi_stack/index.html +++ b/content/docs/hudi_stack/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/ibm_cos_hoodie/index.html b/content/docs/ibm_cos_hoodie/index.html index c83fb3266570b..26203f254fe94 100644 --- a/content/docs/ibm_cos_hoodie/index.html +++ b/content/docs/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/indexes/index.html b/content/docs/indexes/index.html index bd097b6f4dfb1..8a4d43fd23e23 100644 --- a/content/docs/indexes/index.html +++ b/content/docs/indexes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/ingestion_flink/index.html b/content/docs/ingestion_flink/index.html index 3528c3b1a1c10..661a383d199b8 100644 --- a/content/docs/ingestion_flink/index.html +++ b/content/docs/ingestion_flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/ingestion_kafka_connect/index.html b/content/docs/ingestion_kafka_connect/index.html index 8be4de795fda6..101cc46d26a09 100644 --- a/content/docs/ingestion_kafka_connect/index.html +++ b/content/docs/ingestion_kafka_connect/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/intro/index.html b/content/docs/intro/index.html index 462bba4440a01..842b90185e2e8 100644 --- a/content/docs/intro/index.html +++ b/content/docs/intro/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/jfs_hoodie/index.html b/content/docs/jfs_hoodie/index.html index 462ea52900ba3..3ba7db70ae72c 100644 --- a/content/docs/jfs_hoodie/index.html +++ b/content/docs/jfs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/key_generation/index.html b/content/docs/key_generation/index.html index c7384afeb8472..659f8e2e9d318 100644 --- a/content/docs/key_generation/index.html +++ b/content/docs/key_generation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/markers/index.html b/content/docs/markers/index.html index 9785ecb085795..d0852551aaa41 100644 --- a/content/docs/markers/index.html +++ b/content/docs/markers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/metadata/index.html b/content/docs/metadata/index.html index 7d336fdea50c2..5461447ad770b 100644 --- a/content/docs/metadata/index.html +++ b/content/docs/metadata/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/metadata_indexing/index.html b/content/docs/metadata_indexing/index.html index 0e438b9645427..285ff4eac2bd2 100644 --- a/content/docs/metadata_indexing/index.html +++ b/content/docs/metadata_indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/metrics/index.html b/content/docs/metrics/index.html index 3e126f6a9a1fb..9c1848e97eb67 100644 --- a/content/docs/metrics/index.html +++ b/content/docs/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/migration_guide/index.html b/content/docs/migration_guide/index.html index 915992e685e1a..8a57855ef2fe2 100644 --- a/content/docs/migration_guide/index.html +++ b/content/docs/migration_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/azure_hoodie/index.html b/content/docs/next/azure_hoodie/index.html index 1a0b62320dc2f..2a1cdabc9e8db 100644 --- a/content/docs/next/azure_hoodie/index.html +++ b/content/docs/next/azure_hoodie/index.html @@ -19,7 +19,7 @@ - + @@ -54,6 +54,11 @@

        spark.read
        .format("org.apache.hudi")
        .load("/mountpoint/hudi-tables/customer")
        -

      +
    + +

    Blogs

    + \ No newline at end of file diff --git a/content/docs/next/basic_configurations/index.html b/content/docs/next/basic_configurations/index.html index f1c19b84bcc79..c96921133326e 100644 --- a/content/docs/next/basic_configurations/index.html +++ b/content/docs/next/basic_configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/bos_hoodie/index.html b/content/docs/next/bos_hoodie/index.html index 7945d908d0612..81e201e29a2fe 100644 --- a/content/docs/next/bos_hoodie/index.html +++ b/content/docs/next/bos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/cleaning/index.html b/content/docs/next/cleaning/index.html index b786e87b4f4d9..352abb700dc1e 100644 --- a/content/docs/next/cleaning/index.html +++ b/content/docs/next/cleaning/index.html @@ -19,7 +19,7 @@ - + @@ -100,6 +100,10 @@

    CLI
    cleans run --sparkMaster local --hoodieConfigs hoodie.cleaner.policy=KEEP_LATEST_COMMITS hoodie.cleaner.commits.retained=3 hoodie.cleaner.parallelism=200

    You can find more details and the relevant code for these commands in org.apache.hudi.cli.commands.CleansCommand class.

    +

    Blogs

    +

    Videos

    • Cleaner Service: Save up to 40% on data lake storage costs | Hudi Labs
    • diff --git a/content/docs/next/cli/index.html b/content/docs/next/cli/index.html index d9821cedcda40..80c911908f75c 100644 --- a/content/docs/next/cli/index.html +++ b/content/docs/next/cli/index.html @@ -19,7 +19,7 @@ - + @@ -212,6 +212,11 @@

      Chang

      The parameter target_table_type candidates are below:

      target table typecomment
      MORChange COW table to MERGE_ON_READ.
      COWChange MOR table to COPY_ON_WRITE.
      By default, changing to COW will execute all pending compactions and perform a full compaction if any log file left. Set --enable-compaction=false will disable the default compaction.
      There are params can be set for the compaction operation:
      --parallelism: Default 3. Parallelism for hoodie compaction
      --sparkMaster: Default local. Spark Master
      --sparkMemory: Default 4G. Spark executor memory
      --retry: Default 1. Number of retries
      --propsFilePath: Default . path to properties file on localfs or dfs with configurations for hoodie client for compacting
      --hoodieConfigs: Default . Any configuration that can be set in the properties file can be passed here in the form of an array

      Example below is changing MOR table to COW:

      -
      connect --path /var/dataset/test_table_mor2cow
      desc
      ╔════════════════════════════════════════════════╤═════════════════════════════════════════╗
      ║ Property │ Value ║
      ╠════════════════════════════════════════════════╪═════════════════════════════════════════╣
      ║ basePath │ /var/dataset/test_table_mor2cow ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ metaPath │ /var/dataset/test_table_mor2cow/.hoodie ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ fileSystem │ file ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.table.name │ test_table ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.compaction.record.merger.strategy │ eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.table.metadata.partitions │ files ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.table.type │ MERGE_ON_READ ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.table.metadata.partitions.inflight │ ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.archivelog.folder │ archived ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.timeline.layout.version │ 1 ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.table.checksum │ 2702201862 ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.compaction.payload.type │ HOODIE_AVRO ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.table.version │ 6 ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.datasource.write.drop.partition.columns │ false ║
      ╚════════════════════════════════════════════════╧═════════════════════════════════════════╝

      table change-table-type COW
      ╔════════════════════════════════════════════════╤══════════════════════════════════════╤══════════════════════════════════════╗
      ║ Property │ Old Value │ New Value ║
      ╠════════════════════════════════════════════════╪══════════════════════════════════════╪══════════════════════════════════════╣
      ║ hoodie.archivelog.folder │ archived │ archived ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.compaction.payload.type │ HOODIE_AVRO │ HOODIE_AVRO ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.compaction.record.merger.strategy │ eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 │ eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.datasource.write.drop.partition.columns │ false │ false ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.table.checksum │ 2702201862 │ 2702201862 ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.table.metadata.partitions │ files │ files ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.table.metadata.partitions.inflight │ │ ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.table.name │ test_table │ test_table ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.table.type │ MERGE_ON_READ │ COPY_ON_WRITE ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.table.version │ 6 │ 6 ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.timeline.layout.version │ 1 │ 1 ║
      ╚════════════════════════════════════════════════╧══════════════════════════════════════╧══════════════════════════════════════╝
      +
      connect --path /var/dataset/test_table_mor2cow
      desc
      ╔════════════════════════════════════════════════╤═════════════════════════════════════════╗
      ║ Property │ Value ║
      ╠════════════════════════════════════════════════╪═════════════════════════════════════════╣
      ║ basePath │ /var/dataset/test_table_mor2cow ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ metaPath │ /var/dataset/test_table_mor2cow/.hoodie ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ fileSystem │ file ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.table.name │ test_table ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.compaction.record.merger.strategy │ eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.table.metadata.partitions │ files ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.table.type │ MERGE_ON_READ ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.table.metadata.partitions.inflight │ ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.archivelog.folder │ archived ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.timeline.layout.version │ 1 ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.table.checksum │ 2702201862 ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.compaction.payload.type │ HOODIE_AVRO ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.table.version │ 6 ║
      ╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
      ║ hoodie.datasource.write.drop.partition.columns │ false ║
      ╚════════════════════════════════════════════════╧═════════════════════════════════════════╝

      table change-table-type COW
      ╔════════════════════════════════════════════════╤══════════════════════════════════════╤══════════════════════════════════════╗
      ║ Property │ Old Value │ New Value ║
      ╠════════════════════════════════════════════════╪══════════════════════════════════════╪══════════════════════════════════════╣
      ║ hoodie.archivelog.folder │ archived │ archived ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.compaction.payload.type │ HOODIE_AVRO │ HOODIE_AVRO ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.compaction.record.merger.strategy │ eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 │ eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.datasource.write.drop.partition.columns │ false │ false ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.table.checksum │ 2702201862 │ 2702201862 ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.table.metadata.partitions │ files │ files ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.table.metadata.partitions.inflight │ │ ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.table.name │ test_table │ test_table ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.table.type │ MERGE_ON_READ │ COPY_ON_WRITE ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.table.version │ 6 │ 6 ║
      ╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
      ║ hoodie.timeline.layout.version │ 1 │ 1 ║
      ╚════════════════════════════════════════════════╧══════════════════════════════════════╧══════════════════════════════════════╝
      +

      +

      Blogs

      + \ No newline at end of file diff --git a/content/docs/next/cloud/index.html b/content/docs/next/cloud/index.html index cc6cfb7d18ccd..aee44ce069550 100644 --- a/content/docs/next/cloud/index.html +++ b/content/docs/next/cloud/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/clustering/index.html b/content/docs/next/clustering/index.html index bbf9588798f63..8f2facf11e4fe 100644 --- a/content/docs/next/clustering/index.html +++ b/content/docs/next/clustering/index.html @@ -19,7 +19,7 @@ - + @@ -183,6 +183,9 @@

      Java Clientorg.apache.hudi.client.clustering.run.strategy.JavaSortAndSizeExecutionStrategy are supported out-of-the-box. Note that as of now only linear sort is supported in Java execution strategy.

      +

      Blogs

      +Apache Hudi Z-Order and Hilbert Space Filling Curves +Hudi Z-Order and Hilbert Space-filling Curves

      Videos

      The intention of merge on read table is to enable near real-time processing directly on top of DFS, as opposed to copying data out to specialized systems, which may not be able to handle the data volume. There are also a few secondary side benefits to -this table such as reduced write amplification by avoiding synchronous merge of data, i.e, the amount of data written per 1 bytes of data in a batch

      +this table such as reduced write amplification by avoiding synchronous merge of data, i.e, the amount of data written per 1 bytes of data in a batch

      + +

      Blogs

      + \ No newline at end of file diff --git a/content/docs/next/concurrency_control/index.html b/content/docs/next/concurrency_control/index.html index e9b0a329f0dec..cf6d22726c4c4 100644 --- a/content/docs/next/concurrency_control/index.html +++ b/content/docs/next/concurrency_control/index.html @@ -19,7 +19,7 @@ - + @@ -182,6 +182,11 @@

      CaveatsRelated Resources

      +

      Blogs

      +

      Videos

      • Hands on Lab with using DynamoDB as lock table for Apache Hudi Data Lakes
      • diff --git a/content/docs/next/configurations/index.html b/content/docs/next/configurations/index.html index 4706c6eebcfdb..bc9cf579a11bd 100644 --- a/content/docs/next/configurations/index.html +++ b/content/docs/next/configurations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/cos_hoodie/index.html b/content/docs/next/cos_hoodie/index.html index 4fa203612b036..0500484a2c7bf 100644 --- a/content/docs/next/cos_hoodie/index.html +++ b/content/docs/next/cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/deployment/index.html b/content/docs/next/deployment/index.html index 29e112a88d6f9..9caf553ce4143 100644 --- a/content/docs/next/deployment/index.html +++ b/content/docs/next/deployment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/disaster_recovery/index.html b/content/docs/next/disaster_recovery/index.html index 04248e670b31f..d2c5c9573ceec 100644 --- a/content/docs/next/disaster_recovery/index.html +++ b/content/docs/next/disaster_recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/docker_demo/index.html b/content/docs/next/docker_demo/index.html index 70bdd8afd85d4..e09734cddc5e7 100644 --- a/content/docs/next/docker_demo/index.html +++ b/content/docs/next/docker_demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/encryption/index.html b/content/docs/next/encryption/index.html index 04ff7a589e45a..50bd98175d887 100644 --- a/content/docs/next/encryption/index.html +++ b/content/docs/next/encryption/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/faq/index.html b/content/docs/next/faq/index.html index 2e1d4c14f9d27..ce6155b31adf9 100644 --- a/content/docs/next/faq/index.html +++ b/content/docs/next/faq/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/faq_design_and_concepts/index.html b/content/docs/next/faq_design_and_concepts/index.html index e3c6f6162a3d1..4049d1b845b16 100644 --- a/content/docs/next/faq_design_and_concepts/index.html +++ b/content/docs/next/faq_design_and_concepts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/faq_general/index.html b/content/docs/next/faq_general/index.html index a2842f53a93f3..8a81f569f720a 100644 --- a/content/docs/next/faq_general/index.html +++ b/content/docs/next/faq_general/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/faq_integrations/index.html b/content/docs/next/faq_integrations/index.html index c54860c43f94b..e87ba8a814242 100644 --- a/content/docs/next/faq_integrations/index.html +++ b/content/docs/next/faq_integrations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/faq_reading_tables/index.html b/content/docs/next/faq_reading_tables/index.html index 22d67a45fd8c5..4013a4863be08 100644 --- a/content/docs/next/faq_reading_tables/index.html +++ b/content/docs/next/faq_reading_tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/faq_storage/index.html b/content/docs/next/faq_storage/index.html index 8035a05ca17d7..6efbce813ae0f 100644 --- a/content/docs/next/faq_storage/index.html +++ b/content/docs/next/faq_storage/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/faq_table_services/index.html b/content/docs/next/faq_table_services/index.html index add7dc7803469..652c6829b392f 100644 --- a/content/docs/next/faq_table_services/index.html +++ b/content/docs/next/faq_table_services/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/faq_writing_tables/index.html b/content/docs/next/faq_writing_tables/index.html index 2ea7af756e2ab..6dd294f9227c4 100644 --- a/content/docs/next/faq_writing_tables/index.html +++ b/content/docs/next/faq_writing_tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/file_sizing/index.html b/content/docs/next/file_sizing/index.html index 38fa6a499fdbf..b7fc571536db1 100644 --- a/content/docs/next/file_sizing/index.html +++ b/content/docs/next/file_sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/flink-quick-start-guide/index.html b/content/docs/next/flink-quick-start-guide/index.html index 98875a156fceb..beb831766dab9 100644 --- a/content/docs/next/flink-quick-start-guide/index.html +++ b/content/docs/next/flink-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/flink_tuning/index.html b/content/docs/next/flink_tuning/index.html index 1a24a37afae75..7cdb729b07998 100644 --- a/content/docs/next/flink_tuning/index.html +++ b/content/docs/next/flink_tuning/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/gcp_bigquery/index.html b/content/docs/next/gcp_bigquery/index.html index a0ffee156f32d..2fd098d1ae637 100644 --- a/content/docs/next/gcp_bigquery/index.html +++ b/content/docs/next/gcp_bigquery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/gcs_hoodie/index.html b/content/docs/next/gcs_hoodie/index.html index 9e71345d66337..66423d526eb95 100644 --- a/content/docs/next/gcs_hoodie/index.html +++ b/content/docs/next/gcs_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/hoodie_streaming_ingestion/index.html b/content/docs/next/hoodie_streaming_ingestion/index.html index 1bb8fb7109d77..2854452c9981c 100644 --- a/content/docs/next/hoodie_streaming_ingestion/index.html +++ b/content/docs/next/hoodie_streaming_ingestion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/hudi_stack/index.html b/content/docs/next/hudi_stack/index.html index 56f75df0f347a..3a0336fd2e278 100644 --- a/content/docs/next/hudi_stack/index.html +++ b/content/docs/next/hudi_stack/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/ibm_cos_hoodie/index.html b/content/docs/next/ibm_cos_hoodie/index.html index 039590e6b34f2..9368856ec902e 100644 --- a/content/docs/next/ibm_cos_hoodie/index.html +++ b/content/docs/next/ibm_cos_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/indexes/index.html b/content/docs/next/indexes/index.html index ce37e0d8b7920..cad705498456f 100644 --- a/content/docs/next/indexes/index.html +++ b/content/docs/next/indexes/index.html @@ -19,7 +19,7 @@ - + @@ -194,6 +194,10 @@

        Related Resources

        +

        Blogs

        +

        Videos

        +
      + +

      Blogs

      + \ No newline at end of file diff --git a/content/docs/next/platform_services_post_commit_callback/index.html b/content/docs/next/platform_services_post_commit_callback/index.html index 93506c14ace11..734264ddaa85a 100644 --- a/content/docs/next/platform_services_post_commit_callback/index.html +++ b/content/docs/next/platform_services_post_commit_callback/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/precommit_validator/index.html b/content/docs/next/precommit_validator/index.html index bbccd78f62d8e..4edb318f5b4e8 100644 --- a/content/docs/next/precommit_validator/index.html +++ b/content/docs/next/precommit_validator/index.html @@ -19,7 +19,7 @@ - + @@ -60,6 +60,10 @@

      commit notification service that can be configured to trigger notifications about write commits.

      The commit notification service can be combined with pre-commit validators to send a notification when a commit fails a validation. This is possible by passing details about the validation as a custom value to the HTTP endpoint.

      +

      Blogs

      +

      Videos

      • Learn About Apache Hudi Pre Commit Validator with Hands on Lab
      • diff --git a/content/docs/next/privacy/index.html b/content/docs/next/privacy/index.html index 68b4909ef0c1c..a27f0db9455a8 100644 --- a/content/docs/next/privacy/index.html +++ b/content/docs/next/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/procedures/index.html b/content/docs/next/procedures/index.html index c2e4929e24a44..dd467e6d3ba1e 100644 --- a/content/docs/next/procedures/index.html +++ b/content/docs/next/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/python-rust-quick-start-guide/index.html b/content/docs/next/python-rust-quick-start-guide/index.html index 3e759f33b0efb..9dbca9b3900fe 100644 --- a/content/docs/next/python-rust-quick-start-guide/index.html +++ b/content/docs/next/python-rust-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/querying_data/index.html b/content/docs/next/querying_data/index.html index 99a0a2de56ed9..c064f4432139d 100644 --- a/content/docs/next/querying_data/index.html +++ b/content/docs/next/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/quick-start-guide/index.html b/content/docs/next/quick-start-guide/index.html index a77d691c2d711..7401a831e4f11 100644 --- a/content/docs/next/quick-start-guide/index.html +++ b/content/docs/next/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/reading_tables_batch_reads/index.html b/content/docs/next/reading_tables_batch_reads/index.html index 9572b60e13a60..15fb1346f75f0 100644 --- a/content/docs/next/reading_tables_batch_reads/index.html +++ b/content/docs/next/reading_tables_batch_reads/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/reading_tables_streaming_reads/index.html b/content/docs/next/reading_tables_streaming_reads/index.html index 093e143773ac6..c5efb57748bdf 100644 --- a/content/docs/next/reading_tables_streaming_reads/index.html +++ b/content/docs/next/reading_tables_streaming_reads/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/record_merger/index.html b/content/docs/next/record_merger/index.html index ac46cb75c2983..c5c0954776ca0 100644 --- a/content/docs/next/record_merger/index.html +++ b/content/docs/next/record_merger/index.html @@ -19,7 +19,7 @@ - + @@ -138,6 +138,11 @@

        ConfigsMySqlDebeziumAvroPayload and PostgresDebeziumAvroPayload provides support for seamlessly applying changes captured via Debezium for MySQL and PostgresDB. AWSDmsAvroPayload provides support for applying changes captured via Amazon Database Migration Service onto S3. -For full configurations, go here and please check out this FAQ if you want to implement your own custom payloads.

        +For full configurations, go here and please check out this FAQ if you want to implement your own custom payloads.

        +

        +

        Blogs

        + \ No newline at end of file diff --git a/content/docs/next/rollbacks/index.html b/content/docs/next/rollbacks/index.html index 0cab4342a3f04..2940c18705edd 100644 --- a/content/docs/next/rollbacks/index.html +++ b/content/docs/next/rollbacks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/s3_hoodie/index.html b/content/docs/next/s3_hoodie/index.html index 436d3ac7e3e14..83a62af7d38a5 100644 --- a/content/docs/next/s3_hoodie/index.html +++ b/content/docs/next/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/schema_evolution/index.html b/content/docs/next/schema_evolution/index.html index ac4d692db4b97..368c78c5a91f9 100644 --- a/content/docs/next/schema_evolution/index.html +++ b/content/docs/next/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/snapshot_exporter/index.html b/content/docs/next/snapshot_exporter/index.html index 35bd390f51553..cd126f2501679 100644 --- a/content/docs/next/snapshot_exporter/index.html +++ b/content/docs/next/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/sql_ddl/index.html b/content/docs/next/sql_ddl/index.html index c572e6475c058..a79af3cd4cdf5 100644 --- a/content/docs/next/sql_ddl/index.html +++ b/content/docs/next/sql_ddl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/sql_dml/index.html b/content/docs/next/sql_dml/index.html index 13acaed36ff12..9fcabe55a8c6f 100644 --- a/content/docs/next/sql_dml/index.html +++ b/content/docs/next/sql_dml/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/sql_queries/index.html b/content/docs/next/sql_queries/index.html index 0c2ec3d4021e7..57fbf7eaf0c7b 100644 --- a/content/docs/next/sql_queries/index.html +++ b/content/docs/next/sql_queries/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/storage_layouts/index.html b/content/docs/next/storage_layouts/index.html index 58d65480b7de7..20592ede815af 100644 --- a/content/docs/next/storage_layouts/index.html +++ b/content/docs/next/storage_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/structure/index.html b/content/docs/next/structure/index.html index 6ab0a2b40c48f..f1ba8145fcfbd 100644 --- a/content/docs/next/structure/index.html +++ b/content/docs/next/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/syncing_aws_glue_data_catalog/index.html b/content/docs/next/syncing_aws_glue_data_catalog/index.html index 5e42ed9a32cdd..b509dd960e66f 100644 --- a/content/docs/next/syncing_aws_glue_data_catalog/index.html +++ b/content/docs/next/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/syncing_datahub/index.html b/content/docs/next/syncing_datahub/index.html index 39f50b66d9d42..dc9442e90e4b5 100644 --- a/content/docs/next/syncing_datahub/index.html +++ b/content/docs/next/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/syncing_metastore/index.html b/content/docs/next/syncing_metastore/index.html index 0ce62599a2b67..ad43b19afd89a 100644 --- a/content/docs/next/syncing_metastore/index.html +++ b/content/docs/next/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/syncing_xtable/index.html b/content/docs/next/syncing_xtable/index.html index 7d60a76b0c7f6..e64ef5b49ddd0 100644 --- a/content/docs/next/syncing_xtable/index.html +++ b/content/docs/next/syncing_xtable/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/table_types/index.html b/content/docs/next/table_types/index.html index 9a7ef98eae1cc..24c0276306dad 100644 --- a/content/docs/next/table_types/index.html +++ b/content/docs/next/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/timeline/index.html b/content/docs/next/timeline/index.html index 799da5d82cb2b..e6084588885d8 100644 --- a/content/docs/next/timeline/index.html +++ b/content/docs/next/timeline/index.html @@ -19,7 +19,7 @@ - + @@ -122,6 +122,11 @@

        Spark configs<

        Flink jobs using the SQL can be configured through the options in WITH clause. The actual datasource level configs are listed below.

        Config NameDefaultDescription
        archive.max_commits50 (Optional)Max number of commits to keep before archiving older commits into a sequential log, default 50

        Config Param: ARCHIVE_MAX_COMMITS
        archive.min_commits40 (Optional)Min number of commits to keep before archiving older commits into a sequential log, default 40

        Config Param: ARCHIVE_MIN_COMMITS
        hoodie.timeline.compaction.batch.size10 (Optional)Controls the number of parquet files to compact in a single compaction run at the current level of the LSM tree.
        -

        Refer here for more details.

        +

        Refer here for more details.

        + +

        Blogs

        + \ No newline at end of file diff --git a/content/docs/next/troubleshooting/index.html b/content/docs/next/troubleshooting/index.html index 88014ecfde495..e18d63f622583 100644 --- a/content/docs/next/troubleshooting/index.html +++ b/content/docs/next/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/tuning-guide/index.html b/content/docs/next/tuning-guide/index.html index d3241079f27e5..81a66b40ab485 100644 --- a/content/docs/next/tuning-guide/index.html +++ b/content/docs/next/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/use_cases/index.html b/content/docs/next/use_cases/index.html index cbda9ccd524e8..5e82c92e964ae 100644 --- a/content/docs/next/use_cases/index.html +++ b/content/docs/next/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/write_operations/index.html b/content/docs/next/write_operations/index.html index cd319aae6e85e..ab54f59b4851d 100644 --- a/content/docs/next/write_operations/index.html +++ b/content/docs/next/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/writing_data/index.html b/content/docs/next/writing_data/index.html index d30855d4393ae..7c57246b10828 100644 --- a/content/docs/next/writing_data/index.html +++ b/content/docs/next/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/next/writing_tables_streaming_writes/index.html b/content/docs/next/writing_tables_streaming_writes/index.html index 0def25e893326..9ff0df5585594 100644 --- a/content/docs/next/writing_tables_streaming_writes/index.html +++ b/content/docs/next/writing_tables_streaming_writes/index.html @@ -19,12 +19,18 @@ - +
        Version: Current

        Streaming Writes

        Spark Streaming

        You can write Hudi tables using spark's structured streaming.

        -
        # pyspark
        # prepare to stream write to new table
        streamingTableName = "hudi_trips_cow_streaming"
        baseStreamingPath = "file:///tmp/hudi_trips_cow_streaming"
        checkpointLocation = "file:///tmp/checkpoints/hudi_trips_cow_streaming"

        hudi_streaming_options = {
        'hoodie.table.name': streamingTableName,
        'hoodie.datasource.write.recordkey.field': 'uuid',
        'hoodie.datasource.write.partitionpath.field': 'partitionpath',
        'hoodie.datasource.write.table.name': streamingTableName,
        'hoodie.datasource.write.operation': 'upsert',
        'hoodie.datasource.write.precombine.field': 'ts',
        'hoodie.upsert.shuffle.parallelism': 2,
        'hoodie.insert.shuffle.parallelism': 2
        }

        # create streaming df
        df = spark.readStream
        .format("hudi")
        .load(basePath)

        # write stream to new hudi table
        df.writeStream.format("hudi")
        .options(**hudi_streaming_options)
        .outputMode("append")
        .option("path", baseStreamingPath)
        .option("checkpointLocation", checkpointLocation)
        .trigger(once=True)
        .start()

        +
        # pyspark
        # prepare to stream write to new table
        streamingTableName = "hudi_trips_cow_streaming"
        baseStreamingPath = "file:///tmp/hudi_trips_cow_streaming"
        checkpointLocation = "file:///tmp/checkpoints/hudi_trips_cow_streaming"

        hudi_streaming_options = {
        'hoodie.table.name': streamingTableName,
        'hoodie.datasource.write.recordkey.field': 'uuid',
        'hoodie.datasource.write.partitionpath.field': 'partitionpath',
        'hoodie.datasource.write.table.name': streamingTableName,
        'hoodie.datasource.write.operation': 'upsert',
        'hoodie.datasource.write.precombine.field': 'ts',
        'hoodie.upsert.shuffle.parallelism': 2,
        'hoodie.insert.shuffle.parallelism': 2
        }

        # create streaming df
        df = spark.readStream
        .format("hudi")
        .load(basePath)

        # write stream to new hudi table
        df.writeStream.format("hudi")
        .options(**hudi_streaming_options)
        .outputMode("append")
        .option("path", baseStreamingPath)
        .option("checkpointLocation", checkpointLocation)
        .trigger(once=True)
        .start()

        + +

        Blogs

        + \ No newline at end of file diff --git a/content/docs/oci_hoodie/index.html b/content/docs/oci_hoodie/index.html index c9534c2f37d9a..b83e7453b58cf 100644 --- a/content/docs/oci_hoodie/index.html +++ b/content/docs/oci_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/oss_hoodie/index.html b/content/docs/oss_hoodie/index.html index dc550460a5938..abc0cba6a0101 100644 --- a/content/docs/oss_hoodie/index.html +++ b/content/docs/oss_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/overview/index.html b/content/docs/overview/index.html index 641705b799a7f..fc401ba556b48 100644 --- a/content/docs/overview/index.html +++ b/content/docs/overview/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/performance/index.html b/content/docs/performance/index.html index 1f8e089e4b4e0..5608f00db40eb 100644 --- a/content/docs/performance/index.html +++ b/content/docs/performance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/platform_services_post_commit_callback/index.html b/content/docs/platform_services_post_commit_callback/index.html index 1dbaf23e61733..cc9af13c02e98 100644 --- a/content/docs/platform_services_post_commit_callback/index.html +++ b/content/docs/platform_services_post_commit_callback/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/precommit_validator/index.html b/content/docs/precommit_validator/index.html index 3b0097047e56d..61b71361bae5d 100644 --- a/content/docs/precommit_validator/index.html +++ b/content/docs/precommit_validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/privacy/index.html b/content/docs/privacy/index.html index bfff75bf52c33..926528680a71e 100644 --- a/content/docs/privacy/index.html +++ b/content/docs/privacy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/procedures/index.html b/content/docs/procedures/index.html index 8f00f2e967049..e46d1cc6e1e97 100644 --- a/content/docs/procedures/index.html +++ b/content/docs/procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/python-rust-quick-start-guide/index.html b/content/docs/python-rust-quick-start-guide/index.html index 2ccf7c9d575b6..5a7060092ebcd 100644 --- a/content/docs/python-rust-quick-start-guide/index.html +++ b/content/docs/python-rust-quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/querying_data/index.html b/content/docs/querying_data/index.html index 2bf6e48914d82..2554390f4525b 100644 --- a/content/docs/querying_data/index.html +++ b/content/docs/querying_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/quick-start-guide/index.html b/content/docs/quick-start-guide/index.html index 62ddbd942c278..b8e2174a04c27 100644 --- a/content/docs/quick-start-guide/index.html +++ b/content/docs/quick-start-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/reading_tables_batch_reads/index.html b/content/docs/reading_tables_batch_reads/index.html index 09488a6807888..f0ee8debfc84f 100644 --- a/content/docs/reading_tables_batch_reads/index.html +++ b/content/docs/reading_tables_batch_reads/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/reading_tables_streaming_reads/index.html b/content/docs/reading_tables_streaming_reads/index.html index 37017dbd1e5e2..1166ade81f909 100644 --- a/content/docs/reading_tables_streaming_reads/index.html +++ b/content/docs/reading_tables_streaming_reads/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/record_merger/index.html b/content/docs/record_merger/index.html index a74d2ffc8f49f..fd4391913f52f 100644 --- a/content/docs/record_merger/index.html +++ b/content/docs/record_merger/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/rollbacks/index.html b/content/docs/rollbacks/index.html index 21add702680c1..93c4af463c9af 100644 --- a/content/docs/rollbacks/index.html +++ b/content/docs/rollbacks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/s3_hoodie/index.html b/content/docs/s3_hoodie/index.html index 4e557d96dc32c..06a68ec854274 100644 --- a/content/docs/s3_hoodie/index.html +++ b/content/docs/s3_hoodie/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/schema_evolution/index.html b/content/docs/schema_evolution/index.html index 5ac1cee94bd85..027c8a417413e 100644 --- a/content/docs/schema_evolution/index.html +++ b/content/docs/schema_evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/snapshot_exporter/index.html b/content/docs/snapshot_exporter/index.html index 44702f43ad4f5..740276c9a9d64 100644 --- a/content/docs/snapshot_exporter/index.html +++ b/content/docs/snapshot_exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/sql_ddl/index.html b/content/docs/sql_ddl/index.html index 522432126a423..792e62a091996 100644 --- a/content/docs/sql_ddl/index.html +++ b/content/docs/sql_ddl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/sql_dml/index.html b/content/docs/sql_dml/index.html index a847b54d9ad67..bd2efa1ef3d1a 100644 --- a/content/docs/sql_dml/index.html +++ b/content/docs/sql_dml/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/sql_queries/index.html b/content/docs/sql_queries/index.html index e308efc94390f..2c575be62c6d5 100644 --- a/content/docs/sql_queries/index.html +++ b/content/docs/sql_queries/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/storage_layouts/index.html b/content/docs/storage_layouts/index.html index 3d2f74adb614f..7a3832d5a88ea 100644 --- a/content/docs/storage_layouts/index.html +++ b/content/docs/storage_layouts/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/structure/index.html b/content/docs/structure/index.html index 4864b064183ab..0d3f531dacefd 100644 --- a/content/docs/structure/index.html +++ b/content/docs/structure/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/syncing_aws_glue_data_catalog/index.html b/content/docs/syncing_aws_glue_data_catalog/index.html index 1f5329f699298..b5e829849982c 100644 --- a/content/docs/syncing_aws_glue_data_catalog/index.html +++ b/content/docs/syncing_aws_glue_data_catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/syncing_datahub/index.html b/content/docs/syncing_datahub/index.html index 53facfedf9382..68719b8483efd 100644 --- a/content/docs/syncing_datahub/index.html +++ b/content/docs/syncing_datahub/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/syncing_metastore/index.html b/content/docs/syncing_metastore/index.html index 90fced6efc406..92485d7d9f9f8 100644 --- a/content/docs/syncing_metastore/index.html +++ b/content/docs/syncing_metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/syncing_xtable/index.html b/content/docs/syncing_xtable/index.html index 09aaafd8d2086..6a1347da92d61 100644 --- a/content/docs/syncing_xtable/index.html +++ b/content/docs/syncing_xtable/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/table_types/index.html b/content/docs/table_types/index.html index e5606afadb9ff..8e161466f60f2 100644 --- a/content/docs/table_types/index.html +++ b/content/docs/table_types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/timeline/index.html b/content/docs/timeline/index.html index c0fe16eb470d5..8fb24ee5308aa 100644 --- a/content/docs/timeline/index.html +++ b/content/docs/timeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/troubleshooting/index.html b/content/docs/troubleshooting/index.html index 4f3590f6b49f1..b0679dab0f70b 100644 --- a/content/docs/troubleshooting/index.html +++ b/content/docs/troubleshooting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/tuning-guide/index.html b/content/docs/tuning-guide/index.html index 1fff8161155f6..1b390e2be3244 100644 --- a/content/docs/tuning-guide/index.html +++ b/content/docs/tuning-guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/use_cases/index.html b/content/docs/use_cases/index.html index dc77d16848909..64b0d0324c858 100644 --- a/content/docs/use_cases/index.html +++ b/content/docs/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/write_operations/index.html b/content/docs/write_operations/index.html index c045a96d9aba8..c9d5b5933b97c 100644 --- a/content/docs/write_operations/index.html +++ b/content/docs/write_operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/writing_data/index.html b/content/docs/writing_data/index.html index cb468145eb25c..edf1714e377a0 100644 --- a/content/docs/writing_data/index.html +++ b/content/docs/writing_data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/docs/writing_tables_streaming_writes/index.html b/content/docs/writing_tables_streaming_writes/index.html index de3f32c059993..5cf3540a02552 100644 --- a/content/docs/writing_tables_streaming_writes/index.html +++ b/content/docs/writing_tables_streaming_writes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/ecosystem/index.html b/content/ecosystem/index.html index fd58fbf042778..95cc0f3a2450c 100644 --- a/content/ecosystem/index.html +++ b/content/ecosystem/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/index.html b/content/index.html index 4ad6f13fa2cf5..58f83dcacf44d 100644 --- a/content/index.html +++ b/content/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/learn/use_cases/index.html b/content/learn/use_cases/index.html index 469bded973a42..c607a478ed8ce 100644 --- a/content/learn/use_cases/index.html +++ b/content/learn/use_cases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/markdown-page/index.html b/content/markdown-page/index.html index 56c4fbf3e27c9..462d36254f3e3 100644 --- a/content/markdown-page/index.html +++ b/content/markdown-page/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/powered-by/index.html b/content/powered-by/index.html index a4b2db084ae1c..bf54e724acaf7 100644 --- a/content/powered-by/index.html +++ b/content/powered-by/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/quickstart/index.html b/content/quickstart/index.html index c14d31c76e299..dae1493c1935c 100644 --- a/content/quickstart/index.html +++ b/content/quickstart/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/download/index.html b/content/releases/download/index.html index 969ad5bab75de..a92b589935ac1 100644 --- a/content/releases/download/index.html +++ b/content/releases/download/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/older-releases/index.html b/content/releases/older-releases/index.html index 6ed31c8df99ad..d98fc16c36794 100644 --- a/content/releases/older-releases/index.html +++ b/content/releases/older-releases/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-0.10.0/index.html b/content/releases/release-0.10.0/index.html index b0377dd7949d6..48a436be58e20 100644 --- a/content/releases/release-0.10.0/index.html +++ b/content/releases/release-0.10.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-0.10.1/index.html b/content/releases/release-0.10.1/index.html index 1e3ebeccb14f6..c0db52af7f0d9 100644 --- a/content/releases/release-0.10.1/index.html +++ b/content/releases/release-0.10.1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-0.11.0/index.html b/content/releases/release-0.11.0/index.html index 9cdf388b9a21e..a5edb8bf654c6 100644 --- a/content/releases/release-0.11.0/index.html +++ b/content/releases/release-0.11.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-0.11.1/index.html b/content/releases/release-0.11.1/index.html index 8b03c7621976b..95d7c888d8b86 100644 --- a/content/releases/release-0.11.1/index.html +++ b/content/releases/release-0.11.1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-0.12.0/index.html b/content/releases/release-0.12.0/index.html index f7844837c6fca..439c37acb1e97 100644 --- a/content/releases/release-0.12.0/index.html +++ b/content/releases/release-0.12.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-0.12.1/index.html b/content/releases/release-0.12.1/index.html index a676d2e0f0acb..03b5e7342d920 100644 --- a/content/releases/release-0.12.1/index.html +++ b/content/releases/release-0.12.1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-0.12.2/index.html b/content/releases/release-0.12.2/index.html index 219db67d0d39e..916284e9fff2c 100644 --- a/content/releases/release-0.12.2/index.html +++ b/content/releases/release-0.12.2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-0.12.3/index.html b/content/releases/release-0.12.3/index.html index b6aa2e99098ef..503543fc75a87 100644 --- a/content/releases/release-0.12.3/index.html +++ b/content/releases/release-0.12.3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-0.13.0/index.html b/content/releases/release-0.13.0/index.html index 4daf0a2b98776..beda9d07b0db7 100644 --- a/content/releases/release-0.13.0/index.html +++ b/content/releases/release-0.13.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-0.13.1/index.html b/content/releases/release-0.13.1/index.html index 0d1144b4aff2e..dcc945249d099 100644 --- a/content/releases/release-0.13.1/index.html +++ b/content/releases/release-0.13.1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-0.14.0/index.html b/content/releases/release-0.14.0/index.html index 295b49463f687..052774fad851d 100644 --- a/content/releases/release-0.14.0/index.html +++ b/content/releases/release-0.14.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-0.14.1/index.html b/content/releases/release-0.14.1/index.html index 489203b2cf1d6..3b22b00da8573 100644 --- a/content/releases/release-0.14.1/index.html +++ b/content/releases/release-0.14.1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-0.15.0/index.html b/content/releases/release-0.15.0/index.html index 30c4dc3192a2f..88c4663015c6e 100644 --- a/content/releases/release-0.15.0/index.html +++ b/content/releases/release-0.15.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-0.6.0/index.html b/content/releases/release-0.6.0/index.html index 1ab5edf1d08a8..f211188f2306f 100644 --- a/content/releases/release-0.6.0/index.html +++ b/content/releases/release-0.6.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-0.7.0/index.html b/content/releases/release-0.7.0/index.html index b0cc933a452c0..a2306025b35f0 100644 --- a/content/releases/release-0.7.0/index.html +++ b/content/releases/release-0.7.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-0.8.0/index.html b/content/releases/release-0.8.0/index.html index eeb5a9ebc4afc..34565bf0875ee 100644 --- a/content/releases/release-0.8.0/index.html +++ b/content/releases/release-0.8.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-0.9.0/index.html b/content/releases/release-0.9.0/index.html index 8c42a363f60d5..6311f39cbe739 100644 --- a/content/releases/release-0.9.0/index.html +++ b/content/releases/release-0.9.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-1.0.0-beta1/index.html b/content/releases/release-1.0.0-beta1/index.html index 19444acf33565..cfb3f72e6d9bf 100644 --- a/content/releases/release-1.0.0-beta1/index.html +++ b/content/releases/release-1.0.0-beta1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-1.0.0-beta2/index.html b/content/releases/release-1.0.0-beta2/index.html index ded7dcb705493..42042fc480284 100644 --- a/content/releases/release-1.0.0-beta2/index.html +++ b/content/releases/release-1.0.0-beta2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/releases/release-1.0.0/index.html b/content/releases/release-1.0.0/index.html index 67acaf4e0e6e0..ffc09b52a84c9 100644 --- a/content/releases/release-1.0.0/index.html +++ b/content/releases/release-1.0.0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/roadmap/index.html b/content/roadmap/index.html index 915b93faf379d..b1e615bd0d49a 100644 --- a/content/roadmap/index.html +++ b/content/roadmap/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/search/index.html b/content/search/index.html index 033bf98ace2fa..febf4db280402 100644 --- a/content/search/index.html +++ b/content/search/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/talks/index.html b/content/talks/index.html index 10ac2072d86bb..7c465ed441fad 100644 --- a/content/talks/index.html +++ b/content/talks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/tech-specs-1point0/index.html b/content/tech-specs-1point0/index.html index a8d257739adb1..e0e1d6eb8383a 100644 --- a/content/tech-specs-1point0/index.html +++ b/content/tech-specs-1point0/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/tech-specs/index.html b/content/tech-specs/index.html index 44cb00007b4d6..bab85de0ee367 100644 --- a/content/tech-specs/index.html +++ b/content/tech-specs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/11/17/Insert_Update_Delete_On_Datalake_S3_with_Apache_Hudi_and_glue_Pyspark/index.html b/content/videos/2022/11/17/Insert_Update_Delete_On_Datalake_S3_with_Apache_Hudi_and_glue_Pyspark/index.html index 91a63882260a8..b2b2374f2dbe8 100644 --- a/content/videos/2022/11/17/Insert_Update_Delete_On_Datalake_S3_with_Apache_Hudi_and_glue_Pyspark/index.html +++ b/content/videos/2022/11/17/Insert_Update_Delete_On_Datalake_S3_with_Apache_Hudi_and_glue_Pyspark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/11/19/Build_a_Spark_pipeline_to_analyze_streaming_data_using_AWS_Glue_Apache_Hudi_S3_and_Athena/index.html b/content/videos/2022/11/19/Build_a_Spark_pipeline_to_analyze_streaming_data_using_AWS_Glue_Apache_Hudi_S3_and_Athena/index.html index c6f42d3fbbb32..e426e8963bd5d 100644 --- a/content/videos/2022/11/19/Build_a_Spark_pipeline_to_analyze_streaming_data_using_AWS_Glue_Apache_Hudi_S3_and_Athena/index.html +++ b/content/videos/2022/11/19/Build_a_Spark_pipeline_to_analyze_streaming_data_using_AWS_Glue_Apache_Hudi_S3_and_Athena/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/11/20/Different_table_types_in_Apache_Hudi_MOR_and_COW_Deep_Dive_By_Sivabalan_Narayanan/index.html b/content/videos/2022/11/20/Different_table_types_in_Apache_Hudi_MOR_and_COW_Deep_Dive_By_Sivabalan_Narayanan/index.html index 1e374bdf9ca58..e746d3f5142db 100644 --- a/content/videos/2022/11/20/Different_table_types_in_Apache_Hudi_MOR_and_COW_Deep_Dive_By_Sivabalan_Narayanan/index.html +++ b/content/videos/2022/11/20/Different_table_types_in_Apache_Hudi_MOR_and_COW_Deep_Dive_By_Sivabalan_Narayanan/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/12/08/Simple_5_Steps_Guide_to_get_started_with_Apache_Hudi_and_Glue_40_and_query_the_data_using_Athena/index.html b/content/videos/2022/12/08/Simple_5_Steps_Guide_to_get_started_with_Apache_Hudi_and_Glue_40_and_query_the_data_using_Athena/index.html index 8bb0e183deca0..48918fcf3eac9 100644 --- a/content/videos/2022/12/08/Simple_5_Steps_Guide_to_get_started_with_Apache_Hudi_and_Glue_40_and_query_the_data_using_Athena/index.html +++ b/content/videos/2022/12/08/Simple_5_Steps_Guide_to_get_started_with_Apache_Hudi_and_Glue_40_and_query_the_data_using_Athena/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/12/11/Build_Datalakes_on_S3_with_Apache_HUDI_in_a_easy_way_for_Beginners_with_hands_on_labs_Glue/index.html b/content/videos/2022/12/11/Build_Datalakes_on_S3_with_Apache_HUDI_in_a_easy_way_for_Beginners_with_hands_on_labs_Glue/index.html index af96d21d55c2a..f48980168c91e 100644 --- a/content/videos/2022/12/11/Build_Datalakes_on_S3_with_Apache_HUDI_in_a_easy_way_for_Beginners_with_hands_on_labs_Glue/index.html +++ b/content/videos/2022/12/11/Build_Datalakes_on_S3_with_Apache_HUDI_in_a_easy_way_for_Beginners_with_hands_on_labs_Glue/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/12/14/Build_Slowly_Changing_Dimensions_Type_2_SCD2_with_Apache_Spark_and_Apache_Hudi_Hands_on_Labs/index.html b/content/videos/2022/12/14/Build_Slowly_Changing_Dimensions_Type_2_SCD2_with_Apache_Spark_and_Apache_Hudi_Hands_on_Labs/index.html index 520b461c8a5be..dff1b74e96f97 100644 --- a/content/videos/2022/12/14/Build_Slowly_Changing_Dimensions_Type_2_SCD2_with_Apache_Spark_and_Apache_Hudi_Hands_on_Labs/index.html +++ b/content/videos/2022/12/14/Build_Slowly_Changing_Dimensions_Type_2_SCD2_with_Apache_Spark_and_Apache_Hudi_Hands_on_Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/12/14/Hands_on_Lab_with_using_DynamoDB_as_lock_table_for_Apache_Hudi_Data_Lakes/index.html b/content/videos/2022/12/14/Hands_on_Lab_with_using_DynamoDB_as_lock_table_for_Apache_Hudi_Data_Lakes/index.html index 4db359a186683..ac63eb0e5c3cc 100644 --- a/content/videos/2022/12/14/Hands_on_Lab_with_using_DynamoDB_as_lock_table_for_Apache_Hudi_Data_Lakes/index.html +++ b/content/videos/2022/12/14/Hands_on_Lab_with_using_DynamoDB_as_lock_table_for_Apache_Hudi_Data_Lakes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/12/14/How_to_convert_Existing_data_in_S3_into_Apache_Hudi_Transaction_Datalake_with_Glue_Hands_on_Lab/index.html b/content/videos/2022/12/14/How_to_convert_Existing_data_in_S3_into_Apache_Hudi_Transaction_Datalake_with_Glue_Hands_on_Lab/index.html index fa2ad6ea2a45a..8a40680edaeed 100644 --- a/content/videos/2022/12/14/How_to_convert_Existing_data_in_S3_into_Apache_Hudi_Transaction_Datalake_with_Glue_Hands_on_Lab/index.html +++ b/content/videos/2022/12/14/How_to_convert_Existing_data_in_S3_into_Apache_Hudi_Transaction_Datalake_with_Glue_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/12/15/Build_production_Ready_Real_Time_Transaction_Hudi_Datalake_from_DynamoDB_Streams_using_Glue_kinesis/index.html b/content/videos/2022/12/15/Build_production_Ready_Real_Time_Transaction_Hudi_Datalake_from_DynamoDB_Streams_using_Glue_kinesis/index.html index 1111b0f020216..c29393838c05c 100644 --- a/content/videos/2022/12/15/Build_production_Ready_Real_Time_Transaction_Hudi_Datalake_from_DynamoDB_Streams_using_Glue_kinesis/index.html +++ b/content/videos/2022/12/15/Build_production_Ready_Real_Time_Transaction_Hudi_Datalake_from_DynamoDB_Streams_using_Glue_kinesis/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/12/17/Migrate_Certain_Tables_from_ONPREM_DB_using_DMS_into_Apache_Hudi_Transaction_Datalake_with_GlueDemo/index.html b/content/videos/2022/12/17/Migrate_Certain_Tables_from_ONPREM_DB_using_DMS_into_Apache_Hudi_Transaction_Datalake_with_GlueDemo/index.html index 8cbc6ccfec19f..c0b36ceaf5745 100644 --- a/content/videos/2022/12/17/Migrate_Certain_Tables_from_ONPREM_DB_using_DMS_into_Apache_Hudi_Transaction_Datalake_with_GlueDemo/index.html +++ b/content/videos/2022/12/17/Migrate_Certain_Tables_from_ONPREM_DB_using_DMS_into_Apache_Hudi_Transaction_Datalake_with_GlueDemo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/12/17/Step_by_Step_Guide_on_Migrate_Certain_Tables_from_DB_using_DMS_into_Apache_Hudi_Transaction_Datalake/index.html b/content/videos/2022/12/17/Step_by_Step_Guide_on_Migrate_Certain_Tables_from_DB_using_DMS_into_Apache_Hudi_Transaction_Datalake/index.html index 817528ab15863..c1c801a38dbef 100644 --- a/content/videos/2022/12/17/Step_by_Step_Guide_on_Migrate_Certain_Tables_from_DB_using_DMS_into_Apache_Hudi_Transaction_Datalake/index.html +++ b/content/videos/2022/12/17/Step_by_Step_Guide_on_Migrate_Certain_Tables_from_DB_using_DMS_into_Apache_Hudi_Transaction_Datalake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/12/18/InsertUpdateReadWriteSnapShot_Time_Travel_incremental_Query_on_Apache_Hudi_datalake_S3/index.html b/content/videos/2022/12/18/InsertUpdateReadWriteSnapShot_Time_Travel_incremental_Query_on_Apache_Hudi_datalake_S3/index.html index 485af70acb87e..1fffa98065ff6 100644 --- a/content/videos/2022/12/18/InsertUpdateReadWriteSnapShot_Time_Travel_incremental_Query_on_Apache_Hudi_datalake_S3/index.html +++ b/content/videos/2022/12/18/InsertUpdateReadWriteSnapShot_Time_Travel_incremental_Query_on_Apache_Hudi_datalake_S3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/12/19/Build_Production_Ready_Alternative_Data_Pipeline_from_DynamoDB_to_Apache_Hudi_PROJECT_DEMO/index.html b/content/videos/2022/12/19/Build_Production_Ready_Alternative_Data_Pipeline_from_DynamoDB_to_Apache_Hudi_PROJECT_DEMO/index.html index 163154dda47d1..2a174a93e15b0 100644 --- a/content/videos/2022/12/19/Build_Production_Ready_Alternative_Data_Pipeline_from_DynamoDB_to_Apache_Hudi_PROJECT_DEMO/index.html +++ b/content/videos/2022/12/19/Build_Production_Ready_Alternative_Data_Pipeline_from_DynamoDB_to_Apache_Hudi_PROJECT_DEMO/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/12/19/Build_Production_Ready_Alternative_Data_Pipeline_from_DynamoDB_to_Apache_Hudi_Step_by_Step_Guide/index.html b/content/videos/2022/12/19/Build_Production_Ready_Alternative_Data_Pipeline_from_DynamoDB_to_Apache_Hudi_Step_by_Step_Guide/index.html index e7ea01b62f441..b9901055ec904 100644 --- a/content/videos/2022/12/19/Build_Production_Ready_Alternative_Data_Pipeline_from_DynamoDB_to_Apache_Hudi_Step_by_Step_Guide/index.html +++ b/content/videos/2022/12/19/Build_Production_Ready_Alternative_Data_Pipeline_from_DynamoDB_to_Apache_Hudi_Step_by_Step_Guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/12/20/Getting_started_with_Kafka_and_Glue_to_Build_Real_Time_Apache_Hudi_Transaction_Datalake/index.html b/content/videos/2022/12/20/Getting_started_with_Kafka_and_Glue_to_Build_Real_Time_Apache_Hudi_Transaction_Datalake/index.html index 7809a4ebdb036..2a59de4e1c197 100644 --- a/content/videos/2022/12/20/Getting_started_with_Kafka_and_Glue_to_Build_Real_Time_Apache_Hudi_Transaction_Datalake/index.html +++ b/content/videos/2022/12/20/Getting_started_with_Kafka_and_Glue_to_Build_Real_Time_Apache_Hudi_Transaction_Datalake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/12/21/Learn_Schema_Evolution_in_Apache_Hudi_Transaction_Datalake_with_hands_on_labs/index.html b/content/videos/2022/12/21/Learn_Schema_Evolution_in_Apache_Hudi_Transaction_Datalake_with_hands_on_labs/index.html index 2c628add52b97..330a32eb070bd 100644 --- a/content/videos/2022/12/21/Learn_Schema_Evolution_in_Apache_Hudi_Transaction_Datalake_with_hands_on_labs/index.html +++ b/content/videos/2022/12/21/Learn_Schema_Evolution_in_Apache_Hudi_Transaction_Datalake_with_hands_on_labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/12/23/Apache_Hudi_with_DBT_Hands_on_LabTransform_Raw_Hudi_tables_with_DBT_and_Glue_Interactive_Session/index.html b/content/videos/2022/12/23/Apache_Hudi_with_DBT_Hands_on_LabTransform_Raw_Hudi_tables_with_DBT_and_Glue_Interactive_Session/index.html index e555ada40e5ef..4d99accd547e2 100644 --- a/content/videos/2022/12/23/Apache_Hudi_with_DBT_Hands_on_LabTransform_Raw_Hudi_tables_with_DBT_and_Glue_Interactive_Session/index.html +++ b/content/videos/2022/12/23/Apache_Hudi_with_DBT_Hands_on_LabTransform_Raw_Hudi_tables_with_DBT_and_Glue_Interactive_Session/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/12/24/Apache_Hudi_on_Windows_Machine_Spark_33_and_hadoop27_Step_by_Step_guide_and_Installation_Process/index.html b/content/videos/2022/12/24/Apache_Hudi_on_Windows_Machine_Spark_33_and_hadoop27_Step_by_Step_guide_and_Installation_Process/index.html index 23c50e6afe7ff..0a43222040f32 100644 --- a/content/videos/2022/12/24/Apache_Hudi_on_Windows_Machine_Spark_33_and_hadoop27_Step_by_Step_guide_and_Installation_Process/index.html +++ b/content/videos/2022/12/24/Apache_Hudi_on_Windows_Machine_Spark_33_and_hadoop27_Step_by_Step_guide_and_Installation_Process/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/12/24/Lets_Build_Streaming_Solution_using_Kafka_PySpark_and_Apache_HUDI_Hands_on_Lab_with_code/index.html b/content/videos/2022/12/24/Lets_Build_Streaming_Solution_using_Kafka_PySpark_and_Apache_HUDI_Hands_on_Lab_with_code/index.html index 2e5e32b1f7c24..8eeb6a4280f39 100644 --- a/content/videos/2022/12/24/Lets_Build_Streaming_Solution_using_Kafka_PySpark_and_Apache_HUDI_Hands_on_Lab_with_code/index.html +++ b/content/videos/2022/12/24/Lets_Build_Streaming_Solution_using_Kafka_PySpark_and_Apache_HUDI_Hands_on_Lab_with_code/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/12/27/Bring_Data_from_Source_using_Debezium_with_CDC_into_Kafka_S3Sink_Build_Hudi_Datalake_Hands_on_lab/index.html b/content/videos/2022/12/27/Bring_Data_from_Source_using_Debezium_with_CDC_into_Kafka_S3Sink_Build_Hudi_Datalake_Hands_on_lab/index.html index 261a694d303fc..05d9d921b9806 100644 --- a/content/videos/2022/12/27/Bring_Data_from_Source_using_Debezium_with_CDC_into_Kafka_S3Sink_Build_Hudi_Datalake_Hands_on_lab/index.html +++ b/content/videos/2022/12/27/Bring_Data_from_Source_using_Debezium_with_CDC_into_Kafka_S3Sink_Build_Hudi_Datalake_Hands_on_lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/12/28/Comparing_Apache_Hudi_s_MOR_and_COW_Tables_Use_Cases_from_Uber/index.html b/content/videos/2022/12/28/Comparing_Apache_Hudi_s_MOR_and_COW_Tables_Use_Cases_from_Uber/index.html index f787085bdad49..56c2517bdc4c1 100644 --- a/content/videos/2022/12/28/Comparing_Apache_Hudi_s_MOR_and_COW_Tables_Use_Cases_from_Uber/index.html +++ b/content/videos/2022/12/28/Comparing_Apache_Hudi_s_MOR_and_COW_Tables_Use_Cases_from_Uber/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2022/12/30/Step_by_Step_guide_how_to_setup_VPC_Subnet_Get_Started_with_HUDI_on_EMR_Installation_Guide/index.html b/content/videos/2022/12/30/Step_by_Step_guide_how_to_setup_VPC_Subnet_Get_Started_with_HUDI_on_EMR_Installation_Guide/index.html index 73fc68d5ef141..061be5bb30943 100644 --- a/content/videos/2022/12/30/Step_by_Step_guide_how_to_setup_VPC_Subnet_Get_Started_with_HUDI_on_EMR_Installation_Guide/index.html +++ b/content/videos/2022/12/30/Step_by_Step_guide_how_to_setup_VPC_Subnet_Get_Started_with_HUDI_on_EMR_Installation_Guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/01/01/Streaming_ETL_using_Apache_Flink_joining_multiple_Kinesis_streams_Demo/index.html b/content/videos/2023/01/01/Streaming_ETL_using_Apache_Flink_joining_multiple_Kinesis_streams_Demo/index.html index 2f7520eb0a46a..00d6453b50a7f 100644 --- a/content/videos/2023/01/01/Streaming_ETL_using_Apache_Flink_joining_multiple_Kinesis_streams_Demo/index.html +++ b/content/videos/2023/01/01/Streaming_ETL_using_Apache_Flink_joining_multiple_Kinesis_streams_Demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/01/01/Transaction_Hudi_Data_Lake_with_Streaming_ETL_from_Multiple_Kinesis_Streams_Joining_using_Flink/index.html b/content/videos/2023/01/01/Transaction_Hudi_Data_Lake_with_Streaming_ETL_from_Multiple_Kinesis_Streams_Joining_using_Flink/index.html index 1bd36f211c855..478637833dbde 100644 --- a/content/videos/2023/01/01/Transaction_Hudi_Data_Lake_with_Streaming_ETL_from_Multiple_Kinesis_Streams_Joining_using_Flink/index.html +++ b/content/videos/2023/01/01/Transaction_Hudi_Data_Lake_with_Streaming_ETL_from_Multiple_Kinesis_Streams_Joining_using_Flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/01/11/Great_ArticleApache_Hudi_vs_Delta_Lake_vs_Apache_Iceberg_Lakehouse_Feature_Comparison_by_OneHouse/index.html b/content/videos/2023/01/11/Great_ArticleApache_Hudi_vs_Delta_Lake_vs_Apache_Iceberg_Lakehouse_Feature_Comparison_by_OneHouse/index.html index 40e0886c7e651..fe230678d51af 100644 --- a/content/videos/2023/01/11/Great_ArticleApache_Hudi_vs_Delta_Lake_vs_Apache_Iceberg_Lakehouse_Feature_Comparison_by_OneHouse/index.html +++ b/content/videos/2023/01/11/Great_ArticleApache_Hudi_vs_Delta_Lake_vs_Apache_Iceberg_Lakehouse_Feature_Comparison_by_OneHouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/01/12/Build_Real_Time_Streaming_Pipeline_with_Apache_Hudi_Kinesis_and_Flink_Hands_on_Lab/index.html b/content/videos/2023/01/12/Build_Real_Time_Streaming_Pipeline_with_Apache_Hudi_Kinesis_and_Flink_Hands_on_Lab/index.html index dcdbc4a2a749b..7a9a5632fe087 100644 --- a/content/videos/2023/01/12/Build_Real_Time_Streaming_Pipeline_with_Apache_Hudi_Kinesis_and_Flink_Hands_on_Lab/index.html +++ b/content/videos/2023/01/12/Build_Real_Time_Streaming_Pipeline_with_Apache_Hudi_Kinesis_and_Flink_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/01/13/Build_Real_Time_Low_Latency_Streaming_pipeline_from_DynamoDB_to_Apache_Hudi_using_Kinesis_FlinkLab/index.html b/content/videos/2023/01/13/Build_Real_Time_Low_Latency_Streaming_pipeline_from_DynamoDB_to_Apache_Hudi_using_Kinesis_FlinkLab/index.html index c20c91c98c0dd..39d99db175838 100644 --- a/content/videos/2023/01/13/Build_Real_Time_Low_Latency_Streaming_pipeline_from_DynamoDB_to_Apache_Hudi_using_Kinesis_FlinkLab/index.html +++ b/content/videos/2023/01/13/Build_Real_Time_Low_Latency_Streaming_pipeline_from_DynamoDB_to_Apache_Hudi_using_Kinesis_FlinkLab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/01/15/Real_Time_Streaming_Data_Pipeline_From_Aurora_Postgres_to_Hudi_with_DMS_Kinesis_and_Flink_DEMO/index.html b/content/videos/2023/01/15/Real_Time_Streaming_Data_Pipeline_From_Aurora_Postgres_to_Hudi_with_DMS_Kinesis_and_Flink_DEMO/index.html index f43534ab344fc..103a24e7edd09 100644 --- a/content/videos/2023/01/15/Real_Time_Streaming_Data_Pipeline_From_Aurora_Postgres_to_Hudi_with_DMS_Kinesis_and_Flink_DEMO/index.html +++ b/content/videos/2023/01/15/Real_Time_Streaming_Data_Pipeline_From_Aurora_Postgres_to_Hudi_with_DMS_Kinesis_and_Flink_DEMO/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/01/16/Real_Time_Streaming_Pipeline_From_Aurora_Postgres_to_Hudi_with_DMS_Kinesis_and_Flink_Hands_on_Lab/index.html b/content/videos/2023/01/16/Real_Time_Streaming_Pipeline_From_Aurora_Postgres_to_Hudi_with_DMS_Kinesis_and_Flink_Hands_on_Lab/index.html index ebd75afd3f440..c5ecae7960a8f 100644 --- a/content/videos/2023/01/16/Real_Time_Streaming_Pipeline_From_Aurora_Postgres_to_Hudi_with_DMS_Kinesis_and_Flink_Hands_on_Lab/index.html +++ b/content/videos/2023/01/16/Real_Time_Streaming_Pipeline_From_Aurora_Postgres_to_Hudi_with_DMS_Kinesis_and_Flink_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/01/17/Cleaner_Service_Save_up_to_40_on_data_lake_storage_costs_Hudi_Labs/index.html b/content/videos/2023/01/17/Cleaner_Service_Save_up_to_40_on_data_lake_storage_costs_Hudi_Labs/index.html index d5955f10a6cd2..31687c0bfe4b8 100644 --- a/content/videos/2023/01/17/Cleaner_Service_Save_up_to_40_on_data_lake_storage_costs_Hudi_Labs/index.html +++ b/content/videos/2023/01/17/Cleaner_Service_Save_up_to_40_on_data_lake_storage_costs_Hudi_Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/01/17/Global_Bloom_Index_Remove_duplicates_guarantee_uniquness_Hudi_Labs/index.html b/content/videos/2023/01/17/Global_Bloom_Index_Remove_duplicates_guarantee_uniquness_Hudi_Labs/index.html index 9b8c9a1413c31..e292bff0cf55e 100644 --- a/content/videos/2023/01/17/Global_Bloom_Index_Remove_duplicates_guarantee_uniquness_Hudi_Labs/index.html +++ b/content/videos/2023/01/17/Global_Bloom_Index_Remove_duplicates_guarantee_uniquness_Hudi_Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/01/17/How_businesses_use_Hudi_Soft_delete_features_to_do_soft_delete_instead_of_hard_delete_on_Datalake/index.html b/content/videos/2023/01/17/How_businesses_use_Hudi_Soft_delete_features_to_do_soft_delete_instead_of_hard_delete_on_Datalake/index.html index 68933f5aa52a6..c310daf787a41 100644 --- a/content/videos/2023/01/17/How_businesses_use_Hudi_Soft_delete_features_to_do_soft_delete_instead_of_hard_delete_on_Datalake/index.html +++ b/content/videos/2023/01/17/How_businesses_use_Hudi_Soft_delete_features_to_do_soft_delete_instead_of_hard_delete_on_Datalake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/01/17/Leverage_Apache_Hudi_incremental_query_to_process_new_updated_data_Hudi_Labs/index.html b/content/videos/2023/01/17/Leverage_Apache_Hudi_incremental_query_to_process_new_updated_data_Hudi_Labs/index.html index 1aa5cdd737489..7a84f74ec4416 100644 --- a/content/videos/2023/01/17/Leverage_Apache_Hudi_incremental_query_to_process_new_updated_data_Hudi_Labs/index.html +++ b/content/videos/2023/01/17/Leverage_Apache_Hudi_incremental_query_to_process_new_updated_data_Hudi_Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/01/17/Leverage_Apache_Hudi_upsert_to_remove_duplicates_on_a_data_lake_Hudi_Labs/index.html b/content/videos/2023/01/17/Leverage_Apache_Hudi_upsert_to_remove_duplicates_on_a_data_lake_Hudi_Labs/index.html index 8ea0a0548663a..01f2026abbb31 100644 --- a/content/videos/2023/01/17/Leverage_Apache_Hudi_upsert_to_remove_duplicates_on_a_data_lake_Hudi_Labs/index.html +++ b/content/videos/2023/01/17/Leverage_Apache_Hudi_upsert_to_remove_duplicates_on_a_data_lake_Hudi_Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/01/17/Precomb_Key_Overview_Avoid_dedupes_Hudi_Labs/index.html b/content/videos/2023/01/17/Precomb_Key_Overview_Avoid_dedupes_Hudi_Labs/index.html index d2bb7f33a00d5..cc7c4a95be14b 100644 --- a/content/videos/2023/01/17/Precomb_Key_Overview_Avoid_dedupes_Hudi_Labs/index.html +++ b/content/videos/2023/01/17/Precomb_Key_Overview_Avoid_dedupes_Hudi_Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/01/17/Use_Apache_Hudi_for_hard_deletes_on_your_data_lake_for_data_governance_Hudi_Labs/index.html b/content/videos/2023/01/17/Use_Apache_Hudi_for_hard_deletes_on_your_data_lake_for_data_governance_Hudi_Labs/index.html index b6d5753b0204e..5335ca0931c24 100644 --- a/content/videos/2023/01/17/Use_Apache_Hudi_for_hard_deletes_on_your_data_lake_for_data_governance_Hudi_Labs/index.html +++ b/content/videos/2023/01/17/Use_Apache_Hudi_for_hard_deletes_on_your_data_lake_for_data_governance_Hudi_Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/01/20/How_do_I_identify_Schema_Changes_in_Hudi_Tables_and_Send_Email_Alert_when_New_Column_addedremoved/index.html b/content/videos/2023/01/20/How_do_I_identify_Schema_Changes_in_Hudi_Tables_and_Send_Email_Alert_when_New_Column_addedremoved/index.html index e21e8e2ba7b86..a38e067eac6db 100644 --- a/content/videos/2023/01/20/How_do_I_identify_Schema_Changes_in_Hudi_Tables_and_Send_Email_Alert_when_New_Column_addedremoved/index.html +++ b/content/videos/2023/01/20/How_do_I_identify_Schema_Changes_in_Hudi_Tables_and_Send_Email_Alert_when_New_Column_addedremoved/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/01/21/How_to_detect_and_Mask_PII_data_in_Apache_Hudi_Data_Lake_Hands_on_Lab/index.html b/content/videos/2023/01/21/How_to_detect_and_Mask_PII_data_in_Apache_Hudi_Data_Lake_Hands_on_Lab/index.html index 7f5b79d18fda7..37fa028b42b7e 100644 --- a/content/videos/2023/01/21/How_to_detect_and_Mask_PII_data_in_Apache_Hudi_Data_Lake_Hands_on_Lab/index.html +++ b/content/videos/2023/01/21/How_to_detect_and_Mask_PII_data_in_Apache_Hudi_Data_Lake_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/01/23/Writing_data_quality_and_validation_scripts_for_a_Hudi_data_lake_with_AWS_Glue_and_pydeequ_Hands_on_Lab/index.html b/content/videos/2023/01/23/Writing_data_quality_and_validation_scripts_for_a_Hudi_data_lake_with_AWS_Glue_and_pydeequ_Hands_on_Lab/index.html index 005de77fd9bc0..35c817dcc981d 100644 --- a/content/videos/2023/01/23/Writing_data_quality_and_validation_scripts_for_a_Hudi_data_lake_with_AWS_Glue_and_pydeequ_Hands_on_Lab/index.html +++ b/content/videos/2023/01/23/Writing_data_quality_and_validation_scripts_for_a_Hudi_data_lake_with_AWS_Glue_and_pydeequ_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/01/28/Learn_How_to_restrict_Intern_from_accessing_Certain_Column_in_Hudi_Datalake_with_lake_Formation/index.html b/content/videos/2023/01/28/Learn_How_to_restrict_Intern_from_accessing_Certain_Column_in_Hudi_Datalake_with_lake_Formation/index.html index 37116dcb4a9ff..42b0571e269d2 100644 --- a/content/videos/2023/01/28/Learn_How_to_restrict_Intern_from_accessing_Certain_Column_in_Hudi_Datalake_with_lake_Formation/index.html +++ b/content/videos/2023/01/28/Learn_How_to_restrict_Intern_from_accessing_Certain_Column_in_Hudi_Datalake_with_lake_Formation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/02/07/How_do_I_Ingest_Extremely_Small_Files_into_Hudi_Data_lake_with_Glue_Incremental_data_processing/index.html b/content/videos/2023/02/07/How_do_I_Ingest_Extremely_Small_Files_into_Hudi_Data_lake_with_Glue_Incremental_data_processing/index.html index fa45fea9dc56b..adb4b959e2514 100644 --- a/content/videos/2023/02/07/How_do_I_Ingest_Extremely_Small_Files_into_Hudi_Data_lake_with_Glue_Incremental_data_processing/index.html +++ b/content/videos/2023/02/07/How_do_I_Ingest_Extremely_Small_Files_into_Hudi_Data_lake_with_Glue_Incremental_data_processing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/02/11/Create_Your_Hudi_Transaction_Datalake_on_S3_with_EMR_Serverless_for_Beginners_in_fun_and_easy_way/index.html b/content/videos/2023/02/11/Create_Your_Hudi_Transaction_Datalake_on_S3_with_EMR_Serverless_for_Beginners_in_fun_and_easy_way/index.html index 6ea13b7a96f9c..b9edabac32690 100644 --- a/content/videos/2023/02/11/Create_Your_Hudi_Transaction_Datalake_on_S3_with_EMR_Serverless_for_Beginners_in_fun_and_easy_way/index.html +++ b/content/videos/2023/02/11/Create_Your_Hudi_Transaction_Datalake_on_S3_with_EMR_Serverless_for_Beginners_in_fun_and_easy_way/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/02/18/Streaming_Ingestion_from_MongoDB_into_Hudi_with_Glue_kinesis_Event_bridge_MongoStream_Hands_on_labs/index.html b/content/videos/2023/02/18/Streaming_Ingestion_from_MongoDB_into_Hudi_with_Glue_kinesis_Event_bridge_MongoStream_Hands_on_labs/index.html index 7c94590c5c241..18e2808e606e7 100644 --- a/content/videos/2023/02/18/Streaming_Ingestion_from_MongoDB_into_Hudi_with_Glue_kinesis_Event_bridge_MongoStream_Hands_on_labs/index.html +++ b/content/videos/2023/02/18/Streaming_Ingestion_from_MongoDB_into_Hudi_with_Glue_kinesis_Event_bridge_MongoStream_Hands_on_labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/02/21/Apache_Hudi_Bulk_Insert_Sort_Modes_a_summary_of_two_incredible_blogs/index.html b/content/videos/2023/02/21/Apache_Hudi_Bulk_Insert_Sort_Modes_a_summary_of_two_incredible_blogs/index.html index 8ffeabcc7e37d..2006c694e46eb 100644 --- a/content/videos/2023/02/21/Apache_Hudi_Bulk_Insert_Sort_Modes_a_summary_of_two_incredible_blogs/index.html +++ b/content/videos/2023/02/21/Apache_Hudi_Bulk_Insert_Sort_Modes_a_summary_of_two_incredible_blogs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/02/22/Use_Glue_40_to_take_regular_save_points_for_your_Hudi_tables_for_backup_or_disaster_Recovery/index.html b/content/videos/2023/02/22/Use_Glue_40_to_take_regular_save_points_for_your_Hudi_tables_for_backup_or_disaster_Recovery/index.html index 5222f618e4087..bb188eab424b3 100644 --- a/content/videos/2023/02/22/Use_Glue_40_to_take_regular_save_points_for_your_Hudi_tables_for_backup_or_disaster_Recovery/index.html +++ b/content/videos/2023/02/22/Use_Glue_40_to_take_regular_save_points_for_your_Hudi_tables_for_backup_or_disaster_Recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/02/25/RFC51_Change_Data_Capture_in_Apache_Hudi_like_Debezium_and_AWS_DMS_Hands_on_Labs/index.html b/content/videos/2023/02/25/RFC51_Change_Data_Capture_in_Apache_Hudi_like_Debezium_and_AWS_DMS_Hands_on_Labs/index.html index bfea99a6f66e2..c8478ddee9a34 100644 --- a/content/videos/2023/02/25/RFC51_Change_Data_Capture_in_Apache_Hudi_like_Debezium_and_AWS_DMS_Hands_on_Labs/index.html +++ b/content/videos/2023/02/25/RFC51_Change_Data_Capture_in_Apache_Hudi_like_Debezium_and_AWS_DMS_Hands_on_Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/02/26/Python_helper_class_which_makes_querying_incremental_data_from_Hudi_Data_lakes_easy/index.html b/content/videos/2023/02/26/Python_helper_class_which_makes_querying_incremental_data_from_Hudi_Data_lakes_easy/index.html index 9f4c6100841ee..afd9f661ed90c 100644 --- a/content/videos/2023/02/26/Python_helper_class_which_makes_querying_incremental_data_from_Hudi_Data_lakes_easy/index.html +++ b/content/videos/2023/02/26/Python_helper_class_which_makes_querying_incremental_data_from_Hudi_Data_lakes_easy/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/04/Develop_Incremental_Pipeline_with_CDC_from_Hudi_to_Aurora_Postgres_Demo_Video/index.html b/content/videos/2023/03/04/Develop_Incremental_Pipeline_with_CDC_from_Hudi_to_Aurora_Postgres_Demo_Video/index.html index 3bfae99c544e4..cffd099fe3fa9 100644 --- a/content/videos/2023/03/04/Develop_Incremental_Pipeline_with_CDC_from_Hudi_to_Aurora_Postgres_Demo_Video/index.html +++ b/content/videos/2023/03/04/Develop_Incremental_Pipeline_with_CDC_from_Hudi_to_Aurora_Postgres_Demo_Video/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/06/Power_your_Down_Stream_ElasticSearch_Stack_From_Apache_Hudi_Transaction_Datalake_with_CDCDemo_Video/index.html b/content/videos/2023/03/06/Power_your_Down_Stream_ElasticSearch_Stack_From_Apache_Hudi_Transaction_Datalake_with_CDCDemo_Video/index.html index fd398e90ce003..cddc05482aac6 100644 --- a/content/videos/2023/03/06/Power_your_Down_Stream_ElasticSearch_Stack_From_Apache_Hudi_Transaction_Datalake_with_CDCDemo_Video/index.html +++ b/content/videos/2023/03/06/Power_your_Down_Stream_ElasticSearch_Stack_From_Apache_Hudi_Transaction_Datalake_with_CDCDemo_Video/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/06/Power_your_Down_Stream_Elastic_Search_Stack_From_Apache_Hudi_Transaction_Datalake_with_CDCDeepDive/index.html b/content/videos/2023/03/06/Power_your_Down_Stream_Elastic_Search_Stack_From_Apache_Hudi_Transaction_Datalake_with_CDCDeepDive/index.html index 0aa013e5cd97b..b77f10b12dbea 100644 --- a/content/videos/2023/03/06/Power_your_Down_Stream_Elastic_Search_Stack_From_Apache_Hudi_Transaction_Datalake_with_CDCDeepDive/index.html +++ b/content/videos/2023/03/06/Power_your_Down_Stream_Elastic_Search_Stack_From_Apache_Hudi_Transaction_Datalake_with_CDCDeepDive/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/07/How_to_Rollback_to_Previous_Checkpoint_during_Disaster_in_Apache_Hudi_using_Glue_40_Demo/index.html b/content/videos/2023/03/07/How_to_Rollback_to_Previous_Checkpoint_during_Disaster_in_Apache_Hudi_using_Glue_40_Demo/index.html index 70819204e55a4..4e5df0ad0e5ac 100644 --- a/content/videos/2023/03/07/How_to_Rollback_to_Previous_Checkpoint_during_Disaster_in_Apache_Hudi_using_Glue_40_Demo/index.html +++ b/content/videos/2023/03/07/How_to_Rollback_to_Previous_Checkpoint_during_Disaster_in_Apache_Hudi_using_Glue_40_Demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/11/How_do_I_read_data_from_Cross_Account_S3_Buckets_and_Build_Hudi_Datalake_in_Datateam_Account/index.html b/content/videos/2023/03/11/How_do_I_read_data_from_Cross_Account_S3_Buckets_and_Build_Hudi_Datalake_in_Datateam_Account/index.html index 21a1f1dfd83d1..bf4da25c86e82 100644 --- a/content/videos/2023/03/11/How_do_I_read_data_from_Cross_Account_S3_Buckets_and_Build_Hudi_Datalake_in_Datateam_Account/index.html +++ b/content/videos/2023/03/11/How_do_I_read_data_from_Cross_Account_S3_Buckets_and_Build_Hudi_Datalake_in_Datateam_Account/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/11/Query_crossaccount_Hudi_Glue_Data_Catalogs_using_Amazon_Athena/index.html b/content/videos/2023/03/11/Query_crossaccount_Hudi_Glue_Data_Catalogs_using_Amazon_Athena/index.html index 57bcca2e48979..4296598c6bb98 100644 --- a/content/videos/2023/03/11/Query_crossaccount_Hudi_Glue_Data_Catalogs_using_Amazon_Athena/index.html +++ b/content/videos/2023/03/11/Query_crossaccount_Hudi_Glue_Data_Catalogs_using_Amazon_Athena/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/15/Learn_About_Bucket_Index_SIMPLE_In_Apache_Hudi_with_lab/index.html b/content/videos/2023/03/15/Learn_About_Bucket_Index_SIMPLE_In_Apache_Hudi_with_lab/index.html index d4081bdc97438..6cc2c100c03a2 100644 --- a/content/videos/2023/03/15/Learn_About_Bucket_Index_SIMPLE_In_Apache_Hudi_with_lab/index.html +++ b/content/videos/2023/03/15/Learn_About_Bucket_Index_SIMPLE_In_Apache_Hudi_with_lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/17/Setting_Uber_s_Transactional_Data_Lake_in_Motion_with_Incremental_ETL_Using_Apache_Hudi/index.html b/content/videos/2023/03/17/Setting_Uber_s_Transactional_Data_Lake_in_Motion_with_Incremental_ETL_Using_Apache_Hudi/index.html index aff9e793863f5..b301313ed6a19 100644 --- a/content/videos/2023/03/17/Setting_Uber_s_Transactional_Data_Lake_in_Motion_with_Incremental_ETL_Using_Apache_Hudi/index.html +++ b/content/videos/2023/03/17/Setting_Uber_s_Transactional_Data_Lake_in_Motion_with_Incremental_ETL_Using_Apache_Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/18/Push_Hudi_Commit_Notification_TO_HTTP_URI_with_Callback/index.html b/content/videos/2023/03/18/Push_Hudi_Commit_Notification_TO_HTTP_URI_with_Callback/index.html index 9da7cf5e41dc7..6ee0370e08d42 100644 --- a/content/videos/2023/03/18/Push_Hudi_Commit_Notification_TO_HTTP_URI_with_Callback/index.html +++ b/content/videos/2023/03/18/Push_Hudi_Commit_Notification_TO_HTTP_URI_with_Callback/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/19/RFC_18_Insert_Overwrite_in_Apache_Hudi_with_Example/index.html b/content/videos/2023/03/19/RFC_18_Insert_Overwrite_in_Apache_Hudi_with_Example/index.html index b284ecce8a8ac..3845b4efebf0f 100644 --- a/content/videos/2023/03/19/RFC_18_Insert_Overwrite_in_Apache_Hudi_with_Example/index.html +++ b/content/videos/2023/03/19/RFC_18_Insert_Overwrite_in_Apache_Hudi_with_Example/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/21/RFC_42_Consistent_Hashing_in_Apache_Hudi_MOR_Tables/index.html b/content/videos/2023/03/21/RFC_42_Consistent_Hashing_in_Apache_Hudi_MOR_Tables/index.html index 430993ace3484..8414cc6d3be51 100644 --- a/content/videos/2023/03/21/RFC_42_Consistent_Hashing_in_Apache_Hudi_MOR_Tables/index.html +++ b/content/videos/2023/03/21/RFC_42_Consistent_Hashing_in_Apache_Hudi_MOR_Tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/24/Data_Analysis_for_Apache_Hudi_Blogs_on_Medium_with_Pandas/index.html b/content/videos/2023/03/24/Data_Analysis_for_Apache_Hudi_Blogs_on_Medium_with_Pandas/index.html index ec56fcd4e6a81..7af26d95d58d5 100644 --- a/content/videos/2023/03/24/Data_Analysis_for_Apache_Hudi_Blogs_on_Medium_with_Pandas/index.html +++ b/content/videos/2023/03/24/Data_Analysis_for_Apache_Hudi_Blogs_on_Medium_with_Pandas/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_1/index.html b/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_1/index.html index c78837e3b37e8..328eec027f554 100644 --- a/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_1/index.html +++ b/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_2/index.html b/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_2/index.html index 8dccc9572585a..40f06039c54c4 100644 --- a/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_2/index.html +++ b/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_3/index.html b/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_3/index.html index c2ed03acf941d..2655f1fb8eb2b 100644 --- a/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_3/index.html +++ b/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_4/index.html b/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_4/index.html index 93b89fd9ba21a..30caa90adf1de 100644 --- a/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_4/index.html +++ b/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_5/index.html b/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_5/index.html index 1c32d6e8c4c6f..f71f589624324 100644 --- a/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_5/index.html +++ b/content/videos/2023/03/25/Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_with_AWS_DMS_PART_5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/25/Weekend_Project_Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_1/index.html b/content/videos/2023/03/25/Weekend_Project_Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_1/index.html index a2d4a2ae806b1..eaa6ba41a8880 100644 --- a/content/videos/2023/03/25/Weekend_Project_Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_1/index.html +++ b/content/videos/2023/03/25/Weekend_Project_Build_CDC_Pipeline_from_Microsoft_SQL_Server_into_Apache_Hudi_1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/26/How_to_use_Apache_Hudi_with_AWS_Glue_Studio_Visual_Editor_Hands_on_Lab/index.html b/content/videos/2023/03/26/How_to_use_Apache_Hudi_with_AWS_Glue_Studio_Visual_Editor_Hands_on_Lab/index.html index 5adda1dd649c4..3eb9bc757adea 100644 --- a/content/videos/2023/03/26/How_to_use_Apache_Hudi_with_AWS_Glue_Studio_Visual_Editor_Hands_on_Lab/index.html +++ b/content/videos/2023/03/26/How_to_use_Apache_Hudi_with_AWS_Glue_Studio_Visual_Editor_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_1/index.html b/content/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_1/index.html index 202d6b3f3f558..f7dc76a596115 100644 --- a/content/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_1/index.html +++ b/content/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_2/index.html b/content/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_2/index.html index 837830c9d26c4..185b688f9ab1c 100644 --- a/content/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_2/index.html +++ b/content/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_3/index.html b/content/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_3/index.html index e4f0caf373152..764364931fbd8 100644 --- a/content/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_3/index.html +++ b/content/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_4/index.html b/content/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_4/index.html index 9c055e4abe420..005494fc63a65 100644 --- a/content/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_4/index.html +++ b/content/videos/2023/03/30/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/03/31/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_5/index.html b/content/videos/2023/03/31/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_5/index.html index 2d7cd90aa6ff4..72a626018d529 100644 --- a/content/videos/2023/03/31/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_5/index.html +++ b/content/videos/2023/03/31/Project_Using_Apache_Hudi_Deltastreamer_and_AWS_DMS_Hands_on_Lab_Part_5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/04/02/Learn_How_to_Integrate_Apache_Hudi_with_Redshift_Spectrum_Hands_on_Labs_with_Code/index.html b/content/videos/2023/04/02/Learn_How_to_Integrate_Apache_Hudi_with_Redshift_Spectrum_Hands_on_Labs_with_Code/index.html index 379753f968777..a20fe7995710c 100644 --- a/content/videos/2023/04/02/Learn_How_to_Integrate_Apache_Hudi_with_Redshift_Spectrum_Hands_on_Labs_with_Code/index.html +++ b/content/videos/2023/04/02/Learn_How_to_Integrate_Apache_Hudi_with_Redshift_Spectrum_Hands_on_Labs_with_Code/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/04/04/Running_Apache_Hudi_Delta_Streamer_On_EMR_Serverless_Hands_on_Lab_step_by_step_guide/index.html b/content/videos/2023/04/04/Running_Apache_Hudi_Delta_Streamer_On_EMR_Serverless_Hands_on_Lab_step_by_step_guide/index.html index 728ed1f388b58..87301b29356f0 100644 --- a/content/videos/2023/04/04/Running_Apache_Hudi_Delta_Streamer_On_EMR_Serverless_Hands_on_Lab_step_by_step_guide/index.html +++ b/content/videos/2023/04/04/Running_Apache_Hudi_Delta_Streamer_On_EMR_Serverless_Hands_on_Lab_step_by_step_guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/04/05/Getting_Alerts_when_hudi_Delta_Streamer_Fails_with_Event_Driven_Approach_using_Lambdas_Event_Bridge/index.html b/content/videos/2023/04/05/Getting_Alerts_when_hudi_Delta_Streamer_Fails_with_Event_Driven_Approach_using_Lambdas_Event_Bridge/index.html index b5c5043e5fff2..7f389e447eda6 100644 --- a/content/videos/2023/04/05/Getting_Alerts_when_hudi_Delta_Streamer_Fails_with_Event_Driven_Approach_using_Lambdas_Event_Bridge/index.html +++ b/content/videos/2023/04/05/Getting_Alerts_when_hudi_Delta_Streamer_Fails_with_Event_Driven_Approach_using_Lambdas_Event_Bridge/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/04/06/Efficient_Data_Lake_Management_with_Apache_Hudi_Cleaner_Benefits_of_Scheduling_Data_Cleaning_1/index.html b/content/videos/2023/04/06/Efficient_Data_Lake_Management_with_Apache_Hudi_Cleaner_Benefits_of_Scheduling_Data_Cleaning_1/index.html index f341183306314..de649e4334164 100644 --- a/content/videos/2023/04/06/Efficient_Data_Lake_Management_with_Apache_Hudi_Cleaner_Benefits_of_Scheduling_Data_Cleaning_1/index.html +++ b/content/videos/2023/04/06/Efficient_Data_Lake_Management_with_Apache_Hudi_Cleaner_Benefits_of_Scheduling_Data_Cleaning_1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/04/06/Efficient_Data_Lake_Management_with_Apache_Hudi_Cleaner_Benefits_of_Scheduling_Data_Cleaning_2/index.html b/content/videos/2023/04/06/Efficient_Data_Lake_Management_with_Apache_Hudi_Cleaner_Benefits_of_Scheduling_Data_Cleaning_2/index.html index 382d81d18b85c..006e8021f38b6 100644 --- a/content/videos/2023/04/06/Efficient_Data_Lake_Management_with_Apache_Hudi_Cleaner_Benefits_of_Scheduling_Data_Cleaning_2/index.html +++ b/content/videos/2023/04/06/Efficient_Data_Lake_Management_with_Apache_Hudi_Cleaner_Benefits_of_Scheduling_Data_Cleaning_2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/04/07/Advantages_of_Metadata_Indexing_and_Asynchronous_Indexing_in_Hudi_Hands_on_Lab/index.html b/content/videos/2023/04/07/Advantages_of_Metadata_Indexing_and_Asynchronous_Indexing_in_Hudi_Hands_on_Lab/index.html index fa2db4eba8171..f593a99c5504d 100644 --- a/content/videos/2023/04/07/Advantages_of_Metadata_Indexing_and_Asynchronous_Indexing_in_Hudi_Hands_on_Lab/index.html +++ b/content/videos/2023/04/07/Advantages_of_Metadata_Indexing_and_Asynchronous_Indexing_in_Hudi_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/04/08/Understanding_Clustering_in_Apache_Hudi_and_the_Benefits_of_Asynchronous_Clustering/index.html b/content/videos/2023/04/08/Understanding_Clustering_in_Apache_Hudi_and_the_Benefits_of_Asynchronous_Clustering/index.html index 5a31c78ca0162..569afadec334e 100644 --- a/content/videos/2023/04/08/Understanding_Clustering_in_Apache_Hudi_and_the_Benefits_of_Asynchronous_Clustering/index.html +++ b/content/videos/2023/04/08/Understanding_Clustering_in_Apache_Hudi_and_the_Benefits_of_Asynchronous_Clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/04/09/Bootstrapping_in_Apache_Hudi_on_EMR_Serverless_with_Lab/index.html b/content/videos/2023/04/09/Bootstrapping_in_Apache_Hudi_on_EMR_Serverless_with_Lab/index.html index cc96407fbca52..6bb4b02872a1f 100644 --- a/content/videos/2023/04/09/Bootstrapping_in_Apache_Hudi_on_EMR_Serverless_with_Lab/index.html +++ b/content/videos/2023/04/09/Bootstrapping_in_Apache_Hudi_on_EMR_Serverless_with_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/04/11/Journey_to_Hudi_Transactional_Data_Lake_Mastery_How_I_Learned_and_Succeeded/index.html b/content/videos/2023/04/11/Journey_to_Hudi_Transactional_Data_Lake_Mastery_How_I_Learned_and_Succeeded/index.html index 6c2a5ea1497b4..c9c56842dfde9 100644 --- a/content/videos/2023/04/11/Journey_to_Hudi_Transactional_Data_Lake_Mastery_How_I_Learned_and_Succeeded/index.html +++ b/content/videos/2023/04/11/Journey_to_Hudi_Transactional_Data_Lake_Mastery_How_I_Learned_and_Succeeded/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/04/11/Learn_about_Apache_Hudi_Transformers_with_Hands_on_Lab/index.html b/content/videos/2023/04/11/Learn_about_Apache_Hudi_Transformers_with_Hands_on_Lab/index.html index bf87a28661431..3b65a6ee07183 100644 --- a/content/videos/2023/04/11/Learn_about_Apache_Hudi_Transformers_with_Hands_on_Lab/index.html +++ b/content/videos/2023/04/11/Learn_about_Apache_Hudi_Transformers_with_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/04/12/Efficient_Data_Ingestion_with_Glue_Concurrency_and_Hudi_Data_Lake/index.html b/content/videos/2023/04/12/Efficient_Data_Ingestion_with_Glue_Concurrency_and_Hudi_Data_Lake/index.html index 29b285bd553a5..e518a916c4fc3 100644 --- a/content/videos/2023/04/12/Efficient_Data_Ingestion_with_Glue_Concurrency_and_Hudi_Data_Lake/index.html +++ b/content/videos/2023/04/12/Efficient_Data_Ingestion_with_Glue_Concurrency_and_Hudi_Data_Lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/04/20/Effortlessly_Sync_Your_JDBC_Source_to_Hudi_Transactional_Datalake_No_DMS_or_Debezium_Required/index.html b/content/videos/2023/04/20/Effortlessly_Sync_Your_JDBC_Source_to_Hudi_Transactional_Datalake_No_DMS_or_Debezium_Required/index.html index 6b56c5266e38a..e67ef26ed6099 100644 --- a/content/videos/2023/04/20/Effortlessly_Sync_Your_JDBC_Source_to_Hudi_Transactional_Datalake_No_DMS_or_Debezium_Required/index.html +++ b/content/videos/2023/04/20/Effortlessly_Sync_Your_JDBC_Source_to_Hudi_Transactional_Datalake_No_DMS_or_Debezium_Required/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/04/25/Joining_Hudi_Raw_Tables_for_Powerful_Data_Analysis_with_Spark_SQL/index.html b/content/videos/2023/04/25/Joining_Hudi_Raw_Tables_for_Powerful_Data_Analysis_with_Spark_SQL/index.html index 38521bed4885b..0cf2871b5f217 100644 --- a/content/videos/2023/04/25/Joining_Hudi_Raw_Tables_for_Powerful_Data_Analysis_with_Spark_SQL/index.html +++ b/content/videos/2023/04/25/Joining_Hudi_Raw_Tables_for_Powerful_Data_Analysis_with_Spark_SQL/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/04/26/From_Raw_Data_to_Insights_Building_a_Lake_House_with_Hudi_and_Star_Schema_Step_by_Step_Guide/index.html b/content/videos/2023/04/26/From_Raw_Data_to_Insights_Building_a_Lake_House_with_Hudi_and_Star_Schema_Step_by_Step_Guide/index.html index 03a53b792ecf2..1f5c1c3be6e69 100644 --- a/content/videos/2023/04/26/From_Raw_Data_to_Insights_Building_a_Lake_House_with_Hudi_and_Star_Schema_Step_by_Step_Guide/index.html +++ b/content/videos/2023/04/26/From_Raw_Data_to_Insights_Building_a_Lake_House_with_Hudi_and_Star_Schema_Step_by_Step_Guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/04/29/Efficiently_Managing_Ride_Late_Arriving_Tips_Data_with_Incremental_ETL_using_Apache_Hudi_Hands_On/index.html b/content/videos/2023/04/29/Efficiently_Managing_Ride_Late_Arriving_Tips_Data_with_Incremental_ETL_using_Apache_Hudi_Hands_On/index.html index 30227b517d39d..85d8a72677fa7 100644 --- a/content/videos/2023/04/29/Efficiently_Managing_Ride_Late_Arriving_Tips_Data_with_Incremental_ETL_using_Apache_Hudi_Hands_On/index.html +++ b/content/videos/2023/04/29/Efficiently_Managing_Ride_Late_Arriving_Tips_Data_with_Incremental_ETL_using_Apache_Hudi_Hands_On/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/05/01/Building_a_Scalable_and_Resilient_Streaming_ETL_Pipeline_with_Hudi_s_Incremental_Processing_1/index.html b/content/videos/2023/05/01/Building_a_Scalable_and_Resilient_Streaming_ETL_Pipeline_with_Hudi_s_Incremental_Processing_1/index.html index 5fc7f9d6ec3fc..78b792a310c9b 100644 --- a/content/videos/2023/05/01/Building_a_Scalable_and_Resilient_Streaming_ETL_Pipeline_with_Hudi_s_Incremental_Processing_1/index.html +++ b/content/videos/2023/05/01/Building_a_Scalable_and_Resilient_Streaming_ETL_Pipeline_with_Hudi_s_Incremental_Processing_1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/05/03/Build_deploy_and_run_Spark_jobs_on_Amazon_EMR_with_the_opensource_EMR_CLI_tool/index.html b/content/videos/2023/05/03/Build_deploy_and_run_Spark_jobs_on_Amazon_EMR_with_the_opensource_EMR_CLI_tool/index.html index 5ccceb450e82d..fc84e87382a08 100644 --- a/content/videos/2023/05/03/Build_deploy_and_run_Spark_jobs_on_Amazon_EMR_with_the_opensource_EMR_CLI_tool/index.html +++ b/content/videos/2023/05/03/Build_deploy_and_run_Spark_jobs_on_Amazon_EMR_with_the_opensource_EMR_CLI_tool/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/05/03/Mastering_Slowly_Changing_Dimension_with_Hudi_A_StepbyStep_Guide_to_Efficient_Data_Management/index.html b/content/videos/2023/05/03/Mastering_Slowly_Changing_Dimension_with_Hudi_A_StepbyStep_Guide_to_Efficient_Data_Management/index.html index abbe11ca61594..4573e98951a32 100644 --- a/content/videos/2023/05/03/Mastering_Slowly_Changing_Dimension_with_Hudi_A_StepbyStep_Guide_to_Efficient_Data_Management/index.html +++ b/content/videos/2023/05/03/Mastering_Slowly_Changing_Dimension_with_Hudi_A_StepbyStep_Guide_to_Efficient_Data_Management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/05/06/How_to_Build_Your_Own_Version_of_AWS_Glue_Bookmark_to_get_Only_New_Incremental_Files/index.html b/content/videos/2023/05/06/How_to_Build_Your_Own_Version_of_AWS_Glue_Bookmark_to_get_Only_New_Incremental_Files/index.html index fed567287cc29..2d1ca105ec401 100644 --- a/content/videos/2023/05/06/How_to_Build_Your_Own_Version_of_AWS_Glue_Bookmark_to_get_Only_New_Incremental_Files/index.html +++ b/content/videos/2023/05/06/How_to_Build_Your_Own_Version_of_AWS_Glue_Bookmark_to_get_Only_New_Incremental_Files/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/05/07/Maximizing_Efficiency_DataLake_Hudi_Glue_ETL_Jobs_with_Templated_Approach_Serverless_Architecture/index.html b/content/videos/2023/05/07/Maximizing_Efficiency_DataLake_Hudi_Glue_ETL_Jobs_with_Templated_Approach_Serverless_Architecture/index.html index b3e7bf13d47d7..a1af71d3f729d 100644 --- a/content/videos/2023/05/07/Maximizing_Efficiency_DataLake_Hudi_Glue_ETL_Jobs_with_Templated_Approach_Serverless_Architecture/index.html +++ b/content/videos/2023/05/07/Maximizing_Efficiency_DataLake_Hudi_Glue_ETL_Jobs_with_Templated_Approach_Serverless_Architecture/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/05/11/EMR_Serverless_for_Beginners_Ingest_Data_incrementally_Submit_Spark_Job_with_EMRCLI_Data_lake/index.html b/content/videos/2023/05/11/EMR_Serverless_for_Beginners_Ingest_Data_incrementally_Submit_Spark_Job_with_EMRCLI_Data_lake/index.html index 79bb1838dc34c..abace53ac3942 100644 --- a/content/videos/2023/05/11/EMR_Serverless_for_Beginners_Ingest_Data_incrementally_Submit_Spark_Job_with_EMRCLI_Data_lake/index.html +++ b/content/videos/2023/05/11/EMR_Serverless_for_Beginners_Ingest_Data_incrementally_Submit_Spark_Job_with_EMRCLI_Data_lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/05/13/EMR_Serverless_Made_Easy_Submitting_Hive_SQL_Queries_for_Beginners_with_NYC_Taxi_Dataset/index.html b/content/videos/2023/05/13/EMR_Serverless_Made_Easy_Submitting_Hive_SQL_Queries_for_Beginners_with_NYC_Taxi_Dataset/index.html index 1765cb64cd414..07810b4b0c310 100644 --- a/content/videos/2023/05/13/EMR_Serverless_Made_Easy_Submitting_Hive_SQL_Queries_for_Beginners_with_NYC_Taxi_Dataset/index.html +++ b/content/videos/2023/05/13/EMR_Serverless_Made_Easy_Submitting_Hive_SQL_Queries_for_Beginners_with_NYC_Taxi_Dataset/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/05/16/Unify_Your_Event_Data_Guide_to_Mapping_Events_to_Standardized_Format_with_Incremental_ETL_using_Hudi/index.html b/content/videos/2023/05/16/Unify_Your_Event_Data_Guide_to_Mapping_Events_to_Standardized_Format_with_Incremental_ETL_using_Hudi/index.html index e2e9491cfefcd..7dbde40bfca1a 100644 --- a/content/videos/2023/05/16/Unify_Your_Event_Data_Guide_to_Mapping_Events_to_Standardized_Format_with_Incremental_ETL_using_Hudi/index.html +++ b/content/videos/2023/05/16/Unify_Your_Event_Data_Guide_to_Mapping_Events_to_Standardized_Format_with_Incremental_ETL_using_Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/05/19/HandsOn_Lab_Unleashing_Efficiency_and_Flexibility_with_Partial_Updates_in_Apache_Hudi/index.html b/content/videos/2023/05/19/HandsOn_Lab_Unleashing_Efficiency_and_Flexibility_with_Partial_Updates_in_Apache_Hudi/index.html index 6f9be833ad825..b247e38167959 100644 --- a/content/videos/2023/05/19/HandsOn_Lab_Unleashing_Efficiency_and_Flexibility_with_Partial_Updates_in_Apache_Hudi/index.html +++ b/content/videos/2023/05/19/HandsOn_Lab_Unleashing_Efficiency_and_Flexibility_with_Partial_Updates_in_Apache_Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/05/20/Mastering_File_Sizing_in_Hudi_Boosting_Performance_and_Efficiency/index.html b/content/videos/2023/05/20/Mastering_File_Sizing_in_Hudi_Boosting_Performance_and_Efficiency/index.html index 988ca26a22b97..bd45b2534588d 100644 --- a/content/videos/2023/05/20/Mastering_File_Sizing_in_Hudi_Boosting_Performance_and_Efficiency/index.html +++ b/content/videos/2023/05/20/Mastering_File_Sizing_in_Hudi_Boosting_Performance_and_Efficiency/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/05/21/How_to_Set_Up_AWS_Glue_Locally_with_Docker_Accessing_Glue_Database_Table_in_Your_LocalEnvironment/index.html b/content/videos/2023/05/21/How_to_Set_Up_AWS_Glue_Locally_with_Docker_Accessing_Glue_Database_Table_in_Your_LocalEnvironment/index.html index 86f89ea7d459d..1c82b75c3c48a 100644 --- a/content/videos/2023/05/21/How_to_Set_Up_AWS_Glue_Locally_with_Docker_Accessing_Glue_Database_Table_in_Your_LocalEnvironment/index.html +++ b/content/videos/2023/05/21/How_to_Set_Up_AWS_Glue_Locally_with_Docker_Accessing_Glue_Database_Table_in_Your_LocalEnvironment/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/05/27/Automate_alerting_and_reporting_for_AWS_Glue_job_resource_usage/index.html b/content/videos/2023/05/27/Automate_alerting_and_reporting_for_AWS_Glue_job_resource_usage/index.html index 89dfc969de957..ba3d568fe80c9 100644 --- a/content/videos/2023/05/27/Automate_alerting_and_reporting_for_AWS_Glue_job_resource_usage/index.html +++ b/content/videos/2023/05/27/Automate_alerting_and_reporting_for_AWS_Glue_job_resource_usage/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/05/31/AWS_and_Apache_Hudi_Workshop_Overview_Build_a_ride_share_lakehouse_platform/index.html b/content/videos/2023/05/31/AWS_and_Apache_Hudi_Workshop_Overview_Build_a_ride_share_lakehouse_platform/index.html index a908763da2b7d..10050e55d98c4 100644 --- a/content/videos/2023/05/31/AWS_and_Apache_Hudi_Workshop_Overview_Build_a_ride_share_lakehouse_platform/index.html +++ b/content/videos/2023/05/31/AWS_and_Apache_Hudi_Workshop_Overview_Build_a_ride_share_lakehouse_platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/06/02/How_to_Query_Hudi_Tables_in_Incremental_Fashion_and_Get_only_New_data_on_AWS_Glue_Hands_on_Lab/index.html b/content/videos/2023/06/02/How_to_Query_Hudi_Tables_in_Incremental_Fashion_and_Get_only_New_data_on_AWS_Glue_Hands_on_Lab/index.html index c2e650397cb4d..bce94acb7d7a8 100644 --- a/content/videos/2023/06/02/How_to_Query_Hudi_Tables_in_Incremental_Fashion_and_Get_only_New_data_on_AWS_Glue_Hands_on_Lab/index.html +++ b/content/videos/2023/06/02/How_to_Query_Hudi_Tables_in_Incremental_Fashion_and_Get_only_New_data_on_AWS_Glue_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/06/05/How_to_JOIN_Hudi_Tables_in_Incremental_fashion_with_DynamoDB_in_AWS_GLue_Hands_on_Lab_for_Begineer/index.html b/content/videos/2023/06/05/How_to_JOIN_Hudi_Tables_in_Incremental_fashion_with_DynamoDB_in_AWS_GLue_Hands_on_Lab_for_Begineer/index.html index c510a47079771..19a4a276bae0e 100644 --- a/content/videos/2023/06/05/How_to_JOIN_Hudi_Tables_in_Incremental_fashion_with_DynamoDB_in_AWS_GLue_Hands_on_Lab_for_Begineer/index.html +++ b/content/videos/2023/06/05/How_to_JOIN_Hudi_Tables_in_Incremental_fashion_with_DynamoDB_in_AWS_GLue_Hands_on_Lab_for_Begineer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/06/07/How_Data_Scientist_Data_Engineer_Can_Query_Hudi_Tables_with_Athena_Spark_Notebook_for_AdhocAnalysis/index.html b/content/videos/2023/06/07/How_Data_Scientist_Data_Engineer_Can_Query_Hudi_Tables_with_Athena_Spark_Notebook_for_AdhocAnalysis/index.html index fd814f9ac37f8..ca52d47e44738 100644 --- a/content/videos/2023/06/07/How_Data_Scientist_Data_Engineer_Can_Query_Hudi_Tables_with_Athena_Spark_Notebook_for_AdhocAnalysis/index.html +++ b/content/videos/2023/06/07/How_Data_Scientist_Data_Engineer_Can_Query_Hudi_Tables_with_Athena_Spark_Notebook_for_AdhocAnalysis/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/06/07/Learn_How_to_delete_Partition_in_Apache_Hudi_on_AWS_Glue_Hands_on/index.html b/content/videos/2023/06/07/Learn_How_to_delete_Partition_in_Apache_Hudi_on_AWS_Glue_Hands_on/index.html index b3f32756ff479..88ac21e44bfb7 100644 --- a/content/videos/2023/06/07/Learn_How_to_delete_Partition_in_Apache_Hudi_on_AWS_Glue_Hands_on/index.html +++ b/content/videos/2023/06/07/Learn_How_to_delete_Partition_in_Apache_Hudi_on_AWS_Glue_Hands_on/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/06/10/How_to_read_data_from_Multiple_Hudi_Tables_Join_them_and_insert_into_DynamoDB_with_AWS_Glue/index.html b/content/videos/2023/06/10/How_to_read_data_from_Multiple_Hudi_Tables_Join_them_and_insert_into_DynamoDB_with_AWS_Glue/index.html index bb4c66b94f45b..00a80ead9cf14 100644 --- a/content/videos/2023/06/10/How_to_read_data_from_Multiple_Hudi_Tables_Join_them_and_insert_into_DynamoDB_with_AWS_Glue/index.html +++ b/content/videos/2023/06/10/How_to_read_data_from_Multiple_Hudi_Tables_Join_them_and_insert_into_DynamoDB_with_AWS_Glue/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/06/16/SNS_Lambda_How_to_Trigger_Lambda_Functions_from_SNS_using_Message_Filtering/index.html b/content/videos/2023/06/16/SNS_Lambda_How_to_Trigger_Lambda_Functions_from_SNS_using_Message_Filtering/index.html index 080b130537b24..d0a4cc5b2991a 100644 --- a/content/videos/2023/06/16/SNS_Lambda_How_to_Trigger_Lambda_Functions_from_SNS_using_Message_Filtering/index.html +++ b/content/videos/2023/06/16/SNS_Lambda_How_to_Trigger_Lambda_Functions_from_SNS_using_Message_Filtering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/06/22/Full_Workshop_Recap_Build_a_rideshare_lakehouse_platform/index.html b/content/videos/2023/06/22/Full_Workshop_Recap_Build_a_rideshare_lakehouse_platform/index.html index 235a990768347..b46a6e26a1a53 100644 --- a/content/videos/2023/06/22/Full_Workshop_Recap_Build_a_rideshare_lakehouse_platform/index.html +++ b/content/videos/2023/06/22/Full_Workshop_Recap_Build_a_rideshare_lakehouse_platform/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/06/23/Learn_About_Apache_Hudi_Pre_Commit_Validator_with_Hands_on_Lab/index.html b/content/videos/2023/06/23/Learn_About_Apache_Hudi_Pre_Commit_Validator_with_Hands_on_Lab/index.html index a9a802938b3b8..04372044c87e9 100644 --- a/content/videos/2023/06/23/Learn_About_Apache_Hudi_Pre_Commit_Validator_with_Hands_on_Lab/index.html +++ b/content/videos/2023/06/23/Learn_About_Apache_Hudi_Pre_Commit_Validator_with_Hands_on_Lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/07/01/Building_Lakehouse_using_Hudi_Apache_Hudi_Data_Lakehouse_Hudi_Apache/index.html b/content/videos/2023/07/01/Building_Lakehouse_using_Hudi_Apache_Hudi_Data_Lakehouse_Hudi_Apache/index.html index 1b2025f48c0a4..cafc8b9338e8e 100644 --- a/content/videos/2023/07/01/Building_Lakehouse_using_Hudi_Apache_Hudi_Data_Lakehouse_Hudi_Apache/index.html +++ b/content/videos/2023/07/01/Building_Lakehouse_using_Hudi_Apache_Hudi_Data_Lakehouse_Hudi_Apache/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/07/02/Hudi_Best_Practices_Handling_Failed_InsertsUpserts_with_Error_Tables/index.html b/content/videos/2023/07/02/Hudi_Best_Practices_Handling_Failed_InsertsUpserts_with_Error_Tables/index.html index 073098bc7a27a..e7d6396713c53 100644 --- a/content/videos/2023/07/02/Hudi_Best_Practices_Handling_Failed_InsertsUpserts_with_Error_Tables/index.html +++ b/content/videos/2023/07/02/Hudi_Best_Practices_Handling_Failed_InsertsUpserts_with_Error_Tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/07/09/Develop_Incremental_ETL_Pipeline_From_Hudi_Tables_to_Redshift_Using_AWS_Glue_and_Spark/index.html b/content/videos/2023/07/09/Develop_Incremental_ETL_Pipeline_From_Hudi_Tables_to_Redshift_Using_AWS_Glue_and_Spark/index.html index a0be66086b91a..449e060f2ff42 100644 --- a/content/videos/2023/07/09/Develop_Incremental_ETL_Pipeline_From_Hudi_Tables_to_Redshift_Using_AWS_Glue_and_Spark/index.html +++ b/content/videos/2023/07/09/Develop_Incremental_ETL_Pipeline_From_Hudi_Tables_to_Redshift_Using_AWS_Glue_and_Spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/07/09/Incremental_Data_Extraction_from_Postgres_using_Triggers_and_PySpark/index.html b/content/videos/2023/07/09/Incremental_Data_Extraction_from_Postgres_using_Triggers_and_PySpark/index.html index bab0635c345ba..1da6acfa3fe71 100644 --- a/content/videos/2023/07/09/Incremental_Data_Extraction_from_Postgres_using_Triggers_and_PySpark/index.html +++ b/content/videos/2023/07/09/Incremental_Data_Extraction_from_Postgres_using_Triggers_and_PySpark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/07/22/learn_How_to_use_AWS_Glue_Crawler_with_Hudi_Tables_to_Catlog_the_Data/index.html b/content/videos/2023/07/22/learn_How_to_use_AWS_Glue_Crawler_with_Hudi_Tables_to_Catlog_the_Data/index.html index 9927bf97ff409..ec4fc8eb87c52 100644 --- a/content/videos/2023/07/22/learn_How_to_use_AWS_Glue_Crawler_with_Hudi_Tables_to_Catlog_the_Data/index.html +++ b/content/videos/2023/07/22/learn_How_to_use_AWS_Glue_Crawler_with_Hudi_Tables_to_Catlog_the_Data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/07/28/Removing_Duplicates_in_Hudi_Partitions_with_InsertOverwrite_API_and_Spark_SQL/index.html b/content/videos/2023/07/28/Removing_Duplicates_in_Hudi_Partitions_with_InsertOverwrite_API_and_Spark_SQL/index.html index 744521915ff2a..bbc5879198cf5 100644 --- a/content/videos/2023/07/28/Removing_Duplicates_in_Hudi_Partitions_with_InsertOverwrite_API_and_Spark_SQL/index.html +++ b/content/videos/2023/07/28/Removing_Duplicates_in_Hudi_Partitions_with_InsertOverwrite_API_and_Spark_SQL/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/08/01/Building_and_Automating_Hudi_Medallion_Architecture_with_AWS_Glue_Workflow_Hands_on_Labs_StepbyStep/index.html b/content/videos/2023/08/01/Building_and_Automating_Hudi_Medallion_Architecture_with_AWS_Glue_Workflow_Hands_on_Labs_StepbyStep/index.html index 90db02b74ac3c..d425c76884a3e 100644 --- a/content/videos/2023/08/01/Building_and_Automating_Hudi_Medallion_Architecture_with_AWS_Glue_Workflow_Hands_on_Labs_StepbyStep/index.html +++ b/content/videos/2023/08/01/Building_and_Automating_Hudi_Medallion_Architecture_with_AWS_Glue_Workflow_Hands_on_Labs_StepbyStep/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/08/03/Powering_EventDriven_Workloads_with_Hudi_Read_Stream_AWS_Glue_Streaming_JOBS/index.html b/content/videos/2023/08/03/Powering_EventDriven_Workloads_with_Hudi_Read_Stream_AWS_Glue_Streaming_JOBS/index.html index 2d0ea534a16ec..b411def29f40f 100644 --- a/content/videos/2023/08/03/Powering_EventDriven_Workloads_with_Hudi_Read_Stream_AWS_Glue_Streaming_JOBS/index.html +++ b/content/videos/2023/08/03/Powering_EventDriven_Workloads_with_Hudi_Read_Stream_AWS_Glue_Streaming_JOBS/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/08/06/Easy_Step_by_Step_Guide_for_Beginner_Setup_AWS_Transfer_Family_SFTP_with_S3/index.html b/content/videos/2023/08/06/Easy_Step_by_Step_Guide_for_Beginner_Setup_AWS_Transfer_Family_SFTP_with_S3/index.html index 87b095f176903..065e9e02f024f 100644 --- a/content/videos/2023/08/06/Easy_Step_by_Step_Guide_for_Beginner_Setup_AWS_Transfer_Family_SFTP_with_S3/index.html +++ b/content/videos/2023/08/06/Easy_Step_by_Step_Guide_for_Beginner_Setup_AWS_Transfer_Family_SFTP_with_S3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/08/09/Easy_Step_by_Step_Guide_for_Beginner_Ingest_CSV_Files_into_Hudi_with_AWS_GLue_Hands_on_Labs/index.html b/content/videos/2023/08/09/Easy_Step_by_Step_Guide_for_Beginner_Ingest_CSV_Files_into_Hudi_with_AWS_GLue_Hands_on_Labs/index.html index ce41e36c71b43..679dc38b4b542 100644 --- a/content/videos/2023/08/09/Easy_Step_by_Step_Guide_for_Beginner_Ingest_CSV_Files_into_Hudi_with_AWS_GLue_Hands_on_Labs/index.html +++ b/content/videos/2023/08/09/Easy_Step_by_Step_Guide_for_Beginner_Ingest_CSV_Files_into_Hudi_with_AWS_GLue_Hands_on_Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/08/29/From-Zero-to-Data-Hero-Building-Dynamic-Data-Platforms-Like-a-Pro-Final-Part-Demo/index.html b/content/videos/2023/08/29/From-Zero-to-Data-Hero-Building-Dynamic-Data-Platforms-Like-a-Pro-Final-Part-Demo/index.html index 463b3ab863187..752573273e842 100644 --- a/content/videos/2023/08/29/From-Zero-to-Data-Hero-Building-Dynamic-Data-Platforms-Like-a-Pro-Final-Part-Demo/index.html +++ b/content/videos/2023/08/29/From-Zero-to-Data-Hero-Building-Dynamic-Data-Platforms-Like-a-Pro-Final-Part-Demo/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/09/23/Flink-with-POSTGRES-RealTime-Stream-Data-Processing-with-Python-Hands-on-Labs/index.html b/content/videos/2023/09/23/Flink-with-POSTGRES-RealTime-Stream-Data-Processing-with-Python-Hands-on-Labs/index.html index e477f81d46095..27e6d6e29bcbf 100644 --- a/content/videos/2023/09/23/Flink-with-POSTGRES-RealTime-Stream-Data-Processing-with-Python-Hands-on-Labs/index.html +++ b/content/videos/2023/09/23/Flink-with-POSTGRES-RealTime-Stream-Data-Processing-with-Python-Hands-on-Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/09/25/How-to-Use-Apache-Hudi-with-Flink-1-15-on-AWS-Managed-Apache-Flink-Hands-on-Guide-for-Beginners/index.html b/content/videos/2023/09/25/How-to-Use-Apache-Hudi-with-Flink-1-15-on-AWS-Managed-Apache-Flink-Hands-on-Guide-for-Beginners/index.html index 7c5ade3944078..61394fbfb6e74 100644 --- a/content/videos/2023/09/25/How-to-Use-Apache-Hudi-with-Flink-1-15-on-AWS-Managed-Apache-Flink-Hands-on-Guide-for-Beginners/index.html +++ b/content/videos/2023/09/25/How-to-Use-Apache-Hudi-with-Flink-1-15-on-AWS-Managed-Apache-Flink-Hands-on-Guide-for-Beginners/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/09/26/How-to-Ingest-Data-from-PostgreSQL-into-Hudi-Tables-on-S3-with-Apache-Flink-CDC-Connector-Python/index.html b/content/videos/2023/09/26/How-to-Ingest-Data-from-PostgreSQL-into-Hudi-Tables-on-S3-with-Apache-Flink-CDC-Connector-Python/index.html index fd69cde253f18..f94c348c11f07 100644 --- a/content/videos/2023/09/26/How-to-Ingest-Data-from-PostgreSQL-into-Hudi-Tables-on-S3-with-Apache-Flink-CDC-Connector-Python/index.html +++ b/content/videos/2023/09/26/How-to-Ingest-Data-from-PostgreSQL-into-Hudi-Tables-on-S3-with-Apache-Flink-CDC-Connector-Python/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/09/27/Learn-How-to-Use-Apache-Flink-with-Kafka-Build-Transactional-Datalakes-on-S3-using-PyFLink-Locally/index.html b/content/videos/2023/09/27/Learn-How-to-Use-Apache-Flink-with-Kafka-Build-Transactional-Datalakes-on-S3-using-PyFLink-Locally/index.html index 44d4e305b72ad..4c55ec24d66b2 100644 --- a/content/videos/2023/09/27/Learn-How-to-Use-Apache-Flink-with-Kafka-Build-Transactional-Datalakes-on-S3-using-PyFLink-Locally/index.html +++ b/content/videos/2023/09/27/Learn-How-to-Use-Apache-Flink-with-Kafka-Build-Transactional-Datalakes-on-S3-using-PyFLink-Locally/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/10/07/Hudi-Latest-Feature-Auto-Generating-Primary-Keys-for-Modern-Data-Lakes/index.html b/content/videos/2023/10/07/Hudi-Latest-Feature-Auto-Generating-Primary-Keys-for-Modern-Data-Lakes/index.html index a246151713e60..cd23e4b82f063 100644 --- a/content/videos/2023/10/07/Hudi-Latest-Feature-Auto-Generating-Primary-Keys-for-Modern-Data-Lakes/index.html +++ b/content/videos/2023/10/07/Hudi-Latest-Feature-Auto-Generating-Primary-Keys-for-Modern-Data-Lakes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/10/14/Accelerating-Data-Processing-Leveraging-Apache-Hudi-with-DynamoDB-for-Faster-Commit-Time-Retrieval/index.html b/content/videos/2023/10/14/Accelerating-Data-Processing-Leveraging-Apache-Hudi-with-DynamoDB-for-Faster-Commit-Time-Retrieval/index.html index 6865322482c5f..13fc1ec28b72f 100644 --- a/content/videos/2023/10/14/Accelerating-Data-Processing-Leveraging-Apache-Hudi-with-DynamoDB-for-Faster-Commit-Time-Retrieval/index.html +++ b/content/videos/2023/10/14/Accelerating-Data-Processing-Leveraging-Apache-Hudi-with-DynamoDB-for-Faster-Commit-Time-Retrieval/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/10/16/Hudi-0-14-0-Deep-Dive-Record-Level-Index/index.html b/content/videos/2023/10/16/Hudi-0-14-0-Deep-Dive-Record-Level-Index/index.html index 835cac86bfc03..ddb7b2abab8c7 100644 --- a/content/videos/2023/10/16/Hudi-0-14-0-Deep-Dive-Record-Level-Index/index.html +++ b/content/videos/2023/10/16/Hudi-0-14-0-Deep-Dive-Record-Level-Index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/10/21/Full-Apache-Hudi-Course-for-beginner-Operations-Type-Part-5/index.html b/content/videos/2023/10/21/Full-Apache-Hudi-Course-for-beginner-Operations-Type-Part-5/index.html index aa3ca2686b780..066f98218a864 100644 --- a/content/videos/2023/10/21/Full-Apache-Hudi-Course-for-beginner-Operations-Type-Part-5/index.html +++ b/content/videos/2023/10/21/Full-Apache-Hudi-Course-for-beginner-Operations-Type-Part-5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/10/28/How-to-Unlock-Data-Insights-from-Hudi-Metrics-for-Your-Data-Lake-using-Elastic-Search-and-Kibana/index.html b/content/videos/2023/10/28/How-to-Unlock-Data-Insights-from-Hudi-Metrics-for-Your-Data-Lake-using-Elastic-Search-and-Kibana/index.html index 60d82775ef85c..63106f8c18b60 100644 --- a/content/videos/2023/10/28/How-to-Unlock-Data-Insights-from-Hudi-Metrics-for-Your-Data-Lake-using-Elastic-Search-and-Kibana/index.html +++ b/content/videos/2023/10/28/How-to-Unlock-Data-Insights-from-Hudi-Metrics-for-Your-Data-Lake-using-Elastic-Search-and-Kibana/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/11/08/A-Glide-Skip-or-a-Jump-Efficiently-Stream-Data-into-Your-Medallion-Architecture-with-Apache-Hudi/index.html b/content/videos/2023/11/08/A-Glide-Skip-or-a-Jump-Efficiently-Stream-Data-into-Your-Medallion-Architecture-with-Apache-Hudi/index.html index 6159faa4dcb77..c64212b2deed8 100644 --- a/content/videos/2023/11/08/A-Glide-Skip-or-a-Jump-Efficiently-Stream-Data-into-Your-Medallion-Architecture-with-Apache-Hudi/index.html +++ b/content/videos/2023/11/08/A-Glide-Skip-or-a-Jump-Efficiently-Stream-Data-into-Your-Medallion-Architecture-with-Apache-Hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/11/17/Maximizing-Efficiency-by-Templating-Serverless-Architecture-in-Hudi-Data-Lakes/index.html b/content/videos/2023/11/17/Maximizing-Efficiency-by-Templating-Serverless-Architecture-in-Hudi-Data-Lakes/index.html index d6cf66bcce085..c0d7e79402543 100644 --- a/content/videos/2023/11/17/Maximizing-Efficiency-by-Templating-Serverless-Architecture-in-Hudi-Data-Lakes/index.html +++ b/content/videos/2023/11/17/Maximizing-Efficiency-by-Templating-Serverless-Architecture-in-Hudi-Data-Lakes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/11/19/Hudi-Streamer-Hands-On-Guide-Local-Ingestion-from-Parquet-Source-1/index.html b/content/videos/2023/11/19/Hudi-Streamer-Hands-On-Guide-Local-Ingestion-from-Parquet-Source-1/index.html index 4fcbfc4f5ab3c..2e0d8022a1f89 100644 --- a/content/videos/2023/11/19/Hudi-Streamer-Hands-On-Guide-Local-Ingestion-from-Parquet-Source-1/index.html +++ b/content/videos/2023/11/19/Hudi-Streamer-Hands-On-Guide-Local-Ingestion-from-Parquet-Source-1/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/11/20/Hudi-Streamer-Hands-On-Guide-Local-Ingestion-from-CSV-Source-2/index.html b/content/videos/2023/11/20/Hudi-Streamer-Hands-On-Guide-Local-Ingestion-from-CSV-Source-2/index.html index b67bd70ca2dc3..9f942cd266a44 100644 --- a/content/videos/2023/11/20/Hudi-Streamer-Hands-On-Guide-Local-Ingestion-from-CSV-Source-2/index.html +++ b/content/videos/2023/11/20/Hudi-Streamer-Hands-On-Guide-Local-Ingestion-from-CSV-Source-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/11/20/Learn-How-to-Ingest-Multiple-Tables-using-Hudi-MultiTable-Delta-Streamer-3/index.html b/content/videos/2023/11/20/Learn-How-to-Ingest-Multiple-Tables-using-Hudi-MultiTable-Delta-Streamer-3/index.html index a8c80c0f7bc2f..57a407db6071b 100644 --- a/content/videos/2023/11/20/Learn-How-to-Ingest-Multiple-Tables-using-Hudi-MultiTable-Delta-Streamer-3/index.html +++ b/content/videos/2023/11/20/Learn-How-to-Ingest-Multiple-Tables-using-Hudi-MultiTable-Delta-Streamer-3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/11/21/RFC-14-Step-by-Step-Guide-for-Incremental-Data-Pull-from-Postgres-to-Hudi-using-deltastreamer/index.html b/content/videos/2023/11/21/RFC-14-Step-by-Step-Guide-for-Incremental-Data-Pull-from-Postgres-to-Hudi-using-deltastreamer/index.html index e0956255c2648..9f684408762bd 100644 --- a/content/videos/2023/11/21/RFC-14-Step-by-Step-Guide-for-Incremental-Data-Pull-from-Postgres-to-Hudi-using-deltastreamer/index.html +++ b/content/videos/2023/11/21/RFC-14-Step-by-Step-Guide-for-Incremental-Data-Pull-from-Postgres-to-Hudi-using-deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/11/23/Learn-How-to-Ingest-Data-Into-Hudi-Table-using-DeltaStreamer-in-continous-Mode-and-SQL-transformer-5/index.html b/content/videos/2023/11/23/Learn-How-to-Ingest-Data-Into-Hudi-Table-using-DeltaStreamer-in-continous-Mode-and-SQL-transformer-5/index.html index 2aefedcc97f47..ff58bdad3a315 100644 --- a/content/videos/2023/11/23/Learn-How-to-Ingest-Data-Into-Hudi-Table-using-DeltaStreamer-in-continous-Mode-and-SQL-transformer-5/index.html +++ b/content/videos/2023/11/23/Learn-How-to-Ingest-Data-Into-Hudi-Table-using-DeltaStreamer-in-continous-Mode-and-SQL-transformer-5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/11/24/Learn-How-to-use-DeltaStreamer-and-ingest-data-from-Kafka-Topic-Hands-on-Labs-6/index.html b/content/videos/2023/11/24/Learn-How-to-use-DeltaStreamer-and-ingest-data-from-Kafka-Topic-Hands-on-Labs-6/index.html index 364409a320b0a..aa705a88a5a7c 100644 --- a/content/videos/2023/11/24/Learn-How-to-use-DeltaStreamer-and-ingest-data-from-Kafka-Topic-Hands-on-Labs-6/index.html +++ b/content/videos/2023/11/24/Learn-How-to-use-DeltaStreamer-and-ingest-data-from-Kafka-Topic-Hands-on-Labs-6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/11/24/hudi-table-types/index.html b/content/videos/2023/11/24/hudi-table-types/index.html index e7b890a3eeeed..996a7dea57ad7 100644 --- a/content/videos/2023/11/24/hudi-table-types/index.html +++ b/content/videos/2023/11/24/hudi-table-types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/11/26/real-time-data-postgres-debezium-kafka-schema-registry-deltastreamer-7a/index.html b/content/videos/2023/11/26/real-time-data-postgres-debezium-kafka-schema-registry-deltastreamer-7a/index.html index 1f7f493c7a97c..c9379ea62c401 100644 --- a/content/videos/2023/11/26/real-time-data-postgres-debezium-kafka-schema-registry-deltastreamer-7a/index.html +++ b/content/videos/2023/11/26/real-time-data-postgres-debezium-kafka-schema-registry-deltastreamer-7a/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/11/26/real-time-data-postgres-debezium-kafka-schema-registry-deltastreamer-7b/index.html b/content/videos/2023/11/26/real-time-data-postgres-debezium-kafka-schema-registry-deltastreamer-7b/index.html index dac85f83bf97c..ddefbcf403975 100644 --- a/content/videos/2023/11/26/real-time-data-postgres-debezium-kafka-schema-registry-deltastreamer-7b/index.html +++ b/content/videos/2023/11/26/real-time-data-postgres-debezium-kafka-schema-registry-deltastreamer-7b/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/11/27/Hudi-Metadata-table-Record-Level-Index-HBase-Index/index.html b/content/videos/2023/11/27/Hudi-Metadata-table-Record-Level-Index-HBase-Index/index.html index 69176bc934784..d23afd41614dc 100644 --- a/content/videos/2023/11/27/Hudi-Metadata-table-Record-Level-Index-HBase-Index/index.html +++ b/content/videos/2023/11/27/Hudi-Metadata-table-Record-Level-Index-HBase-Index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/11/27/Learn-How-to-Run-Clustering-in-Async-Mode-with-DeltaStreamer-in-Continuous-Mode-Hands-on-Labs-8/index.html b/content/videos/2023/11/27/Learn-How-to-Run-Clustering-in-Async-Mode-with-DeltaStreamer-in-Continuous-Mode-Hands-on-Labs-8/index.html index 5d1d9dbe790a2..d010e3b077af2 100644 --- a/content/videos/2023/11/27/Learn-How-to-Run-Clustering-in-Async-Mode-with-DeltaStreamer-in-Continuous-Mode-Hands-on-Labs-8/index.html +++ b/content/videos/2023/11/27/Learn-How-to-Run-Clustering-in-Async-Mode-with-DeltaStreamer-in-Continuous-Mode-Hands-on-Labs-8/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/11/30/Learn-How-to-use-MinIO-and-Apache-Hudi-DeltaStreamer-with-Hands-on-Lab-9/index.html b/content/videos/2023/11/30/Learn-How-to-use-MinIO-and-Apache-Hudi-DeltaStreamer-with-Hands-on-Lab-9/index.html index a723b72a176ab..bb9fa1267b71d 100644 --- a/content/videos/2023/11/30/Learn-How-to-use-MinIO-and-Apache-Hudi-DeltaStreamer-with-Hands-on-Lab-9/index.html +++ b/content/videos/2023/11/30/Learn-How-to-use-MinIO-and-Apache-Hudi-DeltaStreamer-with-Hands-on-Lab-9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/12/08/How-to-use-DeltaStreamer-to-Read-Data-From-Hudi-Source-in-Incremental-Fashion-Bronze-to-Silver-10/index.html b/content/videos/2023/12/08/How-to-use-DeltaStreamer-to-Read-Data-From-Hudi-Source-in-Incremental-Fashion-Bronze-to-Silver-10/index.html index d7addab7911bd..d498ab14d9a48 100644 --- a/content/videos/2023/12/08/How-to-use-DeltaStreamer-to-Read-Data-From-Hudi-Source-in-Incremental-Fashion-Bronze-to-Silver-10/index.html +++ b/content/videos/2023/12/08/How-to-use-DeltaStreamer-to-Read-Data-From-Hudi-Source-in-Incremental-Fashion-Bronze-to-Silver-10/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/12/09/Learn-How-to-use-DBT-with-Spark-and-Thrift-Server-on-Local-Machine-for-Begineers-Easy-Setup/index.html b/content/videos/2023/12/09/Learn-How-to-use-DBT-with-Spark-and-Thrift-Server-on-Local-Machine-for-Begineers-Easy-Setup/index.html index d82fb5a77332b..cd31126f29e8d 100644 --- a/content/videos/2023/12/09/Learn-How-to-use-DBT-with-Spark-and-Thrift-Server-on-Local-Machine-for-Begineers-Easy-Setup/index.html +++ b/content/videos/2023/12/09/Learn-How-to-use-DBT-with-Spark-and-Thrift-Server-on-Local-Machine-for-Begineers-Easy-Setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/12/11/Simplifying-Big-Data-Setting-Up-SparkSQL-Hive-Thrift-Server-and-Hudi-with-Beeline-in-Minutes/index.html b/content/videos/2023/12/11/Simplifying-Big-Data-Setting-Up-SparkSQL-Hive-Thrift-Server-and-Hudi-with-Beeline-in-Minutes/index.html index c611073cf0e77..75ec43d5604d0 100644 --- a/content/videos/2023/12/11/Simplifying-Big-Data-Setting-Up-SparkSQL-Hive-Thrift-Server-and-Hudi-with-Beeline-in-Minutes/index.html +++ b/content/videos/2023/12/11/Simplifying-Big-Data-Setting-Up-SparkSQL-Hive-Thrift-Server-and-Hudi-with-Beeline-in-Minutes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/12/12/Apache-Hudi-DeltaStreamer-in-Action-Python-Publishing-and-AvroKafkaSource-Consumption-11-Guide/index.html b/content/videos/2023/12/12/Apache-Hudi-DeltaStreamer-in-Action-Python-Publishing-and-AvroKafkaSource-Consumption-11-Guide/index.html index 64db28bdf4735..b0fb3f0274ae3 100644 --- a/content/videos/2023/12/12/Apache-Hudi-DeltaStreamer-in-Action-Python-Publishing-and-AvroKafkaSource-Consumption-11-Guide/index.html +++ b/content/videos/2023/12/12/Apache-Hudi-DeltaStreamer-in-Action-Python-Publishing-and-AvroKafkaSource-Consumption-11-Guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/12/16/Learn-How-to-Setup-Hudi-on-EMR-with-Hive-and-Query-Data-using-Hue-and-Presto-CLI-Hands-on-Labs/index.html b/content/videos/2023/12/16/Learn-How-to-Setup-Hudi-on-EMR-with-Hive-and-Query-Data-using-Hue-and-Presto-CLI-Hands-on-Labs/index.html index f0465e9259872..d608a9aacc4d1 100644 --- a/content/videos/2023/12/16/Learn-How-to-Setup-Hudi-on-EMR-with-Hive-and-Query-Data-using-Hue-and-Presto-CLI-Hands-on-Labs/index.html +++ b/content/videos/2023/12/16/Learn-How-to-Setup-Hudi-on-EMR-with-Hive-and-Query-Data-using-Hue-and-Presto-CLI-Hands-on-Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/12/19/How-to-Use-Apache-Hudi-0-14-and-RLI-on-AWS-Glue-Step-by-Step-Guide/index.html b/content/videos/2023/12/19/How-to-Use-Apache-Hudi-0-14-and-RLI-on-AWS-Glue-Step-by-Step-Guide/index.html index a752820eacd98..24f9990649a57 100644 --- a/content/videos/2023/12/19/How-to-Use-Apache-Hudi-0-14-and-RLI-on-AWS-Glue-Step-by-Step-Guide/index.html +++ b/content/videos/2023/12/19/How-to-Use-Apache-Hudi-0-14-and-RLI-on-AWS-Glue-Step-by-Step-Guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/12/24/Apache-Hudi-Spark-DBT-Glue-Hive-MetaStore-Setup-Locally-in-Minutes-Hands-On-Exercise/index.html b/content/videos/2023/12/24/Apache-Hudi-Spark-DBT-Glue-Hive-MetaStore-Setup-Locally-in-Minutes-Hands-On-Exercise/index.html index c942a6d0cd234..f91ce66eb1cf9 100644 --- a/content/videos/2023/12/24/Apache-Hudi-Spark-DBT-Glue-Hive-MetaStore-Setup-Locally-in-Minutes-Hands-On-Exercise/index.html +++ b/content/videos/2023/12/24/Apache-Hudi-Spark-DBT-Glue-Hive-MetaStore-Setup-Locally-in-Minutes-Hands-On-Exercise/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/12/25/Hudi-DBT-Spark-Glue-Hive-MetaStore-Join-two-hudi-tables-Labs-with-Exercise-Files/index.html b/content/videos/2023/12/25/Hudi-DBT-Spark-Glue-Hive-MetaStore-Join-two-hudi-tables-Labs-with-Exercise-Files/index.html index 891f940b6ff3a..0c3c5285f21e1 100644 --- a/content/videos/2023/12/25/Hudi-DBT-Spark-Glue-Hive-MetaStore-Join-two-hudi-tables-Labs-with-Exercise-Files/index.html +++ b/content/videos/2023/12/25/Hudi-DBT-Spark-Glue-Hive-MetaStore-Join-two-hudi-tables-Labs-with-Exercise-Files/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/12/29/Get-Started-with-Hudi-CLI-Locally-Using-Docker-in-Minutes-and-Connect-to-Your-S3-Data/index.html b/content/videos/2023/12/29/Get-Started-with-Hudi-CLI-Locally-Using-Docker-in-Minutes-and-Connect-to-Your-S3-Data/index.html index eca96225e0d68..4991c25135f21 100644 --- a/content/videos/2023/12/29/Get-Started-with-Hudi-CLI-Locally-Using-Docker-in-Minutes-and-Connect-to-Your-S3-Data/index.html +++ b/content/videos/2023/12/29/Get-Started-with-Hudi-CLI-Locally-Using-Docker-in-Minutes-and-Connect-to-Your-S3-Data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/12/30/Step-by-step-guide-on-How-to-Migrate-legacy-COW-Table-on-S3-to-MOR-Table-using-Hudi-CLI/index.html b/content/videos/2023/12/30/Step-by-step-guide-on-How-to-Migrate-legacy-COW-Table-on-S3-to-MOR-Table-using-Hudi-CLI/index.html index 21dbd86f45a5b..cb98910b2cdde 100644 --- a/content/videos/2023/12/30/Step-by-step-guide-on-How-to-Migrate-legacy-COW-Table-on-S3-to-MOR-Table-using-Hudi-CLI/index.html +++ b/content/videos/2023/12/30/Step-by-step-guide-on-How-to-Migrate-legacy-COW-Table-on-S3-to-MOR-Table-using-Hudi-CLI/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2023/12/31/What-is-Spark-Connect-and-Getting-started-Spark-Connect-Hello-World/index.html b/content/videos/2023/12/31/What-is-Spark-Connect-and-Getting-started-Spark-Connect-Hello-World/index.html index 87ffb6af3e769..36cbc24aa8e10 100644 --- a/content/videos/2023/12/31/What-is-Spark-Connect-and-Getting-started-Spark-Connect-Hello-World/index.html +++ b/content/videos/2023/12/31/What-is-Spark-Connect-and-Getting-started-Spark-Connect-Hello-World/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/01/01/Data-Lake-to-Microservices-Apache-Hudi-Record-Index-FastAPI-Spark-Connect-with-Swagger-UI/index.html b/content/videos/2024/01/01/Data-Lake-to-Microservices-Apache-Hudi-Record-Index-FastAPI-Spark-Connect-with-Swagger-UI/index.html index 584437b5b1ce0..4fc937cda5486 100644 --- a/content/videos/2024/01/01/Data-Lake-to-Microservices-Apache-Hudi-Record-Index-FastAPI-Spark-Connect-with-Swagger-UI/index.html +++ b/content/videos/2024/01/01/Data-Lake-to-Microservices-Apache-Hudi-Record-Index-FastAPI-Spark-Connect-with-Swagger-UI/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/01/06/Dynamic-Delta-Streamer-Jobs-with-JDBC-Puller-for-Postgres-Bring-all-Tables-from-particular-Schema-full/index.html b/content/videos/2024/01/06/Dynamic-Delta-Streamer-Jobs-with-JDBC-Puller-for-Postgres-Bring-all-Tables-from-particular-Schema-full/index.html index 8747269ba4f04..e0493f12dca5d 100644 --- a/content/videos/2024/01/06/Dynamic-Delta-Streamer-Jobs-with-JDBC-Puller-for-Postgres-Bring-all-Tables-from-particular-Schema-full/index.html +++ b/content/videos/2024/01/06/Dynamic-Delta-Streamer-Jobs-with-JDBC-Puller-for-Postgres-Bring-all-Tables-from-particular-Schema-full/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/01/06/Dynamic-Delta-Streamer-Jobs-with-JDBC-Puller-for-Postgres-Bring-all-Tables-from-particular-Schema/index.html b/content/videos/2024/01/06/Dynamic-Delta-Streamer-Jobs-with-JDBC-Puller-for-Postgres-Bring-all-Tables-from-particular-Schema/index.html index e6292574aa2cf..3dd9ebac61745 100644 --- a/content/videos/2024/01/06/Dynamic-Delta-Streamer-Jobs-with-JDBC-Puller-for-Postgres-Bring-all-Tables-from-particular-Schema/index.html +++ b/content/videos/2024/01/06/Dynamic-Delta-Streamer-Jobs-with-JDBC-Puller-for-Postgres-Bring-all-Tables-from-particular-Schema/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/01/13/Setup-HUDI-with-AWS-Glue-and-MINIO-locally-using-Docker-Container-in-Minutes/index.html b/content/videos/2024/01/13/Setup-HUDI-with-AWS-Glue-and-MINIO-locally-using-Docker-Container-in-Minutes/index.html index 9cc60e18253b7..527e435135efa 100644 --- a/content/videos/2024/01/13/Setup-HUDI-with-AWS-Glue-and-MINIO-locally-using-Docker-Container-in-Minutes/index.html +++ b/content/videos/2024/01/13/Setup-HUDI-with-AWS-Glue-and-MINIO-locally-using-Docker-Container-in-Minutes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/01/17/How-to-Delete-Items-from-Hudi-using-Delta-Streamer-operating-in-UPSERT-Mode-with-Kafka-Avro-MSG-12/index.html b/content/videos/2024/01/17/How-to-Delete-Items-from-Hudi-using-Delta-Streamer-operating-in-UPSERT-Mode-with-Kafka-Avro-MSG-12/index.html index b91c771966135..62b4ce9ac8538 100644 --- a/content/videos/2024/01/17/How-to-Delete-Items-from-Hudi-using-Delta-Streamer-operating-in-UPSERT-Mode-with-Kafka-Avro-MSG-12/index.html +++ b/content/videos/2024/01/17/How-to-Delete-Items-from-Hudi-using-Delta-Streamer-operating-in-UPSERT-Mode-with-Kafka-Avro-MSG-12/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/01/21/Learn-How-to-Move-Data-From-MongoDB-to-Apache-Hudi-Using-PySpark/index.html b/content/videos/2024/01/21/Learn-How-to-Move-Data-From-MongoDB-to-Apache-Hudi-Using-PySpark/index.html index 00da056e9dbe9..287a9d072bf6e 100644 --- a/content/videos/2024/01/21/Learn-How-to-Move-Data-From-MongoDB-to-Apache-Hudi-Using-PySpark/index.html +++ b/content/videos/2024/01/21/Learn-How-to-Move-Data-From-MongoDB-to-Apache-Hudi-Using-PySpark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/02/03/Apache-Hudi-Table-Services-Export-Services-HoodieSnapshotExporter-Hands-on-labs/index.html b/content/videos/2024/02/03/Apache-Hudi-Table-Services-Export-Services-HoodieSnapshotExporter-Hands-on-labs/index.html index 565e34498f132..4f718801af85d 100644 --- a/content/videos/2024/02/03/Apache-Hudi-Table-Services-Export-Services-HoodieSnapshotExporter-Hands-on-labs/index.html +++ b/content/videos/2024/02/03/Apache-Hudi-Table-Services-Export-Services-HoodieSnapshotExporter-Hands-on-labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/02/03/Apache-Hudi-Table-Services-Offline-Compaction-HoodieCompactor-Hands-on-labs/index.html b/content/videos/2024/02/03/Apache-Hudi-Table-Services-Offline-Compaction-HoodieCompactor-Hands-on-labs/index.html index fea7280c8136e..dd3e5c82ec8a0 100644 --- a/content/videos/2024/02/03/Apache-Hudi-Table-Services-Offline-Compaction-HoodieCompactor-Hands-on-labs/index.html +++ b/content/videos/2024/02/03/Apache-Hudi-Table-Services-Offline-Compaction-HoodieCompactor-Hands-on-labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/02/07/Building-an-Open-Source-Data-Lake-House-with-Hudip-Postgres-Hive-Metastore-Minio-and-StarRocks/index.html b/content/videos/2024/02/07/Building-an-Open-Source-Data-Lake-House-with-Hudip-Postgres-Hive-Metastore-Minio-and-StarRocks/index.html index 00edf61fc67dd..055d238ad13ad 100644 --- a/content/videos/2024/02/07/Building-an-Open-Source-Data-Lake-House-with-Hudip-Postgres-Hive-Metastore-Minio-and-StarRocks/index.html +++ b/content/videos/2024/02/07/Building-an-Open-Source-Data-Lake-House-with-Hudip-Postgres-Hive-Metastore-Minio-and-StarRocks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/02/10/Data-Ingestion-to-Visualization-Hudi-MinIO-StarRocks-HiveMetaStore-Apache-SuperSet-Hands-on-Guide/index.html b/content/videos/2024/02/10/Data-Ingestion-to-Visualization-Hudi-MinIO-StarRocks-HiveMetaStore-Apache-SuperSet-Hands-on-Guide/index.html index 14e7f29a3674d..d7f7474b94008 100644 --- a/content/videos/2024/02/10/Data-Ingestion-to-Visualization-Hudi-MinIO-StarRocks-HiveMetaStore-Apache-SuperSet-Hands-on-Guide/index.html +++ b/content/videos/2024/02/10/Data-Ingestion-to-Visualization-Hudi-MinIO-StarRocks-HiveMetaStore-Apache-SuperSet-Hands-on-Guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/02/17/Learn-How-to-Integerate-Hudi-Spark-job-with-Airflow-and-MinIO-Hands-on-Labs/index.html b/content/videos/2024/02/17/Learn-How-to-Integerate-Hudi-Spark-job-with-Airflow-and-MinIO-Hands-on-Labs/index.html index bd27e6942bdd0..5c5f68ab82e16 100644 --- a/content/videos/2024/02/17/Learn-How-to-Integerate-Hudi-Spark-job-with-Airflow-and-MinIO-Hands-on-Labs/index.html +++ b/content/videos/2024/02/17/Learn-How-to-Integerate-Hudi-Spark-job-with-Airflow-and-MinIO-Hands-on-Labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/02/18/Build-Incremental-ETL-pipeline-with-Hudi-and-Airflow-and-MinIO/index.html b/content/videos/2024/02/18/Build-Incremental-ETL-pipeline-with-Hudi-and-Airflow-and-MinIO/index.html index 05cf68ec394a3..eb822ee4c9716 100644 --- a/content/videos/2024/02/18/Build-Incremental-ETL-pipeline-with-Hudi-and-Airflow-and-MinIO/index.html +++ b/content/videos/2024/02/18/Build-Incremental-ETL-pipeline-with-Hudi-and-Airflow-and-MinIO/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/02/23/Getting-Started-with-Open-Data-lineage-Marquez-Project-Apache-Hudi-Spark-jobs/index.html b/content/videos/2024/02/23/Getting-Started-with-Open-Data-lineage-Marquez-Project-Apache-Hudi-Spark-jobs/index.html index 25438fb587aa9..1ad5c9b54dd31 100644 --- a/content/videos/2024/02/23/Getting-Started-with-Open-Data-lineage-Marquez-Project-Apache-Hudi-Spark-jobs/index.html +++ b/content/videos/2024/02/23/Getting-Started-with-Open-Data-lineage-Marquez-Project-Apache-Hudi-Spark-jobs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/02/27/Learn-How-you-can-run-DeltaStreamer-Running-on-AWS-Glue-with-Hudi-0.14-Step-by-Step-Guide/index.html b/content/videos/2024/02/27/Learn-How-you-can-run-DeltaStreamer-Running-on-AWS-Glue-with-Hudi-0.14-Step-by-Step-Guide/index.html index 3b9f9bc70d761..4e87f1c831b5d 100644 --- a/content/videos/2024/02/27/Learn-How-you-can-run-DeltaStreamer-Running-on-AWS-Glue-with-Hudi-0.14-Step-by-Step-Guide/index.html +++ b/content/videos/2024/02/27/Learn-How-you-can-run-DeltaStreamer-Running-on-AWS-Glue-with-Hudi-0.14-Step-by-Step-Guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/03/01/How-to-Query-Apache-Hudi-tables-from-Glue-Interactive-Notebook-for-AdHoc-Analysis/index.html b/content/videos/2024/03/01/How-to-Query-Apache-Hudi-tables-from-Glue-Interactive-Notebook-for-AdHoc-Analysis/index.html index a2e86bfa8f24a..7e14bd1f7c362 100644 --- a/content/videos/2024/03/01/How-to-Query-Apache-Hudi-tables-from-Glue-Interactive-Notebook-for-AdHoc-Analysis/index.html +++ b/content/videos/2024/03/01/How-to-Query-Apache-Hudi-tables-from-Glue-Interactive-Notebook-for-AdHoc-Analysis/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/03/11/Getting-Started-Tutorial-Building-a-Data-Lakehouse-With-StarRocks-Apache-Hudi-and-MinIO/index.html b/content/videos/2024/03/11/Getting-Started-Tutorial-Building-a-Data-Lakehouse-With-StarRocks-Apache-Hudi-and-MinIO/index.html index 3e2573cecaadf..6c1c73283aa6d 100644 --- a/content/videos/2024/03/11/Getting-Started-Tutorial-Building-a-Data-Lakehouse-With-StarRocks-Apache-Hudi-and-MinIO/index.html +++ b/content/videos/2024/03/11/Getting-Started-Tutorial-Building-a-Data-Lakehouse-With-StarRocks-Apache-Hudi-and-MinIO/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/03/12/Managing-Updates-&-Deletes-in-Glue-Hudi-Spark-Jobs-with-CDC-Data:-Using-_hoodie_is_deleted-Flag/index.html b/content/videos/2024/03/12/Managing-Updates-&-Deletes-in-Glue-Hudi-Spark-Jobs-with-CDC-Data:-Using-_hoodie_is_deleted-Flag/index.html index 185489b71383a..343b80a24f0ab 100644 --- a/content/videos/2024/03/12/Managing-Updates-&-Deletes-in-Glue-Hudi-Spark-Jobs-with-CDC-Data:-Using-_hoodie_is_deleted-Flag/index.html +++ b/content/videos/2024/03/12/Managing-Updates-&-Deletes-in-Glue-Hudi-Spark-Jobs-with-CDC-Data:-Using-_hoodie_is_deleted-Flag/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/03/18/Mastering-Incremental-ETL-with-DeltaStreamer-and-SQL-Based-Transformer/index.html b/content/videos/2024/03/18/Mastering-Incremental-ETL-with-DeltaStreamer-and-SQL-Based-Transformer/index.html index e0589a37171ab..b70dc94f8d555 100644 --- a/content/videos/2024/03/18/Mastering-Incremental-ETL-with-DeltaStreamer-and-SQL-Based-Transformer/index.html +++ b/content/videos/2024/03/18/Mastering-Incremental-ETL-with-DeltaStreamer-and-SQL-Based-Transformer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/03/20/How-to-perform-Backfilling-jobs-with-Hudi-DeltaStreamer-and-Spark-SQL-using-SqlSource-Class/index.html b/content/videos/2024/03/20/How-to-perform-Backfilling-jobs-with-Hudi-DeltaStreamer-and-Spark-SQL-using-SqlSource-Class/index.html index 78ce54b97f857..7d1790f7645c7 100644 --- a/content/videos/2024/03/20/How-to-perform-Backfilling-jobs-with-Hudi-DeltaStreamer-and-Spark-SQL-using-SqlSource-Class/index.html +++ b/content/videos/2024/03/20/How-to-perform-Backfilling-jobs-with-Hudi-DeltaStreamer-and-Spark-SQL-using-SqlSource-Class/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/03/29/Open-Lakehouse-Evolution-Powering-the-Future-with-YugabyteDB-and-Apache-Hudi-Episode-102/index.html b/content/videos/2024/03/29/Open-Lakehouse-Evolution-Powering-the-Future-with-YugabyteDB-and-Apache-Hudi-Episode-102/index.html index ecc84d5675e45..9dc754d9ed4b6 100644 --- a/content/videos/2024/03/29/Open-Lakehouse-Evolution-Powering-the-Future-with-YugabyteDB-and-Apache-Hudi-Episode-102/index.html +++ b/content/videos/2024/03/29/Open-Lakehouse-Evolution-Powering-the-Future-with-YugabyteDB-and-Apache-Hudi-Episode-102/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/03/30/Building-DataLakeHouse-using-XTableMinIO-StarRocks-DeltaStreamer---Interoperating-Hudi-IceBerg-and-Delta/index.html b/content/videos/2024/03/30/Building-DataLakeHouse-using-XTableMinIO-StarRocks-DeltaStreamer---Interoperating-Hudi-IceBerg-and-Delta/index.html index c8817588a667c..1314a2e0c3826 100644 --- a/content/videos/2024/03/30/Building-DataLakeHouse-using-XTableMinIO-StarRocks-DeltaStreamer---Interoperating-Hudi-IceBerg-and-Delta/index.html +++ b/content/videos/2024/03/30/Building-DataLakeHouse-using-XTableMinIO-StarRocks-DeltaStreamer---Interoperating-Hudi-IceBerg-and-Delta/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/04/03/Reading-Data-from-Hudi-INC-and-Joining-with-Delta-Tables-using-HudiStreamer-and-SQL-Based-Transformer/index.html b/content/videos/2024/04/03/Reading-Data-from-Hudi-INC-and-Joining-with-Delta-Tables-using-HudiStreamer-and-SQL-Based-Transformer/index.html index 8ccd8597b2836..669fcdf2c4fe8 100644 --- a/content/videos/2024/04/03/Reading-Data-from-Hudi-INC-and-Joining-with-Delta-Tables-using-HudiStreamer-and-SQL-Based-Transformer/index.html +++ b/content/videos/2024/04/03/Reading-Data-from-Hudi-INC-and-Joining-with-Delta-Tables-using-HudiStreamer-and-SQL-Based-Transformer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/04/06/Build-Universal-Data-lake-with-Posgres-+-Debezium+Kafka+DeltaSTreamer-+-Minio+HiveMetastore+Trino/index.html b/content/videos/2024/04/06/Build-Universal-Data-lake-with-Posgres-+-Debezium+Kafka+DeltaSTreamer-+-Minio+HiveMetastore+Trino/index.html index c32b91ecdb6e4..0af27745bf1cf 100644 --- a/content/videos/2024/04/06/Build-Universal-Data-lake-with-Posgres-+-Debezium+Kafka+DeltaSTreamer-+-Minio+HiveMetastore+Trino/index.html +++ b/content/videos/2024/04/06/Build-Universal-Data-lake-with-Posgres-+-Debezium+Kafka+DeltaSTreamer-+-Minio+HiveMetastore+Trino/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/04/10/Build-Universal-Data-lake-with-MySQL-+-Debezium+Kafka+DeltaSTreamer-+-Minio+HiveMetastore+Trino/index.html b/content/videos/2024/04/10/Build-Universal-Data-lake-with-MySQL-+-Debezium+Kafka+DeltaSTreamer-+-Minio+HiveMetastore+Trino/index.html index a7a6dfa06e5e2..3a1771671f959 100644 --- a/content/videos/2024/04/10/Build-Universal-Data-lake-with-MySQL-+-Debezium+Kafka+DeltaSTreamer-+-Minio+HiveMetastore+Trino/index.html +++ b/content/videos/2024/04/10/Build-Universal-Data-lake-with-MySQL-+-Debezium+Kafka+DeltaSTreamer-+-Minio+HiveMetastore+Trino/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/04/22/Hudi-with-Kyuubi-a-distributed-and-multi-tenant-gateway-to-provide-serverless-SQL-on-lakehouses/index.html b/content/videos/2024/04/22/Hudi-with-Kyuubi-a-distributed-and-multi-tenant-gateway-to-provide-serverless-SQL-on-lakehouses/index.html index 532f175ef932a..8f441cb2847f4 100644 --- a/content/videos/2024/04/22/Hudi-with-Kyuubi-a-distributed-and-multi-tenant-gateway-to-provide-serverless-SQL-on-lakehouses/index.html +++ b/content/videos/2024/04/22/Hudi-with-Kyuubi-a-distributed-and-multi-tenant-gateway-to-provide-serverless-SQL-on-lakehouses/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/05/04/Learn-How-to-Display-Data-From-Hudi-Tables-to-your-Frontend-with-Flask-and-Daft-NO-SPARK-NEEDED/index.html b/content/videos/2024/05/04/Learn-How-to-Display-Data-From-Hudi-Tables-to-your-Frontend-with-Flask-and-Daft-NO-SPARK-NEEDED/index.html index d5f8ffae9148b..6658bc0126568 100644 --- a/content/videos/2024/05/04/Learn-How-to-Display-Data-From-Hudi-Tables-to-your-Frontend-with-Flask-and-Daft-NO-SPARK-NEEDED/index.html +++ b/content/videos/2024/05/04/Learn-How-to-Display-Data-From-Hudi-Tables-to-your-Frontend-with-Flask-and-Daft-NO-SPARK-NEEDED/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/05/08/How-to-read-Hudi-Dataset-Using-AWS-Glue-Ray-and-Glue-Notebooks-(withouth-Spark)/index.html b/content/videos/2024/05/08/How-to-read-Hudi-Dataset-Using-AWS-Glue-Ray-and-Glue-Notebooks-(withouth-Spark)/index.html index fba2147e2e417..8ba4e6edcb874 100644 --- a/content/videos/2024/05/08/How-to-read-Hudi-Dataset-Using-AWS-Glue-Ray-and-Glue-Notebooks-(withouth-Spark)/index.html +++ b/content/videos/2024/05/08/How-to-read-Hudi-Dataset-Using-AWS-Glue-Ray-and-Glue-Notebooks-(withouth-Spark)/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/05/12/Unleashing-the-Power-of-Serverless-Serving-Gold-Hudi-Tables-with-AWS-Lambda/index.html b/content/videos/2024/05/12/Unleashing-the-Power-of-Serverless-Serving-Gold-Hudi-Tables-with-AWS-Lambda/index.html index 4e846d0d7a73c..a54700d8561a4 100644 --- a/content/videos/2024/05/12/Unleashing-the-Power-of-Serverless-Serving-Gold-Hudi-Tables-with-AWS-Lambda/index.html +++ b/content/videos/2024/05/12/Unleashing-the-Power-of-Serverless-Serving-Gold-Hudi-Tables-with-AWS-Lambda/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/05/18/Learn-How-to-use-Cloudwatch-metrics-with-Hudi-AWS-Glue-Jobs/index.html b/content/videos/2024/05/18/Learn-How-to-use-Cloudwatch-metrics-with-Hudi-AWS-Glue-Jobs/index.html index c4ee949be2c65..fd0f95ec683ba 100644 --- a/content/videos/2024/05/18/Learn-How-to-use-Cloudwatch-metrics-with-Hudi-AWS-Glue-Jobs/index.html +++ b/content/videos/2024/05/18/Learn-How-to-use-Cloudwatch-metrics-with-Hudi-AWS-Glue-Jobs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/05/20/deltastreamer-with-incremental-etl-and-broadcast-joins-for-faster-etl/index.html b/content/videos/2024/05/20/deltastreamer-with-incremental-etl-and-broadcast-joins-for-faster-etl/index.html index 6e8ed7ebe9d41..e1841a69ecf4b 100644 --- a/content/videos/2024/05/20/deltastreamer-with-incremental-etl-and-broadcast-joins-for-faster-etl/index.html +++ b/content/videos/2024/05/20/deltastreamer-with-incremental-etl-and-broadcast-joins-for-faster-etl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/05/22/hudi-delta-streamer-implementing-slowly-changing-dimension-and-query-that-using-trino/index.html b/content/videos/2024/05/22/hudi-delta-streamer-implementing-slowly-changing-dimension-and-query-that-using-trino/index.html index 5dcf6c9bb13ee..6cc47b55fab0d 100644 --- a/content/videos/2024/05/22/hudi-delta-streamer-implementing-slowly-changing-dimension-and-query-that-using-trino/index.html +++ b/content/videos/2024/05/22/hudi-delta-streamer-implementing-slowly-changing-dimension-and-query-that-using-trino/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/05/22/hudi-streamer-implementing-slowly-changing-dimension-type-2-and-query-real-time-trino/index.html b/content/videos/2024/05/22/hudi-streamer-implementing-slowly-changing-dimension-type-2-and-query-real-time-trino/index.html index 2d019fb628367..6bd5a584c66c3 100644 --- a/content/videos/2024/05/22/hudi-streamer-implementing-slowly-changing-dimension-type-2-and-query-real-time-trino/index.html +++ b/content/videos/2024/05/22/hudi-streamer-implementing-slowly-changing-dimension-type-2-and-query-real-time-trino/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/05/23/build-hudi-date-dimension-in-minutes-with-spark-sql-minio-and-query-with-trino/index.html b/content/videos/2024/05/23/build-hudi-date-dimension-in-minutes-with-spark-sql-minio-and-query-with-trino/index.html index e8e74205015fd..274f799cc8dee 100644 --- a/content/videos/2024/05/23/build-hudi-date-dimension-in-minutes-with-spark-sql-minio-and-query-with-trino/index.html +++ b/content/videos/2024/05/23/build-hudi-date-dimension-in-minutes-with-spark-sql-minio-and-query-with-trino/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/05/25/learn-how-to-ingest-data-from-pulsar-topic-into-hudi-with-deltastreamer/index.html b/content/videos/2024/05/25/learn-how-to-ingest-data-from-pulsar-topic-into-hudi-with-deltastreamer/index.html index b2423d29dc13b..091f5f99cf355 100644 --- a/content/videos/2024/05/25/learn-how-to-ingest-data-from-pulsar-topic-into-hudi-with-deltastreamer/index.html +++ b/content/videos/2024/05/25/learn-how-to-ingest-data-from-pulsar-topic-into-hudi-with-deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/06/05/multiple-spark-writers-to-hudi-tables/index.html b/content/videos/2024/06/05/multiple-spark-writers-to-hudi-tables/index.html index 58191f120cefa..87594f7c17638 100644 --- a/content/videos/2024/06/05/multiple-spark-writers-to-hudi-tables/index.html +++ b/content/videos/2024/06/05/multiple-spark-writers-to-hudi-tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/06/12/hudi-cleaning-process-hoodie.keep.min.commits-and-hoodie.keep.max.commits-explained/index.html b/content/videos/2024/06/12/hudi-cleaning-process-hoodie.keep.min.commits-and-hoodie.keep.max.commits-explained/index.html index 408f300577589..7da1ecc8ddc53 100644 --- a/content/videos/2024/06/12/hudi-cleaning-process-hoodie.keep.min.commits-and-hoodie.keep.max.commits-explained/index.html +++ b/content/videos/2024/06/12/hudi-cleaning-process-hoodie.keep.min.commits-and-hoodie.keep.max.commits-explained/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/06/15/how-we-utilized-hudis-time-travel-query-to-investigate-bid-and-spend/index.html b/content/videos/2024/06/15/how-we-utilized-hudis-time-travel-query-to-investigate-bid-and-spend/index.html index abee3a2ba2d64..18887ce498ccf 100644 --- a/content/videos/2024/06/15/how-we-utilized-hudis-time-travel-query-to-investigate-bid-and-spend/index.html +++ b/content/videos/2024/06/15/how-we-utilized-hudis-time-travel-query-to-investigate-bid-and-spend/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/06/16/hudi-with-spark-sql-for-beginners-insert-updates-delete-incremental-query-stored-procedures/index.html b/content/videos/2024/06/16/hudi-with-spark-sql-for-beginners-insert-updates-delete-incremental-query-stored-procedures/index.html index 737be5451246e..505e7e060542f 100644 --- a/content/videos/2024/06/16/hudi-with-spark-sql-for-beginners-insert-updates-delete-incremental-query-stored-procedures/index.html +++ b/content/videos/2024/06/16/hudi-with-spark-sql-for-beginners-insert-updates-delete-incremental-query-stored-procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/06/18/learn-how-to-ingest-xml-files-with-aws-glue-into-hudi-datalakes/index.html b/content/videos/2024/06/18/learn-how-to-ingest-xml-files-with-aws-glue-into-hudi-datalakes/index.html index 1f2e82ec2cca5..206c705c19eb3 100644 --- a/content/videos/2024/06/18/learn-how-to-ingest-xml-files-with-aws-glue-into-hudi-datalakes/index.html +++ b/content/videos/2024/06/18/learn-how-to-ingest-xml-files-with-aws-glue-into-hudi-datalakes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/06/21/Four-Different-Ways-to-fetch-Apache-Hudi-Commit-time-in-Python-and-PySpark/index.html b/content/videos/2024/06/21/Four-Different-Ways-to-fetch-Apache-Hudi-Commit-time-in-Python-and-PySpark/index.html index aee34520a92bf..66097fc27d71d 100644 --- a/content/videos/2024/06/21/Four-Different-Ways-to-fetch-Apache-Hudi-Commit-time-in-Python-and-PySpark/index.html +++ b/content/videos/2024/06/21/Four-Different-Ways-to-fetch-Apache-Hudi-Commit-time-in-Python-and-PySpark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/09/01/how-to-consume-apache-hudi-tables-in-snowflake-iceberg-and-athena-hands-on-labs/index.html b/content/videos/2024/09/01/how-to-consume-apache-hudi-tables-in-snowflake-iceberg-and-athena-hands-on-labs/index.html index 554a50cc0b92c..48d214b9f53a6 100644 --- a/content/videos/2024/09/01/how-to-consume-apache-hudi-tables-in-snowflake-iceberg-and-athena-hands-on-labs/index.html +++ b/content/videos/2024/09/01/how-to-consume-apache-hudi-tables-in-snowflake-iceberg-and-athena-hands-on-labs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/09/26/Create-Apache-Hudi-Table-Using-Glue-in-Catalog-By-Reading-Streaming-Data-From-AWS-Kinesis/index.html b/content/videos/2024/09/26/Create-Apache-Hudi-Table-Using-Glue-in-Catalog-By-Reading-Streaming-Data-From-AWS-Kinesis/index.html index b2831ad8ab6a7..75447e485ed0a 100644 --- a/content/videos/2024/09/26/Create-Apache-Hudi-Table-Using-Glue-in-Catalog-By-Reading-Streaming-Data-From-AWS-Kinesis/index.html +++ b/content/videos/2024/09/26/Create-Apache-Hudi-Table-Using-Glue-in-Catalog-By-Reading-Streaming-Data-From-AWS-Kinesis/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/10/06/learn-how-to-read-hudi-tables-on-s3-locally-in-your-pyspark-job/index.html b/content/videos/2024/10/06/learn-how-to-read-hudi-tables-on-s3-locally-in-your-pyspark-job/index.html index f08ba49c61abd..88e6aef67a7c9 100644 --- a/content/videos/2024/10/06/learn-how-to-read-hudi-tables-on-s3-locally-in-your-pyspark-job/index.html +++ b/content/videos/2024/10/06/learn-how-to-read-hudi-tables-on-s3-locally-in-your-pyspark-job/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/10/22/practice-of-building-a-lakehouse-based-on-apache-hudi-at-kuaishou-inc/index.html b/content/videos/2024/10/22/practice-of-building-a-lakehouse-based-on-apache-hudi-at-kuaishou-inc/index.html index e897b7bc9919c..9d7dc1e046883 100644 --- a/content/videos/2024/10/22/practice-of-building-a-lakehouse-based-on-apache-hudi-at-kuaishou-inc/index.html +++ b/content/videos/2024/10/22/practice-of-building-a-lakehouse-based-on-apache-hudi-at-kuaishou-inc/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/2024/11/17/Create-Data-Lake-using-aws-Glue-as-beginner/index.html b/content/videos/2024/11/17/Create-Data-Lake-using-aws-Glue-as-beginner/index.html index 22510e5bb00a0..cf3b0926ee6e9 100644 --- a/content/videos/2024/11/17/Create-Data-Lake-using-aws-Glue-as-beginner/index.html +++ b/content/videos/2024/11/17/Create-Data-Lake-using-aws-Glue-as-beginner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/archive/index.html b/content/videos/archive/index.html index 10791b0a81717..d4cd6108fff0d 100644 --- a/content/videos/archive/index.html +++ b/content/videos/archive/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/index.html b/content/videos/index.html index 50a24ee097a96..fab4ac64721fb 100644 --- a/content/videos/index.html +++ b/content/videos/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/page/10/index.html b/content/videos/page/10/index.html index ebaa7b8f7600b..702b3b776f570 100644 --- a/content/videos/page/10/index.html +++ b/content/videos/page/10/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/page/11/index.html b/content/videos/page/11/index.html index 8b777cf082daa..0bd57da7bfbc3 100644 --- a/content/videos/page/11/index.html +++ b/content/videos/page/11/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/page/12/index.html b/content/videos/page/12/index.html index 1aff0e2b28ed6..7c637fef34233 100644 --- a/content/videos/page/12/index.html +++ b/content/videos/page/12/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/page/13/index.html b/content/videos/page/13/index.html index 9cf4515ff0af3..688bdf809d5ee 100644 --- a/content/videos/page/13/index.html +++ b/content/videos/page/13/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/page/14/index.html b/content/videos/page/14/index.html index c612930cc2d69..df66bc7c9699f 100644 --- a/content/videos/page/14/index.html +++ b/content/videos/page/14/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/page/15/index.html b/content/videos/page/15/index.html index e28dd0f3aa5b5..61e328fd72a91 100644 --- a/content/videos/page/15/index.html +++ b/content/videos/page/15/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/page/16/index.html b/content/videos/page/16/index.html index 48ad18dfc292a..5a3b33953aeef 100644 --- a/content/videos/page/16/index.html +++ b/content/videos/page/16/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/page/17/index.html b/content/videos/page/17/index.html index 17a6d0dcb322d..32590ebeab86a 100644 --- a/content/videos/page/17/index.html +++ b/content/videos/page/17/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/page/18/index.html b/content/videos/page/18/index.html index 9ab41ca95d34c..20a1a28638932 100644 --- a/content/videos/page/18/index.html +++ b/content/videos/page/18/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/page/19/index.html b/content/videos/page/19/index.html index 64f1fc57b5a94..5ee9b378c5a55 100644 --- a/content/videos/page/19/index.html +++ b/content/videos/page/19/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/page/2/index.html b/content/videos/page/2/index.html index 8ada740cb3350..f51d134429194 100644 --- a/content/videos/page/2/index.html +++ b/content/videos/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/page/20/index.html b/content/videos/page/20/index.html index 68d6bc28795ba..3096ad164f140 100644 --- a/content/videos/page/20/index.html +++ b/content/videos/page/20/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/page/3/index.html b/content/videos/page/3/index.html index d04300fcf2a33..83bcb5b18f49b 100644 --- a/content/videos/page/3/index.html +++ b/content/videos/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/page/4/index.html b/content/videos/page/4/index.html index 5ed76af78e7cf..c891c1f393007 100644 --- a/content/videos/page/4/index.html +++ b/content/videos/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/page/5/index.html b/content/videos/page/5/index.html index dcf5afb4356f3..1d0dcd7ed074e 100644 --- a/content/videos/page/5/index.html +++ b/content/videos/page/5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/page/6/index.html b/content/videos/page/6/index.html index 8841c579e70cd..e47091f40396f 100644 --- a/content/videos/page/6/index.html +++ b/content/videos/page/6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/page/7/index.html b/content/videos/page/7/index.html index ced6262c5d532..10455ce29d5b4 100644 --- a/content/videos/page/7/index.html +++ b/content/videos/page/7/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/page/8/index.html b/content/videos/page/8/index.html index 070606ff8597a..fb39fda9f33dc 100644 --- a/content/videos/page/8/index.html +++ b/content/videos/page/8/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/page/9/index.html b/content/videos/page/9/index.html index da78c1df7361a..53ecd39eb820d 100644 --- a/content/videos/page/9/index.html +++ b/content/videos/page/9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/access-restriction/index.html b/content/videos/tags/access-restriction/index.html index aa8b03c574441..8f286389f13b3 100644 --- a/content/videos/tags/access-restriction/index.html +++ b/content/videos/tags/access-restriction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/after-image/index.html b/content/videos/tags/after-image/index.html index dfdb42c4c7bc6..cd6603f7cf6cc 100644 --- a/content/videos/tags/after-image/index.html +++ b/content/videos/tags/after-image/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/alerting/index.html b/content/videos/tags/alerting/index.html index c717e47a87878..d66c2bd42f7c6 100644 --- a/content/videos/tags/alerting/index.html +++ b/content/videos/tags/alerting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-athena-spark-notebook/index.html b/content/videos/tags/amazon-athena-spark-notebook/index.html index 1c513a3f68ecb..ff91172c78d40 100644 --- a/content/videos/tags/amazon-athena-spark-notebook/index.html +++ b/content/videos/tags/amazon-athena-spark-notebook/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-athena/index.html b/content/videos/tags/amazon-athena/index.html index b3b120780d72a..28dbb701f4132 100644 --- a/content/videos/tags/amazon-athena/index.html +++ b/content/videos/tags/amazon-athena/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-athena/page/2/index.html b/content/videos/tags/amazon-athena/page/2/index.html index 0c5a97c34f871..f20b8c9b44ffb 100644 --- a/content/videos/tags/amazon-athena/page/2/index.html +++ b/content/videos/tags/amazon-athena/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-aurora/index.html b/content/videos/tags/amazon-aurora/index.html index 1623b6ef4a727..685dffc5c44ea 100644 --- a/content/videos/tags/amazon-aurora/index.html +++ b/content/videos/tags/amazon-aurora/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-cloudwatch/index.html b/content/videos/tags/amazon-cloudwatch/index.html index ba5fba313bb8c..60694557aac9d 100644 --- a/content/videos/tags/amazon-cloudwatch/index.html +++ b/content/videos/tags/amazon-cloudwatch/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-dyanmodb/index.html b/content/videos/tags/amazon-dyanmodb/index.html index 65ffb939ad48f..73008be9b952d 100644 --- a/content/videos/tags/amazon-dyanmodb/index.html +++ b/content/videos/tags/amazon-dyanmodb/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-dynamodb/index.html b/content/videos/tags/amazon-dynamodb/index.html index ee9ee9a3f4a3f..e9b77ce80a260 100644 --- a/content/videos/tags/amazon-dynamodb/index.html +++ b/content/videos/tags/amazon-dynamodb/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-emr-cli/index.html b/content/videos/tags/amazon-emr-cli/index.html index 226907a51b735..51e56cb208297 100644 --- a/content/videos/tags/amazon-emr-cli/index.html +++ b/content/videos/tags/amazon-emr-cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-emr-serverless/index.html b/content/videos/tags/amazon-emr-serverless/index.html index 259659a001c67..680903dd9e9ef 100644 --- a/content/videos/tags/amazon-emr-serverless/index.html +++ b/content/videos/tags/amazon-emr-serverless/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-emr/index.html b/content/videos/tags/amazon-emr/index.html index 7ca9b7836d169..86694ad480bd1 100644 --- a/content/videos/tags/amazon-emr/index.html +++ b/content/videos/tags/amazon-emr/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-kinesis/index.html b/content/videos/tags/amazon-kinesis/index.html index 3dc1e4a35b184..6dd3d0fb5f5d3 100644 --- a/content/videos/tags/amazon-kinesis/index.html +++ b/content/videos/tags/amazon-kinesis/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-kinesis/page/2/index.html b/content/videos/tags/amazon-kinesis/page/2/index.html index 2a91b8feb726b..6ec984f32fc5d 100644 --- a/content/videos/tags/amazon-kinesis/page/2/index.html +++ b/content/videos/tags/amazon-kinesis/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-quicksight/index.html b/content/videos/tags/amazon-quicksight/index.html index a0ca5c475a82a..496d5d3385a95 100644 --- a/content/videos/tags/amazon-quicksight/index.html +++ b/content/videos/tags/amazon-quicksight/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-redshift-spectrum/index.html b/content/videos/tags/amazon-redshift-spectrum/index.html index a52b26cd193d8..48f0c05e90b33 100644 --- a/content/videos/tags/amazon-redshift-spectrum/index.html +++ b/content/videos/tags/amazon-redshift-spectrum/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-redshift/index.html b/content/videos/tags/amazon-redshift/index.html index bc27c82a9fc57..07dd8a1b7a995 100644 --- a/content/videos/tags/amazon-redshift/index.html +++ b/content/videos/tags/amazon-redshift/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-s-3/index.html b/content/videos/tags/amazon-s-3/index.html index fb6a2a6cbf33b..527d01d1d5888 100644 --- a/content/videos/tags/amazon-s-3/index.html +++ b/content/videos/tags/amazon-s-3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-s-3/page/2/index.html b/content/videos/tags/amazon-s-3/page/2/index.html index 70b77c0c6316f..d17e838aed11a 100644 --- a/content/videos/tags/amazon-s-3/page/2/index.html +++ b/content/videos/tags/amazon-s-3/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-s-3/page/3/index.html b/content/videos/tags/amazon-s-3/page/3/index.html index 8d109c9ae90a6..5f1dee5b73578 100644 --- a/content/videos/tags/amazon-s-3/page/3/index.html +++ b/content/videos/tags/amazon-s-3/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-s-3/page/4/index.html b/content/videos/tags/amazon-s-3/page/4/index.html index e2c95150a45e7..eaf8ff99d1ca5 100644 --- a/content/videos/tags/amazon-s-3/page/4/index.html +++ b/content/videos/tags/amazon-s-3/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-sns/index.html b/content/videos/tags/amazon-sns/index.html index 6cdfccb81b2f6..274be2818c171 100644 --- a/content/videos/tags/amazon-sns/index.html +++ b/content/videos/tags/amazon-sns/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon-sqs/index.html b/content/videos/tags/amazon-sqs/index.html index 1ba2479ad7119..a28d1f4cdbeb3 100644 --- a/content/videos/tags/amazon-sqs/index.html +++ b/content/videos/tags/amazon-sqs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/amazon/index.html b/content/videos/tags/amazon/index.html index d291c81dfd35e..e9232c6920f42 100644 --- a/content/videos/tags/amazon/index.html +++ b/content/videos/tags/amazon/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/analytics/index.html b/content/videos/tags/analytics/index.html index cda781b06095c..0c568b4a1e0d4 100644 --- a/content/videos/tags/analytics/index.html +++ b/content/videos/tags/analytics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-airflow/index.html b/content/videos/tags/apache-airflow/index.html index de995b5729ef1..37c1cdf1074bf 100644 --- a/content/videos/tags/apache-airflow/index.html +++ b/content/videos/tags/apache-airflow/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-avro/index.html b/content/videos/tags/apache-avro/index.html index d7ee0b4e02d02..173e099e7519d 100644 --- a/content/videos/tags/apache-avro/index.html +++ b/content/videos/tags/apache-avro/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-flink/index.html b/content/videos/tags/apache-flink/index.html index ee3d0a62c4fea..cd6c0fc2da9fc 100644 --- a/content/videos/tags/apache-flink/index.html +++ b/content/videos/tags/apache-flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hive/index.html b/content/videos/tags/apache-hive/index.html index de5d2a8122aa8..b2abcd586663d 100644 --- a/content/videos/tags/apache-hive/index.html +++ b/content/videos/tags/apache-hive/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/index.html b/content/videos/tags/apache-hudi/index.html index b81aff982bfd5..901dbad5abee4 100644 --- a/content/videos/tags/apache-hudi/index.html +++ b/content/videos/tags/apache-hudi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/page/10/index.html b/content/videos/tags/apache-hudi/page/10/index.html index e9581769c8545..03b4d21e7f073 100644 --- a/content/videos/tags/apache-hudi/page/10/index.html +++ b/content/videos/tags/apache-hudi/page/10/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/page/11/index.html b/content/videos/tags/apache-hudi/page/11/index.html index 0c45d0ae33891..c5e8b0e3fac53 100644 --- a/content/videos/tags/apache-hudi/page/11/index.html +++ b/content/videos/tags/apache-hudi/page/11/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/page/12/index.html b/content/videos/tags/apache-hudi/page/12/index.html index 570b94976d1fa..57aae57899b35 100644 --- a/content/videos/tags/apache-hudi/page/12/index.html +++ b/content/videos/tags/apache-hudi/page/12/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/page/13/index.html b/content/videos/tags/apache-hudi/page/13/index.html index f8f467d7d8c9f..de0f96d132e09 100644 --- a/content/videos/tags/apache-hudi/page/13/index.html +++ b/content/videos/tags/apache-hudi/page/13/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/page/14/index.html b/content/videos/tags/apache-hudi/page/14/index.html index ca2c02d841206..f981abb4d49b2 100644 --- a/content/videos/tags/apache-hudi/page/14/index.html +++ b/content/videos/tags/apache-hudi/page/14/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/page/15/index.html b/content/videos/tags/apache-hudi/page/15/index.html index 5711884c1824e..d5be199d6d060 100644 --- a/content/videos/tags/apache-hudi/page/15/index.html +++ b/content/videos/tags/apache-hudi/page/15/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/page/16/index.html b/content/videos/tags/apache-hudi/page/16/index.html index 9137a72484b74..ae46e0a2a17f9 100644 --- a/content/videos/tags/apache-hudi/page/16/index.html +++ b/content/videos/tags/apache-hudi/page/16/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/page/17/index.html b/content/videos/tags/apache-hudi/page/17/index.html index 7c9cda2adb5a8..f5cdeb6b54a22 100644 --- a/content/videos/tags/apache-hudi/page/17/index.html +++ b/content/videos/tags/apache-hudi/page/17/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/page/18/index.html b/content/videos/tags/apache-hudi/page/18/index.html index 731421af1883d..ddf7f5bf1d2a1 100644 --- a/content/videos/tags/apache-hudi/page/18/index.html +++ b/content/videos/tags/apache-hudi/page/18/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/page/19/index.html b/content/videos/tags/apache-hudi/page/19/index.html index 1a6166b306ae6..c12750c4e99ab 100644 --- a/content/videos/tags/apache-hudi/page/19/index.html +++ b/content/videos/tags/apache-hudi/page/19/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/page/2/index.html b/content/videos/tags/apache-hudi/page/2/index.html index 13300288e9eb2..0d355cb2c00b0 100644 --- a/content/videos/tags/apache-hudi/page/2/index.html +++ b/content/videos/tags/apache-hudi/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/page/20/index.html b/content/videos/tags/apache-hudi/page/20/index.html index c6e40d16fc38e..be03a26afa599 100644 --- a/content/videos/tags/apache-hudi/page/20/index.html +++ b/content/videos/tags/apache-hudi/page/20/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/page/3/index.html b/content/videos/tags/apache-hudi/page/3/index.html index 38c166a21a029..b17dd6f4a4f14 100644 --- a/content/videos/tags/apache-hudi/page/3/index.html +++ b/content/videos/tags/apache-hudi/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/page/4/index.html b/content/videos/tags/apache-hudi/page/4/index.html index 167b9d0660e08..e96644737d711 100644 --- a/content/videos/tags/apache-hudi/page/4/index.html +++ b/content/videos/tags/apache-hudi/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/page/5/index.html b/content/videos/tags/apache-hudi/page/5/index.html index e1727ffa958a7..54422b0d21c09 100644 --- a/content/videos/tags/apache-hudi/page/5/index.html +++ b/content/videos/tags/apache-hudi/page/5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/page/6/index.html b/content/videos/tags/apache-hudi/page/6/index.html index e56dd449aed13..4099f85500d3d 100644 --- a/content/videos/tags/apache-hudi/page/6/index.html +++ b/content/videos/tags/apache-hudi/page/6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/page/7/index.html b/content/videos/tags/apache-hudi/page/7/index.html index ea7e54cdaf8a7..92e2a2e7b655e 100644 --- a/content/videos/tags/apache-hudi/page/7/index.html +++ b/content/videos/tags/apache-hudi/page/7/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/page/8/index.html b/content/videos/tags/apache-hudi/page/8/index.html index 59d2cbd7b4fa7..b8be6e307de99 100644 --- a/content/videos/tags/apache-hudi/page/8/index.html +++ b/content/videos/tags/apache-hudi/page/8/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-hudi/page/9/index.html b/content/videos/tags/apache-hudi/page/9/index.html index 99352225c5634..232280379e0de 100644 --- a/content/videos/tags/apache-hudi/page/9/index.html +++ b/content/videos/tags/apache-hudi/page/9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-iceberg/index.html b/content/videos/tags/apache-iceberg/index.html index 350e73811cd28..91943f4dcbcfe 100644 --- a/content/videos/tags/apache-iceberg/index.html +++ b/content/videos/tags/apache-iceberg/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-iceberge/index.html b/content/videos/tags/apache-iceberge/index.html index c91169aa22950..3e433297a8908 100644 --- a/content/videos/tags/apache-iceberge/index.html +++ b/content/videos/tags/apache-iceberge/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-kafka/index.html b/content/videos/tags/apache-kafka/index.html index 6d7adfe4d3579..24951441ed239 100644 --- a/content/videos/tags/apache-kafka/index.html +++ b/content/videos/tags/apache-kafka/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-kafka/page/2/index.html b/content/videos/tags/apache-kafka/page/2/index.html index c1475700c4631..5d55eff302c4b 100644 --- a/content/videos/tags/apache-kafka/page/2/index.html +++ b/content/videos/tags/apache-kafka/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-kyuubi/index.html b/content/videos/tags/apache-kyuubi/index.html index 507cd739af6f5..c9fbc06741e8f 100644 --- a/content/videos/tags/apache-kyuubi/index.html +++ b/content/videos/tags/apache-kyuubi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-parquet/index.html b/content/videos/tags/apache-parquet/index.html index 35b0422a8eb8e..7abcb0ed226ee 100644 --- a/content/videos/tags/apache-parquet/index.html +++ b/content/videos/tags/apache-parquet/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-pulsar/index.html b/content/videos/tags/apache-pulsar/index.html index ab6e77946ced8..bcd31cb582e8c 100644 --- a/content/videos/tags/apache-pulsar/index.html +++ b/content/videos/tags/apache-pulsar/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-spark/index.html b/content/videos/tags/apache-spark/index.html index 5eeb186a8d878..68ad831485849 100644 --- a/content/videos/tags/apache-spark/index.html +++ b/content/videos/tags/apache-spark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-spark/page/2/index.html b/content/videos/tags/apache-spark/page/2/index.html index badc6eaf2b7d6..5a12a0e2b74c4 100644 --- a/content/videos/tags/apache-spark/page/2/index.html +++ b/content/videos/tags/apache-spark/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-superset/index.html b/content/videos/tags/apache-superset/index.html index 02cd9bac5b3fa..0bd6524d25b2e 100644 --- a/content/videos/tags/apache-superset/index.html +++ b/content/videos/tags/apache-superset/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-thrift/index.html b/content/videos/tags/apache-thrift/index.html index ee9e2232e4946..bbb9acfc9b8cc 100644 --- a/content/videos/tags/apache-thrift/index.html +++ b/content/videos/tags/apache-thrift/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-xtable/index.html b/content/videos/tags/apache-xtable/index.html index 48a435f8a7925..5d1691fb053af 100644 --- a/content/videos/tags/apache-xtable/index.html +++ b/content/videos/tags/apache-xtable/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/apache-zookeeper/index.html b/content/videos/tags/apache-zookeeper/index.html index 0ec6fe6ac776b..eb4a489dbf612 100644 --- a/content/videos/tags/apache-zookeeper/index.html +++ b/content/videos/tags/apache-zookeeper/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/async-mode/index.html b/content/videos/tags/async-mode/index.html index a30a42e7338e3..70401b9f5d684 100644 --- a/content/videos/tags/async-mode/index.html +++ b/content/videos/tags/async-mode/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/asynchronous-clustering/index.html b/content/videos/tags/asynchronous-clustering/index.html index 9104e9d11587f..a49fcca341d4e 100644 --- a/content/videos/tags/asynchronous-clustering/index.html +++ b/content/videos/tags/asynchronous-clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/asynchronous-indexing/index.html b/content/videos/tags/asynchronous-indexing/index.html index f17fcb326aaa4..dff9cda238c5c 100644 --- a/content/videos/tags/asynchronous-indexing/index.html +++ b/content/videos/tags/asynchronous-indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/athena/index.html b/content/videos/tags/athena/index.html index d96a86d4350e8..735261bcab660 100644 --- a/content/videos/tags/athena/index.html +++ b/content/videos/tags/athena/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/auto-generated-primary-keys/index.html b/content/videos/tags/auto-generated-primary-keys/index.html index ddc48e86aa8e4..b37356144ce7c 100644 --- a/content/videos/tags/auto-generated-primary-keys/index.html +++ b/content/videos/tags/auto-generated-primary-keys/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/automation/index.html b/content/videos/tags/automation/index.html index 11438b6ee20ee..bc43e60e860cd 100644 --- a/content/videos/tags/automation/index.html +++ b/content/videos/tags/automation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/aws-dms/index.html b/content/videos/tags/aws-dms/index.html index 0e942bae149dd..1ffc0939e6ea2 100644 --- a/content/videos/tags/aws-dms/index.html +++ b/content/videos/tags/aws-dms/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/aws-dms/page/2/index.html b/content/videos/tags/aws-dms/page/2/index.html index 98a758ee75253..57c10b335bd61 100644 --- a/content/videos/tags/aws-dms/page/2/index.html +++ b/content/videos/tags/aws-dms/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/aws-dynamodb/index.html b/content/videos/tags/aws-dynamodb/index.html index fb670d485e2b3..3abe162d69944 100644 --- a/content/videos/tags/aws-dynamodb/index.html +++ b/content/videos/tags/aws-dynamodb/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/aws-emr/index.html b/content/videos/tags/aws-emr/index.html index f6beb7730c1ef..03b6518159342 100644 --- a/content/videos/tags/aws-emr/index.html +++ b/content/videos/tags/aws-emr/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/aws-glue-concurrency/index.html b/content/videos/tags/aws-glue-concurrency/index.html index e592ed3e52acd..c377247de75c9 100644 --- a/content/videos/tags/aws-glue-concurrency/index.html +++ b/content/videos/tags/aws-glue-concurrency/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/aws-glue-crawler/index.html b/content/videos/tags/aws-glue-crawler/index.html index 5804283d00a24..b151c27de0c8d 100644 --- a/content/videos/tags/aws-glue-crawler/index.html +++ b/content/videos/tags/aws-glue-crawler/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/aws-glue/index.html b/content/videos/tags/aws-glue/index.html index 2cd41d04c6651..94c4e77e2b935 100644 --- a/content/videos/tags/aws-glue/index.html +++ b/content/videos/tags/aws-glue/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/aws-glue/page/2/index.html b/content/videos/tags/aws-glue/page/2/index.html index 7445cedce7836..35056fcb86853 100644 --- a/content/videos/tags/aws-glue/page/2/index.html +++ b/content/videos/tags/aws-glue/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/aws-glue/page/3/index.html b/content/videos/tags/aws-glue/page/3/index.html index dbfe7094f942c..b103ccc85ce44 100644 --- a/content/videos/tags/aws-glue/page/3/index.html +++ b/content/videos/tags/aws-glue/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/aws-glue/page/4/index.html b/content/videos/tags/aws-glue/page/4/index.html index c295dc4556683..6041dcecc19c3 100644 --- a/content/videos/tags/aws-glue/page/4/index.html +++ b/content/videos/tags/aws-glue/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/aws-glue/page/5/index.html b/content/videos/tags/aws-glue/page/5/index.html index 752e4243a3845..d7e771821b582 100644 --- a/content/videos/tags/aws-glue/page/5/index.html +++ b/content/videos/tags/aws-glue/page/5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/aws-glue/page/6/index.html b/content/videos/tags/aws-glue/page/6/index.html index 07191cd2a72de..840854f9fd9c4 100644 --- a/content/videos/tags/aws-glue/page/6/index.html +++ b/content/videos/tags/aws-glue/page/6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/aws-glue/page/7/index.html b/content/videos/tags/aws-glue/page/7/index.html index fdd8350d78cba..906785d3302eb 100644 --- a/content/videos/tags/aws-glue/page/7/index.html +++ b/content/videos/tags/aws-glue/page/7/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/aws-lake-formation/index.html b/content/videos/tags/aws-lake-formation/index.html index 92e044acf95d3..91146d4d5ced7 100644 --- a/content/videos/tags/aws-lake-formation/index.html +++ b/content/videos/tags/aws-lake-formation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/aws-lambda/index.html b/content/videos/tags/aws-lambda/index.html index d1b0fd1d7c9e3..d179f23fdeaab 100644 --- a/content/videos/tags/aws-lambda/index.html +++ b/content/videos/tags/aws-lambda/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/aws-managed-apache-flink/index.html b/content/videos/tags/aws-managed-apache-flink/index.html index d8c44476a4d22..f82180ff369d5 100644 --- a/content/videos/tags/aws-managed-apache-flink/index.html +++ b/content/videos/tags/aws-managed-apache-flink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/aws-s-3/index.html b/content/videos/tags/aws-s-3/index.html index 0f973f85b5d1c..2553df69c2fd4 100644 --- a/content/videos/tags/aws-s-3/index.html +++ b/content/videos/tags/aws-s-3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/aws-sqs/index.html b/content/videos/tags/aws-sqs/index.html index b7b8fb677a742..a9abe19ed8f58 100644 --- a/content/videos/tags/aws-sqs/index.html +++ b/content/videos/tags/aws-sqs/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/aws-transfer-family/index.html b/content/videos/tags/aws-transfer-family/index.html index ee0b99b856e84..1524e85fb10a1 100644 --- a/content/videos/tags/aws-transfer-family/index.html +++ b/content/videos/tags/aws-transfer-family/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/backfilling/index.html b/content/videos/tags/backfilling/index.html index 12f4152a7cd78..c94437751bff1 100644 --- a/content/videos/tags/backfilling/index.html +++ b/content/videos/tags/backfilling/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/backup/index.html b/content/videos/tags/backup/index.html index 9099c8904fc6e..7cffdd04c6cd0 100644 --- a/content/videos/tags/backup/index.html +++ b/content/videos/tags/backup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/batch-etl/index.html b/content/videos/tags/batch-etl/index.html index af757c9a908c7..2fa4f055d4ec0 100644 --- a/content/videos/tags/batch-etl/index.html +++ b/content/videos/tags/batch-etl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/beeline/index.html b/content/videos/tags/beeline/index.html index 40b3eff8da57e..d76e802c51c73 100644 --- a/content/videos/tags/beeline/index.html +++ b/content/videos/tags/beeline/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/before-image/index.html b/content/videos/tags/before-image/index.html index ffb734c0fdb16..689b43112afc1 100644 --- a/content/videos/tags/before-image/index.html +++ b/content/videos/tags/before-image/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/beginner/index.html b/content/videos/tags/beginner/index.html index 95573fcde6d52..1a1934897036d 100644 --- a/content/videos/tags/beginner/index.html +++ b/content/videos/tags/beginner/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/beginner/page/2/index.html b/content/videos/tags/beginner/page/2/index.html index 2f8aa361d4047..aad81285e44f6 100644 --- a/content/videos/tags/beginner/page/2/index.html +++ b/content/videos/tags/beginner/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/beginner/page/3/index.html b/content/videos/tags/beginner/page/3/index.html index e23bcef784aeb..1adc6e5344fbe 100644 --- a/content/videos/tags/beginner/page/3/index.html +++ b/content/videos/tags/beginner/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/beginner/page/4/index.html b/content/videos/tags/beginner/page/4/index.html index 3fce507424c85..1fe6b9be3bb5c 100644 --- a/content/videos/tags/beginner/page/4/index.html +++ b/content/videos/tags/beginner/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/beginner/page/5/index.html b/content/videos/tags/beginner/page/5/index.html index daf1d54d27fd7..4b597a4cf0c41 100644 --- a/content/videos/tags/beginner/page/5/index.html +++ b/content/videos/tags/beginner/page/5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/beginner/page/6/index.html b/content/videos/tags/beginner/page/6/index.html index 1c0e24d160315..c5b1c43891025 100644 --- a/content/videos/tags/beginner/page/6/index.html +++ b/content/videos/tags/beginner/page/6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/beginner/page/7/index.html b/content/videos/tags/beginner/page/7/index.html index 8c76097f43ccf..fddaea9cd5d49 100644 --- a/content/videos/tags/beginner/page/7/index.html +++ b/content/videos/tags/beginner/page/7/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/beginner/page/8/index.html b/content/videos/tags/beginner/page/8/index.html index 7b122b0bb07f2..8940dc92a9c21 100644 --- a/content/videos/tags/beginner/page/8/index.html +++ b/content/videos/tags/beginner/page/8/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/beginner/page/9/index.html b/content/videos/tags/beginner/page/9/index.html index 09e477f4609b8..da1e2df779a26 100644 --- a/content/videos/tags/beginner/page/9/index.html +++ b/content/videos/tags/beginner/page/9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/best-practices/index.html b/content/videos/tags/best-practices/index.html index b6e6bd8f5142a..e935cba686ffb 100644 --- a/content/videos/tags/best-practices/index.html +++ b/content/videos/tags/best-practices/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/bloom/index.html b/content/videos/tags/bloom/index.html index 9f5beb85c2c06..21f86262acea2 100644 --- a/content/videos/tags/bloom/index.html +++ b/content/videos/tags/bloom/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/bootstrapping/index.html b/content/videos/tags/bootstrapping/index.html index 332a8e860c3d8..0efcb9cff15d9 100644 --- a/content/videos/tags/bootstrapping/index.html +++ b/content/videos/tags/bootstrapping/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/bucket-index/index.html b/content/videos/tags/bucket-index/index.html index 20ffdcb1db15c..9793e1146623f 100644 --- a/content/videos/tags/bucket-index/index.html +++ b/content/videos/tags/bucket-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/bulk-insert-sort-modes/index.html b/content/videos/tags/bulk-insert-sort-modes/index.html index 032c3c2502a71..09fcb082108a6 100644 --- a/content/videos/tags/bulk-insert-sort-modes/index.html +++ b/content/videos/tags/bulk-insert-sort-modes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/bulk-insert/index.html b/content/videos/tags/bulk-insert/index.html index 93bd13cb45ed6..216ac7ae4adb7 100644 --- a/content/videos/tags/bulk-insert/index.html +++ b/content/videos/tags/bulk-insert/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/catalog/index.html b/content/videos/tags/catalog/index.html index bc8bb57f36383..6510455c3b59f 100644 --- a/content/videos/tags/catalog/index.html +++ b/content/videos/tags/catalog/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/cdc/index.html b/content/videos/tags/cdc/index.html index 005936bbe11c1..f6c1634921a0c 100644 --- a/content/videos/tags/cdc/index.html +++ b/content/videos/tags/cdc/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/cdc/page/2/index.html b/content/videos/tags/cdc/page/2/index.html index 1760876bcd2e7..08c8d0ebd015a 100644 --- a/content/videos/tags/cdc/page/2/index.html +++ b/content/videos/tags/cdc/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/cleaner-service/index.html b/content/videos/tags/cleaner-service/index.html index 2656051194a72..448d377508a39 100644 --- a/content/videos/tags/cleaner-service/index.html +++ b/content/videos/tags/cleaner-service/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/clustering/index.html b/content/videos/tags/clustering/index.html index 593bef8b85255..d9812693ba323 100644 --- a/content/videos/tags/clustering/index.html +++ b/content/videos/tags/clustering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/command-line-interface/index.html b/content/videos/tags/command-line-interface/index.html index 90b147af538be..daca77da438e5 100644 --- a/content/videos/tags/command-line-interface/index.html +++ b/content/videos/tags/command-line-interface/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/commit-notification/index.html b/content/videos/tags/commit-notification/index.html index ef21e1e5a55a1..6add813b980f5 100644 --- a/content/videos/tags/commit-notification/index.html +++ b/content/videos/tags/commit-notification/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/commit-times/index.html b/content/videos/tags/commit-times/index.html index 3937cb1da31aa..5a0a3e47efc40 100644 --- a/content/videos/tags/commit-times/index.html +++ b/content/videos/tags/commit-times/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/compaction/index.html b/content/videos/tags/compaction/index.html index b28b0622d35c7..35cdcd7e28f02 100644 --- a/content/videos/tags/compaction/index.html +++ b/content/videos/tags/compaction/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/comparison/index.html b/content/videos/tags/comparison/index.html index a10a0e05f1414..83fa3c6e240a1 100644 --- a/content/videos/tags/comparison/index.html +++ b/content/videos/tags/comparison/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/compliance/index.html b/content/videos/tags/compliance/index.html index 825bb3e60ecba..d8f2287c1e129 100644 --- a/content/videos/tags/compliance/index.html +++ b/content/videos/tags/compliance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/concurrency-control/index.html b/content/videos/tags/concurrency-control/index.html index c5da6a37a69dd..12db8b261a779 100644 --- a/content/videos/tags/concurrency-control/index.html +++ b/content/videos/tags/concurrency-control/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/consistent-hashing-index/index.html b/content/videos/tags/consistent-hashing-index/index.html index 89527dee09125..919d1c16bb14e 100644 --- a/content/videos/tags/consistent-hashing-index/index.html +++ b/content/videos/tags/consistent-hashing-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/copy-on-write/index.html b/content/videos/tags/copy-on-write/index.html index dce375be55ee4..7fa7d85d34180 100644 --- a/content/videos/tags/copy-on-write/index.html +++ b/content/videos/tags/copy-on-write/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/cow/index.html b/content/videos/tags/cow/index.html index a71027489d292..8eea4a8584963 100644 --- a/content/videos/tags/cow/index.html +++ b/content/videos/tags/cow/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/csv/index.html b/content/videos/tags/csv/index.html index 16152e1cd756c..5b9dd3bce3b63 100644 --- a/content/videos/tags/csv/index.html +++ b/content/videos/tags/csv/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/daft/index.html b/content/videos/tags/daft/index.html index d03bff2a59bbc..81aa932250b81 100644 --- a/content/videos/tags/daft/index.html +++ b/content/videos/tags/daft/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/data-cleaning/index.html b/content/videos/tags/data-cleaning/index.html index 742a85ee693f5..5315fe9f74d1b 100644 --- a/content/videos/tags/data-cleaning/index.html +++ b/content/videos/tags/data-cleaning/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/data-governance/index.html b/content/videos/tags/data-governance/index.html index 1a845a4bdef09..9114234791487 100644 --- a/content/videos/tags/data-governance/index.html +++ b/content/videos/tags/data-governance/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/data-ingestion/index.html b/content/videos/tags/data-ingestion/index.html index 62c0c8012270c..81b690a092c95 100644 --- a/content/videos/tags/data-ingestion/index.html +++ b/content/videos/tags/data-ingestion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/data-integration/index.html b/content/videos/tags/data-integration/index.html index b10dbaf2936b5..70019ab523aa4 100644 --- a/content/videos/tags/data-integration/index.html +++ b/content/videos/tags/data-integration/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/data-lake/index.html b/content/videos/tags/data-lake/index.html index ca29be0e29cdb..9dae9217bcd3f 100644 --- a/content/videos/tags/data-lake/index.html +++ b/content/videos/tags/data-lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/data-lakehouse/index.html b/content/videos/tags/data-lakehouse/index.html index e8f07ac7f204c..eec26cd944d5f 100644 --- a/content/videos/tags/data-lakehouse/index.html +++ b/content/videos/tags/data-lakehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/data-lineage/index.html b/content/videos/tags/data-lineage/index.html index f715ceefd334a..8950083de3843 100644 --- a/content/videos/tags/data-lineage/index.html +++ b/content/videos/tags/data-lineage/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/data-management/index.html b/content/videos/tags/data-management/index.html index 3ff5e9bf59c1b..2bf1ffc871dcb 100644 --- a/content/videos/tags/data-management/index.html +++ b/content/videos/tags/data-management/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/data-processing/index.html b/content/videos/tags/data-processing/index.html index 1ba3375f29487..54dd6dc6bd99a 100644 --- a/content/videos/tags/data-processing/index.html +++ b/content/videos/tags/data-processing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/data-quality/index.html b/content/videos/tags/data-quality/index.html index 0d767baddaeec..24a1182976169 100644 --- a/content/videos/tags/data-quality/index.html +++ b/content/videos/tags/data-quality/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/data-skipping/index.html b/content/videos/tags/data-skipping/index.html index 66135e9325ed6..415f739b91b89 100644 --- a/content/videos/tags/data-skipping/index.html +++ b/content/videos/tags/data-skipping/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/data-unification/index.html b/content/videos/tags/data-unification/index.html index ada7ddf3a4d9b..f5db79b5d4c47 100644 --- a/content/videos/tags/data-unification/index.html +++ b/content/videos/tags/data-unification/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/data-update/index.html b/content/videos/tags/data-update/index.html index 1e57a82ba28da..ddfbb9e5e74c0 100644 --- a/content/videos/tags/data-update/index.html +++ b/content/videos/tags/data-update/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/data-upsert/index.html b/content/videos/tags/data-upsert/index.html index dc160a93e7dc3..333e4647d70c0 100644 --- a/content/videos/tags/data-upsert/index.html +++ b/content/videos/tags/data-upsert/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/database/index.html b/content/videos/tags/database/index.html index d17b3b60d8a1b..946401da11879 100644 --- a/content/videos/tags/database/index.html +++ b/content/videos/tags/database/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/datalake/index.html b/content/videos/tags/datalake/index.html index 3d7cf2b5b1641..2316a42108f69 100644 --- a/content/videos/tags/datalake/index.html +++ b/content/videos/tags/datalake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/dbt/index.html b/content/videos/tags/dbt/index.html index 87793ad5874bc..d2ceece58ab3c 100644 --- a/content/videos/tags/dbt/index.html +++ b/content/videos/tags/dbt/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/de-duplicate/index.html b/content/videos/tags/de-duplicate/index.html index bddeae37440c6..b621772fd06da 100644 --- a/content/videos/tags/de-duplicate/index.html +++ b/content/videos/tags/de-duplicate/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/debezium/index.html b/content/videos/tags/debezium/index.html index c5c7fd13b6b48..35db71f80743b 100644 --- a/content/videos/tags/debezium/index.html +++ b/content/videos/tags/debezium/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/deep-dive/index.html b/content/videos/tags/deep-dive/index.html index 0b2122be3ab52..26af88247030b 100644 --- a/content/videos/tags/deep-dive/index.html +++ b/content/videos/tags/deep-dive/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/delete-partition/index.html b/content/videos/tags/delete-partition/index.html index ef7bdfc9068ad..8981a8475f0e1 100644 --- a/content/videos/tags/delete-partition/index.html +++ b/content/videos/tags/delete-partition/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/delete/index.html b/content/videos/tags/delete/index.html index 39aa297bfb2dc..1343de9630fc9 100644 --- a/content/videos/tags/delete/index.html +++ b/content/videos/tags/delete/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/delta-lake/index.html b/content/videos/tags/delta-lake/index.html index b7ab0359be40e..84ca1191104a9 100644 --- a/content/videos/tags/delta-lake/index.html +++ b/content/videos/tags/delta-lake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/deltastreamer/index.html b/content/videos/tags/deltastreamer/index.html index 86722fd7c3c39..630321ba652de 100644 --- a/content/videos/tags/deltastreamer/index.html +++ b/content/videos/tags/deltastreamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/deltastreamer/page/2/index.html b/content/videos/tags/deltastreamer/page/2/index.html index ae24dce6fc4eb..78237048a729a 100644 --- a/content/videos/tags/deltastreamer/page/2/index.html +++ b/content/videos/tags/deltastreamer/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/deltastreamer/page/3/index.html b/content/videos/tags/deltastreamer/page/3/index.html index 09b4ab14726e9..bffcef5a2ac5e 100644 --- a/content/videos/tags/deltastreamer/page/3/index.html +++ b/content/videos/tags/deltastreamer/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/deltastreamer/page/4/index.html b/content/videos/tags/deltastreamer/page/4/index.html index 6cbd3f7869929..fef0a2137e448 100644 --- a/content/videos/tags/deltastreamer/page/4/index.html +++ b/content/videos/tags/deltastreamer/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/development-setup/index.html b/content/videos/tags/development-setup/index.html index 685944a635237..b7c667896e2a6 100644 --- a/content/videos/tags/development-setup/index.html +++ b/content/videos/tags/development-setup/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/dimension-fields/index.html b/content/videos/tags/dimension-fields/index.html index 99a74cf76f11f..049150dd08485 100644 --- a/content/videos/tags/dimension-fields/index.html +++ b/content/videos/tags/dimension-fields/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/disaster-recovery/index.html b/content/videos/tags/disaster-recovery/index.html index bdb450b1ffca6..6c18a7ded3fd5 100644 --- a/content/videos/tags/disaster-recovery/index.html +++ b/content/videos/tags/disaster-recovery/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/docker/index.html b/content/videos/tags/docker/index.html index b77f3a84f552a..b4627f4df21f5 100644 --- a/content/videos/tags/docker/index.html +++ b/content/videos/tags/docker/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/duplicates/index.html b/content/videos/tags/duplicates/index.html index 8c78cd09a72e1..b0e293f404808 100644 --- a/content/videos/tags/duplicates/index.html +++ b/content/videos/tags/duplicates/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/dynamic-buckets/index.html b/content/videos/tags/dynamic-buckets/index.html index 885cfd3d704f6..2b8381eec9fd7 100644 --- a/content/videos/tags/dynamic-buckets/index.html +++ b/content/videos/tags/dynamic-buckets/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/elastic-search/index.html b/content/videos/tags/elastic-search/index.html index 008b8614e6a0e..fe2b8dba94772 100644 --- a/content/videos/tags/elastic-search/index.html +++ b/content/videos/tags/elastic-search/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/emr-serverless/index.html b/content/videos/tags/emr-serverless/index.html index d407847519a00..a214aac2086b4 100644 --- a/content/videos/tags/emr-serverless/index.html +++ b/content/videos/tags/emr-serverless/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/error-tables/index.html b/content/videos/tags/error-tables/index.html index ce54084fe9c39..68ba1de33deec 100644 --- a/content/videos/tags/error-tables/index.html +++ b/content/videos/tags/error-tables/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/etl/index.html b/content/videos/tags/etl/index.html index 3cde57842f507..1725f5837340d 100644 --- a/content/videos/tags/etl/index.html +++ b/content/videos/tags/etl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/event-bridge/index.html b/content/videos/tags/event-bridge/index.html index 6af1b516d1ffa..7d5adfbf3a9c9 100644 --- a/content/videos/tags/event-bridge/index.html +++ b/content/videos/tags/event-bridge/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/event-bus/index.html b/content/videos/tags/event-bus/index.html index 22142d0314f00..c16f7dd5586cd 100644 --- a/content/videos/tags/event-bus/index.html +++ b/content/videos/tags/event-bus/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/event-driven/index.html b/content/videos/tags/event-driven/index.html index 07d25a94676a1..f882d930be192 100644 --- a/content/videos/tags/event-driven/index.html +++ b/content/videos/tags/event-driven/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/event-notification/index.html b/content/videos/tags/event-notification/index.html index 1c6c1e1654c81..101801b523633 100644 --- a/content/videos/tags/event-notification/index.html +++ b/content/videos/tags/event-notification/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/external-locking/index.html b/content/videos/tags/external-locking/index.html index bc2f8dd797b10..936fbd3c5138f 100644 --- a/content/videos/tags/external-locking/index.html +++ b/content/videos/tags/external-locking/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/fastapi/index.html b/content/videos/tags/fastapi/index.html index baee9d61a18d6..8a5aa00f31a3b 100644 --- a/content/videos/tags/fastapi/index.html +++ b/content/videos/tags/fastapi/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/file-sizing/index.html b/content/videos/tags/file-sizing/index.html index be92228b45f3b..3aa24500d8754 100644 --- a/content/videos/tags/file-sizing/index.html +++ b/content/videos/tags/file-sizing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/flask/index.html b/content/videos/tags/flask/index.html index df33bc21a3519..a86e18bddc5ad 100644 --- a/content/videos/tags/flask/index.html +++ b/content/videos/tags/flask/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/frontend/index.html b/content/videos/tags/frontend/index.html index b3418f0a3f3f3..b03d3a6b7e6c5 100644 --- a/content/videos/tags/frontend/index.html +++ b/content/videos/tags/frontend/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/gdpr/index.html b/content/videos/tags/gdpr/index.html index a476d5cc79d34..5a579c0a9d971 100644 --- a/content/videos/tags/gdpr/index.html +++ b/content/videos/tags/gdpr/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/global-index/index.html b/content/videos/tags/global-index/index.html index 843503aacbe66..8e0ee47e831f3 100644 --- a/content/videos/tags/global-index/index.html +++ b/content/videos/tags/global-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/glue-bookmarks/index.html b/content/videos/tags/glue-bookmarks/index.html index 687ca36449d8e..5c690e7d1f8d7 100644 --- a/content/videos/tags/glue-bookmarks/index.html +++ b/content/videos/tags/glue-bookmarks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/glue-notebook/index.html b/content/videos/tags/glue-notebook/index.html index 1d58e749b1789..1aa85341e3226 100644 --- a/content/videos/tags/glue-notebook/index.html +++ b/content/videos/tags/glue-notebook/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/guide/index.html b/content/videos/tags/guide/index.html index 43cad90f7931b..088181fffea96 100644 --- a/content/videos/tags/guide/index.html +++ b/content/videos/tags/guide/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/guide/page/10/index.html b/content/videos/tags/guide/page/10/index.html index ebd93770126b5..d50a109e837ae 100644 --- a/content/videos/tags/guide/page/10/index.html +++ b/content/videos/tags/guide/page/10/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/guide/page/11/index.html b/content/videos/tags/guide/page/11/index.html index da2279888aa63..a8a67cd04fe57 100644 --- a/content/videos/tags/guide/page/11/index.html +++ b/content/videos/tags/guide/page/11/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/guide/page/12/index.html b/content/videos/tags/guide/page/12/index.html index 6aad4b2acbab9..18ec5ce152311 100644 --- a/content/videos/tags/guide/page/12/index.html +++ b/content/videos/tags/guide/page/12/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/guide/page/13/index.html b/content/videos/tags/guide/page/13/index.html index 85a16f73bf566..95285947395df 100644 --- a/content/videos/tags/guide/page/13/index.html +++ b/content/videos/tags/guide/page/13/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/guide/page/14/index.html b/content/videos/tags/guide/page/14/index.html index 8d57ddf66a6fb..ed6837fb6b607 100644 --- a/content/videos/tags/guide/page/14/index.html +++ b/content/videos/tags/guide/page/14/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/guide/page/15/index.html b/content/videos/tags/guide/page/15/index.html index 498e23008c906..3e15b7eca897a 100644 --- a/content/videos/tags/guide/page/15/index.html +++ b/content/videos/tags/guide/page/15/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/guide/page/16/index.html b/content/videos/tags/guide/page/16/index.html index 8b3c1b6a7be49..a5d3574f95755 100644 --- a/content/videos/tags/guide/page/16/index.html +++ b/content/videos/tags/guide/page/16/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/guide/page/17/index.html b/content/videos/tags/guide/page/17/index.html index 748b5f03cedf9..a22eb03dca149 100644 --- a/content/videos/tags/guide/page/17/index.html +++ b/content/videos/tags/guide/page/17/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/guide/page/18/index.html b/content/videos/tags/guide/page/18/index.html index 695edd8ead4fe..c85bccdcd9610 100644 --- a/content/videos/tags/guide/page/18/index.html +++ b/content/videos/tags/guide/page/18/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/guide/page/19/index.html b/content/videos/tags/guide/page/19/index.html index 180e398efdac8..fdabea3d046e2 100644 --- a/content/videos/tags/guide/page/19/index.html +++ b/content/videos/tags/guide/page/19/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/guide/page/2/index.html b/content/videos/tags/guide/page/2/index.html index a7f8d43ffe9f0..d5400210e76a6 100644 --- a/content/videos/tags/guide/page/2/index.html +++ b/content/videos/tags/guide/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/guide/page/3/index.html b/content/videos/tags/guide/page/3/index.html index b8ef7dae3a8a9..788429f2ae655 100644 --- a/content/videos/tags/guide/page/3/index.html +++ b/content/videos/tags/guide/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/guide/page/4/index.html b/content/videos/tags/guide/page/4/index.html index fecfa64e7c5b7..fb5ae4eda07a6 100644 --- a/content/videos/tags/guide/page/4/index.html +++ b/content/videos/tags/guide/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/guide/page/5/index.html b/content/videos/tags/guide/page/5/index.html index 8b0b4395b43c6..f68d2f27523c2 100644 --- a/content/videos/tags/guide/page/5/index.html +++ b/content/videos/tags/guide/page/5/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/guide/page/6/index.html b/content/videos/tags/guide/page/6/index.html index 509751f94d8e6..49c75662b752b 100644 --- a/content/videos/tags/guide/page/6/index.html +++ b/content/videos/tags/guide/page/6/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/guide/page/7/index.html b/content/videos/tags/guide/page/7/index.html index 38252389a1d87..8ee12da6b3173 100644 --- a/content/videos/tags/guide/page/7/index.html +++ b/content/videos/tags/guide/page/7/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/guide/page/8/index.html b/content/videos/tags/guide/page/8/index.html index eab577e8e528c..45e4d6c71ba65 100644 --- a/content/videos/tags/guide/page/8/index.html +++ b/content/videos/tags/guide/page/8/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/guide/page/9/index.html b/content/videos/tags/guide/page/9/index.html index 0756bd48084be..130834545d97f 100644 --- a/content/videos/tags/guide/page/9/index.html +++ b/content/videos/tags/guide/page/9/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/hands-on-lab/index.html b/content/videos/tags/hands-on-lab/index.html index 3bbe12192bd5e..c0fa898ffeaaa 100644 --- a/content/videos/tags/hands-on-lab/index.html +++ b/content/videos/tags/hands-on-lab/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/hard-delete/index.html b/content/videos/tags/hard-delete/index.html index 9a8b74a594c34..29cfcd15373ae 100644 --- a/content/videos/tags/hard-delete/index.html +++ b/content/videos/tags/hard-delete/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/hbase-index/index.html b/content/videos/tags/hbase-index/index.html index ff63d861e440c..34c42af2c62e0 100644 --- a/content/videos/tags/hbase-index/index.html +++ b/content/videos/tags/hbase-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/hipaa/index.html b/content/videos/tags/hipaa/index.html index a6631bcc0297c..27ab5d2698403 100644 --- a/content/videos/tags/hipaa/index.html +++ b/content/videos/tags/hipaa/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/hive-metastore/index.html b/content/videos/tags/hive-metastore/index.html index 707a0cfc27d92..9cbe677f4c45c 100644 --- a/content/videos/tags/hive-metastore/index.html +++ b/content/videos/tags/hive-metastore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/hive-sql/index.html b/content/videos/tags/hive-sql/index.html index 17c2796c3ba79..3aa6012a9654e 100644 --- a/content/videos/tags/hive-sql/index.html +++ b/content/videos/tags/hive-sql/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/hoodie-snapshot-exporter/index.html b/content/videos/tags/hoodie-snapshot-exporter/index.html index 9e9d1d2db2880..2aca6b48e0b4b 100644 --- a/content/videos/tags/hoodie-snapshot-exporter/index.html +++ b/content/videos/tags/hoodie-snapshot-exporter/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/how-to/index.html b/content/videos/tags/how-to/index.html index d4968bcde81e6..4b1be5f498008 100644 --- a/content/videos/tags/how-to/index.html +++ b/content/videos/tags/how-to/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/http-endpoint/index.html b/content/videos/tags/http-endpoint/index.html index a977e29c919e0..e04b260bde28b 100644 --- a/content/videos/tags/http-endpoint/index.html +++ b/content/videos/tags/http-endpoint/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/hudi-cli/index.html b/content/videos/tags/hudi-cli/index.html index 790bbd54ff218..3de8ce2e49fb8 100644 --- a/content/videos/tags/hudi-cli/index.html +++ b/content/videos/tags/hudi-cli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/hudi-performacne/index.html b/content/videos/tags/hudi-performacne/index.html index 12ef05824c302..e0d9b4e0a3158 100644 --- a/content/videos/tags/hudi-performacne/index.html +++ b/content/videos/tags/hudi-performacne/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/hudi-streamer/index.html b/content/videos/tags/hudi-streamer/index.html index ea8c8d4646dc3..259afd4018986 100644 --- a/content/videos/tags/hudi-streamer/index.html +++ b/content/videos/tags/hudi-streamer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/hudi-streamer/page/2/index.html b/content/videos/tags/hudi-streamer/page/2/index.html index d53e1045d314e..a906950c9569e 100644 --- a/content/videos/tags/hudi-streamer/page/2/index.html +++ b/content/videos/tags/hudi-streamer/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/hudi-streamer/page/3/index.html b/content/videos/tags/hudi-streamer/page/3/index.html index d705728065415..1a3f7b614569f 100644 --- a/content/videos/tags/hudi-streamer/page/3/index.html +++ b/content/videos/tags/hudi-streamer/page/3/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/hudi-streamer/page/4/index.html b/content/videos/tags/hudi-streamer/page/4/index.html index 19f87979e53aa..9498d884d14a8 100644 --- a/content/videos/tags/hudi-streamer/page/4/index.html +++ b/content/videos/tags/hudi-streamer/page/4/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/hue/index.html b/content/videos/tags/hue/index.html index e5f8574008218..c6b66d6d6d9d4 100644 --- a/content/videos/tags/hue/index.html +++ b/content/videos/tags/hue/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/incremental-data-processing/index.html b/content/videos/tags/incremental-data-processing/index.html index 9a66e53cdca7d..bae3b3e471b59 100644 --- a/content/videos/tags/incremental-data-processing/index.html +++ b/content/videos/tags/incremental-data-processing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/incremental-etl/index.html b/content/videos/tags/incremental-etl/index.html index 0f9fc2a937d73..cf288c024cce2 100644 --- a/content/videos/tags/incremental-etl/index.html +++ b/content/videos/tags/incremental-etl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/incremental-etl/page/2/index.html b/content/videos/tags/incremental-etl/page/2/index.html index 6ef415314701b..3b8cfa6a2c1c2 100644 --- a/content/videos/tags/incremental-etl/page/2/index.html +++ b/content/videos/tags/incremental-etl/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/incremental-pipelines/index.html b/content/videos/tags/incremental-pipelines/index.html index 87fb7afa3d80a..f610d011ff97b 100644 --- a/content/videos/tags/incremental-pipelines/index.html +++ b/content/videos/tags/incremental-pipelines/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/incremental-processing/index.html b/content/videos/tags/incremental-processing/index.html index fa396ec4461eb..1550749cd8d7f 100644 --- a/content/videos/tags/incremental-processing/index.html +++ b/content/videos/tags/incremental-processing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/incremental-query/index.html b/content/videos/tags/incremental-query/index.html index 6fcc673da48ce..bf38e1ebc5927 100644 --- a/content/videos/tags/incremental-query/index.html +++ b/content/videos/tags/incremental-query/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/incremental-query/page/2/index.html b/content/videos/tags/incremental-query/page/2/index.html index 730f4a2afc2d9..1b66c58e0195a 100644 --- a/content/videos/tags/incremental-query/page/2/index.html +++ b/content/videos/tags/incremental-query/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/index.html b/content/videos/tags/index.html index 291b989c08ad2..4b05718d25454 100644 --- a/content/videos/tags/index.html +++ b/content/videos/tags/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/indexing/index.html b/content/videos/tags/indexing/index.html index cf056abe77fdd..6fce1fe63b4cd 100644 --- a/content/videos/tags/indexing/index.html +++ b/content/videos/tags/indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/insert-overwrite/index.html b/content/videos/tags/insert-overwrite/index.html index 7a29df9cf2230..0ef5909bb5e64 100644 --- a/content/videos/tags/insert-overwrite/index.html +++ b/content/videos/tags/insert-overwrite/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/insert/index.html b/content/videos/tags/insert/index.html index 4c92a9f4362cc..fdf9f12638a2e 100644 --- a/content/videos/tags/insert/index.html +++ b/content/videos/tags/insert/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/internet-gateway/index.html b/content/videos/tags/internet-gateway/index.html index a3749df0cdbfe..5a53ee670048c 100644 --- a/content/videos/tags/internet-gateway/index.html +++ b/content/videos/tags/internet-gateway/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/jdbc/index.html b/content/videos/tags/jdbc/index.html index ea91629d29d6b..776413ab0d21c 100644 --- a/content/videos/tags/jdbc/index.html +++ b/content/videos/tags/jdbc/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/join/index.html b/content/videos/tags/join/index.html index 335a98667f328..24352463d4c6d 100644 --- a/content/videos/tags/join/index.html +++ b/content/videos/tags/join/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/joins/index.html b/content/videos/tags/joins/index.html index d42d340b438ff..f60cb79c55449 100644 --- a/content/videos/tags/joins/index.html +++ b/content/videos/tags/joins/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/kafka-topic/index.html b/content/videos/tags/kafka-topic/index.html index 512420991965b..bcd0a318ee73f 100644 --- a/content/videos/tags/kafka-topic/index.html +++ b/content/videos/tags/kafka-topic/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/kibana/index.html b/content/videos/tags/kibana/index.html index e1da937381f55..a0e14cf8ca0db 100644 --- a/content/videos/tags/kibana/index.html +++ b/content/videos/tags/kibana/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/lakehouse/index.html b/content/videos/tags/lakehouse/index.html index 249190f4733d5..2fcf22381acd0 100644 --- a/content/videos/tags/lakehouse/index.html +++ b/content/videos/tags/lakehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/lakehouse/page/2/index.html b/content/videos/tags/lakehouse/page/2/index.html index 54a08a9c9a9ad..2dd7ae8652473 100644 --- a/content/videos/tags/lakehouse/page/2/index.html +++ b/content/videos/tags/lakehouse/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/late-arriving-data/index.html b/content/videos/tags/late-arriving-data/index.html index 3d55168d4fcfa..31e71283e691d 100644 --- a/content/videos/tags/late-arriving-data/index.html +++ b/content/videos/tags/late-arriving-data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/lock-providers/index.html b/content/videos/tags/lock-providers/index.html index 663c3fe08c169..134d5faef0a9c 100644 --- a/content/videos/tags/lock-providers/index.html +++ b/content/videos/tags/lock-providers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/marquez/index.html b/content/videos/tags/marquez/index.html index a3100bc7f0711..0d1d57d7eb898 100644 --- a/content/videos/tags/marquez/index.html +++ b/content/videos/tags/marquez/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/mask-pii/index.html b/content/videos/tags/mask-pii/index.html index 1ccc337dc5fa6..892e7985959e8 100644 --- a/content/videos/tags/mask-pii/index.html +++ b/content/videos/tags/mask-pii/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/masking/index.html b/content/videos/tags/masking/index.html index 3adec907fce15..3af5892606a1e 100644 --- a/content/videos/tags/masking/index.html +++ b/content/videos/tags/masking/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/medallion-architecture/index.html b/content/videos/tags/medallion-architecture/index.html index bf78a9e1d87bb..9841b25ec995f 100644 --- a/content/videos/tags/medallion-architecture/index.html +++ b/content/videos/tags/medallion-architecture/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/medallion/index.html b/content/videos/tags/medallion/index.html index 206f05e574ddb..9d075fc5b66b5 100644 --- a/content/videos/tags/medallion/index.html +++ b/content/videos/tags/medallion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/merge-on-read/index.html b/content/videos/tags/merge-on-read/index.html index 27df56ee0d47c..3a304603651bc 100644 --- a/content/videos/tags/merge-on-read/index.html +++ b/content/videos/tags/merge-on-read/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/metadata-indexing/index.html b/content/videos/tags/metadata-indexing/index.html index fece596941d2a..3812d85d373c1 100644 --- a/content/videos/tags/metadata-indexing/index.html +++ b/content/videos/tags/metadata-indexing/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/metadata-table/index.html b/content/videos/tags/metadata-table/index.html index d9b41359efc4e..225a5a207c37a 100644 --- a/content/videos/tags/metadata-table/index.html +++ b/content/videos/tags/metadata-table/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/metrics/index.html b/content/videos/tags/metrics/index.html index 07079a65023d3..cf1a4ee5f2cea 100644 --- a/content/videos/tags/metrics/index.html +++ b/content/videos/tags/metrics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/microsft-sql-server/index.html b/content/videos/tags/microsft-sql-server/index.html index 4990bf4eff4bc..341514584988a 100644 --- a/content/videos/tags/microsft-sql-server/index.html +++ b/content/videos/tags/microsft-sql-server/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/minio/index.html b/content/videos/tags/minio/index.html index 9a273f5f4204a..301c1e8e3fedb 100644 --- a/content/videos/tags/minio/index.html +++ b/content/videos/tags/minio/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/minio/page/2/index.html b/content/videos/tags/minio/page/2/index.html index 36921298c05f8..9767056667700 100644 --- a/content/videos/tags/minio/page/2/index.html +++ b/content/videos/tags/minio/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/mongodb-atlas/index.html b/content/videos/tags/mongodb-atlas/index.html index acaa0d94bf720..a29a5db0f1b0e 100644 --- a/content/videos/tags/mongodb-atlas/index.html +++ b/content/videos/tags/mongodb-atlas/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/mongodb/index.html b/content/videos/tags/mongodb/index.html index b17c37be91f0b..8a34fe9a63199 100644 --- a/content/videos/tags/mongodb/index.html +++ b/content/videos/tags/mongodb/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/mor/index.html b/content/videos/tags/mor/index.html index 9b94d5b2e5ee9..1248f837a2ced 100644 --- a/content/videos/tags/mor/index.html +++ b/content/videos/tags/mor/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/multi-table/index.html b/content/videos/tags/multi-table/index.html index ad039148040e9..d0152fd3e46f0 100644 --- a/content/videos/tags/multi-table/index.html +++ b/content/videos/tags/multi-table/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/multi-writer/index.html b/content/videos/tags/multi-writer/index.html index 2a81226b82190..902deac9245b1 100644 --- a/content/videos/tags/multi-writer/index.html +++ b/content/videos/tags/multi-writer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/mysql/index.html b/content/videos/tags/mysql/index.html index 6d955b5abefb8..a70673fac90b4 100644 --- a/content/videos/tags/mysql/index.html +++ b/content/videos/tags/mysql/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/near-real-time-analytics/index.html b/content/videos/tags/near-real-time-analytics/index.html index af865a8be891c..c000fb2b5adb7 100644 --- a/content/videos/tags/near-real-time-analytics/index.html +++ b/content/videos/tags/near-real-time-analytics/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/oltp/index.html b/content/videos/tags/oltp/index.html index 8aa1ed853ea39..9330e3f13e3eb 100644 --- a/content/videos/tags/oltp/index.html +++ b/content/videos/tags/oltp/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/on-prem/index.html b/content/videos/tags/on-prem/index.html index 96458ff5cd11e..c2eb20dc9e6a9 100644 --- a/content/videos/tags/on-prem/index.html +++ b/content/videos/tags/on-prem/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/onehouse/index.html b/content/videos/tags/onehouse/index.html index 9600a1782ee31..8c5828eb6b416 100644 --- a/content/videos/tags/onehouse/index.html +++ b/content/videos/tags/onehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/ordering/index.html b/content/videos/tags/ordering/index.html index 7689851de8ff9..5eb3f62eb711f 100644 --- a/content/videos/tags/ordering/index.html +++ b/content/videos/tags/ordering/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/partition/index.html b/content/videos/tags/partition/index.html index c92a85896937c..86ec9b542c99f 100644 --- a/content/videos/tags/partition/index.html +++ b/content/videos/tags/partition/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/point-lookups/index.html b/content/videos/tags/point-lookups/index.html index f1dc94694a006..0a4a8e5201305 100644 --- a/content/videos/tags/point-lookups/index.html +++ b/content/videos/tags/point-lookups/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/postgres/index.html b/content/videos/tags/postgres/index.html index 76203fda12172..8d867033cdaa9 100644 --- a/content/videos/tags/postgres/index.html +++ b/content/videos/tags/postgres/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/postgres/page/2/index.html b/content/videos/tags/postgres/page/2/index.html index 744354a8858b3..6719613959b21 100644 --- a/content/videos/tags/postgres/page/2/index.html +++ b/content/videos/tags/postgres/page/2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/postgresql/index.html b/content/videos/tags/postgresql/index.html index 0ea1071209f5e..a93347c5d00bf 100644 --- a/content/videos/tags/postgresql/index.html +++ b/content/videos/tags/postgresql/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/pre-commit-validator/index.html b/content/videos/tags/pre-commit-validator/index.html index e2b4a54c9f468..2728644cb43d5 100644 --- a/content/videos/tags/pre-commit-validator/index.html +++ b/content/videos/tags/pre-commit-validator/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/precombine-key/index.html b/content/videos/tags/precombine-key/index.html index 9b142958cfad2..7fc3d31ebd95c 100644 --- a/content/videos/tags/precombine-key/index.html +++ b/content/videos/tags/precombine-key/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/presto/index.html b/content/videos/tags/presto/index.html index 8ce760702cb36..ec1702ff8b002 100644 --- a/content/videos/tags/presto/index.html +++ b/content/videos/tags/presto/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/primary-keys/index.html b/content/videos/tags/primary-keys/index.html index 30d09df535707..3da72a62ace77 100644 --- a/content/videos/tags/primary-keys/index.html +++ b/content/videos/tags/primary-keys/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/pydeequ/index.html b/content/videos/tags/pydeequ/index.html index d99123a5a93f4..2d7f29242c130 100644 --- a/content/videos/tags/pydeequ/index.html +++ b/content/videos/tags/pydeequ/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/pyflink/index.html b/content/videos/tags/pyflink/index.html index 219230da32b4b..da3b551ba828d 100644 --- a/content/videos/tags/pyflink/index.html +++ b/content/videos/tags/pyflink/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/pyspark/index.html b/content/videos/tags/pyspark/index.html index e1587ca4cce61..d91b0ebf2d0be 100644 --- a/content/videos/tags/pyspark/index.html +++ b/content/videos/tags/pyspark/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/python/index.html b/content/videos/tags/python/index.html index 5d3e5749be287..75662a741e14a 100644 --- a/content/videos/tags/python/index.html +++ b/content/videos/tags/python/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/query/index.html b/content/videos/tags/query/index.html index 798c783286f2f..a07a8b1a6a5cf 100644 --- a/content/videos/tags/query/index.html +++ b/content/videos/tags/query/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/ray/index.html b/content/videos/tags/ray/index.html index 64d8fe68defb6..d48cc3b82ae12 100644 --- a/content/videos/tags/ray/index.html +++ b/content/videos/tags/ray/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/real-time-datalake/index.html b/content/videos/tags/real-time-datalake/index.html index 7e8a16fadb3f3..c6e89c62fb3c6 100644 --- a/content/videos/tags/real-time-datalake/index.html +++ b/content/videos/tags/real-time-datalake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/record-level-index/index.html b/content/videos/tags/record-level-index/index.html index 4e32d006c1f44..dc92a747af259 100644 --- a/content/videos/tags/record-level-index/index.html +++ b/content/videos/tags/record-level-index/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/reporting/index.html b/content/videos/tags/reporting/index.html index 7cb87e39afe14..9766356b90d9c 100644 --- a/content/videos/tags/reporting/index.html +++ b/content/videos/tags/reporting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/resource-usage/index.html b/content/videos/tags/resource-usage/index.html index 68754efb4726f..0f19db296c38f 100644 --- a/content/videos/tags/resource-usage/index.html +++ b/content/videos/tags/resource-usage/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/restore/index.html b/content/videos/tags/restore/index.html index 984dbc082971a..4a26f70474df0 100644 --- a/content/videos/tags/restore/index.html +++ b/content/videos/tags/restore/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/rli/index.html b/content/videos/tags/rli/index.html index 80f9113ddec66..a71006725fe59 100644 --- a/content/videos/tags/rli/index.html +++ b/content/videos/tags/rli/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/rollback/index.html b/content/videos/tags/rollback/index.html index 85738c16f211b..3f600adb17551 100644 --- a/content/videos/tags/rollback/index.html +++ b/content/videos/tags/rollback/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/savepoint/index.html b/content/videos/tags/savepoint/index.html index 7063c02dc4c4b..74bed933e758e 100644 --- a/content/videos/tags/savepoint/index.html +++ b/content/videos/tags/savepoint/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/scd-2/index.html b/content/videos/tags/scd-2/index.html index 5e2cd76f9991b..7fd4d78bbaa42 100644 --- a/content/videos/tags/scd-2/index.html +++ b/content/videos/tags/scd-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/schema-changes/index.html b/content/videos/tags/schema-changes/index.html index 77b201356cd3e..0e8a04ebb6414 100644 --- a/content/videos/tags/schema-changes/index.html +++ b/content/videos/tags/schema-changes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/schema-evolution/index.html b/content/videos/tags/schema-evolution/index.html index 727e7462b3445..cc3fb63920662 100644 --- a/content/videos/tags/schema-evolution/index.html +++ b/content/videos/tags/schema-evolution/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/schema-registry/index.html b/content/videos/tags/schema-registry/index.html index 77c1377b23bf6..fceb35931f02d 100644 --- a/content/videos/tags/schema-registry/index.html +++ b/content/videos/tags/schema-registry/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/serverless/index.html b/content/videos/tags/serverless/index.html index 0c2c32d9d964e..1a3a882113dca 100644 --- a/content/videos/tags/serverless/index.html +++ b/content/videos/tags/serverless/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/sftp/index.html b/content/videos/tags/sftp/index.html index c1ea639168fa8..f1aff3e02f327 100644 --- a/content/videos/tags/sftp/index.html +++ b/content/videos/tags/sftp/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/slowly-changing-dimension-type-2/index.html b/content/videos/tags/slowly-changing-dimension-type-2/index.html index 2dda75829f290..14c20c85309c7 100644 --- a/content/videos/tags/slowly-changing-dimension-type-2/index.html +++ b/content/videos/tags/slowly-changing-dimension-type-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/slowly-changing-dimensions-type-2/index.html b/content/videos/tags/slowly-changing-dimensions-type-2/index.html index ff58e0f8e58d1..4857142595a70 100644 --- a/content/videos/tags/slowly-changing-dimensions-type-2/index.html +++ b/content/videos/tags/slowly-changing-dimensions-type-2/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/small-files/index.html b/content/videos/tags/small-files/index.html index 5856d74f325b0..60edc96705af4 100644 --- a/content/videos/tags/small-files/index.html +++ b/content/videos/tags/small-files/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/snapshot-query/index.html b/content/videos/tags/snapshot-query/index.html index 4013b6f62d4b6..8e1034dfadfb8 100644 --- a/content/videos/tags/snapshot-query/index.html +++ b/content/videos/tags/snapshot-query/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/snowflake/index.html b/content/videos/tags/snowflake/index.html index d174fdf1dad6f..dad58a713e9f9 100644 --- a/content/videos/tags/snowflake/index.html +++ b/content/videos/tags/snowflake/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/soft-delete/index.html b/content/videos/tags/soft-delete/index.html index 429a67f6d8b73..d101d30863c6c 100644 --- a/content/videos/tags/soft-delete/index.html +++ b/content/videos/tags/soft-delete/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/sort-modes/index.html b/content/videos/tags/sort-modes/index.html index 4e62c9f48a7cd..b8d28664f287c 100644 --- a/content/videos/tags/sort-modes/index.html +++ b/content/videos/tags/sort-modes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/sorting/index.html b/content/videos/tags/sorting/index.html index 881c806141f00..4e7307d72e026 100644 --- a/content/videos/tags/sorting/index.html +++ b/content/videos/tags/sorting/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/spark-datasource-writer/index.html b/content/videos/tags/spark-datasource-writer/index.html index 1b5ba6516d0de..2dd466281f4d7 100644 --- a/content/videos/tags/spark-datasource-writer/index.html +++ b/content/videos/tags/spark-datasource-writer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/spark-sql/index.html b/content/videos/tags/spark-sql/index.html index 85b10301b2fb9..52693d83366f3 100644 --- a/content/videos/tags/spark-sql/index.html +++ b/content/videos/tags/spark-sql/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/speed/index.html b/content/videos/tags/speed/index.html index 97122fede278a..71ca8e04dc317 100644 --- a/content/videos/tags/speed/index.html +++ b/content/videos/tags/speed/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/sql-transformer/index.html b/content/videos/tags/sql-transformer/index.html index 058fc57eca6c7..b5fd57b3d564d 100644 --- a/content/videos/tags/sql-transformer/index.html +++ b/content/videos/tags/sql-transformer/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/star-schema/index.html b/content/videos/tags/star-schema/index.html index 49811af7bbffe..339112d1a759b 100644 --- a/content/videos/tags/star-schema/index.html +++ b/content/videos/tags/star-schema/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/starrocks/index.html b/content/videos/tags/starrocks/index.html index c8fb24ec31ad7..b5cc76a0c4265 100644 --- a/content/videos/tags/starrocks/index.html +++ b/content/videos/tags/starrocks/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/storage-cost/index.html b/content/videos/tags/storage-cost/index.html index bcae3dfed7265..727f9ccfeba87 100644 --- a/content/videos/tags/storage-cost/index.html +++ b/content/videos/tags/storage-cost/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/stored-procedures/index.html b/content/videos/tags/stored-procedures/index.html index 02afa05953178..79d401270fbff 100644 --- a/content/videos/tags/stored-procedures/index.html +++ b/content/videos/tags/stored-procedures/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/streaming-etl/index.html b/content/videos/tags/streaming-etl/index.html index 0b6a42fee3b56..c5b9ad6c32197 100644 --- a/content/videos/tags/streaming-etl/index.html +++ b/content/videos/tags/streaming-etl/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/streaming-ingestion/index.html b/content/videos/tags/streaming-ingestion/index.html index b4d4f91ce3a87..59db039734c70 100644 --- a/content/videos/tags/streaming-ingestion/index.html +++ b/content/videos/tags/streaming-ingestion/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/streaming/index.html b/content/videos/tags/streaming/index.html index fefd88564940a..c37531b9af377 100644 --- a/content/videos/tags/streaming/index.html +++ b/content/videos/tags/streaming/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/subnet/index.html b/content/videos/tags/subnet/index.html index ec5a8e7813316..956155e5e301e 100644 --- a/content/videos/tags/subnet/index.html +++ b/content/videos/tags/subnet/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/table-types/index.html b/content/videos/tags/table-types/index.html index 69bc1b5849fd7..0670247b444c4 100644 --- a/content/videos/tags/table-types/index.html +++ b/content/videos/tags/table-types/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/templated-architecture/index.html b/content/videos/tags/templated-architecture/index.html index e816470a8642d..a6fb3dbdc945f 100644 --- a/content/videos/tags/templated-architecture/index.html +++ b/content/videos/tags/templated-architecture/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/third-party-data/index.html b/content/videos/tags/third-party-data/index.html index e12d6573b3745..6a68d234e0954 100644 --- a/content/videos/tags/third-party-data/index.html +++ b/content/videos/tags/third-party-data/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/time-travel/index.html b/content/videos/tags/time-travel/index.html index 8c1c8f14be04c..6721132e12433 100644 --- a/content/videos/tags/time-travel/index.html +++ b/content/videos/tags/time-travel/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/transactional-data-lakes/index.html b/content/videos/tags/transactional-data-lakes/index.html index a1f0d50564993..dd0aec6b190b2 100644 --- a/content/videos/tags/transactional-data-lakes/index.html +++ b/content/videos/tags/transactional-data-lakes/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/transformers/index.html b/content/videos/tags/transformers/index.html index 4dde224f13215..4196ed305587e 100644 --- a/content/videos/tags/transformers/index.html +++ b/content/videos/tags/transformers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/triggers/index.html b/content/videos/tags/triggers/index.html index fbe33abe13102..6b0f03d0a1e77 100644 --- a/content/videos/tags/triggers/index.html +++ b/content/videos/tags/triggers/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/trino/index.html b/content/videos/tags/trino/index.html index 62504766d95cd..e4eadae02b603 100644 --- a/content/videos/tags/trino/index.html +++ b/content/videos/tags/trino/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/uniqueness/index.html b/content/videos/tags/uniqueness/index.html index ebbdac6001c50..b1f56f241a812 100644 --- a/content/videos/tags/uniqueness/index.html +++ b/content/videos/tags/uniqueness/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/universal-lakehouse/index.html b/content/videos/tags/universal-lakehouse/index.html index 700d6748e161d..7f9eba8a29b1d 100644 --- a/content/videos/tags/universal-lakehouse/index.html +++ b/content/videos/tags/universal-lakehouse/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/update/index.html b/content/videos/tags/update/index.html index e25acb41e934f..175c45ea03991 100644 --- a/content/videos/tags/update/index.html +++ b/content/videos/tags/update/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/updates/index.html b/content/videos/tags/updates/index.html index 71741a5a92dfb..2cd97e78371c0 100644 --- a/content/videos/tags/updates/index.html +++ b/content/videos/tags/updates/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/upsert/index.html b/content/videos/tags/upsert/index.html index 6d1c00909b945..eb82f1af0e5b8 100644 --- a/content/videos/tags/upsert/index.html +++ b/content/videos/tags/upsert/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/use-case/index.html b/content/videos/tags/use-case/index.html index 53c9b822f8862..24e92f04b24e0 100644 --- a/content/videos/tags/use-case/index.html +++ b/content/videos/tags/use-case/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/validation/index.html b/content/videos/tags/validation/index.html index 174fe6794dedb..d6c76d4d032d7 100644 --- a/content/videos/tags/validation/index.html +++ b/content/videos/tags/validation/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/vpc/index.html b/content/videos/tags/vpc/index.html index 9821a8a5d12ca..13698af3d4f3b 100644 --- a/content/videos/tags/vpc/index.html +++ b/content/videos/tags/vpc/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/windows-10/index.html b/content/videos/tags/windows-10/index.html index 4c27848ef3a6e..1ddb3112ab36e 100644 --- a/content/videos/tags/windows-10/index.html +++ b/content/videos/tags/windows-10/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/workshop/index.html b/content/videos/tags/workshop/index.html index 26b0c2e8ab5ec..d23c70b529997 100644 --- a/content/videos/tags/workshop/index.html +++ b/content/videos/tags/workshop/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/write-operations/index.html b/content/videos/tags/write-operations/index.html index cbf76cf28a80a..4d6121467b1d1 100644 --- a/content/videos/tags/write-operations/index.html +++ b/content/videos/tags/write-operations/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/xml/index.html b/content/videos/tags/xml/index.html index 06d8ba8026276..e8fcd3e4fdf15 100644 --- a/content/videos/tags/xml/index.html +++ b/content/videos/tags/xml/index.html @@ -19,7 +19,7 @@ - + diff --git a/content/videos/tags/yugabyte/index.html b/content/videos/tags/yugabyte/index.html index c18234c0eefa1..1db6d751140f5 100644 --- a/content/videos/tags/yugabyte/index.html +++ b/content/videos/tags/yugabyte/index.html @@ -19,7 +19,7 @@ - +