You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hudi.apache.org by "lizhiqiang (Jira)" <ji...@apache.org> on 2023/04/13 03:25:00 UTC

[jira] [Resolved] (HUDI-6069) If the primary key is a non-string type, and metastore table is used for filtering, taking minValue to forcibly convert to String will error

     [ https://issues.apache.org/jira/browse/HUDI-6069?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

lizhiqiang resolved HUDI-6069.
------------------------------

> If the primary key is a non-string type, and metastore table is used for filtering, taking minValue to forcibly convert to String will error
> --------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: HUDI-6069
>                 URL: https://issues.apache.org/jira/browse/HUDI-6069
>             Project: Apache Hudi
>          Issue Type: Bug
>          Components: cli
>            Reporter: lizhiqiang
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 0.14.0
>
>   Original Estimate: 0.5h
>  Remaining Estimate: 0.5h
>
>  
> If the primary key is a non-string type, and metastore table is used for filtering, taking minValue to forcibly convert to String will error
> eg: 
> select monotonically_increasing_id() as id
> Type of primary key is bigint .
>  
> {code:java}
> CREATE TABLE tpcds_hudi_100.store_sales_wujuan_cowUSING huditblproperties 
> (
> type= 'cow',
> primaryKey = 'id',
> preCombineField = 'ts',
> hoodie.parquet.compression.codec='snappy',
> hoodie.upsert.shuffle.parallelism = 8,
> hoodie.index.type='BLOOM',
> hoodie.bloom.index.use.metadata=true,
> hoodie.metadata.enable=true,
> hoodie.metadata.index.bloom.filter.enable=true,
> hoodie.metadata.index.bloom.filter.column.list='id',
> hoodie.metadata.index.column.stats.enable=true,
> hoodie.metadata.index.column.stats.column.list='id',
> hoodie.enable.data.skipping=true,
> hoodie.table.metadata.partitions='bloom_filters,column_stats,files'
> ) 
> as select monotonically_increasing_id() as id,ss_sold_time_sk,ss_item_sk ,ss_customer_sk ,ss_cdemo_sk ,ss_hdemo_sk ,ss_addr_sk ,ss_store_sk ,ss_promo_sk ,ss_ticket_number ,ss_quantity ,ss_wholesale_cost ,ss_list_price ,ss_sales_price ,ss_ext_discount_amt ,ss_ext_sales_price ,ss_ext_wholesale_cost ,ss_ext_list_price ,ss_ext_tax,ss_coupon_amt,ss_net_paid,ss_net_paid_inc_tax,1 as ts,ss_sold_date_sk from tpcds_hudi_100.store_sales; 
> update tpcds_hudi_100.store_sales_wujuan_cow set ts = '4' where id = '523986010123';{code}
> {code:java}
> org.apache.hudi.exception.HoodieUpsertException: Failed to upsert for commit time 20230413105918074
>         at org.apache.hudi.table.action.commit.BaseWriteHelper.write(BaseWriteHelper.java:75)
>         at org.apache.hudi.table.action.deltacommit.SparkUpsertDeltaCommitActionExecutor.execute(SparkUpsertDeltaCommitActionExecutor.java:45)
>         at org.apache.hudi.table.HoodieSparkMergeOnReadTable.upsert(HoodieSparkMergeOnReadTable.java:88)
>         at org.apache.hudi.table.HoodieSparkMergeOnReadTable.upsert(HoodieSparkMergeOnReadTable.java:80)
>         at org.apache.hudi.client.SparkRDDWriteClient.upsert(SparkRDDWriteClient.java:141)
>         at org.apache.hudi.DataSourceUtils.doWriteOperation(DataSourceUtils.java:207)
>         at org.apache.hudi.HoodieSparkSqlWriter$.write(HoodieSparkSqlWriter.scala:370)
>         at org.apache.hudi.DefaultSource.createRelation(DefaultSource.scala:150)
>         at org.apache.spark.sql.execution.datasources.SaveIntoDataSourceCommand.run(SaveIntoDataSourceCommand.scala:47)
>         at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult$lzycompute(commands.scala:75)
>         at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult(commands.scala:73)
>         at org.apache.spark.sql.execution.command.ExecutedCommandExec.executeCollect(commands.scala:84)
>         at org.apache.spark.sql.execution.QueryExecution$$anonfun$eagerlyExecuteCommands$1.$anonfun$applyOrElse$1(QueryExecution.scala:98)
>         at org.apache.spark.sql.execution.SQLExecution$.$anonfun$withNewExecutionId$6(SQLExecution.scala:109)
>         at org.apache.spark.sql.execution.SQLExecution$.withSQLConfPropagated(SQLExecution.scala:169)
>         at org.apache.spark.sql.execution.SQLExecution$.$anonfun$withNewExecutionId$1(SQLExecution.scala:95)
>         at org.apache.spark.sql.SparkSession.withActive(SparkSession.scala:779)
>         at org.apache.spark.sql.execution.SQLExecution$.withNewExecutionId(SQLExecution.scala:64)
>         at org.apache.spark.sql.execution.QueryExecution$$anonfun$eagerlyExecuteCommands$1.applyOrElse(QueryExecution.scala:98)
>         at org.apache.spark.sql.execution.QueryExecution$$anonfun$eagerlyExecuteCommands$1.applyOrElse(QueryExecution.scala:94)
>         at org.apache.spark.sql.catalyst.trees.TreeNode.$anonfun$transformDownWithPruning$1(TreeNode.scala:584)
>         at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:176)
>         at org.apache.spark.sql.catalyst.trees.TreeNode.transformDownWithPruning(TreeNode.scala:584)
>         at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.org$apache$spark$sql$catalyst$plans$logical$AnalysisHelper$$super$transformDownWithPruning(LogicalPlan.scala:30)
>         at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper.transformDownWithPruning(AnalysisHelper.scala:267)
>         at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper.transformDownWithPruning$(AnalysisHelper.scala:263)
>         at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.transformDownWithPruning(LogicalPlan.scala:30)
>         at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.transformDownWithPruning(LogicalPlan.scala:30)
>         at org.apache.spark.sql.catalyst.trees.TreeNode.transformDown(TreeNode.scala:560)
>         at org.apache.spark.sql.execution.QueryExecution.eagerlyExecuteCommands(QueryExecution.scala:94)
>         at org.apache.spark.sql.execution.QueryExecution.commandExecuted$lzycompute(QueryExecution.scala:81)
>         at org.apache.spark.sql.execution.QueryExecution.commandExecuted(QueryExecution.scala:79)
>         at org.apache.spark.sql.execution.QueryExecution.assertCommandExecuted(QueryExecution.scala:116)
>         at org.apache.spark.sql.DataFrameWriter.runCommand(DataFrameWriter.scala:860)
>         at org.apache.spark.sql.DataFrameWriter.saveToV1Source(DataFrameWriter.scala:390)
>         at org.apache.spark.sql.DataFrameWriter.saveInternal(DataFrameWriter.scala:363)
>         at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:247)
>         at org.apache.spark.sql.hudi.command.UpdateHoodieTableCommand.run(UpdateHoodieTableCommand.scala:64)
>         at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult$lzycompute(commands.scala:75)
>         at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult(commands.scala:73)
>         at org.apache.spark.sql.execution.command.ExecutedCommandExec.executeCollect(commands.scala:84)
>         at org.apache.spark.sql.execution.QueryExecution$$anonfun$eagerlyExecuteCommands$1.$anonfun$applyOrElse$1(QueryExecution.scala:98)
>         at org.apache.spark.sql.execution.SQLExecution$.$anonfun$withNewExecutionId$6(SQLExecution.scala:109)
>         at org.apache.spark.sql.execution.SQLExecution$.withSQLConfPropagated(SQLExecution.scala:169)
>         at org.apache.spark.sql.execution.SQLExecution$.$anonfun$withNewExecutionId$1(SQLExecution.scala:95)
>         at org.apache.spark.sql.SparkSession.withActive(SparkSession.scala:779)
>         at org.apache.spark.sql.execution.SQLExecution$.withNewExecutionId(SQLExecution.scala:64)
>         at org.apache.spark.sql.execution.QueryExecution$$anonfun$eagerlyExecuteCommands$1.applyOrElse(QueryExecution.scala:98)
>         at org.apache.spark.sql.execution.QueryExecution$$anonfun$eagerlyExecuteCommands$1.applyOrElse(QueryExecution.scala:94)
>         at org.apache.spark.sql.catalyst.trees.TreeNode.$anonfun$transformDownWithPruning$1(TreeNode.scala:584)
>         at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:176)
>         at org.apache.spark.sql.catalyst.trees.TreeNode.transformDownWithPruning(TreeNode.scala:584)
>         at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.org$apache$spark$sql$catalyst$plans$logical$AnalysisHelper$$super$transformDownWithPruning(LogicalPlan.scala:30)
>         at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper.transformDownWithPruning(AnalysisHelper.scala:267)
>         at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper.transformDownWithPruning$(AnalysisHelper.scala:263)
>         at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.transformDownWithPruning(LogicalPlan.scala:30)
>         at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.transformDownWithPruning(LogicalPlan.scala:30)
>         at org.apache.spark.sql.catalyst.trees.TreeNode.transformDown(TreeNode.scala:560)
>         at org.apache.spark.sql.execution.QueryExecution.eagerlyExecuteCommands(QueryExecution.scala:94)
>         at org.apache.spark.sql.execution.QueryExecution.commandExecuted$lzycompute(QueryExecution.scala:81)
>         at org.apache.spark.sql.execution.QueryExecution.commandExecuted(QueryExecution.scala:79)
>         at org.apache.spark.sql.Dataset.<init>(Dataset.scala:220)
>         at org.apache.spark.sql.Dataset$.$anonfun$ofRows$2(Dataset.scala:100)
>         at org.apache.spark.sql.SparkSession.withActive(SparkSession.scala:779)
>         at org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:97)
>         at org.apache.spark.sql.SparkSession.$anonfun$sql$1(SparkSession.scala:622)
>         at org.apache.spark.sql.SparkSession.withActive(SparkSession.scala:779)
>         at org.apache.spark.sql.SparkSession.sql(SparkSession.scala:617)
>         at org.apache.spark.sql.SQLContext.sql(SQLContext.scala:651)
>         at org.apache.spark.sql.hive.thriftserver.SparkSQLDriver.run(SparkSQLDriver.scala:67)
>         at org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver.processCmd(SparkSQLCLIDriver.scala:384)
>         at org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver.$anonfun$processLine$1(SparkSQLCLIDriver.scala:504)
>         at org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver.$anonfun$processLine$1$adapted(SparkSQLCLIDriver.scala:498)
>         at scala.collection.Iterator.foreach(Iterator.scala:943)
>         at scala.collection.Iterator.foreach$(Iterator.scala:943)
>         at scala.collection.AbstractIterator.foreach(Iterator.scala:1431)
>         at scala.collection.IterableLike.foreach(IterableLike.scala:74)
>         at scala.collection.IterableLike.foreach$(IterableLike.scala:73)
>         at scala.collection.AbstractIterable.foreach(Iterable.scala:56)
>         at org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver.processLine(SparkSQLCLIDriver.scala:498)
>         at org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver$.main(SparkSQLCLIDriver.scala:286)
>         at org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver.main(SparkSQLCLIDriver.scala)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>         at java.lang.reflect.Method.invoke(Method.java:498)
>         at org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)
>         at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:958)
>         at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:180)
>         at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:203)
>         at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:90)
>         at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:1046)
>         at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:1055)
>         at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
> Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String
>         at org.apache.hudi.index.bloom.HoodieBloomIndex.loadColumnRangesFromMetaIndex(HoodieBloomIndex.java:237)
>         at org.apache.hudi.index.bloom.HoodieBloomIndex.getBloomIndexFileInfoForPartitions(HoodieBloomIndex.java:147)
>         at org.apache.hudi.index.bloom.HoodieBloomIndex.lookupIndex(HoodieBloomIndex.java:125)
>         at org.apache.hudi.index.bloom.HoodieBloomIndex.tagLocation(HoodieBloomIndex.java:91)
>         at org.apache.hudi.table.action.commit.HoodieWriteHelper.tag(HoodieWriteHelper.java:54)
>         at org.apache.hudi.table.action.commit.HoodieWriteHelper.tag(HoodieWriteHelper.java:36)
>         at org.apache.hudi.table.action.commit.BaseWriteHelper.write(BaseWriteHelper.java:64)
>         ... 93 more{code}
>  
> {code:java}
> {"fileName": "e65e8c87-b253-4295-89f1-97c701765f9a-0_187-3188-0_20230411152657616.parquet", "columnName": "id", "minValue": {"value": 1606317768704}, "maxValue": {"value": 1606318877877}, "valueCount": 1109174, "nullCount": 0, "totalSize": 4441469, "totalUncompressedSize": 8875013, "isDeleted": false} {code}
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)