embulk-output-parquet 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e731ad9c445bd5adef66ce8c994fa73dca87252e
4
- data.tar.gz: 392706f907d2dd684f2d2778863ae7dd28e4dfca
3
+ metadata.gz: 887eeba43ad66ae6159048504e253542162a8988
4
+ data.tar.gz: a04dba91a7abeecc957d7265f809c9bf1276ae0e
5
5
  SHA512:
6
- metadata.gz: ed522bf62b23bd0d236c945f4bbffcd3991d86ed93a835bae4739a3be96717e83ed0f584bdd968330ee426a8fd81e3d2cde11090605050bf2d9a3d70d700c603
7
- data.tar.gz: a3e6429370cfaefc7e777f8ba27912049d9649e51b8574330b957e2495a29640466e68f8173f052f6c881c33564efbc49fb4b301d59ae9f4b21ce7b58039b684
6
+ metadata.gz: 56ec1d8ad587e73a97ad769bbaad04793bb28ccf9119c638cde85e6dd38e06626fe8343ecfa9cc2e497cec78724366c2f3d8fdd7656b892c44ad32d9c4d65718
7
+ data.tar.gz: a99aa07e1b1507c6d375c4d2a21fa6d99341bf72f4022059eda90c88900f7597f687be5baed3c26728187212f59028e8679906fc8f6bba02795e1927f5e1ddcd
data/README.md CHANGED
@@ -19,13 +19,19 @@
19
19
  - **default_timestamp_format**: Format of timestamp columns. This can be overwritten for each column using column_options
