mirror of https://github.com/apache/druid.git
add test for batch indexing from hadoop
This commit is contained in:
parent
773d6fe86c
commit
e7a7ecd65d
|
@ -1,6 +1,20 @@
|
||||||
Integration Testing
|
Integration Testing
|
||||||
===================
|
===================
|
||||||
|
|
||||||
|
To run integration tests, you have to specify the druid cluster the
|
||||||
|
tests should use.
|
||||||
|
|
||||||
|
Druid comes with the mvn profile integration-tests
|
||||||
|
for setting up druid running in docker containers, and using that
|
||||||
|
cluster to run the integration tests.
|
||||||
|
|
||||||
|
To use a druid cluster that is already running, use the
|
||||||
|
mvn profile int-tests-config-file, which uses a configuration file
|
||||||
|
describing the cluster.
|
||||||
|
|
||||||
|
Integration Testing Using Docker
|
||||||
|
-------------------
|
||||||
|
|
||||||
## Installing Docker
|
## Installing Docker
|
||||||
|
|
||||||
Please refer to instructions at [https://github.com/druid-io/docker-druid/blob/master/docker-install.md](https://github.com/druid-io/docker-druid/blob/master/docker-install.md).
|
Please refer to instructions at [https://github.com/druid-io/docker-druid/blob/master/docker-install.md](https://github.com/druid-io/docker-druid/blob/master/docker-install.md).
|
||||||
|
@ -20,24 +34,22 @@ eval "$(docker-machine env integration)"
|
||||||
export DOCKER_IP=$(docker-machine ip integration)
|
export DOCKER_IP=$(docker-machine ip integration)
|
||||||
```
|
```
|
||||||
|
|
||||||
Running Integration tests
|
## Running tests
|
||||||
=========================
|
|
||||||
|
|
||||||
Make sure that you have at least 6GB of memory available before you run the tests.
|
To run all the tests using docker and mvn run the following command:
|
||||||
|
|
||||||
## Starting docker tests
|
|
||||||
|
|
||||||
To run all the tests using docker and mvn run the following command -
|
|
||||||
```
|
```
|
||||||
mvn verify -P integration-tests
|
mvn verify -P integration-tests
|
||||||
```
|
```
|
||||||
|
|
||||||
To run only a single test using mvn run the following command -
|
To run only a single test using mvn run the following command:
|
||||||
```
|
```
|
||||||
mvn verify -P integration-tests -Dit.test=<test_name>
|
mvn verify -P integration-tests -Dit.test=<test_name>
|
||||||
```
|
```
|
||||||
|
|
||||||
## Configure and run integration tests using existing cluster
|
Running Tests Using A Configuration File for Any Cluster
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
Make sure that you have at least 6GB of memory available before you run the tests.
|
||||||
|
|
||||||
To run tests on any druid cluster that is already running, create a configuration file:
|
To run tests on any druid cluster that is already running, create a configuration file:
|
||||||
|
|
||||||
|
@ -54,23 +66,84 @@ To run tests on any druid cluster that is already running, create a configuratio
|
||||||
"zookeeper_hosts": "<comma-separated list of zookeeper_ip:zookeeper_port>",
|
"zookeeper_hosts": "<comma-separated list of zookeeper_ip:zookeeper_port>",
|
||||||
}
|
}
|
||||||
|
|
||||||
Set the environment variable CONFIG_FILE to the name of the configuration file -
|
Set the environment variable CONFIG_FILE to the name of the configuration file:
|
||||||
```
|
```
|
||||||
export CONFIG_FILE=<config file name>
|
export CONFIG_FILE=<config file name>
|
||||||
```
|
```
|
||||||
|
|
||||||
To run all the tests using mvn run the following command -
|
To run all the tests using mvn run the following command:
|
||||||
```
|
```
|
||||||
mvn verify -P int-tests-config-file
|
mvn verify -P int-tests-config-file
|
||||||
```
|
```
|
||||||
|
|
||||||
To run only a single test using mvn run the following command -
|
To run only a single test using mvn run the following command:
|
||||||
```
|
```
|
||||||
mvn verify -P int-tests-config-file -Dit.test=<test_name>
|
mvn verify -P int-tests-config-file -Dit.test=<test_name>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Running a Test That Uses Hadoop
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
The integration test that indexes from hadoop is not run as part
|
||||||
|
of the integration test run discussed above. This is because druid
|
||||||
|
test clusters might not, in general, have access to hadoop.
|
||||||
|
That's the case (for now, at least) when using the docker cluster set
|
||||||
|
up by the integration-tests profile, so the hadoop test
|
||||||
|
has to be run using a cluster specified in a configuration file.
|
||||||
|
|
||||||
|
The data file is
|
||||||
|
integration-tests/src/test/resources/hadoop/batch_hadoop.data.
|
||||||
|
Create a directory called batchHadoop1 in the hadoop file system
|
||||||
|
(anywhere you want) and put batch_hadoop.data into that directory
|
||||||
|
(as its only file).
|
||||||
|
|
||||||
|
Add this keyword to the configuration file (see above):
|
||||||
|
|
||||||
|
```
|
||||||
|
"hadoopTestDir": "<name_of_dir_containing_batchHadoop1>"
|
||||||
|
```
|
||||||
|
|
||||||
|
Run the test using mvn:
|
||||||
|
|
||||||
|
```
|
||||||
|
mvn verify -P int-tests-config-file -Dit.test=ITHadoopIndexTest
|
||||||
|
```
|
||||||
|
|
||||||
|
In some test environments, the machine where the tests need to be executed
|
||||||
|
cannot access the outside internet, so mvn cannot be run. In that case,
|
||||||
|
do the following instead of running the tests using mvn:
|
||||||
|
|
||||||
|
### Compile druid and the integration tests
|
||||||
|
|
||||||
|
On a machine that can do mvn builds:
|
||||||
|
|
||||||
|
```
|
||||||
|
cd druid
|
||||||
|
mvn clean package
|
||||||
|
cd integration_tests
|
||||||
|
mvn dependency:copy-dependencies package
|
||||||
|
```
|
||||||
|
|
||||||
|
### Put the compiled test code into your test cluster
|
||||||
|
|
||||||
|
Copy the integration-tests directory to the test cluster.
|
||||||
|
|
||||||
|
### Set CLASSPATH
|
||||||
|
|
||||||
|
```
|
||||||
|
TDIR=<directory containing integration-tests>/target
|
||||||
|
VER=<version of druid you built>
|
||||||
|
export CLASSPATH=$TDIR/dependency/*:$TDIR/druid-integration-tests-$VER.jar:$TDIR/druid-integration-tests-$VER-tests.jar
|
||||||
|
```
|
||||||
|
|
||||||
|
### Run the test
|
||||||
|
|
||||||
|
```
|
||||||
|
java -Duser.timezone=UTC -Dfile.encoding=UTF-8 -Ddruid.test.config.type=configFile -Ddruid.test.config.configFile=<pathname of configuration file> org.testng.TestNG -testrunfactory org.testng.DruidTestRunnerFactory -testclass io.druid.tests.hadoop.ITHadoopIndexTest
|
||||||
|
```
|
||||||
|
|
||||||
Writing a New Test
|
Writing a New Test
|
||||||
===============
|
-------------------
|
||||||
|
|
||||||
## What should we cover in integration tests
|
## What should we cover in integration tests
|
||||||
|
|
||||||
|
@ -78,7 +151,7 @@ For every end-user functionality provided by druid we should have an integration
|
||||||
|
|
||||||
## Rules to be followed while writing a new integration test
|
## Rules to be followed while writing a new integration test
|
||||||
|
|
||||||
### Every Integration Test must follow these rules
|
### Every Integration Test must follow these rules:
|
||||||
|
|
||||||
1) Name of the test must start with a prefix "IT"
|
1) Name of the test must start with a prefix "IT"
|
||||||
2) A test should be independent of other tests
|
2) A test should be independent of other tests
|
||||||
|
@ -111,5 +184,5 @@ This will tell the test framework that the test class needs to be constructed us
|
||||||
Refer ITIndexerTest as an example on how to use dependency Injection
|
Refer ITIndexerTest as an example on how to use dependency Injection
|
||||||
|
|
||||||
TODOS
|
TODOS
|
||||||
=======================
|
-----------------------
|
||||||
1) Remove the patch for TestNG after resolution of Surefire-622
|
1) Remove the patch for TestNG after resolution of Surefire-622
|
||||||
|
|
|
@ -45,6 +45,11 @@
|
||||||
<artifactId>druid-s3-extensions</artifactId>
|
<artifactId>druid-s3-extensions</artifactId>
|
||||||
<version>${project.parent.version}</version>
|
<version>${project.parent.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.druid.extensions</groupId>
|
||||||
|
<artifactId>druid-datasketches</artifactId>
|
||||||
|
<version>${project.parent.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.druid.extensions</groupId>
|
<groupId>io.druid.extensions</groupId>
|
||||||
<artifactId>druid-kafka-eight</artifactId>
|
<artifactId>druid-kafka-eight</artifactId>
|
||||||
|
@ -190,6 +195,7 @@
|
||||||
-Dfile.encoding=UTF-8
|
-Dfile.encoding=UTF-8
|
||||||
-Dtestrunfactory=org.testng.DruidTestRunnerFactory
|
-Dtestrunfactory=org.testng.DruidTestRunnerFactory
|
||||||
-Ddruid.test.config.dockerIp=${env.DOCKER_IP}
|
-Ddruid.test.config.dockerIp=${env.DOCKER_IP}
|
||||||
|
-Ddruid.test.config.hadoopDir=${env.HADOOP_DIR}
|
||||||
-Ddruid.zk.service.host=${env.DOCKER_IP}
|
-Ddruid.zk.service.host=${env.DOCKER_IP}
|
||||||
</argLine>
|
</argLine>
|
||||||
<suiteXmlFiles>
|
<suiteXmlFiles>
|
||||||
|
|
|
@ -31,6 +31,10 @@ public class DockerConfigProvider implements IntegrationTestingConfigProvider
|
||||||
@NotNull
|
@NotNull
|
||||||
private String dockerIp;
|
private String dockerIp;
|
||||||
|
|
||||||
|
@JsonProperty
|
||||||
|
@NotNull
|
||||||
|
private String hadoopDir;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IntegrationTestingConfig get()
|
public IntegrationTestingConfig get()
|
||||||
{
|
{
|
||||||
|
@ -87,7 +91,10 @@ public class DockerConfigProvider implements IntegrationTestingConfigProvider
|
||||||
@Override
|
@Override
|
||||||
public String getProperty(String prop)
|
public String getProperty(String prop)
|
||||||
{
|
{
|
||||||
throw new UnsupportedOperationException("DockerConfigProvider does not support getProperty()");
|
if (prop.equals("hadoopTestDir")) {
|
||||||
|
return hadoopDir;
|
||||||
|
}
|
||||||
|
throw new UnsupportedOperationException("DockerConfigProvider does not support property " + prop);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -194,6 +194,11 @@ public class OverlordResourceTestClient
|
||||||
}
|
}
|
||||||
|
|
||||||
public void waitUntilTaskCompletes(final String taskID)
|
public void waitUntilTaskCompletes(final String taskID)
|
||||||
|
{
|
||||||
|
waitUntilTaskCompletes(taskID, 60000, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void waitUntilTaskCompletes(final String taskID, final int millisEach, final int numTimes)
|
||||||
{
|
{
|
||||||
RetryUtil.retryUntil(
|
RetryUtil.retryUntil(
|
||||||
new Callable<Boolean>()
|
new Callable<Boolean>()
|
||||||
|
@ -209,9 +214,9 @@ public class OverlordResourceTestClient
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
true,
|
true,
|
||||||
60000,
|
millisEach,
|
||||||
10,
|
numTimes,
|
||||||
"Index Task to complete"
|
taskID
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,114 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Metamarkets Group Inc. (Metamarkets) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. Metamarkets 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.druid.tests.hadoop;
|
||||||
|
|
||||||
|
import com.google.common.base.Throwables;
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
import com.metamx.common.ISE;
|
||||||
|
import com.metamx.common.logger.Logger;
|
||||||
|
import io.druid.indexing.common.TaskStatus;
|
||||||
|
import io.druid.testing.IntegrationTestingConfig;
|
||||||
|
import io.druid.testing.guice.DruidTestModuleFactory;
|
||||||
|
import io.druid.testing.utils.RetryUtil;
|
||||||
|
import io.druid.tests.indexer.AbstractIndexerTest;
|
||||||
|
import org.testng.annotations.AfterClass;
|
||||||
|
import org.testng.annotations.BeforeClass;
|
||||||
|
import org.testng.annotations.Guice;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
|
|
||||||
|
@Guice(moduleFactory = DruidTestModuleFactory.class)
|
||||||
|
public class ITHadoopIndexTest extends AbstractIndexerTest
|
||||||
|
{
|
||||||
|
private static final Logger LOG = new Logger(ITHadoopIndexTest.class);
|
||||||
|
private static final String BATCH_TASK = "/hadoop/batch_hadoop_indexer.json";
|
||||||
|
private static final String BATCH_QUERIES_RESOURCE = "/hadoop/batch_hadoop_queries.json";
|
||||||
|
private static final String BATCH_DATASOURCE = "batchHadoop";
|
||||||
|
private boolean dataLoaded = false;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private IntegrationTestingConfig config;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public void beforeClass()
|
||||||
|
{
|
||||||
|
loadData(config.getProperty ("hadoopTestDir") + "/batchHadoop1");
|
||||||
|
dataLoaded = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testHadoopIndex() throws Exception
|
||||||
|
{
|
||||||
|
queryHelper.testQueriesFromFile(BATCH_QUERIES_RESOURCE, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadData(String hadoopDir)
|
||||||
|
{
|
||||||
|
String indexerSpec = "";
|
||||||
|
|
||||||
|
try {
|
||||||
|
LOG.info("indexerFile name: [%s]", BATCH_TASK);
|
||||||
|
indexerSpec = getTaskAsString(BATCH_TASK);
|
||||||
|
indexerSpec = indexerSpec.replaceAll("%%HADOOP_TEST_PATH%%", hadoopDir);
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOG.error ("could not read and modify indexer file: %s", e.getMessage());
|
||||||
|
throw Throwables.propagate(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
final String taskID = indexer.submitTask(indexerSpec);
|
||||||
|
LOG.info("TaskID for loading index task %s", taskID);
|
||||||
|
indexer.waitUntilTaskCompletes (taskID, 60000, 20);
|
||||||
|
RetryUtil.retryUntil(
|
||||||
|
new Callable<Boolean>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public Boolean call() throws Exception
|
||||||
|
{
|
||||||
|
return coordinator.areSegmentsLoaded(BATCH_DATASOURCE);
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
true,
|
||||||
|
20000,
|
||||||
|
10,
|
||||||
|
"Segment-Load-Task-" + taskID
|
||||||
|
);
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOG.error ("data could not be loaded: %s", e.getMessage());
|
||||||
|
throw Throwables.propagate(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public void afterClass()
|
||||||
|
{
|
||||||
|
if (dataLoaded)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
unloadAndKillData(BATCH_DATASOURCE);
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOG.warn ("exception while removing segments: [%s]", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,72 @@
|
||||||
|
{
|
||||||
|
"type": "index_hadoop",
|
||||||
|
"spec": {
|
||||||
|
"dataSchema": {
|
||||||
|
"dataSource": "batchHadoop",
|
||||||
|
"parser": {
|
||||||
|
"type": "string",
|
||||||
|
"parseSpec": {
|
||||||
|
"type": "tsv",
|
||||||
|
"timestampSpec": {
|
||||||
|
"column": "timestamp",
|
||||||
|
"format": "yyyyMMddHH"
|
||||||
|
},
|
||||||
|
"dimensionsSpec": {
|
||||||
|
"dimensions": [
|
||||||
|
"location",
|
||||||
|
"product"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"columns": [
|
||||||
|
"timestamp",
|
||||||
|
"location",
|
||||||
|
"product",
|
||||||
|
"other_metric",
|
||||||
|
"user_id_sketch"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"metricsSpec": [
|
||||||
|
{
|
||||||
|
"type": "thetaSketch",
|
||||||
|
"name": "other_metric",
|
||||||
|
"fieldName": "other_metric",
|
||||||
|
"size": 16384
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "thetaSketch",
|
||||||
|
"name": "user_id_sketch",
|
||||||
|
"fieldName": "user_id_sketch",
|
||||||
|
"size": 16384
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"granularitySpec": {
|
||||||
|
"type": "uniform",
|
||||||
|
"segmentGranularity": "DAY",
|
||||||
|
"queryGranularity": "DAY",
|
||||||
|
"intervals": [
|
||||||
|
"2014-10-20T00:00:00Z/P2W"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ioConfig": {
|
||||||
|
"type": "hadoop",
|
||||||
|
"inputSpec": {
|
||||||
|
"type": "static",
|
||||||
|
"paths": "%%HADOOP_TEST_PATH%%"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tuningConfig": {
|
||||||
|
"type": "hadoop",
|
||||||
|
"partitionsSpec": {
|
||||||
|
"assumeGrouped": true,
|
||||||
|
"targetPartitionSize": 75000,
|
||||||
|
"type": "hashed"
|
||||||
|
},
|
||||||
|
"jobProperties": {
|
||||||
|
"fs.permissions.umask-mode": "022"
|
||||||
|
},
|
||||||
|
"rowFlushBoundary": 10000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,295 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"description": "segmentMetadata_query",
|
||||||
|
"query": {
|
||||||
|
"queryType": "segmentMetadata",
|
||||||
|
"dataSource": "batchHadoop",
|
||||||
|
"merge": "true",
|
||||||
|
"intervals": "2014-10/2014-12"
|
||||||
|
},
|
||||||
|
"expectedResults": [
|
||||||
|
{
|
||||||
|
"intervals": [
|
||||||
|
"2014-10-20T00:00:00.000Z/2014-11-03T00:00:00.000Z"
|
||||||
|
],
|
||||||
|
"id": "merged",
|
||||||
|
"columns": {
|
||||||
|
"location": {
|
||||||
|
"type": "STRING",
|
||||||
|
"size": 10140,
|
||||||
|
"hasMultipleValues": false,
|
||||||
|
"minValue": "location_1",
|
||||||
|
"maxValue": "location_5",
|
||||||
|
"cardinality": 5,
|
||||||
|
"errorMessage": null
|
||||||
|
},
|
||||||
|
"user_id_sketch": {
|
||||||
|
"type": "thetaSketch",
|
||||||
|
"size": 0,
|
||||||
|
"hasMultipleValues": false,
|
||||||
|
"minValue": null,
|
||||||
|
"maxValue": null,
|
||||||
|
"cardinality": null,
|
||||||
|
"errorMessage": null
|
||||||
|
},
|
||||||
|
"other_metric": {
|
||||||
|
"type": "thetaSketch",
|
||||||
|
"size": 0,
|
||||||
|
"hasMultipleValues": false,
|
||||||
|
"minValue": null,
|
||||||
|
"maxValue": null,
|
||||||
|
"cardinality": null,
|
||||||
|
"errorMessage": null
|
||||||
|
},
|
||||||
|
"__time": {
|
||||||
|
"type": "LONG",
|
||||||
|
"size": 10140,
|
||||||
|
"hasMultipleValues": false,
|
||||||
|
"minValue": null,
|
||||||
|
"maxValue": null,
|
||||||
|
"cardinality": null,
|
||||||
|
"errorMessage": null
|
||||||
|
},
|
||||||
|
"product": {
|
||||||
|
"type": "STRING",
|
||||||
|
"size": 9531,
|
||||||
|
"hasMultipleValues": false,
|
||||||
|
"minValue": "product_1",
|
||||||
|
"maxValue": "product_9",
|
||||||
|
"cardinality": 15,
|
||||||
|
"errorMessage": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"size": 34881,
|
||||||
|
"numRows": 1014,
|
||||||
|
"aggregators": null
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "time_boundary_query",
|
||||||
|
"query": {
|
||||||
|
"queryType": "timeBoundary",
|
||||||
|
"dataSource": "batchHadoop"
|
||||||
|
},
|
||||||
|
"expectedResults": [
|
||||||
|
{
|
||||||
|
"result": {
|
||||||
|
"maxTime": "2014-11-02T00:00:00.000Z",
|
||||||
|
"minTime": "2014-10-20T00:00:00.000Z"
|
||||||
|
},
|
||||||
|
"timestamp": "2014-10-20T00:00:00.000Z"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "unique_query3",
|
||||||
|
"query": {
|
||||||
|
"queryType": "groupBy",
|
||||||
|
"dataSource": {
|
||||||
|
"name": "batchHadoop",
|
||||||
|
"type": "table"
|
||||||
|
},
|
||||||
|
"dimensions": [],
|
||||||
|
"granularity": {
|
||||||
|
"period": "P1D",
|
||||||
|
"type": "period"
|
||||||
|
},
|
||||||
|
"intervals": [
|
||||||
|
"2014-10-19T00:00:00.000Z/2014-11-05T00:00:00.000Z"
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"type": "or",
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"type": "selector",
|
||||||
|
"dimension": "product",
|
||||||
|
"value": "product_1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "selector",
|
||||||
|
"dimension": "product",
|
||||||
|
"value": "product_7"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"aggregations": [
|
||||||
|
{
|
||||||
|
"type": "filtered",
|
||||||
|
"filter": {
|
||||||
|
"type": "selector",
|
||||||
|
"dimension": "product",
|
||||||
|
"value": "product_1"
|
||||||
|
},
|
||||||
|
"aggregator": {
|
||||||
|
"type": "thetaSketch",
|
||||||
|
"name": "unique1",
|
||||||
|
"fieldName": "user_id_sketch"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "filtered",
|
||||||
|
"filter": {
|
||||||
|
"type": "selector",
|
||||||
|
"dimension": "product",
|
||||||
|
"value": "product_7"
|
||||||
|
},
|
||||||
|
"aggregator": {
|
||||||
|
"type": "thetaSketch",
|
||||||
|
"name": "unique7",
|
||||||
|
"fieldName": "user_id_sketch"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"postAggregations": [
|
||||||
|
{
|
||||||
|
"type": "thetaSketchEstimate",
|
||||||
|
"name": "final_unique",
|
||||||
|
"field": {
|
||||||
|
"type": "thetaSketchSetOp",
|
||||||
|
"name": "final_unique_sketch",
|
||||||
|
"func": "INTERSECT",
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"type": "fieldAccess",
|
||||||
|
"fieldName": "unique1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "fieldAccess",
|
||||||
|
"fieldName": "unique7"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"expectedResults": [
|
||||||
|
{
|
||||||
|
"version": "v1",
|
||||||
|
"timestamp": "2014-10-20T00:00:00.000Z",
|
||||||
|
"event": {
|
||||||
|
"unique1": 16.0,
|
||||||
|
"unique7": 17.0,
|
||||||
|
"final_unique": 8.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "v1",
|
||||||
|
"timestamp": "2014-10-21T00:00:00.000Z",
|
||||||
|
"event": {
|
||||||
|
"unique1": 8.0,
|
||||||
|
"unique7": 17.0,
|
||||||
|
"final_unique": 5.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "v1",
|
||||||
|
"timestamp": "2014-10-22T00:00:00.000Z",
|
||||||
|
"event": {
|
||||||
|
"unique1": 14.0,
|
||||||
|
"unique7": 11.0,
|
||||||
|
"final_unique": 3.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "v1",
|
||||||
|
"timestamp": "2014-10-23T00:00:00.000Z",
|
||||||
|
"event": {
|
||||||
|
"unique1": 12.0,
|
||||||
|
"unique7": 14.0,
|
||||||
|
"final_unique": 3.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "v1",
|
||||||
|
"timestamp": "2014-10-24T00:00:00.000Z",
|
||||||
|
"event": {
|
||||||
|
"unique1": 14.0,
|
||||||
|
"unique7": 11.0,
|
||||||
|
"final_unique": 3.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "v1",
|
||||||
|
"timestamp": "2014-10-25T00:00:00.000Z",
|
||||||
|
"event": {
|
||||||
|
"unique1": 11.0,
|
||||||
|
"unique7": 14.0,
|
||||||
|
"final_unique": 4.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "v1",
|
||||||
|
"timestamp": "2014-10-26T00:00:00.000Z",
|
||||||
|
"event": {
|
||||||
|
"unique1": 16.0,
|
||||||
|
"unique7": 13.0,
|
||||||
|
"final_unique": 5.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "v1",
|
||||||
|
"timestamp": "2014-10-27T00:00:00.000Z",
|
||||||
|
"event": {
|
||||||
|
"unique1": 17.0,
|
||||||
|
"unique7": 13.0,
|
||||||
|
"final_unique": 3.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "v1",
|
||||||
|
"timestamp": "2014-10-28T00:00:00.000Z",
|
||||||
|
"event": {
|
||||||
|
"unique1": 15.0,
|
||||||
|
"unique7": 16.0,
|
||||||
|
"final_unique": 7.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "v1",
|
||||||
|
"timestamp": "2014-10-29T00:00:00.000Z",
|
||||||
|
"event": {
|
||||||
|
"unique1": 11.0,
|
||||||
|
"unique7": 15.0,
|
||||||
|
"final_unique": 3.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "v1",
|
||||||
|
"timestamp": "2014-10-30T00:00:00.000Z",
|
||||||
|
"event": {
|
||||||
|
"unique1": 14.0,
|
||||||
|
"unique7": 10.0,
|
||||||
|
"final_unique": 3.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "v1",
|
||||||
|
"timestamp": "2014-10-31T00:00:00.000Z",
|
||||||
|
"event": {
|
||||||
|
"unique1": 17.0,
|
||||||
|
"unique7": 12.0,
|
||||||
|
"final_unique": 5.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "v1",
|
||||||
|
"timestamp": "2014-11-01T00:00:00.000Z",
|
||||||
|
"event": {
|
||||||
|
"unique1": 18.0,
|
||||||
|
"unique7": 18.0,
|
||||||
|
"final_unique": 7.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "v1",
|
||||||
|
"timestamp": "2014-11-02T00:00:00.000Z",
|
||||||
|
"event": {
|
||||||
|
"unique1": 16.0,
|
||||||
|
"unique7": 17.0,
|
||||||
|
"final_unique": 3.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
|
@ -24,7 +24,9 @@
|
||||||
</listeners>
|
</listeners>
|
||||||
<test name="AllTests">
|
<test name="AllTests">
|
||||||
<packages>
|
<packages>
|
||||||
<package name="io.druid.tests.*"/>
|
<package name="io.druid.tests.*">
|
||||||
|
<exclude name="io.druid.tests.hadoop">
|
||||||
|
</package>
|
||||||
</packages>
|
</packages>
|
||||||
</test>
|
</test>
|
||||||
</suite>
|
</suite>
|
||||||
|
|
Loading…
Reference in New Issue