google-cloud-bigquery 1.14.0 → 1.42.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 +4 -4
- data/AUTHENTICATION.md +17 -54
- data/CHANGELOG.md +377 -0
- data/CONTRIBUTING.md +328 -116
- data/LOGGING.md +1 -1
- data/OVERVIEW.md +21 -20
- data/TROUBLESHOOTING.md +2 -8
- data/lib/google/cloud/bigquery/argument.rb +197 -0
- data/lib/google/cloud/bigquery/convert.rb +155 -173
- data/lib/google/cloud/bigquery/copy_job.rb +74 -26
- data/lib/google/cloud/bigquery/credentials.rb +5 -12
- data/lib/google/cloud/bigquery/data.rb +109 -18
- data/lib/google/cloud/bigquery/dataset/access.rb +474 -52
- data/lib/google/cloud/bigquery/dataset/list.rb +7 -13
- data/lib/google/cloud/bigquery/dataset/tag.rb +67 -0
- data/lib/google/cloud/bigquery/dataset.rb +1044 -287
- data/lib/google/cloud/bigquery/external/avro_source.rb +107 -0
- data/lib/google/cloud/bigquery/external/bigtable_source/column.rb +404 -0
- data/lib/google/cloud/bigquery/external/bigtable_source/column_family.rb +945 -0
- data/lib/google/cloud/bigquery/external/bigtable_source.rb +230 -0
- data/lib/google/cloud/bigquery/external/csv_source.rb +481 -0
- data/lib/google/cloud/bigquery/external/data_source.rb +771 -0
- data/lib/google/cloud/bigquery/external/json_source.rb +170 -0
- data/lib/google/cloud/bigquery/external/parquet_source.rb +148 -0
- data/lib/google/cloud/bigquery/external/sheets_source.rb +166 -0
- data/lib/google/cloud/bigquery/external.rb +50 -2256
- data/lib/google/cloud/bigquery/extract_job.rb +226 -61
- data/lib/google/cloud/bigquery/insert_response.rb +1 -3
- data/lib/google/cloud/bigquery/job/list.rb +10 -14
- data/lib/google/cloud/bigquery/job.rb +289 -14
- data/lib/google/cloud/bigquery/load_job.rb +810 -136
- data/lib/google/cloud/bigquery/model/list.rb +5 -9
- data/lib/google/cloud/bigquery/model.rb +247 -16
- data/lib/google/cloud/bigquery/policy.rb +432 -0
- data/lib/google/cloud/bigquery/project/list.rb +6 -11
- data/lib/google/cloud/bigquery/project.rb +509 -250
- data/lib/google/cloud/bigquery/query_job.rb +594 -128
- data/lib/google/cloud/bigquery/routine/list.rb +165 -0
- data/lib/google/cloud/bigquery/routine.rb +1227 -0
- data/lib/google/cloud/bigquery/schema/field.rb +413 -63
- data/lib/google/cloud/bigquery/schema.rb +221 -48
- data/lib/google/cloud/bigquery/service.rb +204 -112
- data/lib/google/cloud/bigquery/standard_sql.rb +269 -53
- data/lib/google/cloud/bigquery/table/async_inserter.rb +86 -43
- data/lib/google/cloud/bigquery/table/list.rb +6 -11
- data/lib/google/cloud/bigquery/table.rb +1470 -377
- data/lib/google/cloud/bigquery/time.rb +6 -0
- data/lib/google/cloud/bigquery/version.rb +1 -1
- data/lib/google/cloud/bigquery.rb +4 -6
- data/lib/google-cloud-bigquery.rb +14 -13
- metadata +66 -38
@@ -18,9 +18,11 @@ require "google/cloud/errors"
|
|
18
18
|
require "google/cloud/bigquery/service"
|
19
19
|
require "google/cloud/bigquery/table"
|
20
20
|
require "google/cloud/bigquery/model"
|
21
|
+
require "google/cloud/bigquery/routine"
|
21
22
|
require "google/cloud/bigquery/external"
|
22
23
|
require "google/cloud/bigquery/dataset/list"
|
23
24
|
require "google/cloud/bigquery/dataset/access"
|
25
|
+
require "google/cloud/bigquery/dataset/tag"
|
24
26
|
require "google/cloud/bigquery/convert"
|
25
27
|
require "google/apis/bigquery_v2"
|
26
28
|
|
@@ -68,8 +70,8 @@ module Google
|
|
68
70
|
##
|
69
71
|
# A unique ID for this dataset, without the project name.
|
70
72
|
#
|
71
|
-
# @return [String] The ID must contain only letters (
|
72
|
-
# (0-9), or underscores (_). The maximum length is 1,024 characters.
|
73
|
+
# @return [String] The ID must contain only letters (`[A-Za-z]`), numbers
|
74
|
+
# (`[0-9]`), or underscores (`_`). The maximum length is 1,024 characters.
|
73
75
|
#
|
74
76
|
# @!group Attributes
|
75
77
|
#
|
@@ -312,12 +314,19 @@ module Google
|
|
312
314
|
# @param [Hash<String, String>] labels A hash containing key/value
|
313
315
|
# pairs.
|
314
316
|
#
|
315
|
-
#
|
316
|
-
#
|
317
|
-
#
|
318
|
-
# *
|
319
|
-
# *
|
320
|
-
#
|
317
|
+
# The labels applied to a resource must meet the following requirements:
|
318
|
+
#
|
319
|
+
# * Each resource can have multiple labels, up to a maximum of 64.
|
320
|
+
# * Each label must be a key-value pair.
|
321
|
+
# * Keys have a minimum length of 1 character and a maximum length of
|
322
|
+
# 63 characters, and cannot be empty. Values can be empty, and have
|
323
|
+
# a maximum length of 63 characters.
|
324
|
+
# * Keys and values can contain only lowercase letters, numeric characters,
|
325
|
+
# underscores, and dashes. All characters must use UTF-8 encoding, and
|
326
|
+
# international characters are allowed.
|
327
|
+
# * The key portion of a label must be unique. However, you can use the
|
328
|
+
# same key with multiple resources.
|
329
|
+
# * Keys must start with a lowercase letter or international character.
|
321
330
|
#
|
322
331
|
# @example
|
323
332
|
# require "google/cloud/bigquery"
|
@@ -335,6 +344,75 @@ module Google
|
|
335
344
|
patch_gapi! :labels
|
336
345
|
end
|
337
346
|
|
347
|
+
##
|
348
|
+
# The {EncryptionConfiguration} object that represents the default
|
349
|
+
# encryption method for all tables and models in the dataset. Once this
|
350
|
+
# property is set, all newly-created partitioned tables and models in
|
351
|
+
# the dataset will have their encryption set to this value, unless table
|
352
|
+
# creation request (or query) overrides it.
|
353
|
+
#
|
354
|
+
# Present only if this dataset is using custom default encryption.
|
355
|
+
#
|
356
|
+
# @see https://cloud.google.com/bigquery/docs/customer-managed-encryption
|
357
|
+
# Protecting Data with Cloud KMS Keys
|
358
|
+
#
|
359
|
+
# @return [EncryptionConfiguration, nil] The default encryption
|
360
|
+
# configuration.
|
361
|
+
#
|
362
|
+
# @!group Attributes
|
363
|
+
#
|
364
|
+
# @example
|
365
|
+
# require "google/cloud/bigquery"
|
366
|
+
#
|
367
|
+
# bigquery = Google::Cloud::Bigquery.new
|
368
|
+
# dataset = bigquery.dataset "my_dataset"
|
369
|
+
#
|
370
|
+
# encrypt_config = dataset.default_encryption
|
371
|
+
#
|
372
|
+
# @!group Attributes
|
373
|
+
#
|
374
|
+
def default_encryption
|
375
|
+
return nil if reference?
|
376
|
+
ensure_full_data!
|
377
|
+
return nil if @gapi.default_encryption_configuration.nil?
|
378
|
+
EncryptionConfiguration.from_gapi(@gapi.default_encryption_configuration).freeze
|
379
|
+
end
|
380
|
+
|
381
|
+
##
|
382
|
+
# Set the {EncryptionConfiguration} object that represents the default
|
383
|
+
# encryption method for all tables and models in the dataset. Once this
|
384
|
+
# property is set, all newly-created partitioned tables and models in
|
385
|
+
# the dataset will have their encryption set to this value, unless table
|
386
|
+
# creation request (or query) overrides it.
|
387
|
+
#
|
388
|
+
# If the dataset is not a full resource representation (see
|
389
|
+
# {#resource_full?}), the full representation will be retrieved before
|
390
|
+
# the update to comply with ETag-based optimistic concurrency control.
|
391
|
+
#
|
392
|
+
# @see https://cloud.google.com/bigquery/docs/customer-managed-encryption
|
393
|
+
# Protecting Data with Cloud KMS Keys
|
394
|
+
#
|
395
|
+
# @param [EncryptionConfiguration] value The new encryption config.
|
396
|
+
#
|
397
|
+
# @example
|
398
|
+
# require "google/cloud/bigquery"
|
399
|
+
#
|
400
|
+
# bigquery = Google::Cloud::Bigquery.new
|
401
|
+
# dataset = bigquery.dataset "my_dataset"
|
402
|
+
#
|
403
|
+
# key_name = "projects/a/locations/b/keyRings/c/cryptoKeys/d"
|
404
|
+
# encrypt_config = bigquery.encryption kms_key: key_name
|
405
|
+
#
|
406
|
+
# dataset.default_encryption = encrypt_config
|
407
|
+
#
|
408
|
+
# @!group Attributes
|
409
|
+
#
|
410
|
+
def default_encryption= value
|
411
|
+
ensure_full_data!
|
412
|
+
@gapi.default_encryption_configuration = value.to_gapi
|
413
|
+
patch_gapi! :default_encryption_configuration
|
414
|
+
end
|
415
|
+
|
338
416
|
##
|
339
417
|
# Retrieves the access rules for a Dataset. The rules can be updated
|
340
418
|
# when passing a block, see {Dataset::Access} for all the methods
|
@@ -389,6 +467,21 @@ module Google
|
|
389
467
|
access_builder.freeze
|
390
468
|
end
|
391
469
|
|
470
|
+
##
|
471
|
+
# Retrieves the tags associated with this dataset. Tag keys are
|
472
|
+
# globally unique, and managed via the resource manager API.
|
473
|
+
#
|
474
|
+
# @see https://cloud.google.com/resource-manager/docs/tags/tags-overview
|
475
|
+
# for more information.
|
476
|
+
#
|
477
|
+
# @return [Google::Cloud::Bigquery::Dataset::Tag] The list of tags.
|
478
|
+
#
|
479
|
+
def tags
|
480
|
+
ensure_full_data!
|
481
|
+
return nil if @gapi.tags.nil?
|
482
|
+
@gapi.tags.map { |gapi| Tag.from_gapi(gapi) }
|
483
|
+
end
|
484
|
+
|
392
485
|
##
|
393
486
|
# Permanently deletes the dataset. The dataset must be empty before it
|
394
487
|
# can be deleted unless the `force` option is set to `true`.
|
@@ -424,7 +517,7 @@ module Google
|
|
424
517
|
# you can pass the table's schema as a hash (see example.)
|
425
518
|
#
|
426
519
|
# @param [String] table_id The ID of the table. The ID must contain only
|
427
|
-
# letters (
|
520
|
+
# letters (`[A-Za-z]`), numbers (`[0-9]`), or underscores (`_`). The maximum
|
428
521
|
# length is 1,024 characters.
|
429
522
|
# @param [String] name A descriptive name for the table.
|
430
523
|
# @param [String] description A user-friendly description of the table.
|
@@ -485,6 +578,40 @@ module Google
|
|
485
578
|
# end
|
486
579
|
# end
|
487
580
|
#
|
581
|
+
# @example With time partitioning and clustering.
|
582
|
+
# require "google/cloud/bigquery"
|
583
|
+
#
|
584
|
+
# bigquery = Google::Cloud::Bigquery.new
|
585
|
+
# dataset = bigquery.dataset "my_dataset"
|
586
|
+
#
|
587
|
+
# table = dataset.create_table "my_table" do |t|
|
588
|
+
# t.schema do |schema|
|
589
|
+
# schema.timestamp "dob", mode: :required
|
590
|
+
# schema.string "first_name", mode: :required
|
591
|
+
# schema.string "last_name", mode: :required
|
592
|
+
# end
|
593
|
+
# t.time_partitioning_type = "DAY"
|
594
|
+
# t.time_partitioning_field = "dob"
|
595
|
+
# t.clustering_fields = ["last_name", "first_name"]
|
596
|
+
# end
|
597
|
+
#
|
598
|
+
# @example With range partitioning.
|
599
|
+
# require "google/cloud/bigquery"
|
600
|
+
#
|
601
|
+
# bigquery = Google::Cloud::Bigquery.new
|
602
|
+
# dataset = bigquery.dataset "my_dataset"
|
603
|
+
#
|
604
|
+
# table = dataset.create_table "my_table" do |t|
|
605
|
+
# t.schema do |schema|
|
606
|
+
# schema.integer "my_table_id", mode: :required
|
607
|
+
# schema.string "my_table_data", mode: :required
|
608
|
+
# end
|
609
|
+
# t.range_partitioning_field = "my_table_id"
|
610
|
+
# t.range_partitioning_start = 0
|
611
|
+
# t.range_partitioning_interval = 10
|
612
|
+
# t.range_partitioning_end = 100
|
613
|
+
# end
|
614
|
+
#
|
488
615
|
# @!group Table
|
489
616
|
#
|
490
617
|
def create_table table_id, name: nil, description: nil
|
@@ -507,17 +634,19 @@ module Google
|
|
507
634
|
end
|
508
635
|
|
509
636
|
##
|
510
|
-
# Creates a new
|
511
|
-
# table, which is a virtual table defined by the given SQL query.
|
637
|
+
# Creates a new view, which is a virtual table defined by the given SQL query.
|
512
638
|
#
|
513
|
-
# BigQuery's
|
514
|
-
#
|
515
|
-
# the view is queried. Queries are billed according to the total amount
|
639
|
+
# With BigQuery's logical views, the query that defines the view is re-executed
|
640
|
+
# every time the view is queried. Queries are billed according to the total amount
|
516
641
|
# of data in all table fields referenced directly or indirectly by the
|
517
642
|
# top-level query. (See {Table#view?} and {Table#query}.)
|
518
643
|
#
|
644
|
+
# For materialized views, see {#create_materialized_view}.
|
645
|
+
#
|
646
|
+
# @see https://cloud.google.com/bigquery/docs/views Creating views
|
647
|
+
#
|
519
648
|
# @param [String] table_id The ID of the view table. The ID must contain
|
520
|
-
# only letters (
|
649
|
+
# only letters (`[A-Za-z]`), numbers (`[0-9]`), or underscores (`_`). The
|
521
650
|
# maximum length is 1,024 characters.
|
522
651
|
# @param [String] query The query that BigQuery executes when the view
|
523
652
|
# is referenced.
|
@@ -532,12 +661,20 @@ module Google
|
|
532
661
|
# SQL](https://cloud.google.com/bigquery/docs/reference/legacy-sql)
|
533
662
|
# dialect. Optional. The default value is false.
|
534
663
|
# @param [Array<String>, String] udfs User-defined function resources
|
535
|
-
# used in
|
536
|
-
# Google Cloud Storage URI (`gs://bucket/path`), or an inline resource
|
664
|
+
# used in a legacy SQL query. May be either a code resource to load from
|
665
|
+
# a Google Cloud Storage URI (`gs://bucket/path`), or an inline resource
|
537
666
|
# that contains code for a user-defined function (UDF). Providing an
|
538
667
|
# inline code resource is equivalent to providing a URI for a file
|
539
|
-
# containing the same code.
|
540
|
-
#
|
668
|
+
# containing the same code.
|
669
|
+
#
|
670
|
+
# This parameter is used for defining User Defined Function (UDF)
|
671
|
+
# resources only when using legacy SQL. Users of standard SQL should
|
672
|
+
# leverage either DDL (e.g. `CREATE [TEMPORARY] FUNCTION ...`) or the
|
673
|
+
# Routines API to define UDF resources.
|
674
|
+
#
|
675
|
+
# For additional information on migrating, see: [Migrating to
|
676
|
+
# standard SQL - Differences in user-defined JavaScript
|
677
|
+
# functions](https://cloud.google.com/bigquery/docs/reference/standard-sql/migrating-from-legacy-sql#differences_in_user-defined_javascript_functions)
|
541
678
|
#
|
542
679
|
# @return [Google::Cloud::Bigquery::Table] A new table object.
|
543
680
|
#
|
@@ -548,7 +685,7 @@ module Google
|
|
548
685
|
# dataset = bigquery.dataset "my_dataset"
|
549
686
|
#
|
550
687
|
# view = dataset.create_view "my_view",
|
551
|
-
#
|
688
|
+
# "SELECT name, age FROM proj.dataset.users"
|
552
689
|
#
|
553
690
|
# @example A name and description can be provided:
|
554
691
|
# require "google/cloud/bigquery"
|
@@ -557,13 +694,18 @@ module Google
|
|
557
694
|
# dataset = bigquery.dataset "my_dataset"
|
558
695
|
#
|
559
696
|
# view = dataset.create_view "my_view",
|
560
|
-
#
|
561
|
-
#
|
697
|
+
# "SELECT name, age FROM proj.dataset.users",
|
698
|
+
# name: "My View", description: "This is my view"
|
562
699
|
#
|
563
700
|
# @!group Table
|
564
701
|
#
|
565
|
-
def create_view table_id,
|
566
|
-
|
702
|
+
def create_view table_id,
|
703
|
+
query,
|
704
|
+
name: nil,
|
705
|
+
description: nil,
|
706
|
+
standard_sql: nil,
|
707
|
+
legacy_sql: nil,
|
708
|
+
udfs: nil
|
567
709
|
use_legacy_sql = Convert.resolve_legacy_sql standard_sql, legacy_sql
|
568
710
|
new_view_opts = {
|
569
711
|
table_reference: Google::Apis::BigqueryV2::TableReference.new(
|
@@ -579,7 +721,81 @@ module Google
|
|
579
721
|
user_defined_function_resources: udfs_gapi(udfs)
|
580
722
|
)
|
581
723
|
}.delete_if { |_, v| v.nil? }
|
582
|
-
new_view = Google::Apis::BigqueryV2::Table.new
|
724
|
+
new_view = Google::Apis::BigqueryV2::Table.new(**new_view_opts)
|
725
|
+
|
726
|
+
gapi = service.insert_table dataset_id, new_view
|
727
|
+
Table.from_gapi gapi, service
|
728
|
+
end
|
729
|
+
|
730
|
+
##
|
731
|
+
# Creates a new materialized view.
|
732
|
+
#
|
733
|
+
# Materialized views are precomputed views that periodically cache results of a query for increased performance
|
734
|
+
# and efficiency. BigQuery leverages precomputed results from materialized views and whenever possible reads
|
735
|
+
# only delta changes from the base table to compute up-to-date results.
|
736
|
+
#
|
737
|
+
# Queries that use materialized views are generally faster and consume less resources than queries that retrieve
|
738
|
+
# the same data only from the base table. Materialized views are helpful to significantly boost performance of
|
739
|
+
# workloads that have the characteristic of common and repeated queries.
|
740
|
+
#
|
741
|
+
# For logical views, see {#create_view}.
|
742
|
+
#
|
743
|
+
# @see https://cloud.google.com/bigquery/docs/materialized-views-intro Introduction to materialized views
|
744
|
+
#
|
745
|
+
# @param [String] table_id The ID of the materialized view table. The ID must contain only letters (`[A-Za-z]`),
|
746
|
+
# numbers (`[0-9]`), or underscores (`_`). The maximum length is 1,024 characters.
|
747
|
+
# @param [String] query The query that BigQuery executes when the materialized view is referenced.
|
748
|
+
# @param [String] name A descriptive name for the table.
|
749
|
+
# @param [String] description A user-friendly description of the table.
|
750
|
+
# @param [Boolean] enable_refresh Enable automatic refresh of the materialized view when the base table is
|
751
|
+
# updated. Optional. The default value is true.
|
752
|
+
# @param [Integer] refresh_interval_ms The maximum frequency in milliseconds at which this materialized view
|
753
|
+
# will be refreshed. Optional. The default value is `1_800_000` (30 minutes).
|
754
|
+
#
|
755
|
+
# @return [Google::Cloud::Bigquery::Table] A new table object.
|
756
|
+
#
|
757
|
+
# @example
|
758
|
+
# require "google/cloud/bigquery"
|
759
|
+
#
|
760
|
+
# bigquery = Google::Cloud::Bigquery.new
|
761
|
+
# dataset = bigquery.dataset "my_dataset"
|
762
|
+
#
|
763
|
+
# materialized_view = dataset.create_materialized_view "my_materialized_view",
|
764
|
+
# "SELECT name, age FROM proj.dataset.users"
|
765
|
+
#
|
766
|
+
# @example Automatic refresh can be disabled:
|
767
|
+
# require "google/cloud/bigquery"
|
768
|
+
#
|
769
|
+
# bigquery = Google::Cloud::Bigquery.new
|
770
|
+
# dataset = bigquery.dataset "my_dataset"
|
771
|
+
#
|
772
|
+
# materialized_view = dataset.create_materialized_view "my_materialized_view",
|
773
|
+
# "SELECT name, age FROM proj.dataset.users",
|
774
|
+
# enable_refresh: false
|
775
|
+
#
|
776
|
+
# @!group Table
|
777
|
+
#
|
778
|
+
def create_materialized_view table_id,
|
779
|
+
query,
|
780
|
+
name: nil,
|
781
|
+
description: nil,
|
782
|
+
enable_refresh: nil,
|
783
|
+
refresh_interval_ms: nil
|
784
|
+
new_view_opts = {
|
785
|
+
table_reference: Google::Apis::BigqueryV2::TableReference.new(
|
786
|
+
project_id: project_id,
|
787
|
+
dataset_id: dataset_id,
|
788
|
+
table_id: table_id
|
789
|
+
),
|
790
|
+
friendly_name: name,
|
791
|
+
description: description,
|
792
|
+
materialized_view: Google::Apis::BigqueryV2::MaterializedViewDefinition.new(
|
793
|
+
enable_refresh: enable_refresh,
|
794
|
+
query: query,
|
795
|
+
refresh_interval_ms: refresh_interval_ms
|
796
|
+
)
|
797
|
+
}.delete_if { |_, v| v.nil? }
|
798
|
+
new_view = Google::Apis::BigqueryV2::Table.new(**new_view_opts)
|
583
799
|
|
584
800
|
gapi = service.insert_table dataset_id, new_view
|
585
801
|
Table.from_gapi gapi, service
|
@@ -593,6 +809,11 @@ module Google
|
|
593
809
|
# object without verifying that the resource exists on the BigQuery
|
594
810
|
# service. Calls made on this object will raise errors if the resource
|
595
811
|
# does not exist. Default is `false`. Optional.
|
812
|
+
# @param [String] view Specifies the view that determines which table information is returned.
|
813
|
+
# By default, basic table information and storage statistics (STORAGE_STATS) are returned.
|
814
|
+
# Accepted values include `:unspecified`, `:basic`, `:storage`, and
|
815
|
+
# `:full`. For more information, see [BigQuery Classes](@todo: Update the link).
|
816
|
+
# The default value is the `:unspecified` view type.
|
596
817
|
#
|
597
818
|
# @return [Google::Cloud::Bigquery::Table, nil] Returns `nil` if the
|
598
819
|
# table does not exist.
|
@@ -615,15 +836,22 @@ module Google
|
|
615
836
|
#
|
616
837
|
# table = dataset.table "my_table", skip_lookup: true
|
617
838
|
#
|
839
|
+
# @example Avoid retrieving transient stats of the table with `view`:
|
840
|
+
# require "google/cloud/bigquery"
|
841
|
+
#
|
842
|
+
# bigquery = Google::Cloud::Bigquery.new
|
843
|
+
#
|
844
|
+
# dataset = bigquery.dataset "my_dataset"
|
845
|
+
#
|
846
|
+
# table = dataset.table "my_table", view: "basic"
|
847
|
+
#
|
618
848
|
# @!group Table
|
619
849
|
#
|
620
|
-
def table table_id, skip_lookup: nil
|
850
|
+
def table table_id, skip_lookup: nil, view: nil
|
621
851
|
ensure_service!
|
622
|
-
if skip_lookup
|
623
|
-
|
624
|
-
|
625
|
-
gapi = service.get_table dataset_id, table_id
|
626
|
-
Table.from_gapi gapi, service
|
852
|
+
return Table.new_reference project_id, dataset_id, table_id, service if skip_lookup
|
853
|
+
gapi = service.get_table dataset_id, table_id, metadata_view: view
|
854
|
+
Table.from_gapi gapi, service, metadata_view: view
|
627
855
|
rescue Google::Cloud::NotFoundError
|
628
856
|
nil
|
629
857
|
end
|
@@ -664,8 +892,7 @@ module Google
|
|
664
892
|
#
|
665
893
|
def tables token: nil, max: nil
|
666
894
|
ensure_service!
|
667
|
-
|
668
|
-
gapi = service.list_tables dataset_id, options
|
895
|
+
gapi = service.list_tables dataset_id, token: token, max: max
|
669
896
|
Table::List.from_gapi gapi, service, dataset_id, max
|
670
897
|
end
|
671
898
|
|
@@ -703,9 +930,7 @@ module Google
|
|
703
930
|
#
|
704
931
|
def model model_id, skip_lookup: nil
|
705
932
|
ensure_service!
|
706
|
-
if skip_lookup
|
707
|
-
return Model.new_reference project_id, dataset_id, model_id, service
|
708
|
-
end
|
933
|
+
return Model.new_reference project_id, dataset_id, model_id, service if skip_lookup
|
709
934
|
gapi = service.get_model dataset_id, model_id
|
710
935
|
Model.from_gapi_json gapi, service
|
711
936
|
rescue Google::Cloud::NotFoundError
|
@@ -752,6 +977,174 @@ module Google
|
|
752
977
|
Model::List.from_gapi gapi, service, dataset_id, max
|
753
978
|
end
|
754
979
|
|
980
|
+
##
|
981
|
+
# Creates a new routine. The following attributes may be set in the yielded block:
|
982
|
+
# {Routine::Updater#routine_type=}, {Routine::Updater#language=}, {Routine::Updater#arguments=},
|
983
|
+
# {Routine::Updater#return_type=}, {Routine::Updater#imported_libraries=}, {Routine::Updater#body=}, and
|
984
|
+
# {Routine::Updater#description=}.
|
985
|
+
#
|
986
|
+
# @param [String] routine_id The ID of the routine. The ID must contain only
|
987
|
+
# letters (`[A-Za-z]`), numbers (`[0-9]`), or underscores (`_`). The maximum length
|
988
|
+
# is 256 characters.
|
989
|
+
# @yield [routine] A block for setting properties on the routine.
|
990
|
+
# @yieldparam [Google::Cloud::Bigquery::Routine::Updater] routine An updater to set additional properties on the
|
991
|
+
# routine.
|
992
|
+
#
|
993
|
+
# @return [Google::Cloud::Bigquery::Routine] A new routine object.
|
994
|
+
#
|
995
|
+
# @example
|
996
|
+
# require "google/cloud/bigquery"
|
997
|
+
#
|
998
|
+
# bigquery = Google::Cloud::Bigquery.new
|
999
|
+
# dataset = bigquery.dataset "my_dataset"
|
1000
|
+
#
|
1001
|
+
# routine = dataset.create_routine "my_routine" do |r|
|
1002
|
+
# r.routine_type = "SCALAR_FUNCTION"
|
1003
|
+
# r.language = "SQL"
|
1004
|
+
# r.arguments = [
|
1005
|
+
# Google::Cloud::Bigquery::Argument.new(name: "x", data_type: "INT64")
|
1006
|
+
# ]
|
1007
|
+
# r.body = "x * 3"
|
1008
|
+
# r.description = "My routine description"
|
1009
|
+
# end
|
1010
|
+
#
|
1011
|
+
# puts routine.routine_id
|
1012
|
+
#
|
1013
|
+
# @example Extended example:
|
1014
|
+
# require "google/cloud/bigquery"
|
1015
|
+
#
|
1016
|
+
# bigquery = Google::Cloud::Bigquery.new
|
1017
|
+
# dataset = bigquery.dataset "my_dataset"
|
1018
|
+
# routine = dataset.create_routine "my_routine" do |r|
|
1019
|
+
# r.routine_type = "SCALAR_FUNCTION"
|
1020
|
+
# r.language = :SQL
|
1021
|
+
# r.body = "(SELECT SUM(IF(elem.name = \"foo\",elem.val,null)) FROM UNNEST(arr) AS elem)"
|
1022
|
+
# r.arguments = [
|
1023
|
+
# Google::Cloud::Bigquery::Argument.new(
|
1024
|
+
# name: "arr",
|
1025
|
+
# argument_kind: "FIXED_TYPE",
|
1026
|
+
# data_type: Google::Cloud::Bigquery::StandardSql::DataType.new(
|
1027
|
+
# type_kind: "ARRAY",
|
1028
|
+
# array_element_type: Google::Cloud::Bigquery::StandardSql::DataType.new(
|
1029
|
+
# type_kind: "STRUCT",
|
1030
|
+
# struct_type: Google::Cloud::Bigquery::StandardSql::StructType.new(
|
1031
|
+
# fields: [
|
1032
|
+
# Google::Cloud::Bigquery::StandardSql::Field.new(
|
1033
|
+
# name: "name",
|
1034
|
+
# type: Google::Cloud::Bigquery::StandardSql::DataType.new(type_kind: "STRING")
|
1035
|
+
# ),
|
1036
|
+
# Google::Cloud::Bigquery::StandardSql::Field.new(
|
1037
|
+
# name: "val",
|
1038
|
+
# type: Google::Cloud::Bigquery::StandardSql::DataType.new(type_kind: "INT64")
|
1039
|
+
# )
|
1040
|
+
# ]
|
1041
|
+
# )
|
1042
|
+
# )
|
1043
|
+
# )
|
1044
|
+
# )
|
1045
|
+
# ]
|
1046
|
+
# end
|
1047
|
+
#
|
1048
|
+
# @!group Routine
|
1049
|
+
#
|
1050
|
+
def create_routine routine_id
|
1051
|
+
ensure_service!
|
1052
|
+
new_tb = Google::Apis::BigqueryV2::Routine.new(
|
1053
|
+
routine_reference: Google::Apis::BigqueryV2::RoutineReference.new(
|
1054
|
+
project_id: project_id, dataset_id: dataset_id, routine_id: routine_id
|
1055
|
+
)
|
1056
|
+
)
|
1057
|
+
updater = Routine::Updater.new new_tb
|
1058
|
+
|
1059
|
+
yield updater if block_given?
|
1060
|
+
|
1061
|
+
gapi = service.insert_routine dataset_id, updater.to_gapi
|
1062
|
+
Routine.from_gapi gapi, service
|
1063
|
+
end
|
1064
|
+
|
1065
|
+
##
|
1066
|
+
# Retrieves an existing routine by ID.
|
1067
|
+
#
|
1068
|
+
# @param [String] routine_id The ID of a routine.
|
1069
|
+
# @param [Boolean] skip_lookup Optionally create just a local reference
|
1070
|
+
# object without verifying that the resource exists on the BigQuery
|
1071
|
+
# service. Calls made on this object will raise errors if the resource
|
1072
|
+
# does not exist. Default is `false`. Optional.
|
1073
|
+
#
|
1074
|
+
# @return [Google::Cloud::Bigquery::Routine, nil] Returns `nil` if the
|
1075
|
+
# routine does not exist.
|
1076
|
+
#
|
1077
|
+
# @example
|
1078
|
+
# require "google/cloud/bigquery"
|
1079
|
+
#
|
1080
|
+
# bigquery = Google::Cloud::Bigquery.new
|
1081
|
+
# dataset = bigquery.dataset "my_dataset"
|
1082
|
+
#
|
1083
|
+
# routine = dataset.routine "my_routine"
|
1084
|
+
# puts routine.routine_id
|
1085
|
+
#
|
1086
|
+
# @example Avoid retrieving the routine resource with `skip_lookup`:
|
1087
|
+
# require "google/cloud/bigquery"
|
1088
|
+
#
|
1089
|
+
# bigquery = Google::Cloud::Bigquery.new
|
1090
|
+
#
|
1091
|
+
# dataset = bigquery.dataset "my_dataset"
|
1092
|
+
#
|
1093
|
+
# routine = dataset.routine "my_routine", skip_lookup: true
|
1094
|
+
#
|
1095
|
+
# @!group Routine
|
1096
|
+
#
|
1097
|
+
def routine routine_id, skip_lookup: nil
|
1098
|
+
ensure_service!
|
1099
|
+
return Routine.new_reference project_id, dataset_id, routine_id, service if skip_lookup
|
1100
|
+
gapi = service.get_routine dataset_id, routine_id
|
1101
|
+
Routine.from_gapi gapi, service
|
1102
|
+
rescue Google::Cloud::NotFoundError
|
1103
|
+
nil
|
1104
|
+
end
|
1105
|
+
|
1106
|
+
##
|
1107
|
+
# Retrieves the list of routines belonging to the dataset.
|
1108
|
+
#
|
1109
|
+
# @param [String] token A previously-returned page token representing
|
1110
|
+
# part of the larger set of results to view.
|
1111
|
+
# @param [Integer] max Maximum number of routines to return.
|
1112
|
+
# @param [String] filter If set, then only the routines matching this filter are returned. The current supported
|
1113
|
+
# form is `routineType:`, with a {Routine#routine_type} enum value. Example: `routineType:SCALAR_FUNCTION`.
|
1114
|
+
#
|
1115
|
+
# @return [Array<Google::Cloud::Bigquery::Routine>] An array of routines
|
1116
|
+
# (See {Google::Cloud::Bigquery::Routine::List})
|
1117
|
+
#
|
1118
|
+
# @example
|
1119
|
+
# require "google/cloud/bigquery"
|
1120
|
+
#
|
1121
|
+
# bigquery = Google::Cloud::Bigquery.new
|
1122
|
+
# dataset = bigquery.dataset "my_dataset"
|
1123
|
+
#
|
1124
|
+
# routines = dataset.routines
|
1125
|
+
# routines.each do |routine|
|
1126
|
+
# puts routine.routine_id
|
1127
|
+
# end
|
1128
|
+
#
|
1129
|
+
# @example Retrieve all routines: (See {Routine::List#all})
|
1130
|
+
# require "google/cloud/bigquery"
|
1131
|
+
#
|
1132
|
+
# bigquery = Google::Cloud::Bigquery.new
|
1133
|
+
# dataset = bigquery.dataset "my_dataset"
|
1134
|
+
#
|
1135
|
+
# routines = dataset.routines
|
1136
|
+
# routines.all do |routine|
|
1137
|
+
# puts routine.routine_id
|
1138
|
+
# end
|
1139
|
+
#
|
1140
|
+
# @!group Routine
|
1141
|
+
#
|
1142
|
+
def routines token: nil, max: nil, filter: nil
|
1143
|
+
ensure_service!
|
1144
|
+
gapi = service.list_routines dataset_id, token: token, max: max, filter: filter
|
1145
|
+
Routine::List.from_gapi gapi, service, dataset_id, max, filter: filter
|
1146
|
+
end
|
1147
|
+
|
755
1148
|
##
|
756
1149
|
# Queries data by creating a [query
|
757
1150
|
# job](https://cloud.google.com/bigquery/docs/query-overview#query_jobs).
|
@@ -759,27 +1152,6 @@ module Google
|
|
759
1152
|
# Sets the current dataset as the default dataset in the query. Useful
|
760
1153
|
# for using unqualified table names.
|
761
1154
|
#
|
762
|
-
# When using standard SQL and passing arguments using `params`, Ruby
|
763
|
-
# types are mapped to BigQuery types as follows:
|
764
|
-
#
|
765
|
-
# | BigQuery | Ruby | Notes |
|
766
|
-
# |-------------|----------------|---|
|
767
|
-
# | `BOOL` | `true`/`false` | |
|
768
|
-
# | `INT64` | `Integer` | |
|
769
|
-
# | `FLOAT64` | `Float` | |
|
770
|
-
# | `NUMERIC` | `BigDecimal` | Will be rounded to 9 decimal places |
|
771
|
-
# | `STRING` | `String` | |
|
772
|
-
# | `DATETIME` | `DateTime` | `DATETIME` does not support time zone. |
|
773
|
-
# | `DATE` | `Date` | |
|
774
|
-
# | `TIMESTAMP` | `Time` | |
|
775
|
-
# | `TIME` | `Google::Cloud::BigQuery::Time` | |
|
776
|
-
# | `BYTES` | `File`, `IO`, `StringIO`, or similar | |
|
777
|
-
# | `ARRAY` | `Array` | Nested arrays, `nil` values are not supported. |
|
778
|
-
# | `STRUCT` | `Hash` | Hash keys may be strings or symbols. |
|
779
|
-
#
|
780
|
-
# See [Data Types](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types)
|
781
|
-
# for an overview of each BigQuery data type, including allowed values.
|
782
|
-
#
|
783
1155
|
# The geographic location for the job ("US", "EU", etc.) can be set via
|
784
1156
|
# {QueryJob::Updater#location=} in a block passed to this method. If the
|
785
1157
|
# dataset is a full resource representation (see {#resource_full?}), the
|
@@ -790,13 +1162,60 @@ module Google
|
|
790
1162
|
# syntax](https://cloud.google.com/bigquery/query-reference), of the
|
791
1163
|
# query to execute. Example: "SELECT count(f1) FROM
|
792
1164
|
# [myProjectId:myDatasetId.myTableId]".
|
793
|
-
# @param [Array, Hash] params Standard SQL only. Used to pass query
|
794
|
-
#
|
795
|
-
#
|
796
|
-
#
|
797
|
-
#
|
798
|
-
#
|
799
|
-
#
|
1165
|
+
# @param [Array, Hash] params Standard SQL only. Used to pass query arguments when the `query` string contains
|
1166
|
+
# either positional (`?`) or named (`@myparam`) query parameters. If value passed is an array `["foo"]`, the
|
1167
|
+
# query must use positional query parameters. If value passed is a hash `{ myparam: "foo" }`, the query must
|
1168
|
+
# use named query parameters. When set, `legacy_sql` will automatically be set to false and `standard_sql` to
|
1169
|
+
# true.
|
1170
|
+
#
|
1171
|
+
# BigQuery types are converted from Ruby types as follows:
|
1172
|
+
#
|
1173
|
+
# | BigQuery | Ruby | Notes |
|
1174
|
+
# |--------------|--------------------------------------|----------------------------------------------------|
|
1175
|
+
# | `BOOL` | `true`/`false` | |
|
1176
|
+
# | `INT64` | `Integer` | |
|
1177
|
+
# | `FLOAT64` | `Float` | |
|
1178
|
+
# | `NUMERIC` | `BigDecimal` | `BigDecimal` values will be rounded to scale 9. |
|
1179
|
+
# | `BIGNUMERIC` | `BigDecimal` | NOT AUTOMATIC: Must be mapped using `types`, below.|
|
1180
|
+
# | `STRING` | `String` | |
|
1181
|
+
# | `DATETIME` | `DateTime` | `DATETIME` does not support time zone. |
|
1182
|
+
# | `DATE` | `Date` | |
|
1183
|
+
# | `GEOGRAPHY` | `String` (WKT or GeoJSON) | NOT AUTOMATIC: Must be mapped using `types`, below.|
|
1184
|
+
# | `TIMESTAMP` | `Time` | |
|
1185
|
+
# | `TIME` | `Google::Cloud::BigQuery::Time` | |
|
1186
|
+
# | `BYTES` | `File`, `IO`, `StringIO`, or similar | |
|
1187
|
+
# | `ARRAY` | `Array` | Nested arrays, `nil` values are not supported. |
|
1188
|
+
# | `STRUCT` | `Hash` | Hash keys may be strings or symbols. |
|
1189
|
+
#
|
1190
|
+
# See [Data Types](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types) for an overview
|
1191
|
+
# of each BigQuery data type, including allowed values. For the `GEOGRAPHY` type, see [Working with BigQuery
|
1192
|
+
# GIS data](https://cloud.google.com/bigquery/docs/gis-data).
|
1193
|
+
# @param [Array, Hash] types Standard SQL only. Types of the SQL parameters in `params`. It is not always
|
1194
|
+
# possible to infer the right SQL type from a value in `params`. In these cases, `types` must be used to
|
1195
|
+
# specify the SQL type for these values.
|
1196
|
+
#
|
1197
|
+
# Arguments must match the value type passed to `params`. This must be an `Array` when the query uses
|
1198
|
+
# positional query parameters. This must be an `Hash` when the query uses named query parameters. The values
|
1199
|
+
# should be BigQuery type codes from the following list:
|
1200
|
+
#
|
1201
|
+
# * `:BOOL`
|
1202
|
+
# * `:INT64`
|
1203
|
+
# * `:FLOAT64`
|
1204
|
+
# * `:NUMERIC`
|
1205
|
+
# * `:BIGNUMERIC`
|
1206
|
+
# * `:STRING`
|
1207
|
+
# * `:DATETIME`
|
1208
|
+
# * `:DATE`
|
1209
|
+
# * `:GEOGRAPHY`
|
1210
|
+
# * `:TIMESTAMP`
|
1211
|
+
# * `:TIME`
|
1212
|
+
# * `:BYTES`
|
1213
|
+
# * `Array` - Lists are specified by providing the type code in an array. For example, an array of integers
|
1214
|
+
# are specified as `[:INT64]`.
|
1215
|
+
# * `Hash` - Types for STRUCT values (`Hash` objects) are specified using a `Hash` object, where the keys
|
1216
|
+
# match the `params` hash, and the values are the types value that matches the data.
|
1217
|
+
#
|
1218
|
+
# Types are optional.
|
800
1219
|
# @param [Hash<String|Symbol, External::DataSource>] external A Hash
|
801
1220
|
# that represents the mapping of the external tables to the table
|
802
1221
|
# names used in the SQL query. The hash keys are the table names, and
|
@@ -855,13 +1274,19 @@ module Google
|
|
855
1274
|
# Flattens all nested and repeated fields in the query results. The
|
856
1275
|
# default value is `true`. `large_results` parameter must be `true` if
|
857
1276
|
# this is set to `false`.
|
1277
|
+
# @param [Integer] maximum_billing_tier Limits the billing tier for this
|
1278
|
+
# job. Queries that have resource usage beyond this tier will fail
|
1279
|
+
# (without incurring a charge). WARNING: The billed byte amount can be
|
1280
|
+
# multiplied by an amount up to this number! Most users should not need
|
1281
|
+
# to alter this setting, and we recommend that you avoid introducing new
|
1282
|
+
# uses of it. Deprecated.
|
858
1283
|
# @param [Integer] maximum_bytes_billed Limits the bytes billed for this
|
859
1284
|
# job. Queries that will have bytes billed beyond this limit will fail
|
860
1285
|
# (without incurring a charge). Optional. If unspecified, this will be
|
861
1286
|
# set to your project default.
|
862
1287
|
# @param [String] job_id A user-defined ID for the query job. The ID
|
863
|
-
# must contain only letters (
|
864
|
-
# (_), or dashes (
|
1288
|
+
# must contain only letters (`[A-Za-z]`), numbers (`[0-9]`), underscores
|
1289
|
+
# (`_`), or dashes (`-`). The maximum length is 1,024 characters. If
|
865
1290
|
# `job_id` is provided, then `prefix` will not be used.
|
866
1291
|
#
|
867
1292
|
# See [Generating a job
|
@@ -870,27 +1295,48 @@ module Google
|
|
870
1295
|
# prepended to a generated value to produce a unique job ID. For
|
871
1296
|
# example, the prefix `daily_import_job_` can be given to generate a
|
872
1297
|
# job ID such as `daily_import_job_12vEDtMQ0mbp1Mo5Z7mzAFQJZazh`. The
|
873
|
-
# prefix must contain only letters (
|
874
|
-
# underscores (_), or dashes (
|
1298
|
+
# prefix must contain only letters (`[A-Za-z]`), numbers (`[0-9]`),
|
1299
|
+
# underscores (`_`), or dashes (`-`). The maximum length of the entire ID
|
875
1300
|
# is 1,024 characters. If `job_id` is provided, then `prefix` will not
|
876
1301
|
# be used.
|
877
1302
|
# @param [Hash] labels A hash of user-provided labels associated with
|
878
|
-
# the job. You can use these to organize and group your jobs.
|
879
|
-
#
|
880
|
-
#
|
881
|
-
#
|
882
|
-
#
|
883
|
-
#
|
884
|
-
#
|
1303
|
+
# the job. You can use these to organize and group your jobs.
|
1304
|
+
#
|
1305
|
+
# The labels applied to a resource must meet the following requirements:
|
1306
|
+
#
|
1307
|
+
# * Each resource can have multiple labels, up to a maximum of 64.
|
1308
|
+
# * Each label must be a key-value pair.
|
1309
|
+
# * Keys have a minimum length of 1 character and a maximum length of
|
1310
|
+
# 63 characters, and cannot be empty. Values can be empty, and have
|
1311
|
+
# a maximum length of 63 characters.
|
1312
|
+
# * Keys and values can contain only lowercase letters, numeric characters,
|
1313
|
+
# underscores, and dashes. All characters must use UTF-8 encoding, and
|
1314
|
+
# international characters are allowed.
|
1315
|
+
# * The key portion of a label must be unique. However, you can use the
|
1316
|
+
# same key with multiple resources.
|
1317
|
+
# * Keys must start with a lowercase letter or international character.
|
885
1318
|
# @param [Array<String>, String] udfs User-defined function resources
|
886
|
-
# used in
|
887
|
-
# Google Cloud Storage URI (`gs://bucket/path`), or an inline resource
|
1319
|
+
# used in a legacy SQL query. May be either a code resource to load from
|
1320
|
+
# a Google Cloud Storage URI (`gs://bucket/path`), or an inline resource
|
888
1321
|
# that contains code for a user-defined function (UDF). Providing an
|
889
1322
|
# inline code resource is equivalent to providing a URI for a file
|
890
|
-
# containing the same code.
|
891
|
-
#
|
892
|
-
#
|
893
|
-
#
|
1323
|
+
# containing the same code.
|
1324
|
+
#
|
1325
|
+
# This parameter is used for defining User Defined Function (UDF)
|
1326
|
+
# resources only when using legacy SQL. Users of standard SQL should
|
1327
|
+
# leverage either DDL (e.g. `CREATE [TEMPORARY] FUNCTION ...`) or the
|
1328
|
+
# Routines API to define UDF resources.
|
1329
|
+
#
|
1330
|
+
# For additional information on migrating, see: [Migrating to
|
1331
|
+
# standard SQL - Differences in user-defined JavaScript
|
1332
|
+
# functions](https://cloud.google.com/bigquery/docs/reference/standard-sql/migrating-from-legacy-sql#differences_in_user-defined_javascript_functions)
|
1333
|
+
# @param [Boolean] create_session If true, creates a new session, where the
|
1334
|
+
# session ID will be a server generated random id. If false, runs query
|
1335
|
+
# with an existing session ID when one is provided in the `session_id`
|
1336
|
+
# param, otherwise runs query in non-session mode. See {Job#session_id}.
|
1337
|
+
# The default value is false.
|
1338
|
+
# @param [String] session_id The ID of an existing session. See also the
|
1339
|
+
# `create_session` param and {Job#session_id}.
|
894
1340
|
# @yield [job] a job configuration object
|
895
1341
|
# @yieldparam [Google::Cloud::Bigquery::QueryJob::Updater] job a job
|
896
1342
|
# configuration object for setting additional options for the query.
|
@@ -960,32 +1406,62 @@ module Google
|
|
960
1406
|
# end
|
961
1407
|
# end
|
962
1408
|
#
|
1409
|
+
# @example Query using named query parameters with types:
|
1410
|
+
# require "google/cloud/bigquery"
|
1411
|
+
#
|
1412
|
+
# bigquery = Google::Cloud::Bigquery.new
|
1413
|
+
# dataset = bigquery.dataset "my_dataset"
|
1414
|
+
#
|
1415
|
+
# job = dataset.query_job "SELECT name FROM my_table WHERE id IN UNNEST(@ids)",
|
1416
|
+
# params: { ids: [] },
|
1417
|
+
# types: { ids: [:INT64] }
|
1418
|
+
#
|
1419
|
+
# job.wait_until_done!
|
1420
|
+
# if !job.failed?
|
1421
|
+
# job.data.each do |row|
|
1422
|
+
# puts row[:name]
|
1423
|
+
# end
|
1424
|
+
# end
|
1425
|
+
#
|
963
1426
|
# @example Execute a DDL statement:
|
964
1427
|
# require "google/cloud/bigquery"
|
965
1428
|
#
|
966
1429
|
# bigquery = Google::Cloud::Bigquery.new
|
1430
|
+
# dataset = bigquery.dataset "my_dataset"
|
967
1431
|
#
|
968
|
-
# job =
|
1432
|
+
# job = dataset.query_job "CREATE TABLE my_table (x INT64)"
|
969
1433
|
#
|
970
1434
|
# job.wait_until_done!
|
971
1435
|
# if !job.failed?
|
972
|
-
# table_ref = job.ddl_target_table
|
1436
|
+
# table_ref = job.ddl_target_table # Or ddl_target_routine for CREATE/DROP FUNCTION/PROCEDURE
|
973
1437
|
# end
|
974
1438
|
#
|
975
1439
|
# @example Execute a DML statement:
|
976
1440
|
# require "google/cloud/bigquery"
|
977
1441
|
#
|
978
1442
|
# bigquery = Google::Cloud::Bigquery.new
|
1443
|
+
# dataset = bigquery.dataset "my_dataset"
|
979
1444
|
#
|
980
|
-
# job =
|
981
|
-
# "SET x = x + 1 " \
|
982
|
-
# "WHERE x IS NOT NULL"
|
1445
|
+
# job = dataset.query_job "UPDATE my_table SET x = x + 1 WHERE x IS NOT NULL"
|
983
1446
|
#
|
984
1447
|
# job.wait_until_done!
|
985
1448
|
# if !job.failed?
|
986
1449
|
# puts job.num_dml_affected_rows
|
987
1450
|
# end
|
988
1451
|
#
|
1452
|
+
# @example Run query in a session:
|
1453
|
+
# require "google/cloud/bigquery"
|
1454
|
+
#
|
1455
|
+
# bigquery = Google::Cloud::Bigquery.new
|
1456
|
+
# dataset = bigquery.dataset "my_dataset"
|
1457
|
+
#
|
1458
|
+
# job = dataset.query_job "CREATE TEMPORARY TABLE temptable AS SELECT 17 as foo", create_session: true
|
1459
|
+
#
|
1460
|
+
# job.wait_until_done!
|
1461
|
+
#
|
1462
|
+
# session_id = job.session_id
|
1463
|
+
# data = dataset.query "SELECT * FROM temptable", session_id: session_id
|
1464
|
+
#
|
989
1465
|
# @example Query using external data source, set destination:
|
990
1466
|
# require "google/cloud/bigquery"
|
991
1467
|
#
|
@@ -1012,21 +1488,52 @@ module Google
|
|
1012
1488
|
#
|
1013
1489
|
# @!group Data
|
1014
1490
|
#
|
1015
|
-
def query_job query,
|
1016
|
-
|
1017
|
-
|
1018
|
-
|
1019
|
-
|
1020
|
-
|
1491
|
+
def query_job query,
|
1492
|
+
params: nil,
|
1493
|
+
types: nil,
|
1494
|
+
external: nil,
|
1495
|
+
priority: "INTERACTIVE",
|
1496
|
+
cache: true,
|
1497
|
+
table: nil,
|
1498
|
+
create: nil,
|
1499
|
+
write: nil,
|
1500
|
+
dryrun: nil,
|
1501
|
+
standard_sql: nil,
|
1502
|
+
legacy_sql: nil,
|
1503
|
+
large_results: nil,
|
1504
|
+
flatten: nil,
|
1505
|
+
maximum_billing_tier: nil,
|
1506
|
+
maximum_bytes_billed: nil,
|
1507
|
+
job_id: nil,
|
1508
|
+
prefix: nil,
|
1509
|
+
labels: nil,
|
1510
|
+
udfs: nil,
|
1511
|
+
create_session: nil,
|
1512
|
+
session_id: nil
|
1021
1513
|
ensure_service!
|
1022
|
-
options = {
|
1023
|
-
|
1024
|
-
|
1025
|
-
|
1026
|
-
|
1027
|
-
|
1028
|
-
|
1029
|
-
|
1514
|
+
options = {
|
1515
|
+
params: params,
|
1516
|
+
types: types,
|
1517
|
+
external: external,
|
1518
|
+
priority: priority,
|
1519
|
+
cache: cache,
|
1520
|
+
table: table,
|
1521
|
+
create: create,
|
1522
|
+
write: write,
|
1523
|
+
dryrun: dryrun,
|
1524
|
+
standard_sql: standard_sql,
|
1525
|
+
legacy_sql: legacy_sql,
|
1526
|
+
large_results: large_results,
|
1527
|
+
flatten: flatten,
|
1528
|
+
maximum_billing_tier: maximum_billing_tier,
|
1529
|
+
maximum_bytes_billed: maximum_bytes_billed,
|
1530
|
+
job_id: job_id,
|
1531
|
+
prefix: prefix,
|
1532
|
+
labels: labels,
|
1533
|
+
udfs: udfs,
|
1534
|
+
create_session: create_session,
|
1535
|
+
session_id: session_id
|
1536
|
+
}
|
1030
1537
|
|
1031
1538
|
updater = QueryJob::Updater.from_options service, query, options
|
1032
1539
|
updater.dataset = self
|
@@ -1048,27 +1555,6 @@ module Google
|
|
1048
1555
|
# Sets the current dataset as the default dataset in the query. Useful
|
1049
1556
|
# for using unqualified table names.
|
1050
1557
|
#
|
1051
|
-
# When using standard SQL and passing arguments using `params`, Ruby
|
1052
|
-
# types are mapped to BigQuery types as follows:
|
1053
|
-
#
|
1054
|
-
# | BigQuery | Ruby | Notes |
|
1055
|
-
# |-------------|----------------|---|
|
1056
|
-
# | `BOOL` | `true`/`false` | |
|
1057
|
-
# | `INT64` | `Integer` | |
|
1058
|
-
# | `FLOAT64` | `Float` | |
|
1059
|
-
# | `NUMERIC` | `BigDecimal` | Will be rounded to 9 decimal places |
|
1060
|
-
# | `STRING` | `String` | |
|
1061
|
-
# | `DATETIME` | `DateTime` | `DATETIME` does not support time zone. |
|
1062
|
-
# | `DATE` | `Date` | |
|
1063
|
-
# | `TIMESTAMP` | `Time` | |
|
1064
|
-
# | `TIME` | `Google::Cloud::BigQuery::Time` | |
|
1065
|
-
# | `BYTES` | `File`, `IO`, `StringIO`, or similar | |
|
1066
|
-
# | `ARRAY` | `Array` | Nested arrays, `nil` values are not supported. |
|
1067
|
-
# | `STRUCT` | `Hash` | Hash keys may be strings or symbols. |
|
1068
|
-
#
|
1069
|
-
# See [Data Types](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types)
|
1070
|
-
# for an overview of each BigQuery data type, including allowed values.
|
1071
|
-
#
|
1072
1558
|
# The geographic location for the job ("US", "EU", etc.) can be set via
|
1073
1559
|
# {QueryJob::Updater#location=} in a block passed to this method. If the
|
1074
1560
|
# dataset is a full resource representation (see {#resource_full?}), the
|
@@ -1081,13 +1567,60 @@ module Google
|
|
1081
1567
|
# syntax](https://cloud.google.com/bigquery/query-reference), of the
|
1082
1568
|
# query to execute. Example: "SELECT count(f1) FROM
|
1083
1569
|
# [myProjectId:myDatasetId.myTableId]".
|
1084
|
-
# @param [Array, Hash] params Standard SQL only. Used to pass query
|
1085
|
-
#
|
1086
|
-
#
|
1087
|
-
#
|
1088
|
-
#
|
1089
|
-
#
|
1090
|
-
#
|
1570
|
+
# @param [Array, Hash] params Standard SQL only. Used to pass query arguments when the `query` string contains
|
1571
|
+
# either positional (`?`) or named (`@myparam`) query parameters. If value passed is an array `["foo"]`, the
|
1572
|
+
# query must use positional query parameters. If value passed is a hash `{ myparam: "foo" }`, the query must
|
1573
|
+
# use named query parameters. When set, `legacy_sql` will automatically be set to false and `standard_sql` to
|
1574
|
+
# true.
|
1575
|
+
#
|
1576
|
+
# BigQuery types are converted from Ruby types as follows:
|
1577
|
+
#
|
1578
|
+
# | BigQuery | Ruby | Notes |
|
1579
|
+
# |--------------|--------------------------------------|----------------------------------------------------|
|
1580
|
+
# | `BOOL` | `true`/`false` | |
|
1581
|
+
# | `INT64` | `Integer` | |
|
1582
|
+
# | `FLOAT64` | `Float` | |
|
1583
|
+
# | `NUMERIC` | `BigDecimal` | `BigDecimal` values will be rounded to scale 9. |
|
1584
|
+
# | `BIGNUMERIC` | `BigDecimal` | NOT AUTOMATIC: Must be mapped using `types`, below.|
|
1585
|
+
# | `STRING` | `String` | |
|
1586
|
+
# | `DATETIME` | `DateTime` | `DATETIME` does not support time zone. |
|
1587
|
+
# | `DATE` | `Date` | |
|
1588
|
+
# | `GEOGRAPHY` | `String` (WKT or GeoJSON) | NOT AUTOMATIC: Must be mapped using `types`, below.|
|
1589
|
+
# | `TIMESTAMP` | `Time` | |
|
1590
|
+
# | `TIME` | `Google::Cloud::BigQuery::Time` | |
|
1591
|
+
# | `BYTES` | `File`, `IO`, `StringIO`, or similar | |
|
1592
|
+
# | `ARRAY` | `Array` | Nested arrays, `nil` values are not supported. |
|
1593
|
+
# | `STRUCT` | `Hash` | Hash keys may be strings or symbols. |
|
1594
|
+
#
|
1595
|
+
# See [Data Types](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types) for an overview
|
1596
|
+
# of each BigQuery data type, including allowed values. For the `GEOGRAPHY` type, see [Working with BigQuery
|
1597
|
+
# GIS data](https://cloud.google.com/bigquery/docs/gis-data).
|
1598
|
+
# @param [Array, Hash] types Standard SQL only. Types of the SQL parameters in `params`. It is not always
|
1599
|
+
# possible to infer the right SQL type from a value in `params`. In these cases, `types` must be used to
|
1600
|
+
# specify the SQL type for these values.
|
1601
|
+
#
|
1602
|
+
# Arguments must match the value type passed to `params`. This must be an `Array` when the query uses
|
1603
|
+
# positional query parameters. This must be an `Hash` when the query uses named query parameters. The values
|
1604
|
+
# should be BigQuery type codes from the following list:
|
1605
|
+
#
|
1606
|
+
# * `:BOOL`
|
1607
|
+
# * `:INT64`
|
1608
|
+
# * `:FLOAT64`
|
1609
|
+
# * `:NUMERIC`
|
1610
|
+
# * `:BIGNUMERIC`
|
1611
|
+
# * `:STRING`
|
1612
|
+
# * `:DATETIME`
|
1613
|
+
# * `:DATE`
|
1614
|
+
# * `:GEOGRAPHY`
|
1615
|
+
# * `:TIMESTAMP`
|
1616
|
+
# * `:TIME`
|
1617
|
+
# * `:BYTES`
|
1618
|
+
# * `Array` - Lists are specified by providing the type code in an array. For example, an array of integers
|
1619
|
+
# are specified as `[:INT64]`.
|
1620
|
+
# * `Hash` - Types for STRUCT values (`Hash` objects) are specified using a `Hash` object, where the keys
|
1621
|
+
# match the `params` hash, and the values are the types value that matches the data.
|
1622
|
+
#
|
1623
|
+
# Types are optional.
|
1091
1624
|
# @param [Hash<String|Symbol, External::DataSource>] external A Hash
|
1092
1625
|
# that represents the mapping of the external tables to the table
|
1093
1626
|
# names used in the SQL query. The hash keys are the table names, and
|
@@ -1122,6 +1655,8 @@ module Google
|
|
1122
1655
|
# When set to false, the values of `large_results` and `flatten` are
|
1123
1656
|
# ignored; the query will be run as if `large_results` is true and
|
1124
1657
|
# `flatten` is false. Optional. The default value is false.
|
1658
|
+
# @param [String] session_id The ID of an existing session. See the
|
1659
|
+
# `create_session` param in {#query_job} and {Job#session_id}.
|
1125
1660
|
# @yield [job] a job configuration object
|
1126
1661
|
# @yieldparam [Google::Cloud::Bigquery::QueryJob::Updater] job a job
|
1127
1662
|
# configuration object for setting additional options for the query.
|
@@ -1136,9 +1671,12 @@ module Google
|
|
1136
1671
|
#
|
1137
1672
|
# data = dataset.query "SELECT name FROM my_table"
|
1138
1673
|
#
|
1674
|
+
# # Iterate over the first page of results
|
1139
1675
|
# data.each do |row|
|
1140
1676
|
# puts row[:name]
|
1141
1677
|
# end
|
1678
|
+
# # Retrieve the next page of results
|
1679
|
+
# data = data.next if data.next?
|
1142
1680
|
#
|
1143
1681
|
# @example Query using legacy SQL:
|
1144
1682
|
# require "google/cloud/bigquery"
|
@@ -1149,9 +1687,12 @@ module Google
|
|
1149
1687
|
# data = dataset.query "SELECT name FROM my_table",
|
1150
1688
|
# legacy_sql: true
|
1151
1689
|
#
|
1690
|
+
# # Iterate over the first page of results
|
1152
1691
|
# data.each do |row|
|
1153
1692
|
# puts row[:name]
|
1154
1693
|
# end
|
1694
|
+
# # Retrieve the next page of results
|
1695
|
+
# data = data.next if data.next?
|
1155
1696
|
#
|
1156
1697
|
# @example Query using positional query parameters:
|
1157
1698
|
# require "google/cloud/bigquery"
|
@@ -1162,9 +1703,12 @@ module Google
|
|
1162
1703
|
# data = dataset.query "SELECT name FROM my_table WHERE id = ?",
|
1163
1704
|
# params: [1]
|
1164
1705
|
#
|
1706
|
+
# # Iterate over the first page of results
|
1165
1707
|
# data.each do |row|
|
1166
1708
|
# puts row[:name]
|
1167
1709
|
# end
|
1710
|
+
# # Retrieve the next page of results
|
1711
|
+
# data = data.next if data.next?
|
1168
1712
|
#
|
1169
1713
|
# @example Query using named query parameters:
|
1170
1714
|
# require "google/cloud/bigquery"
|
@@ -1175,30 +1719,63 @@ module Google
|
|
1175
1719
|
# data = dataset.query "SELECT name FROM my_table WHERE id = @id",
|
1176
1720
|
# params: { id: 1 }
|
1177
1721
|
#
|
1722
|
+
# # Iterate over the first page of results
|
1723
|
+
# data.each do |row|
|
1724
|
+
# puts row[:name]
|
1725
|
+
# end
|
1726
|
+
# # Retrieve the next page of results
|
1727
|
+
# data = data.next if data.next?
|
1728
|
+
#
|
1729
|
+
# @example Query using named query parameters with types:
|
1730
|
+
# require "google/cloud/bigquery"
|
1731
|
+
#
|
1732
|
+
# bigquery = Google::Cloud::Bigquery.new
|
1733
|
+
# dataset = bigquery.dataset "my_dataset"
|
1734
|
+
#
|
1735
|
+
# data = dataset.query "SELECT name FROM my_table WHERE id IN UNNEST(@ids)",
|
1736
|
+
# params: { ids: [] },
|
1737
|
+
# types: { ids: [:INT64] }
|
1738
|
+
#
|
1739
|
+
# # Iterate over the first page of results
|
1178
1740
|
# data.each do |row|
|
1179
1741
|
# puts row[:name]
|
1180
1742
|
# end
|
1743
|
+
# # Retrieve the next page of results
|
1744
|
+
# data = data.next if data.next?
|
1181
1745
|
#
|
1182
1746
|
# @example Execute a DDL statement:
|
1183
1747
|
# require "google/cloud/bigquery"
|
1184
1748
|
#
|
1185
1749
|
# bigquery = Google::Cloud::Bigquery.new
|
1750
|
+
# dataset = bigquery.dataset "my_dataset"
|
1186
1751
|
#
|
1187
|
-
# data =
|
1752
|
+
# data = dataset.query "CREATE TABLE my_table (x INT64)"
|
1188
1753
|
#
|
1189
|
-
# table_ref = data.ddl_target_table
|
1754
|
+
# table_ref = data.ddl_target_table # Or ddl_target_routine for CREATE/DROP FUNCTION/PROCEDURE
|
1190
1755
|
#
|
1191
1756
|
# @example Execute a DML statement:
|
1192
1757
|
# require "google/cloud/bigquery"
|
1193
1758
|
#
|
1194
1759
|
# bigquery = Google::Cloud::Bigquery.new
|
1760
|
+
# dataset = bigquery.dataset "my_dataset"
|
1195
1761
|
#
|
1196
|
-
# data =
|
1197
|
-
# "SET x = x + 1 " \
|
1198
|
-
# "WHERE x IS NOT NULL"
|
1762
|
+
# data = dataset.query "UPDATE my_table SET x = x + 1 WHERE x IS NOT NULL"
|
1199
1763
|
#
|
1200
1764
|
# puts data.num_dml_affected_rows
|
1201
1765
|
#
|
1766
|
+
# @example Run query in a session:
|
1767
|
+
# require "google/cloud/bigquery"
|
1768
|
+
#
|
1769
|
+
# bigquery = Google::Cloud::Bigquery.new
|
1770
|
+
# dataset = bigquery.dataset "my_dataset"
|
1771
|
+
#
|
1772
|
+
# job = dataset.query_job "CREATE TEMPORARY TABLE temptable AS SELECT 17 as foo", create_session: true
|
1773
|
+
#
|
1774
|
+
# job.wait_until_done!
|
1775
|
+
#
|
1776
|
+
# session_id = job.session_id
|
1777
|
+
# data = dataset.query "SELECT * FROM temptable", session_id: session_id
|
1778
|
+
#
|
1202
1779
|
# @example Query using external data source, set destination:
|
1203
1780
|
# require "google/cloud/bigquery"
|
1204
1781
|
#
|
@@ -1216,17 +1793,34 @@ module Google
|
|
1216
1793
|
# query.table = dataset.table "my_table", skip_lookup: true
|
1217
1794
|
# end
|
1218
1795
|
#
|
1796
|
+
# # Iterate over the first page of results
|
1219
1797
|
# data.each do |row|
|
1220
1798
|
# puts row[:name]
|
1221
1799
|
# end
|
1800
|
+
# # Retrieve the next page of results
|
1801
|
+
# data = data.next if data.next?
|
1222
1802
|
#
|
1223
1803
|
# @!group Data
|
1224
1804
|
#
|
1225
|
-
def query query,
|
1226
|
-
|
1227
|
-
|
1228
|
-
|
1229
|
-
|
1805
|
+
def query query,
|
1806
|
+
params: nil,
|
1807
|
+
types: nil,
|
1808
|
+
external: nil,
|
1809
|
+
max: nil,
|
1810
|
+
cache: true,
|
1811
|
+
standard_sql: nil,
|
1812
|
+
legacy_sql: nil,
|
1813
|
+
session_id: nil,
|
1814
|
+
&block
|
1815
|
+
job = query_job query,
|
1816
|
+
params: params,
|
1817
|
+
types: types,
|
1818
|
+
external: external,
|
1819
|
+
cache: cache,
|
1820
|
+
standard_sql: standard_sql,
|
1821
|
+
legacy_sql: legacy_sql,
|
1822
|
+
session_id: session_id,
|
1823
|
+
&block
|
1230
1824
|
job.wait_until_done!
|
1231
1825
|
ensure_job_succeeded! job
|
1232
1826
|
|
@@ -1252,7 +1846,7 @@ module Google
|
|
1252
1846
|
# The following values are supported:
|
1253
1847
|
#
|
1254
1848
|
# * `csv` - CSV
|
1255
|
-
# * `json` - [Newline-delimited JSON](
|
1849
|
+
# * `json` - [Newline-delimited JSON](https://jsonlines.org/)
|
1256
1850
|
# * `avro` - [Avro](http://avro.apache.org/)
|
1257
1851
|
# * `sheets` - Google Sheets
|
1258
1852
|
# * `datastore_backup` - Cloud Datastore backup
|
@@ -1315,7 +1909,7 @@ module Google
|
|
1315
1909
|
# The following values are supported:
|
1316
1910
|
#
|
1317
1911
|
# * `csv` - CSV
|
1318
|
-
# * `json` - [Newline-delimited JSON](
|
1912
|
+
# * `json` - [Newline-delimited JSON](https://jsonlines.org/)
|
1319
1913
|
# * `avro` - [Avro](http://avro.apache.org/)
|
1320
1914
|
# * `orc` - [ORC](https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-orc)
|
1321
1915
|
# * `parquet` - [Parquet](https://parquet.apache.org/)
|
@@ -1407,8 +2001,8 @@ module Google
|
|
1407
2001
|
# this option. Also note that for most use cases, the block yielded by
|
1408
2002
|
# this method is a more convenient way to configure the schema.
|
1409
2003
|
# @param [String] job_id A user-defined ID for the load job. The ID
|
1410
|
-
# must contain only letters (
|
1411
|
-
# (_), or dashes (
|
2004
|
+
# must contain only letters (`[A-Za-z]`), numbers (`[0-9]`), underscores
|
2005
|
+
# (`_`), or dashes (`-`). The maximum length is 1,024 characters. If
|
1412
2006
|
# `job_id` is provided, then `prefix` will not be used.
|
1413
2007
|
#
|
1414
2008
|
# See [Generating a job
|
@@ -1417,18 +2011,26 @@ module Google
|
|
1417
2011
|
# prepended to a generated value to produce a unique job ID. For
|
1418
2012
|
# example, the prefix `daily_import_job_` can be given to generate a
|
1419
2013
|
# job ID such as `daily_import_job_12vEDtMQ0mbp1Mo5Z7mzAFQJZazh`. The
|
1420
|
-
# prefix must contain only letters (
|
1421
|
-
# underscores (_), or dashes (
|
2014
|
+
# prefix must contain only letters (`[A-Za-z]`), numbers (`[0-9]`),
|
2015
|
+
# underscores (`_`), or dashes (`-`). The maximum length of the entire ID
|
1422
2016
|
# is 1,024 characters. If `job_id` is provided, then `prefix` will not
|
1423
2017
|
# be used.
|
1424
2018
|
# @param [Hash] labels A hash of user-provided labels associated with
|
1425
|
-
# the job. You can use these to organize and group your jobs.
|
1426
|
-
#
|
1427
|
-
#
|
1428
|
-
#
|
1429
|
-
#
|
1430
|
-
#
|
1431
|
-
#
|
2019
|
+
# the job. You can use these to organize and group your jobs.
|
2020
|
+
#
|
2021
|
+
# The labels applied to a resource must meet the following requirements:
|
2022
|
+
#
|
2023
|
+
# * Each resource can have multiple labels, up to a maximum of 64.
|
2024
|
+
# * Each label must be a key-value pair.
|
2025
|
+
# * Keys have a minimum length of 1 character and a maximum length of
|
2026
|
+
# 63 characters, and cannot be empty. Values can be empty, and have
|
2027
|
+
# a maximum length of 63 characters.
|
2028
|
+
# * Keys and values can contain only lowercase letters, numeric characters,
|
2029
|
+
# underscores, and dashes. All characters must use UTF-8 encoding, and
|
2030
|
+
# international characters are allowed.
|
2031
|
+
# * The key portion of a label must be unique. However, you can use the
|
2032
|
+
# same key with multiple resources.
|
2033
|
+
# * Keys must start with a lowercase letter or international character.
|
1432
2034
|
# @yield [updater] A block for setting the schema and other
|
1433
2035
|
# options for the destination table. The schema can be omitted if the
|
1434
2036
|
# destination table already exists, or if you're loading data from a
|
@@ -1522,29 +2124,19 @@ module Google
|
|
1522
2124
|
#
|
1523
2125
|
# @!group Data
|
1524
2126
|
#
|
1525
|
-
def load_job table_id, files, format: nil, create: nil, write: nil,
|
1526
|
-
|
1527
|
-
|
1528
|
-
|
1529
|
-
skip_leading: nil, schema: nil, job_id: nil, prefix: nil,
|
1530
|
-
labels: nil, autodetect: nil, null_marker: nil, dryrun: nil
|
2127
|
+
def load_job table_id, files, format: nil, create: nil, write: nil, projection_fields: nil, jagged_rows: nil,
|
2128
|
+
quoted_newlines: nil, encoding: nil, delimiter: nil, ignore_unknown: nil, max_bad_records: nil,
|
2129
|
+
quote: nil, skip_leading: nil, schema: nil, job_id: nil, prefix: nil, labels: nil, autodetect: nil,
|
2130
|
+
null_marker: nil, dryrun: nil
|
1531
2131
|
ensure_service!
|
1532
2132
|
|
1533
2133
|
updater = load_job_updater table_id,
|
1534
|
-
format: format, create: create,
|
1535
|
-
|
1536
|
-
|
1537
|
-
|
1538
|
-
|
1539
|
-
|
1540
|
-
delimiter: delimiter,
|
1541
|
-
ignore_unknown: ignore_unknown,
|
1542
|
-
max_bad_records: max_bad_records,
|
1543
|
-
quote: quote, skip_leading: skip_leading,
|
1544
|
-
dryrun: dryrun, schema: schema,
|
1545
|
-
job_id: job_id, prefix: prefix,
|
1546
|
-
labels: labels, autodetect: autodetect,
|
1547
|
-
null_marker: null_marker
|
2134
|
+
format: format, create: create, write: write, projection_fields: projection_fields,
|
2135
|
+
jagged_rows: jagged_rows, quoted_newlines: quoted_newlines, encoding: encoding,
|
2136
|
+
delimiter: delimiter, ignore_unknown: ignore_unknown,
|
2137
|
+
max_bad_records: max_bad_records, quote: quote, skip_leading: skip_leading,
|
2138
|
+
dryrun: dryrun, schema: schema, job_id: job_id, prefix: prefix, labels: labels,
|
2139
|
+
autodetect: autodetect, null_marker: null_marker
|
1548
2140
|
|
1549
2141
|
yield updater if block_given?
|
1550
2142
|
|
@@ -1579,7 +2171,7 @@ module Google
|
|
1579
2171
|
# The following values are supported:
|
1580
2172
|
#
|
1581
2173
|
# * `csv` - CSV
|
1582
|
-
# * `json` - [Newline-delimited JSON](
|
2174
|
+
# * `json` - [Newline-delimited JSON](https://jsonlines.org/)
|
1583
2175
|
# * `avro` - [Avro](http://avro.apache.org/)
|
1584
2176
|
# * `orc` - [ORC](https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-orc)
|
1585
2177
|
# * `parquet` - [Parquet](https://parquet.apache.org/)
|
@@ -1760,21 +2352,14 @@ module Google
|
|
1760
2352
|
#
|
1761
2353
|
# @!group Data
|
1762
2354
|
#
|
1763
|
-
def load table_id, files, format: nil, create: nil, write: nil,
|
1764
|
-
|
1765
|
-
|
1766
|
-
max_bad_records: nil, quote: nil, skip_leading: nil,
|
1767
|
-
schema: nil, autodetect: nil, null_marker: nil, &block
|
2355
|
+
def load table_id, files, format: nil, create: nil, write: nil, projection_fields: nil, jagged_rows: nil,
|
2356
|
+
quoted_newlines: nil, encoding: nil, delimiter: nil, ignore_unknown: nil, max_bad_records: nil,
|
2357
|
+
quote: nil, skip_leading: nil, schema: nil, autodetect: nil, null_marker: nil, &block
|
1768
2358
|
job = load_job table_id, files,
|
1769
|
-
format: format, create: create, write: write,
|
1770
|
-
|
1771
|
-
|
1772
|
-
|
1773
|
-
encoding: encoding, delimiter: delimiter,
|
1774
|
-
ignore_unknown: ignore_unknown,
|
1775
|
-
max_bad_records: max_bad_records,
|
1776
|
-
quote: quote, skip_leading: skip_leading,
|
1777
|
-
schema: schema, autodetect: autodetect,
|
2359
|
+
format: format, create: create, write: write, projection_fields: projection_fields,
|
2360
|
+
jagged_rows: jagged_rows, quoted_newlines: quoted_newlines, encoding: encoding,
|
2361
|
+
delimiter: delimiter, ignore_unknown: ignore_unknown, max_bad_records: max_bad_records,
|
2362
|
+
quote: quote, skip_leading: skip_leading, schema: schema, autodetect: autodetect,
|
1778
2363
|
null_marker: null_marker, &block
|
1779
2364
|
|
1780
2365
|
job.wait_until_done!
|
@@ -1825,7 +2410,7 @@ module Google
|
|
1825
2410
|
# dataset = bigquery.dataset "my_dataset", skip_lookup: true
|
1826
2411
|
# dataset.exists? # true
|
1827
2412
|
#
|
1828
|
-
def exists? force:
|
2413
|
+
def exists? force: false
|
1829
2414
|
return gapi_exists? if force
|
1830
2415
|
# If we have a memoized value, return it
|
1831
2416
|
return @exists unless @exists.nil?
|
@@ -1935,14 +2520,12 @@ module Google
|
|
1935
2520
|
end
|
1936
2521
|
|
1937
2522
|
##
|
1938
|
-
# @private New lazy Dataset object without making an HTTP request.
|
2523
|
+
# @private New lazy Dataset object without making an HTTP request, for use with the skip_lookup option.
|
1939
2524
|
def self.new_reference project_id, dataset_id, service
|
1940
2525
|
raise ArgumentError, "dataset_id is required" unless dataset_id
|
1941
2526
|
new.tap do |b|
|
1942
|
-
reference_gapi = Google::Apis::BigqueryV2::DatasetReference.new
|
1943
|
-
project_id: project_id,
|
1944
|
-
dataset_id: dataset_id
|
1945
|
-
)
|
2527
|
+
reference_gapi = Google::Apis::BigqueryV2::DatasetReference.new \
|
2528
|
+
project_id: project_id, dataset_id: dataset_id
|
1946
2529
|
b.service = service
|
1947
2530
|
b.instance_variable_set :@reference, reference_gapi
|
1948
2531
|
end
|
@@ -1953,18 +2536,47 @@ module Google
|
|
1953
2536
|
# the need to complete a load operation before the data can appear in
|
1954
2537
|
# query results.
|
1955
2538
|
#
|
2539
|
+
# Simple Ruby types are generally accepted per JSON rules, along with the following support for BigQuery's more
|
2540
|
+
# complex types:
|
2541
|
+
#
|
2542
|
+
# | BigQuery | Ruby | Notes |
|
2543
|
+
# |--------------|--------------------------------------|----------------------------------------------------|
|
2544
|
+
# | `NUMERIC` | `BigDecimal` | `BigDecimal` values will be rounded to scale 9. |
|
2545
|
+
# | `BIGNUMERIC` | `String` | Pass as `String` to avoid rounding to scale 9. |
|
2546
|
+
# | `DATETIME` | `DateTime` | `DATETIME` does not support time zone. |
|
2547
|
+
# | `DATE` | `Date` | |
|
2548
|
+
# | `GEOGRAPHY` | `String` | |
|
2549
|
+
# | `TIMESTAMP` | `Time` | |
|
2550
|
+
# | `TIME` | `Google::Cloud::BigQuery::Time` | |
|
2551
|
+
# | `BYTES` | `File`, `IO`, `StringIO`, or similar | |
|
2552
|
+
# | `ARRAY` | `Array` | Nested arrays, `nil` values are not supported. |
|
2553
|
+
# | `STRUCT` | `Hash` | Hash keys may be strings or symbols. |
|
2554
|
+
#
|
2555
|
+
# Because BigQuery's streaming API is designed for high insertion rates,
|
2556
|
+
# modifications to the underlying table metadata are eventually
|
2557
|
+
# consistent when interacting with the streaming system. In most cases
|
2558
|
+
# metadata changes are propagated within minutes, but during this period
|
2559
|
+
# API responses may reflect the inconsistent state of the table.
|
2560
|
+
#
|
1956
2561
|
# @see https://cloud.google.com/bigquery/streaming-data-into-bigquery
|
1957
2562
|
# Streaming Data Into BigQuery
|
1958
2563
|
#
|
2564
|
+
# @see https://cloud.google.com/bigquery/troubleshooting-errors#metadata-errors-for-streaming-inserts
|
2565
|
+
# BigQuery Troubleshooting: Metadata errors for streaming inserts
|
2566
|
+
#
|
1959
2567
|
# @param [String] table_id The ID of the destination table.
|
1960
2568
|
# @param [Hash, Array<Hash>] rows A hash object or array of hash objects
|
1961
|
-
# containing the data. Required.
|
1962
|
-
#
|
1963
|
-
#
|
1964
|
-
#
|
1965
|
-
#
|
1966
|
-
#
|
1967
|
-
#
|
2569
|
+
# containing the data. Required. `BigDecimal` values will be rounded to
|
2570
|
+
# scale 9 to conform with the BigQuery `NUMERIC` data type. To avoid
|
2571
|
+
# rounding `BIGNUMERIC` type values with scale greater than 9, use `String`
|
2572
|
+
# instead of `BigDecimal`.
|
2573
|
+
# @param [Array<String|Symbol>, Symbol] insert_ids A unique ID for each row. BigQuery uses this property to
|
2574
|
+
# detect duplicate insertion requests on a best-effort basis. For more information, see [data
|
2575
|
+
# consistency](https://cloud.google.com/bigquery/streaming-data-into-bigquery#dataconsistency). Optional. If
|
2576
|
+
# not provided, the client library will assign a UUID to each row before the request is sent.
|
2577
|
+
#
|
2578
|
+
# The value `:skip` can be provided to skip the generation of IDs for all rows, or to skip the generation of an
|
2579
|
+
# ID for a specific row in the array.
|
1968
2580
|
# @param [Boolean] skip_invalid Insert all valid rows of a request, even
|
1969
2581
|
# if invalid rows exist. The default value is `false`, which causes
|
1970
2582
|
# the entire request to fail if any invalid rows exist.
|
@@ -1975,6 +2587,12 @@ module Google
|
|
1975
2587
|
# a new table with the given `table_id`, if no table is found for
|
1976
2588
|
# `table_id`. The default value is false.
|
1977
2589
|
#
|
2590
|
+
# @yield [table] a block for setting the table
|
2591
|
+
# @yieldparam [Google::Cloud::Bigquery::Table::Updater] table An updater
|
2592
|
+
# to set additional properties on the table in the API request to
|
2593
|
+
# create it. Only used when `autocreate` is set and the table does not
|
2594
|
+
# already exist.
|
2595
|
+
#
|
1978
2596
|
# @return [Google::Cloud::Bigquery::InsertResponse] An insert response
|
1979
2597
|
# object.
|
1980
2598
|
#
|
@@ -2018,42 +2636,36 @@ module Google
|
|
2018
2636
|
# t.schema.integer "age", mode: :required
|
2019
2637
|
# end
|
2020
2638
|
#
|
2639
|
+
# @example Pass `BIGNUMERIC` value as a string to avoid rounding to scale 9 in the conversion from `BigDecimal`:
|
2640
|
+
# require "google/cloud/bigquery"
|
2641
|
+
#
|
2642
|
+
# bigquery = Google::Cloud::Bigquery.new
|
2643
|
+
# dataset = bigquery.dataset "my_dataset"
|
2644
|
+
#
|
2645
|
+
# row = {
|
2646
|
+
# "my_numeric" => BigDecimal("123456798.987654321"),
|
2647
|
+
# "my_bignumeric" => "123456798.98765432100001" # BigDecimal would be rounded, use String instead!
|
2648
|
+
# }
|
2649
|
+
# dataset.insert "my_table", row
|
2650
|
+
#
|
2021
2651
|
# @!group Data
|
2022
2652
|
#
|
2023
|
-
def insert table_id, rows, insert_ids: nil, skip_invalid: nil,
|
2024
|
-
ignore_unknown: nil, autocreate: nil
|
2653
|
+
def insert table_id, rows, insert_ids: nil, skip_invalid: nil, ignore_unknown: nil, autocreate: nil, &block
|
2025
2654
|
rows = [rows] if rows.is_a? Hash
|
2655
|
+
raise ArgumentError, "No rows provided" if rows.empty?
|
2656
|
+
|
2657
|
+
insert_ids = Array.new(rows.count) { :skip } if insert_ids == :skip
|
2026
2658
|
insert_ids = Array insert_ids
|
2027
|
-
if insert_ids.count
|
2659
|
+
if insert_ids.count.positive? && insert_ids.count != rows.count
|
2028
2660
|
raise ArgumentError, "insert_ids must be the same size as rows"
|
2029
2661
|
end
|
2030
2662
|
|
2031
2663
|
if autocreate
|
2032
|
-
|
2033
|
-
|
2034
|
-
ignore_unknown: ignore_unknown,
|
2035
|
-
insert_ids: insert_ids
|
2036
|
-
rescue Google::Cloud::NotFoundError
|
2037
|
-
sleep rand(1..60)
|
2038
|
-
begin
|
2039
|
-
create_table table_id do |tbl_updater|
|
2040
|
-
yield tbl_updater if block_given?
|
2041
|
-
end
|
2042
|
-
# rubocop:disable Lint/HandleExceptions
|
2043
|
-
rescue Google::Cloud::AlreadyExistsError
|
2044
|
-
end
|
2045
|
-
# rubocop:enable Lint/HandleExceptions
|
2046
|
-
|
2047
|
-
sleep 60
|
2048
|
-
insert table_id, rows, skip_invalid: skip_invalid,
|
2049
|
-
ignore_unknown: ignore_unknown,
|
2050
|
-
autocreate: true,
|
2051
|
-
insert_ids: insert_ids
|
2052
|
-
end
|
2664
|
+
insert_data_with_autocreate table_id, rows, skip_invalid: skip_invalid, ignore_unknown: ignore_unknown,
|
2665
|
+
insert_ids: insert_ids, &block
|
2053
2666
|
else
|
2054
|
-
insert_data table_id, rows, skip_invalid:
|
2055
|
-
|
2056
|
-
insert_ids: insert_ids
|
2667
|
+
insert_data table_id, rows, skip_invalid: skip_invalid, ignore_unknown: ignore_unknown,
|
2668
|
+
insert_ids: insert_ids
|
2057
2669
|
end
|
2058
2670
|
end
|
2059
2671
|
|
@@ -2076,6 +2688,11 @@ module Google
|
|
2076
2688
|
# messages before the batch is published. Default is 10.
|
2077
2689
|
# @attr_reader [Numeric] threads The number of threads used to insert
|
2078
2690
|
# batches of rows. Default is 4.
|
2691
|
+
# @param [String] view Specifies the view that determines which table information is returned.
|
2692
|
+
# By default, basic table information and storage statistics (STORAGE_STATS) are returned.
|
2693
|
+
# Accepted values include `:unspecified`, `:basic`, `:storage`, and
|
2694
|
+
# `:full`. For more information, see [BigQuery Classes](@todo: Update the link).
|
2695
|
+
# The default value is the `:unspecified` view type.
|
2079
2696
|
# @yield [response] the callback for when a batch of rows is inserted
|
2080
2697
|
# @yieldparam [Table::AsyncInserter::Result] result the result of the
|
2081
2698
|
# asynchronous insert
|
@@ -2104,14 +2721,35 @@ module Google
|
|
2104
2721
|
#
|
2105
2722
|
# inserter.stop.wait!
|
2106
2723
|
#
|
2107
|
-
|
2108
|
-
|
2109
|
-
|
2724
|
+
# @example Avoid retrieving transient stats of the table with while inserting :
|
2725
|
+
# require "google/cloud/bigquery"
|
2726
|
+
#
|
2727
|
+
# bigquery = Google::Cloud::Bigquery.new
|
2728
|
+
# dataset = bigquery.dataset "my_dataset"
|
2729
|
+
# inserter = dataset.insert_async("my_table", view: "basic") do |result|
|
2730
|
+
# if result.error?
|
2731
|
+
# log_error result.error
|
2732
|
+
# else
|
2733
|
+
# log_insert "inserted #{result.insert_count} rows " \
|
2734
|
+
# "with #{result.error_count} errors"
|
2735
|
+
# end
|
2736
|
+
# end
|
2737
|
+
#
|
2738
|
+
# rows = [
|
2739
|
+
# { "first_name" => "Alice", "age" => 21 },
|
2740
|
+
# { "first_name" => "Bob", "age" => 22 }
|
2741
|
+
# ]
|
2742
|
+
# inserter.insert rows
|
2743
|
+
#
|
2744
|
+
# inserter.stop.wait!
|
2745
|
+
#
|
2746
|
+
def insert_async table_id, skip_invalid: nil, ignore_unknown: nil, max_bytes: 10_000_000, max_rows: 500,
|
2747
|
+
interval: 10, threads: 4, view: nil, &block
|
2110
2748
|
ensure_service!
|
2111
2749
|
|
2112
2750
|
# Get table, don't use Dataset#table which handles NotFoundError
|
2113
|
-
gapi = service.get_table dataset_id, table_id
|
2114
|
-
table = Table.from_gapi gapi, service
|
2751
|
+
gapi = service.get_table dataset_id, table_id, metadata_view: view
|
2752
|
+
table = Table.from_gapi gapi, service, metadata_view: view
|
2115
2753
|
# Get the AsyncInserter from the table
|
2116
2754
|
table.insert_async skip_invalid: skip_invalid,
|
2117
2755
|
ignore_unknown: ignore_unknown,
|
@@ -2119,17 +2757,53 @@ module Google
|
|
2119
2757
|
interval: interval, threads: threads, &block
|
2120
2758
|
end
|
2121
2759
|
|
2760
|
+
##
|
2761
|
+
# Build an object of type Google::Apis::BigqueryV2::DatasetAccessEntry from
|
2762
|
+
# the self.
|
2763
|
+
#
|
2764
|
+
# @param [Array<String>] target_types The list of target types within the dataset.
|
2765
|
+
#
|
2766
|
+
# @return [Google::Apis::BigqueryV2::DatasetAccessEntry] Returns a DatasetAccessEntry object.
|
2767
|
+
#
|
2768
|
+
# @example
|
2769
|
+
# require "google/cloud/bigquery"
|
2770
|
+
#
|
2771
|
+
# bigquery = Google::Cloud::Bigquery.new
|
2772
|
+
# dataset = bigquery.dataset "my_dataset"
|
2773
|
+
# dataset_access_entry = dataset.access_entry target_types: ["VIEWS"]
|
2774
|
+
#
|
2775
|
+
def build_access_entry target_types: nil
|
2776
|
+
params = {
|
2777
|
+
dataset: dataset_ref,
|
2778
|
+
target_types: target_types
|
2779
|
+
}.delete_if { |_, v| v.nil? }
|
2780
|
+
Google::Apis::BigqueryV2::DatasetAccessEntry.new(**params)
|
2781
|
+
end
|
2782
|
+
|
2122
2783
|
protected
|
2123
2784
|
|
2124
|
-
def
|
2125
|
-
|
2785
|
+
def insert_data_with_autocreate table_id, rows, skip_invalid: nil, ignore_unknown: nil, insert_ids: nil
|
2786
|
+
insert_data table_id, rows, skip_invalid: skip_invalid, ignore_unknown: ignore_unknown, insert_ids: insert_ids
|
2787
|
+
rescue Google::Cloud::NotFoundError
|
2788
|
+
sleep rand(1..60)
|
2789
|
+
begin
|
2790
|
+
create_table table_id do |tbl_updater|
|
2791
|
+
yield tbl_updater if block_given?
|
2792
|
+
end
|
2793
|
+
rescue Google::Cloud::AlreadyExistsError
|
2794
|
+
# Do nothing if it already exists
|
2795
|
+
end
|
2796
|
+
sleep 60
|
2797
|
+
retry
|
2798
|
+
end
|
2799
|
+
|
2800
|
+
def insert_data table_id, rows, skip_invalid: nil, ignore_unknown: nil, insert_ids: nil
|
2126
2801
|
rows = [rows] if rows.is_a? Hash
|
2127
2802
|
raise ArgumentError, "No rows provided" if rows.empty?
|
2128
2803
|
ensure_service!
|
2129
|
-
|
2130
|
-
|
2131
|
-
|
2132
|
-
gapi = service.insert_tabledata dataset_id, table_id, rows, options
|
2804
|
+
gapi = service.insert_tabledata dataset_id, table_id, rows, skip_invalid: skip_invalid,
|
2805
|
+
ignore_unknown: ignore_unknown,
|
2806
|
+
insert_ids: insert_ids
|
2133
2807
|
InsertResponse.from_gapi rows, gapi
|
2134
2808
|
end
|
2135
2809
|
|
@@ -2160,10 +2834,8 @@ module Google
|
|
2160
2834
|
def patch_gapi! *attributes
|
2161
2835
|
return if attributes.empty?
|
2162
2836
|
ensure_service!
|
2163
|
-
patch_args =
|
2164
|
-
|
2165
|
-
end]
|
2166
|
-
patch_gapi = Google::Apis::BigqueryV2::Dataset.new patch_args
|
2837
|
+
patch_args = attributes.to_h { |attr| [attr, @gapi.send(attr)] }
|
2838
|
+
patch_gapi = Google::Apis::BigqueryV2::Dataset.new(**patch_args)
|
2167
2839
|
patch_gapi.etag = etag if etag
|
2168
2840
|
@gapi = service.patch_dataset dataset_id, patch_gapi
|
2169
2841
|
end
|
@@ -2172,7 +2844,7 @@ module Google
|
|
2172
2844
|
# Load the complete representation of the dataset if it has been
|
2173
2845
|
# only partially loaded by a request to the API list method.
|
2174
2846
|
def ensure_full_data!
|
2175
|
-
reload!
|
2847
|
+
reload! unless resource_full?
|
2176
2848
|
end
|
2177
2849
|
|
2178
2850
|
def ensure_job_succeeded! job
|
@@ -2203,11 +2875,8 @@ module Google
|
|
2203
2875
|
)
|
2204
2876
|
end
|
2205
2877
|
|
2206
|
-
def load_job_csv_options! job, jagged_rows: nil,
|
2207
|
-
|
2208
|
-
delimiter: nil,
|
2209
|
-
quote: nil, skip_leading: nil,
|
2210
|
-
null_marker: nil
|
2878
|
+
def load_job_csv_options! job, jagged_rows: nil, quoted_newlines: nil, delimiter: nil, quote: nil,
|
2879
|
+
skip_leading: nil, null_marker: nil
|
2211
2880
|
job.jagged_rows = jagged_rows unless jagged_rows.nil?
|
2212
2881
|
job.quoted_newlines = quoted_newlines unless quoted_newlines.nil?
|
2213
2882
|
job.delimiter = delimiter unless delimiter.nil?
|
@@ -2216,17 +2885,11 @@ module Google
|
|
2216
2885
|
job.skip_leading = skip_leading unless skip_leading.nil?
|
2217
2886
|
end
|
2218
2887
|
|
2219
|
-
def load_job_file_options! job, format: nil,
|
2220
|
-
|
2221
|
-
|
2222
|
-
encoding: nil, delimiter: nil,
|
2223
|
-
ignore_unknown: nil, max_bad_records: nil,
|
2224
|
-
quote: nil, skip_leading: nil,
|
2225
|
-
null_marker: nil
|
2888
|
+
def load_job_file_options! job, format: nil, projection_fields: nil, jagged_rows: nil, quoted_newlines: nil,
|
2889
|
+
encoding: nil, delimiter: nil, ignore_unknown: nil, max_bad_records: nil, quote: nil,
|
2890
|
+
skip_leading: nil, null_marker: nil
|
2226
2891
|
job.format = format unless format.nil?
|
2227
|
-
unless projection_fields.nil?
|
2228
|
-
job.projection_fields = projection_fields
|
2229
|
-
end
|
2892
|
+
job.projection_fields = projection_fields unless projection_fields.nil?
|
2230
2893
|
job.encoding = encoding unless encoding.nil?
|
2231
2894
|
job.ignore_unknown = ignore_unknown unless ignore_unknown.nil?
|
2232
2895
|
job.max_bad_records = max_bad_records unless max_bad_records.nil?
|
@@ -2238,16 +2901,11 @@ module Google
|
|
2238
2901
|
null_marker: null_marker
|
2239
2902
|
end
|
2240
2903
|
|
2241
|
-
def load_job_updater table_id, format: nil, create: nil,
|
2242
|
-
|
2243
|
-
|
2244
|
-
|
2245
|
-
|
2246
|
-
quote: nil, skip_leading: nil, dryrun: nil,
|
2247
|
-
schema: nil, job_id: nil, prefix: nil, labels: nil,
|
2248
|
-
autodetect: nil, null_marker: nil
|
2249
|
-
new_job = load_job_gapi table_id, dryrun, job_id: job_id,
|
2250
|
-
prefix: prefix
|
2904
|
+
def load_job_updater table_id, format: nil, create: nil, write: nil, projection_fields: nil, jagged_rows: nil,
|
2905
|
+
quoted_newlines: nil, encoding: nil, delimiter: nil, ignore_unknown: nil,
|
2906
|
+
max_bad_records: nil, quote: nil, skip_leading: nil, dryrun: nil, schema: nil, job_id: nil,
|
2907
|
+
prefix: nil, labels: nil, autodetect: nil, null_marker: nil
|
2908
|
+
new_job = load_job_gapi table_id, dryrun, job_id: job_id, prefix: prefix
|
2251
2909
|
LoadJob::Updater.new(new_job).tap do |job|
|
2252
2910
|
job.location = location if location # may be dataset reference
|
2253
2911
|
job.create = create unless create.nil?
|
@@ -2285,9 +2943,7 @@ module Google
|
|
2285
2943
|
job_gapi.configuration.load.update! source_uris: urls
|
2286
2944
|
if job_gapi.configuration.load.source_format.nil?
|
2287
2945
|
source_format = Convert.derive_source_format_from_list urls
|
2288
|
-
unless source_format.nil?
|
2289
|
-
job_gapi.configuration.load.source_format = source_format
|
2290
|
-
end
|
2946
|
+
job_gapi.configuration.load.source_format = source_format unless source_format.nil?
|
2291
2947
|
end
|
2292
2948
|
end
|
2293
2949
|
|
@@ -2299,9 +2955,7 @@ module Google
|
|
2299
2955
|
path = Pathname(file).to_path
|
2300
2956
|
if job_gapi.configuration.load.source_format.nil?
|
2301
2957
|
source_format = Convert.derive_source_format path
|
2302
|
-
unless source_format.nil?
|
2303
|
-
job_gapi.configuration.load.source_format = source_format
|
2304
|
-
end
|
2958
|
+
job_gapi.configuration.load.source_format = source_format unless source_format.nil?
|
2305
2959
|
end
|
2306
2960
|
|
2307
2961
|
gapi = service.load_table_file file, job_gapi
|
@@ -2310,21 +2964,18 @@ module Google
|
|
2310
2964
|
|
2311
2965
|
def load_local_or_uri file, updater
|
2312
2966
|
job_gapi = updater.to_gapi
|
2313
|
-
|
2314
|
-
|
2315
|
-
|
2316
|
-
|
2317
|
-
|
2318
|
-
job
|
2967
|
+
if local_file? file
|
2968
|
+
load_local file, job_gapi
|
2969
|
+
else
|
2970
|
+
load_storage file, job_gapi
|
2971
|
+
end
|
2319
2972
|
end
|
2320
2973
|
|
2321
2974
|
def storage_url? files
|
2322
2975
|
[files].flatten.all? do |file|
|
2323
2976
|
file.respond_to?(:to_gs_url) ||
|
2324
|
-
(file.respond_to?(:to_str) &&
|
2325
|
-
|
2326
|
-
(file.is_a?(URI) &&
|
2327
|
-
file.to_s.downcase.start_with?("gs://"))
|
2977
|
+
(file.respond_to?(:to_str) && file.to_str.downcase.start_with?("gs://")) ||
|
2978
|
+
(file.is_a?(URI) && file.to_s.downcase.start_with?("gs://"))
|
2328
2979
|
end
|
2329
2980
|
end
|
2330
2981
|
|
@@ -2348,15 +2999,16 @@ module Google
|
|
2348
2999
|
end
|
2349
3000
|
|
2350
3001
|
##
|
2351
|
-
# Yielded to a block to accumulate changes for a
|
3002
|
+
# Yielded to a block to accumulate changes for a create request. See {Project#create_dataset}.
|
2352
3003
|
class Updater < Dataset
|
2353
3004
|
##
|
2354
|
-
# A list of attributes that were updated.
|
3005
|
+
# @private A list of attributes that were updated.
|
2355
3006
|
attr_reader :updates
|
2356
3007
|
|
2357
3008
|
##
|
2358
|
-
# Create an Updater object.
|
3009
|
+
# @private Create an Updater object.
|
2359
3010
|
def initialize gapi
|
3011
|
+
super()
|
2360
3012
|
@updates = []
|
2361
3013
|
@gapi = gapi
|
2362
3014
|
end
|
@@ -2373,7 +3025,110 @@ module Google
|
|
2373
3025
|
end
|
2374
3026
|
|
2375
3027
|
##
|
2376
|
-
#
|
3028
|
+
# @raise [RuntimeError] not implemented
|
3029
|
+
def delete(*)
|
3030
|
+
raise "not implemented in #{self.class}"
|
3031
|
+
end
|
3032
|
+
|
3033
|
+
##
|
3034
|
+
# @raise [RuntimeError] not implemented
|
3035
|
+
def create_table(*)
|
3036
|
+
raise "not implemented in #{self.class}"
|
3037
|
+
end
|
3038
|
+
|
3039
|
+
##
|
3040
|
+
# @raise [RuntimeError] not implemented
|
3041
|
+
def create_view(*)
|
3042
|
+
raise "not implemented in #{self.class}"
|
3043
|
+
end
|
3044
|
+
|
3045
|
+
##
|
3046
|
+
# @raise [RuntimeError] not implemented
|
3047
|
+
def create_materialized_view(*)
|
3048
|
+
raise "not implemented in #{self.class}"
|
3049
|
+
end
|
3050
|
+
|
3051
|
+
##
|
3052
|
+
# @raise [RuntimeError] not implemented
|
3053
|
+
def table(*)
|
3054
|
+
raise "not implemented in #{self.class}"
|
3055
|
+
end
|
3056
|
+
|
3057
|
+
##
|
3058
|
+
# @raise [RuntimeError] not implemented
|
3059
|
+
def tables(*)
|
3060
|
+
raise "not implemented in #{self.class}"
|
3061
|
+
end
|
3062
|
+
|
3063
|
+
##
|
3064
|
+
# @raise [RuntimeError] not implemented
|
3065
|
+
def model(*)
|
3066
|
+
raise "not implemented in #{self.class}"
|
3067
|
+
end
|
3068
|
+
|
3069
|
+
##
|
3070
|
+
# @raise [RuntimeError] not implemented
|
3071
|
+
def models(*)
|
3072
|
+
raise "not implemented in #{self.class}"
|
3073
|
+
end
|
3074
|
+
|
3075
|
+
##
|
3076
|
+
# @raise [RuntimeError] not implemented
|
3077
|
+
def create_routine(*)
|
3078
|
+
raise "not implemented in #{self.class}"
|
3079
|
+
end
|
3080
|
+
|
3081
|
+
##
|
3082
|
+
# @raise [RuntimeError] not implemented
|
3083
|
+
def routine(*)
|
3084
|
+
raise "not implemented in #{self.class}"
|
3085
|
+
end
|
3086
|
+
|
3087
|
+
##
|
3088
|
+
# @raise [RuntimeError] not implemented
|
3089
|
+
def routines(*)
|
3090
|
+
raise "not implemented in #{self.class}"
|
3091
|
+
end
|
3092
|
+
|
3093
|
+
##
|
3094
|
+
# @raise [RuntimeError] not implemented
|
3095
|
+
def query_job(*)
|
3096
|
+
raise "not implemented in #{self.class}"
|
3097
|
+
end
|
3098
|
+
|
3099
|
+
##
|
3100
|
+
# @raise [RuntimeError] not implemented
|
3101
|
+
def query(*)
|
3102
|
+
raise "not implemented in #{self.class}"
|
3103
|
+
end
|
3104
|
+
|
3105
|
+
##
|
3106
|
+
# @raise [RuntimeError] not implemented
|
3107
|
+
def external(*)
|
3108
|
+
raise "not implemented in #{self.class}"
|
3109
|
+
end
|
3110
|
+
|
3111
|
+
##
|
3112
|
+
# @raise [RuntimeError] not implemented
|
3113
|
+
def load_job(*)
|
3114
|
+
raise "not implemented in #{self.class}"
|
3115
|
+
end
|
3116
|
+
|
3117
|
+
##
|
3118
|
+
# @raise [RuntimeError] not implemented
|
3119
|
+
def load(*)
|
3120
|
+
raise "not implemented in #{self.class}"
|
3121
|
+
end
|
3122
|
+
|
3123
|
+
##
|
3124
|
+
# @raise [RuntimeError] not implemented
|
3125
|
+
def reload!
|
3126
|
+
raise "not implemented in #{self.class}"
|
3127
|
+
end
|
3128
|
+
alias refresh! reload!
|
3129
|
+
|
3130
|
+
##
|
3131
|
+
# @private Make sure any access changes are saved
|
2377
3132
|
def check_for_mutated_access!
|
2378
3133
|
return if @access.nil?
|
2379
3134
|
return unless @access.changed?
|
@@ -2381,6 +3136,8 @@ module Google
|
|
2381
3136
|
patch_gapi! :access
|
2382
3137
|
end
|
2383
3138
|
|
3139
|
+
##
|
3140
|
+
# @private
|
2384
3141
|
def to_gapi
|
2385
3142
|
check_for_mutated_access!
|
2386
3143
|
@gapi
|