20
20
  - **column_options**: Specify timezone and timestamp format for each column. Format of this option is the same as the official csv formatter. See [document](
21
21
  http://www.embulk.org/docs/built-in.html#csv-formatter-plugin).
22
+ - **extra_configurations**: Add extra entries to Configuration which will be passed to ParquetWriter
23
+ - **overwrite**: Overwrite if output files already exist. (default: fail if files exist)
22
24
 
23
25
  ## Example
24
26
 
25
27
  ```yaml
26
28
  out:
27
29
  type: parquet
28
- path_prefix: file:///data/output
30
+ path_prefix: s3a://bucket/keys
31
+ extra_configuration:
32
+ fs.s3a.access.key: 'your_access_key'
33
+ fs.s3a.secret.key: 'your_secret_access_key'
34
+
29
35
  ```
30
36
 
31
37
  ## Build
data/build.gradle CHANGED
@@ -7,25 +7,22 @@ import com.github.jrubygradle.JRubyExec
7
7
  repositories {
8
8
  mavenCentral()
9
9
  jcenter()
10
- maven {
11
- url "http://maven.twttr.com/"
12
- }
13
10
  }
14
11
  configurations {
15
12
  provided
16
13
  runtime.exclude group: "org.slf4j", module: "slf4j-log4j12"
17
14
  }
18
15
 
19
- version = "0.3.0"
16
+ version = "0.4.0"
20
17
 
21
18
  dependencies {
22
19
  compile "org.embulk:embulk-core:0.7.10"
23
20
  provided "org.embulk:embulk-core:0.7.10"
24
21
 
25
- compile "com.twitter:parquet-hadoop:1.5.0"
26
- compile "org.apache.hadoop:hadoop-client:2.6.0"
22
+ compile "org.apache.parquet:parquet-hadoop:1.8.1"
23
+ compile "org.apache.hadoop:hadoop-client:2.7.1"
24
+ compile "org.apache.hadoop:hadoop-aws:2.7.1"
27
25
  compile "org.xerial.snappy:snappy-java:1.1.1.6"
28
- compile "org.apache.hadoop:hadoop-aws:2.6.0"
29
26
 
30
27
  testCompile "junit:junit:4.+"
31
28
  testCompile "org.embulk:embulk-core:0.7.7:tests"
@@ -1,19 +1,19 @@
1
1
  package org.embulk.output;
2
2
 
3
3
  import org.apache.hadoop.conf.Configuration;
4
+ import org.apache.parquet.hadoop.api.WriteSupport;
5
+ import org.apache.parquet.io.api.Binary;
6
+ import org.apache.parquet.io.api.RecordConsumer;
7
+ import org.apache.parquet.schema.MessageType;
8
+ import org.apache.parquet.schema.PrimitiveType;
9
+ import org.apache.parquet.schema.PrimitiveType.PrimitiveTypeName;
10
+ import org.apache.parquet.schema.Type;
4
11
  import org.embulk.spi.Column;
5
12
  import org.embulk.spi.ColumnVisitor;
6
13
  import org.embulk.spi.PageReader;
7
14
  import org.embulk.spi.Schema;
8
15
  import org.embulk.spi.time.Timestamp;
9
16
  import org.embulk.spi.time.TimestampFormatter;
10
- import parquet.hadoop.api.WriteSupport;
11
- import parquet.io.api.Binary;
12
- import parquet.io.api.RecordConsumer;
13
- import parquet.schema.MessageType;
14
- import parquet.schema.PrimitiveType;
15
- import parquet.schema.PrimitiveType.PrimitiveTypeName;
16
- import parquet.schema.Type;
17
17
 
18
18
  import java.util.ArrayList;
19
19
  import java.util.HashMap;
@@ -0,0 +1,30 @@
1
+ package org.embulk.output;
2
+
3
+ import org.apache.hadoop.conf.Configuration;
4
+ import org.apache.hadoop.fs.Path;
5
+ import org.apache.parquet.hadoop.ParquetWriter;
6
+ import org.apache.parquet.hadoop.api.WriteSupport;
7
+ import org.embulk.spi.PageReader;
8
+ import org.embulk.spi.Schema;
9
+ import org.embulk.spi.time.TimestampFormatter;
10
+
11
+ public class EmbulkWriterBuilder extends ParquetWriter.Builder<PageReader, EmbulkWriterBuilder> {
12
+ final Schema schema;
13
+ final TimestampFormatter[] timestampFormatters;
14
+
15
+ public EmbulkWriterBuilder(Path file, Schema schema, TimestampFormatter[] timestampFormatters) {
16
+ super(file);
17
+ this.schema = schema;
18
+ this.timestampFormatters = timestampFormatters;
19
+ }
20
+
21
+ @Override
22
+ protected EmbulkWriterBuilder self() {
23
+ return this;
24
+ }
25
+
26
+ @Override
27
+ protected WriteSupport<PageReader> getWriteSupport(Configuration conf) {
28
+ return new EmbulkWriteSupport(schema, timestampFormatters);
29
+ }
30
+ }
@@ -5,6 +5,9 @@ import org.apache.hadoop.conf.Configuration;
5
5
  import org.apache.hadoop.fs.LocalFileSystem;
6
6
  import org.apache.hadoop.fs.Path;
7
7
  import org.apache.hadoop.hdfs.DistributedFileSystem;
8
+ import org.apache.parquet.hadoop.ParquetFileWriter;
9
+ import org.apache.parquet.hadoop.ParquetWriter;
10
+ import org.apache.parquet.hadoop.metadata.CompressionCodecName;
8
11
  import org.embulk.config.Config;
9
12
  import org.embulk.config.ConfigDefault;
10
13
  import org.embulk.config.ConfigDiff;
@@ -20,9 +23,6 @@ import org.embulk.spi.Schema;
20
23
  import org.embulk.spi.TransactionalPageOutput;
21
24
  import org.embulk.spi.time.TimestampFormatter;
22
25
  import org.embulk.spi.util.Timestamps;
23
- import parquet.hadoop.ParquetWriter;
24
- import parquet.hadoop.api.WriteSupport;
25
- import parquet.hadoop.metadata.CompressionCodecName;
26
26
 
27
27
  import java.io.IOException;
28
28
  import java.util.List;
@@ -30,11 +30,9 @@ import java.util.Map;
30
30
 
31
31
  @SuppressWarnings("unused")
32
32
  public class ParquetOutputPlugin
33
- implements OutputPlugin
34
- {
33
+ implements OutputPlugin {
35
34
  public interface PluginTask
36
- extends Task, TimestampFormatter.Task
37
- {
35
+ extends Task, TimestampFormatter.Task {
38
36
  @Config("path_prefix")
39
37
  String getPathPrefix();
40
38
 
@@ -47,11 +45,13 @@ public class ParquetOutputPlugin
47
45
  String getSequenceFormat();
48
46
 
49
47
  @Config("block_size")
50
- @ConfigDefault("134217728") // 128M
48
+ @ConfigDefault("134217728")
49
+ // 128M
51
50
  int getBlockSize();
52
51
 
53
52
  @Config("page_size")
54
- @ConfigDefault("1048576") // 1M
53
+ @ConfigDefault("1048576")
54
+ // 1M
55
55
  int getPageSize();
56
56
 
57
57
  @Config("compression_codec")
@@ -61,16 +61,23 @@ public class ParquetOutputPlugin
61
61
  @Config("column_options")
62
62
  @ConfigDefault("{}")
63
63
  Map<String, TimestampColumnOption> getColumnOptions();
64
+
65
+ @Config("extra_configurations")
66
+ @ConfigDefault("{}")
67
+ Map<String, String> getExtraConfigurations();
68
+
69
+ @Config("overwrite")
70
+ @ConfigDefault("false")
71
+ boolean getOverwrite();
64
72
  }
65
73
 
66
74
  public interface TimestampColumnOption
67
- extends Task, TimestampFormatter.TimestampColumnOption
68
- { }
75
+ extends Task, TimestampFormatter.TimestampColumnOption {
76
+ }
69
77
 
70
78
  public ConfigDiff transaction(ConfigSource config,
71
- Schema schema, int processorCount,
72
- OutputPlugin.Control control)
73
- {
79
+ Schema schema, int processorCount,
80
+ OutputPlugin.Control control) {
74
81
  PluginTask task = config.loadConfig(PluginTask.class);
75
82
 
76
83
  //TODO
@@ -80,65 +87,78 @@ public class ParquetOutputPlugin
80
87
  }
81
88
 
82
89
  public ConfigDiff resume(TaskSource taskSource,
83
- Schema schema, int processorCount,
84
- OutputPlugin.Control control)
85
- {
90
+ Schema schema, int processorCount,
91
+ OutputPlugin.Control control) {
86
92
  throw new UnsupportedOperationException("parquet output plugin does not support resuming");
87
93
  }
88
94
 
89
95
  public void cleanup(TaskSource taskSource,
90
- Schema schema, int processorCount,
91
- List<TaskReport> successTaskReports)
92
- {
96
+ Schema schema, int processorCount,
97
+ List<TaskReport> successTaskReports) {
93
98
  //TODO
94
99
  }
95
100
 
96
- public TransactionalPageOutput open(TaskSource taskSource, final Schema schema, int processorIndex)
97
- {
101
+ public TransactionalPageOutput open(TaskSource taskSource, final Schema schema, int processorIndex) {
98
102
  PluginTask task = taskSource.loadTask(PluginTask.class);
99
103
 
104
+ final PageReader reader = new PageReader(schema);
105
+ final ParquetWriter<PageReader> writer = createWriter(task, schema, processorIndex);
106
+
107
+ return new ParquetTransactionalPageOutput(reader, writer);
108
+ }
109
+
110
+ private String buildPath(PluginTask task, int processorIndex) {
100
111
  final String pathPrefix = task.getPathPrefix();
101
112
  final String pathSuffix = task.getFileNameExtension();
102
113
  final String sequenceFormat = task.getSequenceFormat();
114
+ return pathPrefix + String.format(sequenceFormat, processorIndex) + pathSuffix;
115
+ }
116
+
117
+ private ParquetWriter<PageReader> createWriter(PluginTask task, Schema schema, int processorIndex) {
118
+ final TimestampFormatter[] timestampFormatters = Timestamps.newTimestampColumnFormatters(task, schema, task.getColumnOptions());
119
+
120
+ final Path path = new Path(buildPath(task, processorIndex));
103
121
  final CompressionCodecName codec = CompressionCodecName.valueOf(task.getCompressionCodec());
104
122
  final int blockSize = task.getBlockSize();
105
123
  final int pageSize = task.getPageSize();
124
+ final Configuration conf = createConfiguration(task.getExtraConfigurations());
125
+ final boolean overwrite = task.getOverwrite();
106
126
 
107
- final String path = pathPrefix + String.format(sequenceFormat, processorIndex) + pathSuffix;
108
-
109
- final PageReader reader = new PageReader(schema);
110
-
111
- final TimestampFormatter[] timestampFormatters = Timestamps.newTimestampColumnFormatters(task, schema, task.getColumnOptions());
112
- final EmbulkWriteSupport writeSupport = new EmbulkWriteSupport(schema, timestampFormatters);
113
- ParquetWriter<PageReader> writer = createParquetWriter(new Path(path), writeSupport, codec, blockSize, pageSize);
127
+ ParquetWriter<PageReader> writer = null;
128
+ try {
129
+ EmbulkWriterBuilder builder = new EmbulkWriterBuilder(path, schema, timestampFormatters)
130
+ .withCompressionCodec(codec)
131
+ .withRowGroupSize(blockSize)
132
+ .withPageSize(pageSize)
133
+ .withDictionaryPageSize(pageSize)
134
+ .withConf(conf);
135
+
136
+ if (overwrite) {
137
+ builder.withWriteMode(ParquetFileWriter.Mode.OVERWRITE);
138
+ }
114
139
 
115
- return new ParquetTransactionalPageOutput(reader, writer);
140
+ writer = builder.build();
141
+ } catch (IOException e) {
142
+ Throwables.propagate(e);
143
+ }
144
+ return writer;
116
145
  }
117
146
 
118
- private <T> ParquetWriter<T> createParquetWriter(Path path, WriteSupport<T> writeSupport, CompressionCodecName codec, int blockSize, int pageSize) {
119
- ParquetWriter<T> writer = null;
120
-
147
+ private Configuration createConfiguration(Map<String, String> extra) {
121
148
  Configuration conf = new Configuration();
149
+
150
+ // Default values
122
151
  conf.set("fs.hdfs.impl", DistributedFileSystem.class.getName());
123
152
  conf.set("fs.file.impl", LocalFileSystem.class.getName());
124
- conf.setClassLoader(this.getClass().getClassLoader());
125
153
 
126
- try {
127
- writer = new ParquetWriter<>(
128
- path,
129
- writeSupport,
130
- codec,
131
- blockSize,
132
- pageSize,
133
- pageSize,
134
- ParquetWriter.DEFAULT_IS_DICTIONARY_ENABLED,
135
- ParquetWriter.DEFAULT_IS_VALIDATING_ENABLED,
136
- ParquetWriter.DEFAULT_WRITER_VERSION,
137
- conf);
138
- } catch (IOException e) {
139
- Throwables.propagate(e);
154
+ // Optional values
155
+ for (Map.Entry<String, String> entry : extra.entrySet()) {
156
+ conf.set(entry.getKey(), entry.getValue());
140
157
  }
141
- return writer;
158
+
159
+ conf.setClassLoader(this.getClass().getClassLoader());
160
+
161
+ return conf;
142
162
  }
143
163
 
144
164
  class ParquetTransactionalPageOutput implements TransactionalPageOutput {
@@ -157,7 +177,7 @@ public class ParquetOutputPlugin
157
177
  while (reader.nextRecord()) {
158
178
  writer.write(reader);
159
179
  }
160
- } catch(IOException e) {
180
+ } catch (IOException e) {
161
181
  Throwables.propagate(e);
162
182
  }
163
183
  }
@@ -1,5 +1,6 @@
1
1
  package org.embulk.output;
2
2
 
3
+ import org.apache.hadoop.conf.Configuration;
3
4
  import org.embulk.EmbulkTestRuntime;
4
5
  import org.embulk.config.ConfigException;
5
6
  import org.embulk.config.ConfigSource;
@@ -7,6 +8,11 @@ import org.embulk.spi.Exec;
7
8
  import org.junit.Rule;
8
9
  import org.junit.Test;
9
10
 
11
+ import java.lang.reflect.InvocationTargetException;
12
+ import java.lang.reflect.Method;
13
+ import java.util.HashMap;
14
+ import java.util.Map;
15
+
10
16
  import static org.junit.Assert.*;
11
17
 
12
18
  public class ParquetOutputPluginTest {
@@ -24,6 +30,7 @@ public class ParquetOutputPluginTest {
24
30
  assertEquals(134217728, task.getBlockSize());
25
31
  assertEquals(1048576, task.getPageSize());
26
32
  assertEquals("UNCOMPRESSED", task.getCompressionCodec());
33
+ assertFalse(task.getOverwrite());
27
34
  }
28
35
 
29
36
  @Test(expected = ConfigException.class)
@@ -33,5 +40,25 @@ public class ParquetOutputPluginTest {
33
40
  config.loadConfig(ParquetOutputPlugin.PluginTask.class);
34
41
  }
35
42
 
43
+ @Test
44
+ public void checkExtraConfigurations() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
45
+ ConfigSource map = Exec.newConfigSource()
46
+ .set("foo", "bar");
47
+
48
+ ConfigSource config = Exec.newConfigSource()
49
+ .set("path_prefix", "test")
50
+ .setNested("extra_configurations", map);
51
+
52
+ ParquetOutputPlugin.PluginTask task = config.loadConfig(ParquetOutputPlugin.PluginTask.class);
53
+
54
+ Map<String, String> extra = task.getExtraConfigurations();
55
+ assertTrue(extra.containsKey("foo"));
56
+ assertEquals("bar", extra.get("foo"));
36
57
 
58
+ ParquetOutputPlugin plugin = new ParquetOutputPlugin();
59
+ Method method = ParquetOutputPlugin.class.getDeclaredMethod("createConfiguration", Map.class);
60
+ method.setAccessible(true);
61
+ Configuration conf = (Configuration) method.invoke(plugin, extra);
62
+ assertEquals("bar", conf.get("foo"));
63
+ }
37
64
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: embulk-output-parquet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OKUNO Akihiro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-18 00:00:00.000000000 Z
11
+ date: 2016-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -56,6 +56,7 @@ files:
56
56
  - gradlew.bat
57
57
  - lib/embulk/output/parquet.rb
58
58
  - src/main/java/org/embulk/output/EmbulkWriteSupport.java
59
+ - src/main/java/org/embulk/output/EmbulkWriterBuilder.java
59
60
  - src/main/java/org/embulk/output/ParquetOutputPlugin.java
60
61
  - src/test/java/org/embulk/output/ParquetOutputPluginTest.java
61
62
  - classpath/activation-1.1.jar
@@ -73,43 +74,40 @@ files:
73
74
  - classpath/commons-compress-1.4.1.jar
74
75
  - classpath/commons-configuration-1.6.jar
75
76
  - classpath/commons-digester-1.8.jar
76
- - classpath/commons-el-1.0.jar
77
77
  - classpath/commons-httpclient-3.1.jar
78
78
  - classpath/commons-io-2.4.jar
79
79
  - classpath/commons-lang-2.6.jar
80
80
  - classpath/commons-logging-1.1.3.jar
81
81
  - classpath/commons-math3-3.1.1.jar
82
82
  - classpath/commons-net-3.1.jar
83
- - classpath/curator-client-2.6.0.jar
84
- - classpath/curator-framework-2.6.0.jar
85
- - classpath/curator-recipes-2.6.0.jar
86
- - classpath/embulk-output-parquet-0.3.0.jar
83
+ - classpath/curator-client-2.7.1.jar
84
+ - classpath/curator-framework-2.7.1.jar
85
+ - classpath/curator-recipes-2.7.1.jar
86
+ - classpath/embulk-output-parquet-0.4.0.jar
87
87
  - classpath/gson-2.2.4.jar
88
- - classpath/hadoop-annotations-2.6.0.jar
89
- - classpath/hadoop-auth-2.6.0.jar
90
- - classpath/hadoop-aws-2.6.0.jar
91
- - classpath/hadoop-client-2.6.0.jar
92
- - classpath/hadoop-common-2.6.0.jar
93
- - classpath/hadoop-hdfs-2.6.0.jar
94
- - classpath/hadoop-mapreduce-client-app-2.6.0.jar
95
- - classpath/hadoop-mapreduce-client-common-2.6.0.jar
96
- - classpath/hadoop-mapreduce-client-core-2.6.0.jar
97
- - classpath/hadoop-mapreduce-client-jobclient-2.6.0.jar
98
- - classpath/hadoop-mapreduce-client-shuffle-2.6.0.jar
99
- - classpath/hadoop-yarn-api-2.6.0.jar
100
- - classpath/hadoop-yarn-client-2.6.0.jar
101
- - classpath/hadoop-yarn-common-2.6.0.jar
102
- - classpath/hadoop-yarn-server-common-2.6.0.jar
103
- - classpath/hadoop-yarn-server-nodemanager-2.6.0.jar
104
- - classpath/htrace-core-3.0.4.jar
88
+ - classpath/hadoop-annotations-2.7.1.jar
89
+ - classpath/hadoop-auth-2.7.1.jar
90
+ - classpath/hadoop-aws-2.7.1.jar
91
+ - classpath/hadoop-client-2.7.1.jar
92
+ - classpath/hadoop-common-2.7.1.jar
93
+ - classpath/hadoop-hdfs-2.7.1.jar
94
+ - classpath/hadoop-mapreduce-client-app-2.7.1.jar
95
+ - classpath/hadoop-mapreduce-client-common-2.7.1.jar
96
+ - classpath/hadoop-mapreduce-client-core-2.7.1.jar
97
+ - classpath/hadoop-mapreduce-client-jobclient-2.7.1.jar
98
+ - classpath/hadoop-mapreduce-client-shuffle-2.7.1.jar
99
+ - classpath/hadoop-yarn-api-2.7.1.jar
100
+ - classpath/hadoop-yarn-client-2.7.1.jar
101
+ - classpath/hadoop-yarn-common-2.7.1.jar
102
+ - classpath/hadoop-yarn-server-common-2.7.1.jar
103
+ - classpath/hadoop-yarn-server-nodemanager-2.7.1.jar
104
+ - classpath/htrace-core-3.1.0-incubating.jar
105
105
  - classpath/httpclient-4.2.5.jar
106
106
  - classpath/httpcore-4.2.4.jar
107
107
  - classpath/jackson-core-asl-1.9.13.jar
108
108
  - classpath/jackson-jaxrs-1.9.13.jar
109
109
  - classpath/jackson-mapper-asl-1.9.13.jar
110
110
  - classpath/jackson-xc-1.9.13.jar
111
- - classpath/jasper-compiler-5.5.23.jar
112
- - classpath/jasper-runtime-5.5.23.jar
113
111
  - classpath/java-xmlbuilder-0.4.jar
114
112
  - classpath/jaxb-api-2.2.2.jar
115
113
  - classpath/jaxb-impl-2.2.3-1.jar
@@ -126,18 +124,18 @@ files:
126
124
  - classpath/joda-time-2.9.1.jar
127
125
  - classpath/jsch-0.1.42.jar
128
126
  - classpath/jsp-api-2.1.jar
129
- - classpath/jsr305-1.3.9.jar
127
+ - classpath/jsr305-3.0.0.jar
130
128
  - classpath/leveldbjni-all-1.8.jar
131
129
  - classpath/log4j-1.2.17.jar
132
130
  - classpath/netty-3.7.0.Final.jar
131
+ - classpath/netty-all-4.0.23.Final.jar
133
132
  - classpath/paranamer-2.3.jar
134
- - classpath/parquet-column-1.5.0.jar
135
- - classpath/parquet-common-1.5.0.jar
136
- - classpath/parquet-encoding-1.5.0.jar
137
- - classpath/parquet-format-2.1.0.jar
138
- - classpath/parquet-generator-1.5.0.jar
139
- - classpath/parquet-hadoop-1.5.0.jar
140
- - classpath/parquet-jackson-1.5.0.jar
133
+ - classpath/parquet-column-1.8.1.jar
134
+ - classpath/parquet-common-1.8.1.jar
135
+ - classpath/parquet-encoding-1.8.1.jar
136
+ - classpath/parquet-format-2.3.0-incubating.jar
137
+ - classpath/parquet-hadoop-1.8.1.jar
138
+ - classpath/parquet-jackson-1.8.1.jar
141
139
  - classpath/protobuf-java-2.5.0.jar
142
140
  - classpath/servlet-api-2.5.jar
143
141
  - classpath/snappy-java-1.1.1.6.jar