1. Go to this page and download the library: Download envoymediagroup/columna library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
envoymediagroup / columna example snippets
mport the classes we need
use EnvoyMediaGroup\Columna\Writer;
use EnvoyMediaGroup\Columna\Reader;
use EnvoyMediaGroup\Columna\ColumnDefinition;
// Create or retrieve our data set
$array = [
[
'clicks' => 12,
'platform_id' => 2,
'site_id' => 7,
'url' => 'https://www.foo.com',
],
[
'clicks' => 31,
'platform_id' => 2,
'site_id' => 9,
'url' => 'https://www.barbaz.net',
],
//... etc.
];
// Define our Metric and our Dimensions
// The names should match the keys in your data set
$MetricDefinition = new ColumnDefinition(
ColumnDefinition::AXIS_TYPE_METRIC, // metric or dimension
'clicks', // name (should match the keys in your data set)
ColumnDefinition::DATA_TYPE_INT, // data type (string, int, float, bool, datetime)
null, // precision (for floats)
0 // empty value (matching the specified data type)
);
$DimensionDefinitions = [
new ColumnDefinition(
ColumnDefinition::AXIS_TYPE_DIMENSION,
'platform_id',
ColumnDefinition::DATA_TYPE_INT,
null,
0
),
new ColumnDefinition(
ColumnDefinition::AXIS_TYPE_DIMENSION,
'site_id',
ColumnDefinition::DATA_TYPE_INT,
null,
0
),
new ColumnDefinition(
ColumnDefinition::AXIS_TYPE_DIMENSION,
'url',
ColumnDefinition::DATA_TYPE_STRING,
null,
''
),
];
// Set our output path and the date for this file's data
$date = '2022-07-08';
$file_path = "/data_directory/{$date}/{$MetricDefinition->getName()}." . Reader::FILE_EXTENSION;
// Instantiate the Writer
$Writer = new Writer();
// The Writer expects headers (string keys) separate from data (0-indexed).
// If your data is associative like the above, you can separate it with
// this helper function.
list($headers,$data) = $Writer->separateHeadersAndData($array);
// Write the columnar file
$Writer->writeFile(
$date,
$MetricDefinition,
$DimensionDefinitions,
$headers,
$data,
$file_path,
// Some optional flags:
//$do_rle_compression = true, // Perform run-length encoding (RLE) compression
//$do_cardinality_sort = false, // Sort data by cardinality of columns before RLE
//$lock_output_file = true // Acquire an exclusive lock when writing output file
);
mport classes
use EnvoyMediaGroup\Columna\CombinedWriter;
use EnvoyMediaGroup\Columna\ColumnDefinition;
// Set our arguments
$date = '2022-07-08';
$metric = 'clicks';
$partial_files = [
"/tmp/{$date}/{$metric}/partial_1.scf",
"/tmp/{$date}/{$metric}/partial_2.scf",
"/tmp/{$date}/{$metric}/partial_3.scf",
//... etc.
];
$combined_file_path = "/data_directory/{$date}/{$metric}." . Reader::FILE_EXTENSION;
// See Writer example above for metric and dimension definitions
$MetricDefinition = new ColumnDefinition(...);
$DimensionDefinitions = [...];
// Write the combined file from the partial files
$Writer = new CombinedWriter();
$response = $Writer->writeCombinedFile(
$date,
$MetricDefinition,
$DimensionDefinitions,
$partial_files,
$combined_file_path
// Some optional flags:
//$lock_output_file = true // Acquire an exclusive lock when writing output file
);
// If you want to remove the partial files after creating the combined file:
foreach ($partial_files as $partial_file) {
unlink($partial_file);
}
// Import the needed classes
use EnvoyMediaGroup\Columna\BundledReader as Reader;
use EnvoyMediaGroup\Columna\Constraint;
// Specify our metric and date, and the corresponding file path
$metric = 'clicks';
$date = '2022-07-08';
$file_path = "/data_directory/{$date}/{$metric}." . Reader::FILE_EXTENSION;
// Set what dimensions we want to d",Constraint::EQUALS,7))->toArray(),
(new Constraint("site_id",Constraint::IN,[1,3,17]))->toArray(),
],
[
(new Constraint("url",Constraint::CONTAINS,"sale"))->toArray(),
]
];
// Group the results by the dimensions we asked for (in this case, platform_id and site_id)
$do_aggregate = true;
// Don't provide extra metadata with sum/count/min/max for each grouping, just aggregate the values
$do_aggregate_meta = false;
$Reader = new Reader();
$Reader->run(
$date,
$metric,
$dimensions,
$constraints,
$do_aggregate,
$do_aggregate_meta,
$file_path
);
$metadata = $Reader->getMetadata(); // Metadata about the request and results; see sample below.
$data = $Reader->getResults(); // Results of the request; see sample below.
use EnvoyMediaGroup\Columna\Response;
// Craft your request
$workload_array = [
"date" => "2022-07-08",
"metric" => "clicks",
"dimensions" => ["platform_id","site_id"],
"constraints" => [
[
[
"name" => "platform_id",
"comparator" => ">=",
"value" => 5,
],
],
],
"do_aggregate" => true,
"do_aggregate_meta" => false,
"file" => "path/to/file.scf",
];
$workload = json_encode($workload_array);
// Transmit that workload over a network with your RPC framework of choice...
$result_string = $SomeRpcClient->request($workload);
// Unserialize the result with the Response class
$Response = new Response($result_string);
$metadata = $Response->getMetadata();
$results = $Response->getResults();
use EnvoyMediaGroup\Columna\BundledReader as Reader;
$workload = $SomeRpcClient->receive();
$Reader = new Reader();
$Reader->runFromWorkload($workload);
$result_string = $Reader->getResponsePayload();
// Return that result string over your RPC framework...
$SomeRpcClient->respond($result_string);
Array(
'date' => '2022-07-08', // Date of the file
'metric' => 'clicks', // Name of the metric in the file
'status' => 'success', // 'success' if records were found, 'empty' if no records were found, 'error' on failure
'min' => 1, // Least metric value among the records
'max' => 64, // Greatest metric value among the records
'sum' => 102, // Total metric value among the records
'matched_row_count' => 102, // Number of records in the file that matched your constraints prior to aggregation
'result_row_count' => 17, // Number of records in the result set after aggregation
'column_meta' => Array( // Description of the columns in the result set
0 => Array(
// MD5 is automatically prepended. Records with matching dimension values will have matching md5 hashes.
// This is helpful if you need to aggregate multiple Reader results together.
'definition' => Array(
'axis_type' => 'dimension',
'name' => 'md5',
'data_type' => 'string',
'empty_value' => '',
),
'index' => 0, // Numerical index in each result record that corresponds to this column
),
1 => Array(
'definition' => Array(
'axis_type' => 'metric',
'name' => 'clicks',
'data_type' => 'int',
'precision' => NULL,
'empty_value' => 0,
),
'index' => 1,
),
2 => Array(
'definition' => Array(
'axis_type' => 'dimension',
'name' => 'platform_id',
'data_type' => 'int',
'precision' => NULL,
'empty_value' => 0,
),
'index' => 2,
),
3 => Array(
'definition' => Array(
'axis_type' => 'dimension',
'name' => 'site_id',
'data_type' => 'int',
'precision' => NULL,
'empty_value' => 0,
),
'index' => 3,
),
),
'is_aggregated' => true, // Read back of whether these results are aggregated on matching dimension values.
'aggregate_