embulk-output-bigquery 0.1.2 → 0.1.3
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 +4 -4
- data/README.md +54 -13
- data/build.gradle +1 -1
- data/src/main/java/org/embulk/output/BigqueryAuthentication.java +42 -29
- data/src/main/java/org/embulk/output/BigqueryOutputPlugin.java +10 -8
- data/src/main/java/org/embulk/output/BigqueryWriter.java +12 -24
- metadata +3 -4
- data/LICENSE.txt +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b37d638ca9c217221687cdcadfbd45257291aef4
|
4
|
+
data.tar.gz: 972bf78e9ce75972fd3f2e1f77389a7383c3d2a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d18639e76da80f45e2852df8408ec4c9c655e06a77a776c42dfb52310cc787e8319fd8f182eef20c59ffd01e5939ccb3799b4a7bad5b20f416aa668d513b3e3
|
7
|
+
data.tar.gz: 5a37cded1558ba6f3fbb1d4c475c46a593151a32e831299c00c386185d32828ec72810c2334863f7e03cdc7a3b2d974e7d1ec0cf653276073e7d336398ae92ba
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
# embulk-output-bigquery
|
3
3
|
|
4
|
-
[Embulk](https://github.com/embulk/embulk/) output plugin to load/insert data into [Google BigQuery](https://cloud.google.com/bigquery/)
|
4
|
+
[Embulk](https://github.com/embulk/embulk/) output plugin to load/insert data into [Google BigQuery](https://cloud.google.com/bigquery/) using [direct insert](https://cloud.google.com/bigquery/loading-data-into-bigquery#loaddatapostrequest)
|
5
5
|
|
6
6
|
## Overview
|
7
7
|
|
@@ -16,7 +16,7 @@ https://developers.google.com/bigquery/loading-data-into-bigquery
|
|
16
16
|
### NOT IMPLEMENTED
|
17
17
|
* insert data over streaming inserts
|
18
18
|
* for continuous real-time insertions
|
19
|
-
*
|
19
|
+
* Please use other product, like [fluent-plugin-bigquery](https://github.com/kaizenplatform/fluent-plugin-bigquery)
|
20
20
|
* https://developers.google.com/bigquery/streaming-data-into-bigquery#usecases
|
21
21
|
|
22
22
|
Current version of this plugin supports Google API with Service Account Authentication, but does not support
|
@@ -24,8 +24,9 @@ OAuth flow for installed applications.
|
|
24
24
|
|
25
25
|
## Configuration
|
26
26
|
|
27
|
-
- **
|
28
|
-
- **
|
27
|
+
- **auth_method**: (private_key or compute_engine) (string, optional, default is private_key)
|
28
|
+
- **service_account_email**: your Google service account email (string, required when auth_method is private_key)
|
29
|
+
- **p12_keyfile_path**: fullpath of private key in P12(PKCS12) format (string, required when auth_method is private_key)
|
29
30
|
- **path_prefix**: (string, required)
|
30
31
|
- **sequence_format**: (string, optional, default is %03d.%02d)
|
31
32
|
- **file_ext**: (string, required)
|
@@ -42,13 +43,14 @@ OAuth flow for installed applications.
|
|
42
43
|
- **is_skip_job_result_check**: (boolean, optional, default is 0)
|
43
44
|
- **field_delimiter**: (string, optional, default is ",")
|
44
45
|
- **max_bad_records**: (int, optional, default is 0)
|
45
|
-
- **encoding**: (UTF-8 or ISO-8859-1) (string, optional, default is
|
46
|
+
- **encoding**: (UTF-8 or ISO-8859-1) (string, optional, default is UTF-8)
|
46
47
|
|
47
|
-
|
48
|
+
### Example
|
48
49
|
|
49
50
|
```yaml
|
50
51
|
out:
|
51
52
|
type: bigquery
|
53
|
+
auth_method: private_key # default
|
52
54
|
service_account_email: ABCXYZ123ABCXYZ123.gserviceaccount.com
|
53
55
|
p12_keyfile_path: /path/to/p12_keyfile.p12
|
54
56
|
path_prefix: /path/to/output
|
@@ -64,19 +66,58 @@ out:
|
|
64
66
|
- {type: gzip}
|
65
67
|
```
|
66
68
|
|
67
|
-
|
69
|
+
### Authentication
|
70
|
+
|
71
|
+
There are two methods supported to fetch access token for the service account.
|
72
|
+
|
73
|
+
1. Public-Private key pair
|
74
|
+
2. Predefined access token (Compute Engine only)
|
75
|
+
|
76
|
+
The examples above use the first one. You first need to create a service account (client ID),
|
77
|
+
download its private key and deploy the key with embulk.
|
78
|
+
|
79
|
+
On the other hand, you don't need to explicitly create a service account for embulk when you
|
80
|
+
run embulk in Google Compute Engine. In this second authentication method, you need to
|
81
|
+
add the API scope "https://www.googleapis.com/auth/bigquery" to the scope list of your
|
82
|
+
Compute Engine instance, then you can configure embulk like this.
|
83
|
+
|
84
|
+
```yaml
|
85
|
+
out:
|
86
|
+
type: bigquery
|
87
|
+
auth_method: compute_engine
|
88
|
+
```
|
89
|
+
|
90
|
+
### Table id formatting
|
91
|
+
|
92
|
+
`table` and option accept [Time#strftime](http://ruby-doc.org/core-1.9.3/Time.html#method-i-strftime)
|
93
|
+
format to construct table ids.
|
94
|
+
Table ids are formatted at runtime
|
95
|
+
using the local time of the embulk server.
|
96
|
+
|
97
|
+
For example, with the configuration below,
|
98
|
+
data is inserted into tables `table_2015_04`, `table_2015_05` and so on.
|
99
|
+
|
100
|
+
```yaml
|
101
|
+
out:
|
102
|
+
type: bigquery
|
103
|
+
table: table_%Y_%m
|
104
|
+
```
|
105
|
+
|
106
|
+
### Dynamic table creating
|
68
107
|
|
69
108
|
When `auto_create_table` is set to true, try to create the table using BigQuery API.
|
70
109
|
|
110
|
+
If table already exists, insert into it.
|
111
|
+
|
71
112
|
To describe the schema of the target table, please write schema path.
|
72
113
|
|
73
|
-
`table` option accept [Time#strftime](http://ruby-doc.org/core-1.9.3/Time.html#method-i-strftime)
|
74
|
-
format of ruby to construct table name.
|
75
114
|
|
76
|
-
```
|
77
|
-
|
78
|
-
|
79
|
-
|
115
|
+
```yaml
|
116
|
+
out:
|
117
|
+
type: bigquery
|
118
|
+
auto_create_table: true
|
119
|
+
table: table_%Y_%m
|
120
|
+
schema_path: /path/to/schema.json
|
80
121
|
```
|
81
122
|
|
82
123
|
## Build
|
data/build.gradle
CHANGED
@@ -1,44 +1,38 @@
|
|
1
1
|
package org.embulk.output;
|
2
2
|
|
3
3
|
import java.io.File;
|
4
|
-
import java.io.FileNotFoundException;
|
5
|
-
import java.io.FileInputStream;
|
6
4
|
import java.io.IOException;
|
7
|
-
|
8
|
-
import
|
9
|
-
import java.util.IllegalFormatException;
|
10
|
-
import com.google.api.client.auth.oauth2.Credential;
|
11
|
-
import com.google.api.client.auth.oauth2.CredentialRefreshListener;
|
12
|
-
import com.google.api.client.auth.oauth2.TokenErrorResponse;
|
13
|
-
import com.google.api.client.auth.oauth2.TokenResponse;
|
5
|
+
|
6
|
+
import com.google.common.base.Optional;
|
14
7
|
import com.google.common.collect.ImmutableList;
|
15
8
|
import java.security.GeneralSecurityException;
|
16
9
|
|
17
|
-
import org.embulk.spi.Exec;
|
18
|
-
import org.slf4j.Logger;
|
19
|
-
|
20
10
|
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
|
11
|
+
import com.google.api.client.googleapis.compute.ComputeCredential;
|
21
12
|
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
|
22
13
|
import com.google.api.client.http.HttpTransport;
|
23
|
-
import com.google.api.client.http.InputStreamContent;
|
24
14
|
import com.google.api.client.json.JsonFactory;
|
25
15
|
import com.google.api.client.json.jackson2.JacksonFactory;
|
16
|
+
import com.google.api.client.http.HttpRequestInitializer;
|
17
|
+
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
|
26
18
|
import com.google.api.services.bigquery.Bigquery;
|
27
19
|
import com.google.api.services.bigquery.BigqueryScopes;
|
28
20
|
import com.google.api.services.bigquery.model.ProjectList;
|
21
|
+
import org.embulk.spi.Exec;
|
22
|
+
import org.slf4j.Logger;
|
29
23
|
|
30
24
|
public class BigqueryAuthentication
|
31
25
|
{
|
32
|
-
|
33
26
|
private final Logger log = Exec.getLogger(BigqueryAuthentication.class);
|
34
|
-
private final String serviceAccountEmail;
|
35
|
-
private final String p12KeyFilePath;
|
27
|
+
private final Optional<String> serviceAccountEmail;
|
28
|
+
private final Optional<String> p12KeyFilePath;
|
36
29
|
private final String applicationName;
|
37
30
|
private final HttpTransport httpTransport;
|
38
31
|
private final JsonFactory jsonFactory;
|
39
|
-
private final
|
32
|
+
private final HttpRequestInitializer credentials;
|
40
33
|
|
41
|
-
public BigqueryAuthentication(String serviceAccountEmail, String p12KeyFilePath, String applicationName)
|
34
|
+
public BigqueryAuthentication(String authMethod, Optional<String> serviceAccountEmail, Optional<String> p12KeyFilePath, String applicationName)
|
35
|
+
throws IOException, GeneralSecurityException
|
42
36
|
{
|
43
37
|
this.serviceAccountEmail = serviceAccountEmail;
|
44
38
|
this.p12KeyFilePath = p12KeyFilePath;
|
@@ -46,41 +40,60 @@ public class BigqueryAuthentication
|
|
46
40
|
|
47
41
|
this.httpTransport = GoogleNetHttpTransport.newTrustedTransport();
|
48
42
|
this.jsonFactory = new JacksonFactory();
|
49
|
-
|
43
|
+
|
44
|
+
if (authMethod.toLowerCase().equals("compute_engine")) {
|
45
|
+
this.credentials = getComputeCredential();
|
46
|
+
} else {
|
47
|
+
this.credentials = getServiceAccountCredential();
|
48
|
+
}
|
50
49
|
}
|
51
50
|
|
52
51
|
/**
|
53
52
|
* @see https://developers.google.com/accounts/docs/OAuth2ServiceAccount#authorizingrequests
|
54
53
|
*/
|
55
|
-
private GoogleCredential
|
54
|
+
private GoogleCredential getServiceAccountCredential() throws IOException, GeneralSecurityException
|
56
55
|
{
|
57
56
|
// @see https://cloud.google.com/compute/docs/api/how-tos/authorization
|
58
57
|
// @see https://developers.google.com/resources/api-libraries/documentation/storage/v1/java/latest/com/google/api/services/storage/STORAGE_SCOPE.html
|
59
|
-
|
58
|
+
// @see https://developers.google.com/resources/api-libraries/documentation/bigquery/v2/java/latest/com/google/api/services/bigquery/BigqueryScopes.html
|
59
|
+
return new GoogleCredential.Builder()
|
60
60
|
.setTransport(httpTransport)
|
61
61
|
.setJsonFactory(jsonFactory)
|
62
|
-
.setServiceAccountId(serviceAccountEmail)
|
62
|
+
.setServiceAccountId(serviceAccountEmail.orNull())
|
63
63
|
.setServiceAccountScopes(
|
64
64
|
ImmutableList.of(
|
65
65
|
BigqueryScopes.BIGQUERY
|
66
66
|
)
|
67
67
|
)
|
68
|
-
.setServiceAccountPrivateKeyFromP12File(new File(p12KeyFilePath))
|
68
|
+
.setServiceAccountPrivateKeyFromP12File(new File(p12KeyFilePath.orNull()))
|
69
69
|
.build();
|
70
|
-
return cred;
|
71
70
|
}
|
72
71
|
|
73
|
-
|
72
|
+
/**
|
73
|
+
* @see http://developers.guge.io/accounts/docs/OAuth2ServiceAccount#creatinganaccount
|
74
|
+
* @see https://developers.google.com/accounts/docs/OAuth2
|
75
|
+
*/
|
76
|
+
private ComputeCredential getComputeCredential() throws IOException
|
77
|
+
{
|
78
|
+
ComputeCredential credential = new ComputeCredential.Builder(httpTransport, jsonFactory)
|
79
|
+
.build();
|
80
|
+
credential.refreshToken();
|
81
|
+
|
82
|
+
//log.debug("access_token:" + credential.getAccessToken());
|
83
|
+
log.debug("access_token expired:" + credential.getExpiresInSeconds());
|
84
|
+
|
85
|
+
return credential;
|
86
|
+
}
|
87
|
+
|
88
|
+
public Bigquery getBigqueryClient() throws GoogleJsonResponseException, IOException
|
74
89
|
{
|
75
90
|
Bigquery client = new Bigquery.Builder(httpTransport, jsonFactory, credentials)
|
76
|
-
.setHttpRequestInitializer(credentials)
|
77
91
|
.setApplicationName(applicationName)
|
78
92
|
.build();
|
79
93
|
|
80
|
-
// For throw IOException when authentication is
|
94
|
+
// For throw IOException when authentication is fail.
|
81
95
|
long maxResults = 1;
|
82
|
-
|
83
|
-
ProjectList projectList = req.execute();
|
96
|
+
ProjectList projectList = client.projects().list().setMaxResults(maxResults).execute();
|
84
97
|
|
85
98
|
return client;
|
86
99
|
}
|
@@ -1,14 +1,11 @@
|
|
1
1
|
package org.embulk.output;
|
2
2
|
|
3
3
|
import java.io.File;
|
4
|
-
import java.io.FileWriter;
|
5
4
|
import java.io.FileNotFoundException;
|
6
5
|
import java.io.FileOutputStream;
|
7
6
|
import java.io.BufferedOutputStream;
|
8
7
|
import java.io.IOException;
|
9
8
|
import java.util.List;
|
10
|
-
import java.util.ArrayList;
|
11
|
-
import java.util.HashMap;
|
12
9
|
import java.util.concurrent.TimeoutException;
|
13
10
|
import com.google.common.base.Optional;
|
14
11
|
import com.google.common.base.Throwables;
|
@@ -36,11 +33,17 @@ public class BigqueryOutputPlugin
|
|
36
33
|
public interface PluginTask
|
37
34
|
extends Task
|
38
35
|
{
|
36
|
+
@Config("auth_method")
|
37
|
+
@ConfigDefault("\"private_key\"")
|
38
|
+
public String getAuthMethod();
|
39
|
+
|
39
40
|
@Config("service_account_email")
|
40
|
-
|
41
|
+
@ConfigDefault("null")
|
42
|
+
public Optional<String> getServiceAccountEmail();
|
41
43
|
|
42
44
|
@Config("p12_keyfile_path")
|
43
|
-
|
45
|
+
@ConfigDefault("null")
|
46
|
+
public Optional<String> getP12KeyfilePath();
|
44
47
|
|
45
48
|
@Config("application_name")
|
46
49
|
@ConfigDefault("\"Embulk BigQuery plugin\"")
|
@@ -115,7 +118,8 @@ public class BigqueryOutputPlugin
|
|
115
118
|
final PluginTask task = config.loadConfig(PluginTask.class);
|
116
119
|
|
117
120
|
try {
|
118
|
-
bigQueryWriter = new BigqueryWriter.Builder(task.
|
121
|
+
bigQueryWriter = new BigqueryWriter.Builder(task.getAuthMethod())
|
122
|
+
.setServiceAccountEmail(task.getServiceAccountEmail())
|
119
123
|
.setP12KeyFilePath(task.getP12KeyfilePath())
|
120
124
|
.setApplicationName(task.getApplicationName())
|
121
125
|
.setProject(task.getProject())
|
@@ -170,8 +174,6 @@ public class BigqueryOutputPlugin
|
|
170
174
|
private BufferedOutputStream output = null;
|
171
175
|
private File file;
|
172
176
|
private String filePath;
|
173
|
-
private String fileName;
|
174
|
-
private long fileSize;
|
175
177
|
|
176
178
|
public void nextFile()
|
177
179
|
{
|
@@ -6,19 +6,11 @@ import java.io.FileNotFoundException;
|
|
6
6
|
import java.io.FileInputStream;
|
7
7
|
import java.io.BufferedInputStream;
|
8
8
|
import com.google.api.client.http.InputStreamContent;
|
9
|
-
import java.util.ArrayList;
|
10
9
|
import java.util.List;
|
11
|
-
import java.util.Iterator;
|
12
|
-
import java.util.HashMap;
|
13
|
-
import java.util.IllegalFormatException;
|
14
|
-
import java.util.concurrent.Callable;
|
15
10
|
import java.util.concurrent.TimeoutException;
|
16
|
-
import org.apache.commons.lang3.StringUtils;
|
17
11
|
import com.google.common.base.Optional;
|
18
|
-
import com.google.common.collect.ImmutableSet;
|
19
12
|
import com.google.common.base.Throwables;
|
20
13
|
import java.security.GeneralSecurityException;
|
21
|
-
|
22
14
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
23
15
|
import com.fasterxml.jackson.core.type.TypeReference;
|
24
16
|
|
@@ -26,31 +18,21 @@ import org.embulk.spi.Exec;
|
|
26
18
|
import org.slf4j.Logger;
|
27
19
|
|
28
20
|
import com.google.api.services.bigquery.Bigquery;
|
29
|
-
import com.google.api.services.bigquery.BigqueryScopes;
|
30
|
-
import com.google.api.services.bigquery.Bigquery.Datasets;
|
31
21
|
import com.google.api.services.bigquery.Bigquery.Tables;
|
32
22
|
import com.google.api.services.bigquery.Bigquery.Jobs.Insert;
|
33
|
-
import com.google.api.services.bigquery.Bigquery.Jobs.GetQueryResults;
|
34
23
|
import com.google.api.services.bigquery.model.Job;
|
35
24
|
import com.google.api.services.bigquery.model.JobConfiguration;
|
36
25
|
import com.google.api.services.bigquery.model.JobConfigurationLoad;
|
37
|
-
import com.google.api.services.bigquery.model.JobStatus;
|
38
26
|
import com.google.api.services.bigquery.model.JobStatistics;
|
39
27
|
import com.google.api.services.bigquery.model.JobReference;
|
40
|
-
import com.google.api.services.bigquery.model.DatasetList;
|
41
28
|
import com.google.api.services.bigquery.model.Table;
|
42
|
-
import com.google.api.services.bigquery.model.TableList;
|
43
29
|
import com.google.api.services.bigquery.model.TableSchema;
|
44
30
|
import com.google.api.services.bigquery.model.TableReference;
|
45
31
|
import com.google.api.services.bigquery.model.TableFieldSchema;
|
46
|
-
import com.google.api.services.bigquery.model.TableCell;
|
47
|
-
import com.google.api.services.bigquery.model.TableRow;
|
48
32
|
import com.google.api.services.bigquery.model.ErrorProto;
|
49
33
|
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
|
50
|
-
|
51
34
|
import com.google.api.client.googleapis.media.MediaHttpUploader;
|
52
35
|
import com.google.api.client.googleapis.media.MediaHttpUploaderProgressListener;
|
53
|
-
import com.google.api.client.googleapis.media.MediaHttpUploader.UploadState;
|
54
36
|
|
55
37
|
public class BigqueryWriter
|
56
38
|
{
|
@@ -86,7 +68,7 @@ public class BigqueryWriter
|
|
86
68
|
this.jobStatusPollingInterval = builder.jobStatusPollingInterval;
|
87
69
|
this.isSkipJobResultCheck = builder.isSkipJobResultCheck;
|
88
70
|
|
89
|
-
BigqueryAuthentication auth = new BigqueryAuthentication(builder.serviceAccountEmail, builder.p12KeyFilePath, builder.applicationName);
|
71
|
+
BigqueryAuthentication auth = new BigqueryAuthentication(builder.authMethod, builder.serviceAccountEmail, builder.p12KeyFilePath, builder.applicationName);
|
90
72
|
this.bigQueryClient = auth.getBigqueryClient();
|
91
73
|
|
92
74
|
checkConfig();
|
@@ -252,7 +234,7 @@ public class BigqueryWriter
|
|
252
234
|
{
|
253
235
|
if (autoCreateTable) {
|
254
236
|
if (!schemaPath.isPresent()) {
|
255
|
-
throw new
|
237
|
+
throw new FileNotFoundException("schema_path is empty");
|
256
238
|
} else {
|
257
239
|
File file = new File(schemaPath.orNull());
|
258
240
|
if (!file.exists()) {
|
@@ -296,8 +278,9 @@ public class BigqueryWriter
|
|
296
278
|
|
297
279
|
public static class Builder
|
298
280
|
{
|
299
|
-
private final String
|
300
|
-
private String
|
281
|
+
private final String authMethod;
|
282
|
+
private Optional<String> serviceAccountEmail;
|
283
|
+
private Optional<String> p12KeyFilePath;
|
301
284
|
private String applicationName;
|
302
285
|
private String project;
|
303
286
|
private String dataset;
|
@@ -312,13 +295,18 @@ public class BigqueryWriter
|
|
312
295
|
private int jobStatusPollingInterval;
|
313
296
|
private boolean isSkipJobResultCheck;
|
314
297
|
|
298
|
+
public Builder(String authMethod)
|
299
|
+
{
|
300
|
+
this.authMethod = authMethod;
|
301
|
+
}
|
315
302
|
|
316
|
-
public Builder(String serviceAccountEmail)
|
303
|
+
public Builder setServiceAccountEmail(Optional<String> serviceAccountEmail)
|
317
304
|
{
|
318
305
|
this.serviceAccountEmail = serviceAccountEmail;
|
306
|
+
return this;
|
319
307
|
}
|
320
308
|
|
321
|
-
public Builder setP12KeyFilePath(String p12KeyFilePath)
|
309
|
+
public Builder setP12KeyFilePath(Optional<String> p12KeyFilePath)
|
322
310
|
{
|
323
311
|
this.p12KeyFilePath = p12KeyFilePath;
|
324
312
|
return this;
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: embulk-output-bigquery
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Satoshi Akama
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -46,7 +46,6 @@ extensions: []
|
|
46
46
|
extra_rdoc_files: []
|
47
47
|
files:
|
48
48
|
- .gitignore
|
49
|
-
- LICENSE.txt
|
50
49
|
- README.md
|
51
50
|
- build.gradle
|
52
51
|
- gradle/wrapper/gradle-wrapper.jar
|
@@ -63,7 +62,7 @@ files:
|
|
63
62
|
- src/test/java/org/embulk/output/TestBigqueryWriter.java
|
64
63
|
- classpath/commons-codec-1.3.jar
|
65
64
|
- classpath/commons-logging-1.1.1.jar
|
66
|
-
- classpath/embulk-output-bigquery-0.1.
|
65
|
+
- classpath/embulk-output-bigquery-0.1.3.jar
|
67
66
|
- classpath/google-api-client-1.19.1.jar
|
68
67
|
- classpath/google-api-services-bigquery-v2-rev193-1.19.1.jar
|
69
68
|
- classpath/google-http-client-1.19.0.jar
|
data/LICENSE.txt
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
|
2
|
-
MIT License
|
3
|
-
|
4
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
5
|
-
a copy of this software and associated documentation files (the
|
6
|
-
"Software"), to deal in the Software without restriction, including
|
7
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
8
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
-
permit persons to whom the Software is furnished to do so, subject to
|
10
|
-
the following conditions:
|
11
|
-
|
12
|
-
The above copyright notice and this permission notice shall be
|
13
|
-
included in all copies or substantial portions of the Software.
|
14
|
-
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|