package com.example.customername; import java.util.List; import java.util.ArrayList; import software.amazon.awssdk.services.sagemakerfeaturestoreruntime.model.FeatureValue; import software.amazon.awssdk.services.sagemaker.model.FeatureDefinition; public class FeatureGroupRecordOperations { public static String getStringTimeStamp(){ return String.format("%f", System.currentTimeMillis()/1000.0); } private static List < FeatureValue > buildRecord(String[] featureNames, String[] featureValues, boolean isIgnoreIdxColumn) { List < FeatureValue > featureRecordsList = new ArrayList < FeatureValue > (); for (int i = 0; i < featureValues.length; i++) { // Skip the first column if it's an index column (isIgnoreIdxColumn is set to true) if (i == 0 && isIgnoreIdxColumn) { continue; } else{ FeatureValue feature = FeatureValue.builder() .featureName(featureNames[i]) .valueAsString(featureValues[i]) .build(); featureRecordsList.add(feature); } } return featureRecordsList; } public static List < List < FeatureValue >> makeRecordsList( String[] featureNames, List < String[] > recordsList, boolean isIgnoreIdxColumn, boolean isIgnoreFirstRow) { List < List < FeatureValue >> featureRecordsList = new ArrayList < List < FeatureValue >> (); for (int i = 0; i < recordsList.size(); i++) { // Don't process the first row since the first row is just column names if isIgnoreFirstRow is true if (isIgnoreFirstRow && i == 0) { continue; } String[] recordFeatureValues = recordsList.get(i); List < FeatureValue > record = buildRecord(featureNames, recordFeatureValues, isIgnoreIdxColumn); featureRecordsList.add(record); } return featureRecordsList; } public static List < FeatureDefinition > makeColumnDefinitions(String[] featureNames, String[] columnDataTypes, String eventTimeFeatureName, boolean isIgnoreIdxColumn) { List < FeatureDefinition > columnDefs = new ArrayList < FeatureDefinition > (); // Add each column definition for (int i = 0; i < featureNames.length; i++) { String columnName = featureNames[i]; String dataType = getDataType(columnDataTypes[i]); // Skip the first column if it's an index column (isIgnoreIdxColumn is set to true) if (i == 0 && isIgnoreIdxColumn) { continue; } // Build column def FeatureDefinition column_def = FeatureDefinition.builder() .featureName(columnName) .featureType(dataType) .build(); columnDefs.add(column_def); } // Add the timestamp column definition FeatureDefinition timestampColumnDef = FeatureDefinition.builder() .featureName(eventTimeFeatureName) .featureType(getDataType(getStringTimeStamp())) .build(); columnDefs.add(timestampColumnDef); return columnDefs; } private static String getDataType(String data) { String data_type; boolean has_number = data.matches("[0-9.,]+"); boolean has_alphabet = data.matches("[a-zA-Z]+"); // Decide data type if (has_number && !has_alphabet) { // Must be number boolean has_period = data.contains("."); if (has_period) { data_type = "Fractional"; } else { data_type = "Integral"; } } else { // Must be string since isn't just number values even if special characters exist data_type = "String"; } return data_type; } }