hudi-bot opened a new issue, #17225:
URL: https://github.com/apache/hudi/issues/17225

   Currently using `CustomKeyGenerator` with the partition-path config 
\{hoodie.datasource.write.partitionpath.field=ts:timestamp} fails w/
   {code:java}
   Caused by: java.lang.RuntimeException: Failed to cast value `2022-05-11` to 
`LongType` for partition column `ts_ms`
        at 
org.apache.spark.sql.execution.datasources.Spark3ParsePartitionUtil.$anonfun$parsePartition$2(Spark3ParsePartitionUtil.scala:72)
        at 
scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:286)
        at 
scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:62)
        at 
scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:55)
        at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:49)
        at scala.collection.TraversableLike.map(TraversableLike.scala:286)
        at scala.collection.TraversableLike.map$(TraversableLike.scala:279)
        at scala.collection.AbstractTraversable.map(Traversable.scala:108)
        at 
org.apache.spark.sql.execution.datasources.Spark3ParsePartitionUtil.$anonfun$parsePartition$1(Spark3ParsePartitionUtil.scala:65)
        at scala.Option.map(Option.scala:230)
        at 
org.apache.spark.sql.execution.datasources.Spark3ParsePartitionUtil.parsePartition(Spark3ParsePartitionUtil.scala:63)
        at 
org.apache.hudi.SparkHoodieTableFileIndex.parsePartitionPath(SparkHoodieTableFileIndex.scala:274)
        at 
org.apache.hudi.SparkHoodieTableFileIndex.parsePartitionColumnValues(SparkHoodieTableFileIndex.scala:258)
        at 
org.apache.hudi.BaseHoodieTableFileIndex.lambda$getAllQueryPartitionPaths$3(BaseHoodieTableFileIndex.java:190)
        at 
java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
        at 
java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1384)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
        at 
java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
        at 
java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at 
java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566)
        at 
org.apache.hudi.BaseHoodieTableFileIndex.getAllQueryPartitionPaths(BaseHoodieTableFileIndex.java:193)
 {code}
    
   
   This occurs b/c SparkHoodieTableFileIndex produces incorrect partition 
schema at XXX
   
   where it properly handles only `TimestampBasedKeyGenerator`s but not the 
other key-generators that might be changing the data-type of the 
partition-value as compared to the source partition-column (in this case it has 
`ts` as a long in the source table schema, but it produces partition-value as 
string)
   
   ## JIRA info
   
   - Link: https://issues.apache.org/jira/browse/HUDI-4818
   - Type: Sub-task
   - Parent: https://issues.apache.org/jira/browse/HUDI-9113
   - Fix version(s):
     - 1.1.0
   
   
   ---
   
   
   ## Comments
   
   28/Feb/24 12:30;adityagoenka;This is still open - 
   
   One more GitHub issue reported -
   
    [https://github.com/apache/hudi/issues/10678]
   
    
   
   Reproducible code - 
   
   ```
   data = [("id1", "name1", time.time_ns()),
   ("id2", "name2", time.time_ns()+ 1)]
   
   schema = StructType([
   StructField("id", StringType(), True),
   StructField("name", StringType(), True),
   StructField("ts", LongType(), True)
   ])
   
   df = spark.createDataFrame(data, schema=schema)
   
   (df.write.format("hudi")
   .option("hoodie.datasource.write.keygenerator.class", 
"org.apache.hudi.keygen.CustomKeyGenerator")
   .option("hoodie.datasource.write.partitionpath.field", "ts:timestamp")
   .option("hoodie.datasource.write.recordkey.field", "id")
   .option("hoodie.datasource.write.precombined.field", "name")
   .option("hoodie.table.name", "hudi_cow2")
   .option("hoodie.keygen.timebased.timestamp.type", "EPOCHMILLISECONDS")
   .option("hoodie.keygen.timebased.output.dateformat", "yyyyMMdd-HH")
   .mode("overwrite")
   .save(PATH))
   
   df_read_parquet = spark.read.parquet(PATH + "/5*")
   df_read_parquet.show()
   
   df_read_hudi = (spark.read.format("hudi")
   .option("hoodie.schema.on.read.enable", "true")
   .load(PATH))
   df_read_hudi.show()
   ```;;;
   
   ---
   
   17/Sep/24 02:31;guoyihua;I have a WIP fix (see the branch below) on making 
partition pruning work for the timestamp-based partition field with the 
timestamp or custom key generator.  If this issue is related to the partition 
pruning, I'll push through this fix.
   
   [https://github.com/yihua/hudi/tree/HUDI-fix-timestamp-partition]
   
    ;;;
   
   ---
   
   15/Oct/24 23:00;linliu;[~yihua], Do you need us to investigate this ticket, 
and let you know the root cause? Since you already have the PR, should we land 
it now?;;;
   
   ---
   
   16/Oct/24 00:52;linliu;I reproduced the issue on my local, and I confirmed 
this is related to the partition pruning. Would you please push your fix? 
[~yihua]
   ;;;
   
   ---
   
   21/Oct/24 16:10;linliu;[~yihua], I applied your fix, but it did not fix the 
issue. So I have to debug then.;;;
   
   ---
   
   21/Oct/24 18:13;linliu;The root cause of the failure is that 
`.option("hoodie.keygen.timebased.output.dateformat", "yyyyMMdd-HH")`. the out 
put format of the timestamp contains '\-', which cannot be cast into long type. 
After removing the '-', it worked.;;;
   
   ---
   
   22/Oct/24 01:38;yihua;I think we still need to fix this for timestamp or 
custom key generator to work properly with the partition pruning.;;;
   
   ---
   
   22/Oct/24 05:45;linliu;The description of this ticket does not mention about 
partition pruning. 
   
   Please add property description or create a new ticket.;;;
   
   ---
   
   26/Nov/24 19:30;yihua;Let's validate the behavior of the following scenarios 
on both Hudi 0.14 and Hudi 1.0 to make sure there is no regression:
   
   Key generators:
   (1) Timestamp keygen, timestamp partition column (long type), SCALAR 
timestamp type, yyyy-MM-dd as output format
   (2) Custom keygen, simple (string type) and timestamp partition column (long 
type), SCALAR timestamp type, yyyy-MM-dd as output format
   
   Queries to test:
   (1) full table scan
   (2) filter for partition with string, e.g., `partition='yyyy-MM-dd'`
   (3) filter for partition with timestamp, e.g., `partition between 123 and 
456`, where "123" and "456" are the raw values from the partition column.;;;
   
   ---
   
   27/Nov/24 20:07;jonvex;Here is the prototype for a fix 
[https://github.com/jonvex/hudi/tree/fix_timestamp_keygen_vectorized]
   
    
   
   in 
[https://github.com/apache/spark/blob/32232e9ed33bb16b93ad58cfde8b82e0f07c0970/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/FileSourceStrategy.scala#L206]
 it removes the partition only filters from the list of filters that that 
should be run after reading the files. We need to not remove filters for 
timestamp keygen cols;;;


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to