24
24
"""
25
25
26
26
import argparse
27
+ import datetime
27
28
28
29
from google .cloud import bigquery
30
+ import pytz
29
31
30
32
31
33
def print_results (query_results ):
@@ -46,13 +48,14 @@ def print_results(query_results):
46
48
47
49
def sync_query_positional_params (corpus , min_word_count ):
48
50
client = bigquery .Client ()
51
+ query = """SELECT word, word_count
52
+ FROM `bigquery-public-data.samples.shakespeare`
53
+ WHERE corpus = ?
54
+ AND word_count >= ?
55
+ ORDER BY word_count DESC;
56
+ """
49
57
query_results = client .run_sync_query (
50
- """SELECT word, word_count
51
- FROM `bigquery-public-data.samples.shakespeare`
52
- WHERE corpus = ?
53
- AND word_count >= ?
54
- ORDER BY word_count DESC;
55
- """ ,
58
+ query ,
56
59
query_parameters = (
57
60
bigquery .ScalarQueryParameter (
58
61
# Set the name to None to use positional parameters (? symbol
@@ -72,13 +75,14 @@ def sync_query_positional_params(corpus, min_word_count):
72
75
73
76
def sync_query_named_params (corpus , min_word_count ):
74
77
client = bigquery .Client ()
78
+ query = """SELECT word, word_count
79
+ FROM `bigquery-public-data.samples.shakespeare`
80
+ WHERE corpus = @corpus
81
+ AND word_count >= @min_word_count
82
+ ORDER BY word_count DESC;
83
+ """
75
84
query_results = client .run_sync_query (
76
- """SELECT word, word_count
77
- FROM `bigquery-public-data.samples.shakespeare`
78
- WHERE corpus = @corpus
79
- AND word_count >= @min_word_count
80
- ORDER BY word_count DESC;
81
- """ ,
85
+ query ,
82
86
query_parameters = (
83
87
bigquery .ScalarQueryParameter ('corpus' , 'STRING' , corpus ),
84
88
bigquery .ScalarQueryParameter (
@@ -90,31 +94,118 @@ def sync_query_named_params(corpus, min_word_count):
90
94
print_results (query_results )
91
95
92
96
97
+ def sync_query_array_params (gender , states ):
98
+ client = bigquery .Client ()
99
+ query = """SELECT name, sum(number) as count
100
+ FROM `bigquery-public-data.usa_names.usa_1910_2013`
101
+ WHERE gender = @gender
102
+ AND state IN UNNEST(@states)
103
+ GROUP BY name
104
+ ORDER BY count DESC
105
+ LIMIT 10;
106
+ """
107
+ query_results = client .run_sync_query (
108
+ query ,
109
+ query_parameters = (
110
+ bigquery .ScalarQueryParameter ('gender' , 'STRING' , gender ),
111
+ bigquery .ArrayQueryParameter ('states' , 'STRING' , states )))
112
+ query_results .use_legacy_sql = False
113
+ query_results .run ()
114
+ print_results (query_results )
115
+
116
+
117
+ def sync_query_timestamp_params (year , month , day , hour , minute ):
118
+ client = bigquery .Client ()
119
+ query = 'SELECT TIMESTAMP_ADD(@ts_value, INTERVAL 1 HOUR);'
120
+ query_results = client .run_sync_query (
121
+ query ,
122
+ query_parameters = [
123
+ bigquery .ScalarQueryParameter (
124
+ 'ts_value' ,
125
+ 'TIMESTAMP' ,
126
+ datetime .datetime (
127
+ year , month , day , hour , minute , tzinfo = pytz .UTC ))])
128
+ query_results .use_legacy_sql = False
129
+ query_results .run ()
130
+ print_results (query_results )
131
+
132
+
133
+ def sync_query_struct_params (x , y ):
134
+ client = bigquery .Client ()
135
+ query = 'SELECT @struct_value AS s;'
136
+ query_results = client .run_sync_query (
137
+ query ,
138
+ query_parameters = [
139
+ bigquery .StructQueryParameter (
140
+ 'struct_value' ,
141
+ bigquery .ScalarQueryParameter ('x' , 'INT64' , x ),
142
+ bigquery .ScalarQueryParameter ('y' , 'STRING' , y ))])
143
+ query_results .use_legacy_sql = False
144
+ query_results .run ()
145
+ print_results (query_results )
146
+
147
+
93
148
if __name__ == '__main__' :
94
149
parser = argparse .ArgumentParser (
95
150
description = __doc__ ,
96
151
formatter_class = argparse .RawDescriptionHelpFormatter )
97
- parser .add_argument (
152
+ subparsers = parser .add_subparsers (dest = 'sample' , help = 'samples' )
153
+ named_parser = subparsers .add_parser (
154
+ 'named' ,
155
+ help = 'Run a query with named parameters.' )
156
+ named_parser .add_argument (
98
157
'corpus' ,
99
158
help = 'Corpus to search from Shakespeare dataset.' )
100
- parser .add_argument (
159
+ named_parser .add_argument (
101
160
'min_word_count' ,
102
161
help = 'Minimum count of words to query.' ,
103
162
type = int )
104
-
105
- params_type_parser = parser .add_mutually_exclusive_group (required = False )
106
- params_type_parser .add_argument (
107
- '--use-named-params' ,
108
- dest = 'use_named_params' ,
109
- action = 'store_true' )
110
- params_type_parser .add_argument (
111
- '--use-positional-params' ,
112
- dest = 'use_named_params' ,
113
- action = 'store_false' )
114
- parser .set_defaults (use_named_params = False )
163
+ positional_parser = subparsers .add_parser (
164
+ 'positional' ,
165
+ help = 'Run a query with positional parameters.' )
166
+ positional_parser .add_argument (
167
+ 'corpus' ,
168
+ help = 'Corpus to search from Shakespeare dataset.' )
169
+ positional_parser .add_argument (
170
+ 'min_word_count' ,
171
+ help = 'Minimum count of words to query.' ,
172
+ type = int )
173
+ array_parser = subparsers .add_parser (
174
+ 'array' ,
175
+ help = 'Run a query with an array parameter.' )
176
+ array_parser .add_argument (
177
+ 'gender' ,
178
+ choices = ['F' , 'M' ],
179
+ help = 'Gender of baby in the Social Security baby names database.' )
180
+ array_parser .add_argument (
181
+ 'states' ,
182
+ help = 'U.S. States to consider for popular baby names.' ,
183
+ nargs = '+' )
184
+ timestamp_parser = subparsers .add_parser (
185
+ 'timestamp' ,
186
+ help = 'Run a query with a timestamp parameter.' )
187
+ timestamp_parser .add_argument ('year' , type = int )
188
+ timestamp_parser .add_argument ('month' , type = int )
189
+ timestamp_parser .add_argument ('day' , type = int )
190
+ timestamp_parser .add_argument ('hour' , type = int )
191
+ timestamp_parser .add_argument ('minute' , type = int )
192
+ struct_parser = subparsers .add_parser (
193
+ 'struct' ,
194
+ help = 'Run a query with a struct parameter.' )
195
+ struct_parser .add_argument ('x' , help = 'Integer for x' , type = int )
196
+ struct_parser .add_argument ('y' , help = 'String for y' )
115
197
args = parser .parse_args ()
116
198
117
- if args .use_named_params :
199
+ if args .sample == 'named' :
118
200
sync_query_named_params (args .corpus , args .min_word_count )
119
- else :
201
+ elif args . sample == 'positional' :
120
202
sync_query_positional_params (args .corpus , args .min_word_count )
203
+ elif args .sample == 'array' :
204
+ sync_query_array_params (args .gender , args .states )
205
+ elif args .sample == 'timestamp' :
206
+ sync_query_timestamp_params (
207
+ args .year , args .month , args .day , args .hour , args .minute )
208
+ elif args .sample == 'struct' :
209
+ sync_query_struct_params (args .x , args .y )
210
+ else :
211
+ print ('Unexpected value for sample' )
0 commit comments