kyrsideris opened a new issue #7164:
URL: https://github.com/apache/incubator-pinot/issues/7164


   According to #6525 which is part of the 
[release-0.7.1](https://github.com/apache/incubator-pinot/releases/tag/release-0.7.1)
 according to the comparison: 
https://github.com/apache/incubator-pinot/compare/release-0.6.0...release-0.7.1,
   
   It seems that ingestion of Parquet files that include `int96` and `decimal` 
data types should have been addressed in newer versions. Nevertheless I am 
still getting an exception:
   
   ```java
   java.lang.IllegalArgumentException: INT96 not implemented and is deprecated
   ```
   
   ## How I deployed:
   
   I used the helm charts in a fresh checkout at hash 7233e2c66, around 
2021-07-11. The chart is pulling the latest docker image which should be 
`0.8.0-SNAPSHOT`. The version endpoint `/version` does not return any info, but 
the controller's folder `/opt/pinot/lib/` contains 
`pinot-all-0.8.0-SNAPSHOT-jar-with-dependencies.jar` so it must be 
`0.8.0-SNAPSHOT`.
   
   ## Reproduced with test data
   
   I found the following [test 
resource](https://github.com/apache/incubator-pinot/blob/7233e2c66d8a6640cfc067dafc694fcc2ed2d584/pinot-plugins/pinot-input-format/pinot-parquet/src/test/resources/test-file-with-int96-and-decimal.snappy.parquet)
 which I used it to create a standalone batch ingestion: 
   
   ```
   
pinot-plugins/pinot-input-format/pinot-parquet/src/test/resources/test-file-with-int96-and-decimal.snappy.parquet
 
   ```
   
   the schema of that test data is as follows:
   
   ```
   message spark_schema {
     optional int96 ts;
     optional binary source (STRING);
     optional binary table_name (STRING);
     optional float coins;
     optional int32 seniority;
     optional int32 llrecency;
     optional int32 trstierid;
     optional int32 gamelevelid;
     optional int32 ltdrecency;
     optional fixed_len_byte_array(11) playerimportance (DECIMAL(24,4));
     optional binary platformtypename (STRING);
     optional fixed_len_byte_array(12) extreme_wager_14d (DECIMAL(28,2));
     optional int32 is_vip;
     optional int32 newdeposithabitgroupid;
     optional int32 deposithabitgroupid;
     optional int32 activedayssinceinstall;
     optional int32 is_depo;
   }
   ```
   
   
   The configuration of the injection is described by the following files:
   - table schema,
   - offline table configuration,
   - ingestion job specification,
   - ingestion job properties
   
   `test_with_int96_and_decimal_schema.json`:
   
   ```json
   {
     "schemaName": "test_with_int96_and_decimal",
     "metricFieldSpecs": [
       {"name": "coins", "dataType": "FLOAT"},
       {"name": "seniority", "dataType": "INT"},
       {"name": "llrecency", "dataType": "INT"},
       {"name": "ltdrecency", "dataType": "INT"},
       {"name": "playerimportance", "dataType": "DOUBLE"},
       {"name": "extreme_wager_14d", "dataType": "DOUBLE"},
       {"name": "activedayssinceinstall", "dataType": "INT"}
     ],
     "dimensionFieldSpecs": [
       {"name": "trstierid", "dataType": "INT"},
       {"name": "gamelevelid", "dataType": "INT"},
       {"name": "newdeposithabitgroupid", "dataType": "INT"},
       {"name": "deposithabitgroupid", "dataType": "INT"},
       {"name": "source", "dataType": "STRING"},
       {"name": "table_name", "dataType": "STRING"},
       {"name": "platformtypename", "dataType": "STRING"},
       {"name": "is_vip", "dataType": "INT"},
       {"name": "is_depo", "dataType": "INT"}
     ],
     "dateTimeFieldSpecs": [
       { 
         "name": "ts", 
         "dataType": "LONG",
         "format": "1:MINUTES:SIMPLE_DATE_FORMAT:yyyy-MM-dd HH:mm:ss",
         "granularity": "1:MINUTES"
       }
     ]
   }
   ```
   
   `test_with_int96_and_decimal_offline_table_config.json`:
   
   ```json
   {
     "tableName": "test_with_int96_and_decimal",
     "tableType": "OFFLINE",
     "segmentsConfig": {
       "segmentPushType": "APPEND",
       "segmentAssignmentStrategy": "BalanceNumSegmentAssignmentStrategy",
       "schemaName": "test_with_int96_and_decimal",
       "replication": "1"
     },
     "tenants": {
     },
     "tableIndexConfig": {
       "loadMode": "HEAP",
       "invertedIndexColumns": [
         "trstierid",
         "gamelevelid"
       ]
     },
     "metadata": {
       "customConfigs": {
       }
     }
   }
   ```
   
   `ingestionJobSpec.yaml`
   
   ```yaml
   #
   # Licensed to the Apache Software Foundation (ASF) under one
   # or more contributor license agreements.  See the NOTICE file
   # distributed with this work for additional information
   # regarding copyright ownership.  The ASF licenses this file
   # to you under the Apache License, Version 2.0 (the
   # "License"); you may not use this file except in compliance
   # with the License.  You may obtain a copy of the License at
   #
   #   http://www.apache.org/licenses/LICENSE-2.0
   #
   # Unless required by applicable law or agreed to in writing,
   # software distributed under the License is distributed on an
   # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   # KIND, either express or implied.  See the License for the
   # specific language governing permissions and limitations
   # under the License.
   #
   
   # executionFrameworkSpec: Defines ingestion jobs to be running.
   executionFrameworkSpec:
   
     # name: execution framework name
     name: 'standalone'
   
     # segmentGenerationJobRunnerClassName: class name implements 
org.apache.pinot.spi.batch.ingestion.runner.SegmentGenerationJobRunner 
interface.
     segmentGenerationJobRunnerClassName: 
'org.apache.pinot.plugin.ingestion.batch.standalone.SegmentGenerationJobRunner'
   
     # segmentTarPushJobRunnerClassName: class name implements 
org.apache.pinot.spi.batch.ingestion.runner.SegmentTarPushJobRunner interface.
     segmentTarPushJobRunnerClassName: 
'org.apache.pinot.plugin.ingestion.batch.standalone.SegmentTarPushJobRunner'
   
     # segmentUriPushJobRunnerClassName: class name implements 
org.apache.pinot.spi.batch.ingestion.runner.SegmentUriPushJobRunner interface.
     segmentUriPushJobRunnerClassName: 
'org.apache.pinot.plugin.ingestion.batch.standalone.SegmentUriPushJobRunner'
   
   # jobType: Pinot ingestion job type.
   # Supported job types are:
   #   'SegmentCreation'
   #   'SegmentTarPush'
   #   'SegmentUriPush'
   #   'SegmentCreationAndTarPush'
   #   'SegmentCreationAndUriPush'
   jobType: SegmentCreationAndTarPush
   
   # inputDirURI: Root directory of input data, expected to have scheme 
configured in PinotFS.
   inputDirURI: 'examples/batch/test_with_int96_and_decimal/rawdata'
   
   # includeFileNamePattern: include file name pattern, supported glob pattern.
   # Sample usage:
   #   'glob:*.avro' will include all avro files just under the inputDirURI, 
not sub directories;
   #   'glob:**/*.avro' will include all the avro files under inputDirURI 
recursively.
   includeFileNamePattern: 'glob:**/*.parquet'
   
   # excludeFileNamePattern: exclude file name pattern, supported glob pattern.
   # Sample usage:
   #   'glob:*.avro' will exclude all avro files just under the inputDirURI, 
not sub directories;
   #   'glob:**/*.avro' will exclude all the avro files under inputDirURI 
recursively.
   # _excludeFileNamePattern: ''
   
   # outputDirURI: Root directory of output segments, expected to have scheme 
configured in PinotFS.
   outputDirURI: 'examples/batch/test_with_int96_and_decimal/segments'
   
   # overwriteOutput: Overwrite output segments if existed.
   overwriteOutput: true
   
   # pinotFSSpecs: defines all related Pinot file systems.
   pinotFSSpecs:
   
     - # scheme: used to identify a PinotFS.
       # E.g. local, hdfs, dbfs, etc
       scheme: file
   
       # className: Class name used to create the PinotFS instance.
       # E.g.
       #   org.apache.pinot.spi.filesystem.LocalPinotFS is used for local 
filesystem
       #   org.apache.pinot.plugin.filesystem.AzurePinotFS is used for Azure 
Data Lake
       #   org.apache.pinot.plugin.filesystem.HadoopPinotFS is used for HDFS
       className: org.apache.pinot.spi.filesystem.LocalPinotFS
   
   # recordReaderSpec: defines all record reader
   recordReaderSpec:
   
     # dataFormat: Record data format, e.g. 'avro', 'parquet', 'orc', 'csv', 
'json', 'thrift' etc.
     dataFormat: 'parquet'
   
     # className: Corresponding RecordReader class name.
     # E.g.
     #   org.apache.pinot.plugin.inputformat.avro.AvroRecordReader
     #   org.apache.pinot.plugin.inputformat.csv.CSVRecordReader
     #   org.apache.pinot.plugin.inputformat.parquet.ParquetRecordReader
     #   org.apache.pinot.plugin.inputformat.json.JSONRecordReader
     #   org.apache.pinot.plugin.inputformat.orc.ORCRecordReader
     #   org.apache.pinot.plugin.inputformat.thrift.ThriftRecordReader
     className: 
'org.apache.pinot.plugin.inputformat.parquet.ParquetRecordReader'
   
     # configClassName: Corresponding RecordReaderConfig class name, it's 
mandatory for CSV and Thrift file format.
     # E.g.
     #    org.apache.pinot.plugin.inputformat.csv.CSVRecordReaderConfig
     #    org.apache.pinot.plugin.inputformat.thrift.ThriftRecordReaderConfig
     # configClassName: 
'org.apache.pinot.plugin.inputformat.csv.CSVRecordReaderConfig'
   
     # configs: Used to init RecordReaderConfig class name, this config is 
required for CSV and Thrift data format.
     configs:
   
   
   # tableSpec: defines table name and where to fetch corresponding table 
config and table schema.
   tableSpec:
   
     # tableName: Table name
     tableName: 'test_with_int96_and_decimal'
   
     # schemaURI: defines where to read the table schema, supports PinotFS or 
HTTP.
     # E.g.
     #   hdfs://path/to/table_schema.json
     #   http://localhost:9000/tables/myTable/schema
     schemaURI: 
'http://localhost:9000/tables/test_with_int96_and_decimal/schema'
   
     # tableConfigURI: defines where to reade the table config.
     # Supports using PinotFS or HTTP.
     # E.g.
     #   hdfs://path/to/table_config.json
     #   http://localhost:9000/tables/myTable
     # Note that the API to read Pinot table config directly from pinot 
controller contains a JSON wrapper.
     # The real table config is the object under the field 'OFFLINE'.
     tableConfigURI: 'http://localhost:9000/tables/test_with_int96_and_decimal'
   
   # pinotClusterSpecs: defines the Pinot Cluster Access Point.
   pinotClusterSpecs:
     - # controllerURI: used to fetch table/schema information and data push.
       # E.g. http://localhost:9000
       controllerURI: 'http://localhost:9000'
   
   # pushJobSpec: defines segment push job related configuration.
   pushJobSpec:
   
     # pushAttempts: number of attempts for push job, default is 1, which means 
no retry.
     pushAttempts: 2
   
     # pushRetryIntervalMillis: retry wait Ms, default to 1 second.
     pushRetryIntervalMillis: 1000
   ```
   
   `ingestionJob.properties`
   
   ```properties
   job-spec-format=yaml
   ```
   
   and I created the table with:
   
   ```shell
   /opt/pinot/bin/pinot-admin.sh \
       AddTable \
       -schemaFile 
/opt/pinot/examples/batch/test_with_int96_and_decimal/test_with_int96_and_decimal_schema.json
 \
       -tableConfigFile 
/opt/pinot/examples/batch/test_with_int96_and_decimal/test_with_int96_and_decimal_offline_table_config.json
 \
       -controllerHost pinot-controller \
       -controllerPort 9000 \
       -exec
   ```
   
   and the started the ingestion with:
   
   ```shell
   /opt/pinot/bin/pinot-admin.sh \
       LaunchDataIngestionJob \
       -jobSpecFile 
/opt/pinot/examples/batch/test_with_int96_and_decimal/ingestionJobSpec.yaml \
       -propertyFile 
/opt/pinot/examples/batch/test_with_int96_and_decimal/ingestionJob.properties
   ```
   
   Am I doing something wrong or is the batch ingestion of parquet with `int96` 
and `decimal` data types not working?
   


-- 
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]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to