package com.mongodb.hadoop.hive;
import com.jayway.awaitility.Awaitility;
import com.mongodb.hadoop.hive.output.HiveBSONFileOutputFormat;
import com.mongodb.hadoop.mapred.BSONFileInputFormat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.sql.SQLException;
import java.util.concurrent.Callable;
import static java.lang.String.format;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.MINUTES;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.junit.Assert.assertEquals;
public class TestBsonToHive extends HiveTest {
@Before
public void setUp() throws SQLException {
tearDown();
loadDataIntoBSONHiveTable(true);
createMongoBackedTable(false);
createEmptyHDFSHiveTable();
}
@After
public void tearDown() {
dropTable(BSON_BACKED_TABLE);
dropTable(MONGO_BACKED_TABLE);
dropTable(HDFS_BACKED_TABLE);
}
private void loadDataIntoBSONHiveTable(final boolean withLocation)
throws SQLException {
loadIntoHDFS(getPath("users.bson"), BSON_HDFS_TEST_PATH);
String cmd = format("CREATE TABLE %s %s\n"
+ "ROW FORMAT SERDE '%s'\n"
+ "STORED AS INPUTFORMAT '%s'\n"
+ "OUTPUTFORMAT '%s'",
BSON_BACKED_TABLE, TEST_SCHEMA, BSONSerDe.class.getName(), BSONFileInputFormat.class.getName(),
HiveBSONFileOutputFormat.class.getName()
);
if (withLocation) {
cmd += format("\nLOCATION '%s'", BSON_HDFS_TEST_PATH);
}
execute(cmd);
}
@Test
public void testSameDataMongoAndBSONHiveTables() throws SQLException {
testTransfer(BSON_BACKED_TABLE, MONGO_BACKED_TABLE);
}
@Test
public void testSameDataHDFSAndBSONHiveTables() throws SQLException {
testTransfer(BSON_BACKED_TABLE, MONGO_BACKED_TABLE);
}
private void testTransfer(final String from, final String to)
throws SQLException {
transferData(from, to);
Awaitility
.await()
.atMost(1, MINUTES)
.pollDelay(1, MILLISECONDS)
.pollInterval(3, SECONDS)
.until(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
return getAllDataFromTable(to).size() > 0;
}
});
assertEquals(getAllDataFromTable(to), getAllDataFromTable(from));
}
}