Github user ravipesala commented on a diff in the pull request:
https://github.com/apache/incubator-carbondata/pull/263#discussion_r87172561
--- Diff:
integration/spark/src/main/java/org/apache/carbondata/spark/load/CarbonLoaderUtil.java
---
@@ -215,6 +227,105 @@ public static void executeGraph(CarbonLoadModel
loadModel, String storeLocation,
info, loadModel.getPartitionId(),
loadModel.getCarbonDataLoadSchema());
}
+ public static void executeNewDataLoad(CarbonLoadModel loadModel, String
storeLocation,
+ String hdfsStoreLocation, RecordReader<NullWritable,
StringArrayWritable>[] recordReaders)
+ throws Exception {
+ if (!new File(storeLocation).mkdirs()) {
+ LOGGER.error("Error while creating the temp store path: " +
storeLocation);
+ }
+ CarbonDataLoadConfiguration configuration = new
CarbonDataLoadConfiguration();
+ String databaseName = loadModel.getDatabaseName();
+ String tableName = loadModel.getTableName();
+ String tempLocationKey = databaseName +
CarbonCommonConstants.UNDERSCORE + tableName
+ + CarbonCommonConstants.UNDERSCORE + loadModel.getTaskNo();
+ CarbonProperties.getInstance().addProperty(tempLocationKey,
storeLocation);
+ CarbonProperties.getInstance()
+ .addProperty(CarbonCommonConstants.STORE_LOCATION_HDFS,
hdfsStoreLocation);
+ // CarbonProperties.getInstance().addProperty("store_output_location",
outPutLoc);
+ CarbonProperties.getInstance().addProperty("send.signal.load",
"false");
+
+ CarbonTable carbonTable =
loadModel.getCarbonDataLoadSchema().getCarbonTable();
+ AbsoluteTableIdentifier identifier =
+ carbonTable.getAbsoluteTableIdentifier();
+ configuration.setTableIdentifier(identifier);
+ String csvHeader = loadModel.getCsvHeader();
+ String csvFileName = null;
+ if (csvHeader != null && !csvHeader.isEmpty()) {
+
configuration.setHeader(CarbonDataProcessorUtil.getColumnFields(csvHeader,
","));
+ } else {
+ CarbonFile csvFile =
+
CarbonDataProcessorUtil.getCsvFileToRead(loadModel.getFactFilesToProcess().get(0));
+ csvFileName = csvFile.getName();
+ csvHeader = CarbonDataProcessorUtil.getFileHeader(csvFile);
+ configuration.setHeader(
+ CarbonDataProcessorUtil.getColumnFields(csvHeader,
loadModel.getCsvDelimiter()));
+ }
+ CarbonDataProcessorUtil
+ .validateHeader(loadModel.getTableName(), csvHeader,
loadModel.getCarbonDataLoadSchema(),
+ loadModel.getCsvDelimiter(), csvFileName);
+
+ configuration.setPartitionId(loadModel.getPartitionId());
+ configuration.setSegmentId(loadModel.getSegmentId());
+ configuration.setTaskNo(loadModel.getTaskNo());
+
configuration.setDataLoadProperty(DataLoadProcessorConstants.COMPLEX_DELIMITERS,
+ new String[] { loadModel.getComplexDelimiterLevel1(),
+ loadModel.getComplexDelimiterLevel2() });
+
configuration.setDataLoadProperty(DataLoadProcessorConstants.SERIALIZATION_NULL_FORMAT,
+ loadModel.getSerializationNullFormat().split(",")[1]);
+
configuration.setDataLoadProperty(DataLoadProcessorConstants.FACT_TIME_STAMP,
+ loadModel.getFactTimeStamp());
+
configuration.setDataLoadProperty(DataLoadProcessorConstants.BAD_RECORDS_LOGGER_ENABLE,
+ loadModel.getBadRecordsLoggerEnable().split(",")[1]);
+
configuration.setDataLoadProperty(DataLoadProcessorConstants.BAD_RECORDS_LOGGER_ACTION,
+ loadModel.getBadRecordsAction().split(",")[1]);
+
configuration.setDataLoadProperty(DataLoadProcessorConstants.FACT_FILE_PATH,
+ loadModel.getFactFilePath());
+ List<CarbonDimension> dimensions =
+
carbonTable.getDimensionByTableName(carbonTable.getFactTableName());
+ List<CarbonMeasure> measures =
+ carbonTable.getMeasureByTableName(carbonTable.getFactTableName());
+ Map<String, String> dateFormatMap =
+
CarbonDataProcessorUtil.getDateFormatMap(loadModel.getDateFormat());
+ List<DataField> dataFields = new ArrayList<>();
+ List<DataField> complexDataFields = new ArrayList<>();
+
+ // First add dictionary and non dictionary dimensions because these
are part of mdk key.
+ // And then add complex data types and measures.
+ for (CarbonColumn column : dimensions) {
+ DataField dataField = new DataField(column);
+ dataField.setDateFormat(dateFormatMap.get(column.getColName()));
+ if (column.isComplex()) {
+ complexDataFields.add(dataField);
+ } else {
+ dataFields.add(dataField);
+ }
+ }
+ dataFields.addAll(complexDataFields);
+ for (CarbonColumn column : measures) {
+ // This dummy measure is added when no measure was present. We no
need to load it.
+ if (!(column.getColName().equals("default_dummy_measure"))) {
+ dataFields.add(new DataField(column));
+ }
+ }
+ Iterator[] iterators = new RecordReaderIterator[recordReaders.length];
+ configuration.setDataFields(dataFields.toArray(new
DataField[dataFields.size()]));
+ for (int j = 0; j < recordReaders.length; j++) {
+ iterators[j] = new RecordReaderIterator(recordReaders[j]);
+ }
+ AbstractDataLoadProcessorStep loadProcessorStep =
+ new DataLoadProcessBuilder().build(configuration, iterators);
--- End diff --
I have moved most of the logic to builder now.
And regarding loadfromcsv or loadfromdataframe or completly depends on the
RDD. I guess We should have standard API that takes Iterators. And it is
respective RDD responsibility to provide iterators to load API.
And yes, we can directly use FileSplit but code changes are nore in other
flow that is why I have extended FileSplit. We can remove BlockDetails while
removing kettle. I have kept TODO here.
---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---