华为云用户手册

  • 操作步骤 设置JDBCServer的公平调度策略。 Spark默认使用FIFO(First In First Out)的调度策略,但对于多并发的场景,使用FIFO策略容易导致短任务执行失败。因此在多并发的场景下,需要使用公平调度策略,防止任务执行失败。 在Spark中设置公平调度,具体请参考http://spark.apache.org/docs/3.1.1/job-scheduling.html#scheduling-within-an-application。 在JDBC客户端中设置公平调度。 在BeeLine命令行客户端或者JDBC自定义代码中,执行以下语句, 其中PoolName是公平调度的某一个调度池。 SET spark.sql.thriftserver.scheduler.pool=PoolName; 执行相应的SQL命令,Spark任务将会在上面的调度池中运行。 设置BroadCastHashJoin的超时时间。 BroadCastHashJoin有超时参数,一旦超过预设的时间,该查询任务直接失败,在多并发场景下,由于计算任务抢占资源,可能会导致BroadCastHashJoin的Spark任务无法执行,导致超时出现。因此需要在JDBCServer的“spark-defaults.conf”配置文件中调整超时时间。 表1 参数描述 参数 描述 默认值 spark.sql.broadcastTimeout BroadcastHashJoin中广播表的超时时间,当任务并发数较高的时候,可以调高该参数值。 -1(数值类型,实际为五分钟)
  • 操作步骤 Spark程序运行时,在shuffle和RDD Cache等过程中,会有大量的数据需要序列化,默认使用JavaSerializer,通过配置让KryoSerializer作为数据序列化器来提升序列化性能。 在开发应用程序时,添加如下代码来使用KryoSerializer作为数据序列化器。 实现类注册器并手动注册类。 package com.etl.common; import com.esotericsoftware.kryo.Kryo; import org.apache.spark.serializer.KryoRegistrator; public class DemoRegistrator implements KryoRegistrator { @Override public void registerClasses(Kryo kryo) { //以下为示例类,请注册自定义的类 kryo.register(AggrateKey.class); kryo.register(AggrateValue.class); } } 您可以在Spark客户端对spark.kryo.registrationRequired参数进行配置,设置是否需要Kryo注册序列化。 当参数设置为true时,如果工程中存在未被序列化的类,则会发生异常。如果设置为false(默认值),Kryo会自动将未注册的类名写到对应的对象中。此操作会对系统性能造成影响。设置为true时,用户需手动注册类,针对未序列化的类,系统不会自动写入类名,而是发生异常,相对比false,其性能较好。 配置KryoSerializer作为数据序列化器和类注册器。 val conf = new SparkConf() conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") .set("spark.kryo.registrator", "com.etl.common.DemoRegistrator")
  • 操作场景 Spark支持两种方式的序列化 : Java原生序列化JavaSerializer Kryo序列化KryoSerializer 序列化对于Spark应用的性能来说,具有很大的影响。在特定的数据格式的情况下,KryoSerializer的性能可以达到JavaSerializer的10倍以上,而对于一些Int之类的基本类型数据,性能的提升就几乎可以忽略。 KryoSerializer依赖Twitter的Chill库来实现,相对于JavaSerializer,主要的问题在于不是所有的Java Serializable对象都能支持,兼容性不好,所以需要手动注册类。 序列化功能用在两个地方:序列化任务和序列化数据。Spark任务序列化只支持JavaSerializer,数据序列化支持JavaSerializer和KryoSerializer。
  • 注意事项 以下是可以在加载数据时使用的配置选项: DELIMITER:可以在加载命令中提供分隔符和引号字符。默认值为,。 OPTIONS('DELIMITER'=',' , 'QUOTECHAR'='"') 可使用'DELIMITER'='\t'来表示用制表符tab对CSV数据进行分隔。 OPTIONS('DELIMITER'='\t') CarbonData也支持\001和\017作为分隔符。 对于CSV数据,分隔符为单引号(')时,单引号必须在双引号(" ")内。例如:'DELIMITER'= "'"。 QUOTECHAR:可以在加载命令中提供分隔符和引号字符。默认值为"。 OPTIONS('DELIMITER'=',' , 'QUOTECHAR'='"') COMMENTCHAR:可以在加载命令中提供注释字符。在加载操作期间,如果在行的开头遇到注释字符,那么该行将被视为注释,并且不会被加载。默认值为#。 OPTIONS('COMMENTCHAR'='#') FILEHEADER:如果源文件中没有表头,可在LOAD DATA命令中提供表头。 OPTIONS('FILEHEADER'='column1,column2') ESCAPECHAR:如果用户想在CSV上对Escape字符进行严格验证,可以提供Escape字符。默认值为\。 OPTIONS('ESCAPECHAR'='\') 如果在CSV数据中输入ESCAPECHAR,该ESCAPECHAR必须在双引号(" ")内。例如:"a\b"。 Bad Records处理: 为了使数据处理应用程序为用户增值,不可避免地需要对数据进行某种程度的集成。在大多数情况下,数据质量问题源于生成源数据的上游(主要)系统。 有两种完全不同的方式处理Bad Data: 按照原始数据加载所有数据,之后进行除错处理。 在进入数据源的过程中,可以清理或擦除Bad Data,或者在发现Bad Data时让数据加载失败。 有多个选项可用于在CarbonData数据加载过程中清除源数据。对于CarbonData数据中的Bad Records管理,请参见表2。 表2 Bad Records Logger 配置项 默认值 描述 BAD_RECORDS_LOGGER_ENABLE false 如果设置为true,则将创建Bad Records日志文件,其中包含Bad Records的详细信息。 BAD_RECORDS_ACTION FAIL 以下为Bad Records的四种操作类型: FORCE:通过将Bad Records存储为NULL来自动校正数据。 REDIRECT:无法加载Bad Records,并将其写入BAD_RECORD_PATH下的CSV文件中,默认不开启该类型,如需使用该类型,需要设置参数carbon.enable.badrecord.action.redirect为true。 IGNORE:既不加载Bad Records也不将其写入CSV文件。 FAIL:如果发现存在Bad Records,数据加载将会失败。 说明: 在加载数据时,如果所有记录都是Bad Records,则参数BAD_RECORDS_ACTION将不起作用,加载数据操作将会失败。 IS_EMPTY_DATA_BAD_RECORD false 如果设置为“false”,则空(""或''或,,)数据将不被视为Bad Records,如果设置为“true”,则空数据将被视为Bad Records。 BAD_RECORD_PATH - 指定存储Bad Records的HDFS路径。默认值为Null。 如果启用了Bad Records日志记录或者Bad Records操作重定向,则该路径必须由用户进行配置。 示例: LOAD DATA INPATH 'filepath.csv' INTO TABLE tablename OPTIONS('BAD_RECORDS_LOGGER_ENABLE'='true', 'BAD_RECORD_PATH'='hdfs://hacluster/tmp/carbon', 'BAD_RECORDS_ACTION'='REDIRECT', 'IS_EMPTY_DATA_BAD_RECORD'='false'); 使用“REDIRECT”选项,CarbonData会将所有的Bad Records添加到单独的CSV文件中,但是该文件内容不能用于后续的数据加载,因为其内容可能无法与源记录完全匹配。用户必须清理原始源记录以便于进一步的数据提取。该选项的目的只是让用户知道哪些记录被视为Bad Records。 MAXCOLUMNS:该可选参数指定了在一行中,由CSV解析器解析的最大列数。 OPTIONS('MAXCOLUMNS'='400') 表3 MAXCOLUMNS 可选参数名称 默认值 最大值 MAXCOLUMNS 2000 20000 表4 MAXCOLUMNS可选参数的行为图 MAXCOLUMNS值 在文件Header选项中的列数 考虑的最终值 在加载项中未指定 5 2000 在加载项中未指定 6000 6000 40 7 文件header列数与MAXCOLUMNS值,两者中的最大值 22000 40 20000 60 在加载项中未指定 CSV文件第一行的列数与MAXCOLUMNS值,两者中的最大值 对于设置MAXCOLUMNS Option的最大值,要求executor具有足够的内存,否则,数据加载会由于内存不足的错误而失败。
  • 示例 data.csv源文件数据如下所示: ID,date,country,name,phonetype,serialname,salary 4,2014-01-21 00:00:00,xxx,aaa4,phone2435,ASD66902,15003 5,2014-01-22 00:00:00,xxx,aaa5,phone2441,ASD90633,15004 6,2014-03-07 00:00:00,xxx,aaa6,phone294,ASD59961,15005 CREATE TABLE carbontable(ID int, date Timestamp, country String, name String, phonetype String, serialname String,salary int) STORED AS carbondata; LOAD DATA inpath 'hdfs://hacluster/tmp/data.csv' INTO table carbontable options('DELIMITER'=',');
  • 操作步骤 要使用CBO优化,可以按照以下步骤进行优化。 需要先执行特定的SQL语句来收集所需的表和列的统计信息。 SQL命令如下(根据具体情况选择需要执行的SQL命令): 生成表级别统计信息(扫表): ANALYZE TABLE src COMPUTE STATISTICS 生成sizeInBytes和rowCount。 使用ANALYZE语句收集统计信息时,无法计算非HDFS数据源的表的文件大小。 生成表级别统计信息(不扫表): ANALYZE TABLE src COMPUTE STATISTICS NOSCAN 只生成sizeInBytes,如果原来已经生成过sizeInBytes和rowCount,而本次生成的sizeInBytes和原来的大小一样,则保留rowCount(如果存在),否则清除rowCount。 生成列级别统计信息 ANALYZE TABLE src COMPUTE STATISTICS FOR COLUMNS a, b, c 生成列统计信息,为保证一致性,会同步更新表统计信息。目前不支持复杂数据类型(如Seq, Map等)和HiveStringType的统计信息生成。 显示统计信息 DESC FORMATTED src 在Statistics中会显示“xxx bytes, xxx rows”分别表示表级别的统计信息。也可以通过如下命令显示列统计信息: DESC FORMATTED src a 使用限制:当前统计信息收集不支持针对分区表的分区级别的统计信息。 在Spark客户端的“spark-defaults.conf”配置文件中进行表1设置。 表1 参数介绍 参数 描述 默认值 spark.sql.cbo.enabled CBO总开关。 true表示打开, false表示关闭。 要使用该功能,需确保相关表和列的统计信息已经生成。 false spark.sql.cbo.joinReorder.enabled 使用CBO来自动调整连续的inner join的顺序。 true:表示打开 false:表示关闭 要使用该功能,需确保相关表和列的统计信息已经生成,且CBO总开关打开。 false spark.sql.cbo.joinReorder.dp.threshold 使用CBO来自动调整连续inner join的表的个数阈值。 如果超出该阈值,则不会调整join顺序。 12
  • Hudi表类型 Copy On Write 写时复制表也简称cow表,使用parquet文件存储数据,内部的更新操作需要通过重写原始parquet文件完成。 优点:读取时,只读取对应分区的一个数据文件即可,较为高效。 缺点:数据写入的时候,需要复制一个先前的副本再在其基础上生成新的数据文件,这个过程比较耗时。且由于耗时,读请求读取到的数据相对就会滞后。 Merge On Read 读时合并表也简称mor表,使用列格式parquet和行格式Avro两种方式混合存储数据。其中parquet格式文件用于存储基础数据,Avro格式文件(也可叫做log文件)用于存储增量数据。 优点:由于写入数据先写delta log,且delta log较小,所以写入成本较低。 缺点:需要定期合并整理compact,否则碎片文件较多。读取性能较差,因为需要将delta log和老数据文件合并。
  • 示例 ALTER TABLE ProductDatabase COMPACT 'MINOR'; ALTER TABLE ProductDatabase COMPACT 'MAJOR'; ALTER TABLE ProductDatabase COMPACT 'SEGMENT_INDEX'; ALTER TABLE ProductDatabase COMPACT 'CUSTOM' WHERE SEGMENT.ID IN (0, 1);
  • 系统响应 由于为后台运行,ALTER TABLE COMPACTION命令不会显示压缩响应。 如果想要查看MINOR合并和MAJOR合并的响应结果,用户可以检查日志或运行SHOW SEGMENTS命令查看。 示例: +------+------------+--------------------------+------------------+------------+------------+-------------+--------------+--+ | ID | Status | Load Start Time | Load Time Taken | Partition | Data Size | Index Size | File Format | +------+------------+--------------------------+------------------+------------+------------+-------------+--------------+--+ | 3 | Success | 2020-09-28 22:53:26.336 | 3.726S | {} | 6.47KB | 3.30KB | columnar_v3 | | 2 | Success | 2020-09-28 22:53:01.702 | 6.688S | {} | 6.47KB | 3.30KB | columnar_v3 | | 1 | Compacted | 2020-09-28 22:51:15.242 | 5.82S | {} | 6.50KB | 3.43KB | columnar_v3 | | 0.1 | Success | 2020-10-30 20:49:24.561 | 16.66S | {} | 12.87KB | 6.91KB | columnar_v3 | | 0 | Compacted | 2020-09-28 22:51:02.6 | 6.819S | {} | 6.50KB | 3.43KB | columnar_v3 | +------+------------+--------------------------+------------------+------------+------------+-------------+--------------+--+ 其中, Compacted表示该数据已被合并。 0.1表示segment0与segment1合并之后的结果。 数据合并前后的其他操作没有差别。 被合并的segments(例如segment0和segment1)即成为无用的segments,会占用空间,因此建议合并之后使用CLEAN FILES命令进行彻底删除,再进行其他操作。CLEAN FILES命令的使用方法可参考CLEAN FILES。
  • 参数描述 表1 ALTER TABLE COMPACTION参数描述 Parameter Description db_name 数据库名。如果未指定,则选择当前数据库。 table_name 表名。 MINOR Minor合并,详见合并Segments。 MAJOR Major合并,详见合并Segments。 SEGMENT_INDEX 这会将一个segment内的所有Carbon索引文件(.carbonindex)合并为一个Carbon索引合并文件(.carbonindexmerge)。 这增强了首次查询性能。详见表1。 CUSTOM Custom合并,详见合并Segments。
  • 注意事项 Hudi当前不支持使用char、varchar、tinyint、smallint类型,建议使用string或int类型。 Hudi当前只有int、bigint、float、double、decimal、string、date、timestamp、boolean、binary类型支持设置默认值。 Hudi表必须指定primaryKey与preCombineField。 在指定路径下创建表时,如果路径下已存在Hudi表,则建表时不需要指定列。
  • 参数描述 表1 CREATE TABLE参数描述 参数 描述 database_name Database名称,由字母、数字和下划线(_)组成。 table_name Database中的表名,由字母、数字和下划线(_)组成。 columnTypeList 以逗号分隔的带数据类型的列表。列名由字母、数字和下划线(_)组成。 using 参数hudi,定义和创建Hudi table。 table_comment 表的描述信息。 location_path HDFS路径,指定该路径Hudi 表会创建为外表。 options_list Hudi table属性列表。
  • 示例 创建非分区表 create table if not exists hudi_table0 ( id int, name string, price double ) using hudi options ( type = 'cow', primaryKey = 'id', preCombineField = 'price' ); 创建分区表 create table if not exists hudi_table_p0 ( id bigint, name string, ts bigint, dt string, hh string ) using hudi options ( type = 'cow', primaryKey = 'id', preCombineField = 'ts' ) partitioned by (dt, hh); 在指定路径下创建表 create table if not exists h3( id bigint, name string, price double ) using hudi options ( primaryKey = 'id', preCombineField = 'price' ) location '/path/to/hudi/h3';
  • 回答 当源表或子查询具有大数据量的Partition时,创建Hive表失败。执行查询需要很多的task,此时输出的文件数就会很多,从而导致driver OOM。 可以在创建Hive表的语句中增加distribute by子句来解决这个问题,其中distribute by的字段要选取合适的cardinality(即distinct值的个数)。 distribute by子句限制了Hive表的Partition数量。增加distribute by 子句后,最终的输出文件数取决于指定列的cardinality和“spark.sql.shuffle.partitions”参数值。但如果distribute by的字段的cardinality值很小,例如,“spark.sql.shuffle.partitions”参数值为200,但distribute by字段的cardinality只有100,则输出的200个文件中,只有其中100个文件有数据,剩下的100个文件为空文件。也就是说,如果选取的字段的cardinality过低,如1,则会造成严重的数据倾斜,从而严重影响查询性能。 因此,建议选取的distribute by字段的cardinality个数要大于“spark.sql.shuffle.partitions”参数,可大于2~3倍。 示例: create table hivetable1 as select * from sourcetable1 distribute by col_age;
  • 将Hudi表数据同步到Hive 通过执行run_hive_sync_tool.sh可以将Hudi表数据同步到Hive中。 例如:需要将HDFS上目录为hdfs://hacluster/tmp/huditest/hudimor1_deltastreamer_partition的Hudi表同步为Hive表,表名为table hive_sync_test3,使用unite、country和state为分区键,命令示例如下: run_hive_sync_tool.sh --partitioned-by unite,country,state --base-path hdfs://hacluster/tmp/huditest/hudimor1_deltastreamer_partition --table hive_sync_test3 --partition-value-extractor org.apache.hudi.hive.MultiPartKeysValueExtractor --support-timestamp 表1 参数说明 命令 描述 必填 默认值 --database Hive database名称 N default --table Hive表名 Y - --base-file-format 文件格式 (PARQUET或HFILE) N PARQUET --user Hive用户名 N - --pass Hive密码 N - --jdbc-url Hive jdbc connect url N - --base-path 待同步的Hudi表存储路径 Y - --partitioned-by 分区键- N - --partition-value-extractor 分区类,需实现PartitionValueExtractor ,可以从HDFS路径中提取分区值 N SlashEncodedDayPartitionValueExtractor --assume-date-partitioning 以 yyyy/mm/dd进行分区从而支持向后兼容。 N false --use-pre-apache-input-format 使用com.uber.hoodie包下的InputFormat替换 org.apache.hudi包下的。除了从com.uber.hoodie迁移项目至org.apache.hudi外请勿使用。 N false --use-jdbc 使用Hive jdbc连接 N true --auto-create-database 自动创建Hive database N true --skip-ro-suffix 注册时跳过读取_ro后缀的读优化视图 N false --use-file-listing-from-metadata 从Hudi的元数据中获取文件列表 N false --verify-metadata-file-listing 根据文件系统验证Hudi元数据中的文件列表 N false --help、-h 查看帮助 N false --support-timestamp 将原始类型中'INT64'的TIMESTAMP_MICROS转换为Hive的timestamp N false --decode-partition 如果分区在写入过程中已编码,则解码分区值 N false --batch-sync-num 指定每批次同步hive的分区数 N 1000 Hive Sync时会判断表不存在时建外表并添加分区,表存在时对比表的schema是否存在差异,存在则替换,对比分区是否有新增,有则添加分区。 因此使用hive sync时有以下约束: 写入数据Schema只允许增加字段,不允许修改、删除字段。 分区目录只能新增,不会删除。 Overwrite覆写Hudi表不支持同步覆盖Hive表。 Hudi同步Hive表时,不支持使用timestamp类型作为分区列。 父主题: Hudi写操作
  • 命令格式 set hoodie.archive.file.cleaner.policy = KEEP_ARCHIVED_FILES_BY_SIZE; set hoodie.archive.file.cleaner.size.retained = 5368709120; run cleanarchive on tableIdentifier/tablelocation; set hoodie.archive.file.cleaner.policy = KEEP_ARCHIVED_FILES_BY_DAYS; set hoodie.archive.file.cleaner.days.retained = 30; run cleanarchive on tableIdentifier/tablelocation;
  • 参数描述 表1 参数描述 参数 描述 tableIdentifier Hudi表的名称。 tablelocation Hudi表的存储路径。 hoodie.archive.file.cleaner.policy 清理归档文件的策略:目前仅支持KEEP_ARCHIVED_FILES_BY_SIZE和KEEP_ARCHIVED_FILES_BY_DAYS两种策略,默认策略为KEEP_ARCHIVED_FILES_BY_DAYS。 KEEP_ARCHIVED_FILES_BY_SIZE策略可以设置归档文件占用的存储空间大小 KEEP_ARCHIVED_FILES_BY_DAYS策略可以清理超过某个时间点之外的归档文件 hoodie.archive.file.cleaner.size.retained 当清理策略为KEEP_ARCHIVED_FILES_BY_SIZE时,该参数可以设置保留多少字节大小的归档文件,默认值5368709120字节(5G)。 hoodie.archive.file.cleaner.days.retained 当清理策略为KEEP_ARCHIVED_FILES_BY_DAYS时,该参数可以设置保留多少天以内的归档文件,默认值30(天)。
  • 系统响应 +-----+----------+--------------------------+------------------+------------+------------+-------------+--------------+--+ | ID | Status | Load Start Time | Load Time Taken | Partition | Data Size | Index Size | File Format | +-----+----------+--------------------------+------------------+------------+------------+-------------+--------------+--+ | 3 | Success | 2020-09-28 22:53:26.336 | 3.726S | {} | 6.47KB | 3.30KB | columnar_v3 | | 2 | Success | 2020-09-28 22:53:01.702 | 6.688S | {} | 6.47KB | 3.30KB | columnar_v3 | +-----+----------+--------------------------+------------------+------------+------------+-------------+--------------+--+
  • 示例 create table carbon01(a int,b string,c string) stored as carbondata; insert into table carbon01 select 1,'a','aa'; insert into table carbon01 select 2,'b','bb'; insert into table carbon01 select 3,'c','cc'; SHOW SEGMENTS FOR TABLE carbon01 LIMIT 2;
  • 操作场景 将datasource表的分区消息存储到Metastore中,并在Metastore中对分区消息进行处理。 优化datasource表,支持对表中分区执行增加、删除和修改等语法,从而增加与Hive的兼容性。 支持在查询语句中,把分区裁剪并下压到Metastore上,从而过滤掉不匹配的分区。 示例如下: select count(*) from table where partCol=1; //partCol列为分区列 此时,在物理计划中执行TableScan操作时,只处理分区(partCol=1)对应的数据。
  • 操作步骤 要启动Datasource表优化,在Spark客户端的“spark-defaults.conf”配置文件中进行设置。 表1 参数介绍 参数 描述 默认值 spark.sql.hive.manageFilesourcePartitions 是否启用Metastore分区管理(包括数据源表和转换的Hive表)。 true:启用Metastore分区管理,即数据源表存储分区在Hive中,并在查询语句中使用Metastore修剪分区。 false:不启用Metastore分区管理。 true spark.sql.hive.metastorePartitionPruning 是否支持将predicate下压到Hive Metastore中。 true:支持,目前仅支持Hive表的predicate下压。 false:不支持 true spark.sql.hive.filesourcePartitionFileCacheSize 启用内存中分区文件元数据的缓存大小。 所有表共享一个可以使用指定的num字节进行文件元数据的缓存。 只有当“spark.sql.hive.manageFilesourcePartitions”配置为“true”时,该配置项才会生效。 250 * 1024 * 1024 spark.sql.hive.convertMetastoreOrc 设置ORC表的处理方式: false:Spark SQL使用Hive SerDe处理ORC表。 true:Spark SQL使用Spark内置的机制处理ORC表。 true
  • 参数描述 表1 CREATE TABLE As SELECT参数描述 参数 描述 database_name Database名称,由字母、数字和下划线(_)组成。 table_name Database中的表名,由字母、数字和下划线(_)组成。 using 参数hudi,定义和创建Hudi table。 table_comment 表的描述信息。 location_path HDFS路径,指定该路径Hudi表会创建为外表。 options_list Hudi table属性列表。 query_statement select查询表达式
  • 示例 创建分区表 create table h2 using hudi options (type = 'cow', primaryKey = 'id') partitioned by (dt) as select 1 as id, 'a1' as name, 10 as price, 1000 as dt; 创建非分区表 create table h3 using hudi as select 1 as id, 'a1' as name, 10 as price; 从parquet表加载数据到hudi表 # 创建parquet表 create table parquet_mngd using parquet options(path=’hdfs:///tmp/parquet_dataset/*.parquet’); # CTAS创建hudi表 create table hudi_tbl using hudi location 'hdfs:///tmp/hudi/hudi_tbl/' options ( type = 'cow', primaryKey = 'id', preCombineField = 'ts' ) partitioned by (datestr) as select * from parquet_mngd;
  • DDL与DML并发 表2 支持的DDL与DML并发操作 DDL操作 insert into update delete set/reset add Y Y Y Y rename N N Y N change type N N Y N change comment Y Y Y Y drop N N Y N 执行不支持的DDL与DML并发操作时会发生异常“cannot evolution schema implicitly, actions such as rename, delete, and type change were found”。
  • DDL并发 表1 支持的DDL并发操作 DDL操作 add rename change type change comment drop add Y Y Y Y Y rename Y Y Y Y Y change type Y Y Y Y Y change comment Y Y Y Y Y drop Y Y Y Y N 对同一列并发执行DDL操作需要注意以下两点: 不能对同一列并发执行drop,否则只能成功执行第一个drop随后发生异常“java.lang.UnsupportedOperationException: cannot evolution schema implicitly, the column for which the update operation is performed does not exist.”。 drop与rename、change type和change comment并发执行时,drop必须是最后执行,否则只能执行drop以及drop之前的命令,执行drop之后的命令会发生异常“java.lang.UnsupportedOperationException: cannot evolution schema implicitly, the column for which the update operation is performed does not exist.”。
  • 约束 支持在Hudi客户端执行Spark SQL操作Hudi。 支持在Spark2x的JDBCServer中执行Spark SQL操作Hudi。 不支持在Spark2x的客户端执行Spark SQL操作Hudi,支持在Spark3.1.1及之后版本的客户端执行Spark SQL操作Hudi。 不支持在Hive、Hetu引擎中写hudi表,以及修改hudi表结构,仅支持读。 由于SQL的KeyGenerator默认是org.apache.hudi.keygen.ComplexKeyGenerator,要求DataSource方式写入时KeyGenerator与SQL设置的一致。
  • 注意事项 仅在没有数据丢失的情况下支持将Decimal数据类型从较低精度更改为较高精度 例如: 无效场景:将Decimal数据精度从(10,2)更改为(10,5)无效,因为在这种情况下,只有scale增加,但总位数保持不变。 有效场景:将Decimal数据精度从(10,2)更改为(12,3)有效,因为总位数增加2,但是scale仅增加1,这不会导致任何数据丢失。 将Decimal数据类型从较低精度更改为较高精度,其允许的最大精度(precision, scale)范围为(38,38),并且只适用于不会导致数据丢失的有效提升精度的场景。
  • 日志级别 CDL提供了如表2所示的日志级别。 运行日志的级别优先级从高到低分别是FATAL、ERROR、WARN、INFO、DEBUG,程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。 表2 日志级别 日志类型 级别 描述 运行日志&审计日志 FATAL fatal表示系统的致命错误 ERROR error表示系统运行的错误信息。 WARN warning表示当前事件处理存在异常信息。 INFO information表示记录系统及各事件正常运行状态信息。 DEBUG debug表示记录系统及系统的调试信息。 如果您需要修改日志级别,请执行如下操作: 请参考修改集群服务配置参数,进入CDL的“全部配置”页面。 左边菜单栏中选择所需修改的角色所对应的日志菜单。 选择所需修改的日志级别。 保存配置,在弹出窗口中单击“确定”使配置生效。 配置完成后立即生效,不需要重启服务。
  • 回答 不可以,会抛HoodieKeyException异常。 Caused by: org.apache.hudi.exception.HoodieKeyException: recordKey value: "null" for field: "name" cannot be null or empty. at org.apache.hudi.keygen.SimpleKeyGenerator.getKey(SimpleKeyGenerator.java:58) at org.apache.hudi.HoodieSparkSqlWriter$$anonfun$1.apply(HoodieSparkSqlWriter.scala:104) at org.apache.hudi.HoodieSparkSqlWriter$$anonfun$1.apply(HoodieSparkSqlWriter.scala:100)
  • 示例 示例1: delete from h0 where column1 = 'country'; 示例2: delete from h0 where column1 IN ('country1', 'country2'); 示例3: delete from h0 where column1 IN (select column11 from sourceTable2); 示例4: delete from h0 where column1 IN (select column11 from sourceTable2 where column1 = 'xxx'); 示例5: delete from h0;
共100000条