如何通过BigQuery Client API动态创建Array<String>及BQ例程参数
解决BigQuery客户端动态创建例程时的数组类型定义问题
用
bigquery.ArrayType构造数组类型
别直接用bigquery.enums里的array枚举值,而是用客户端提供的ArrayType类包装基础类型,这样能生成BigQuery认可的数组类型标识。示例:from google.cloud import bigquery # 构造INT64数组类型 int_array_type = bigquery.ArrayType(bigquery.enums.SqlTypeNames.INT64) # 构造STRING数组类型 string_array_type = bigquery.ArrayType(bigquery.enums.SqlTypeNames.STRING)创建例程参数时,直接传入这个构造好的类型对象就行。
直接写类型字符串
要是习惯用字符串指定类型,BigQuery的数组格式是ARRAY<基础类型>,比如:# INT64数组的字符串标识 int_array_str = "ARRAY<INT64>" # STRING数组的字符串标识 string_array_str = "ARRAY<STRING>"把这个字符串赋值给参数的
parameter_type字段,BigQuery也能正确识别。完整的例程创建示例
下面是一个动态创建带数组参数的标量函数例程的完整代码:from google.cloud import bigquery client = bigquery.Client() # 定义包含数组类型的参数列表 routine_params = [ bigquery.RoutineParameter( name="input_ids", parameter_type=bigquery.ArrayType(bigquery.enums.SqlTypeNames.INT64), mode="IN" ), bigquery.RoutineParameter( name="input_strings", parameter_type="ARRAY<STRING>", mode="IN" ) ] # 配置例程 routine_config = bigquery.Routine( routine_type="SCALAR_FUNCTION", language="SQL", definition_body=""" CREATE FUNCTION `{project}.{dataset}.test_array_func`(input_ids ARRAY<INT64>, input_strings ARRAY<STRING>) RETURNS STRING LANGUAGE SQL AS $$ SELECT CONCAT('IDs count: ', ARRAY_LENGTH(input_ids), ', Strings count: ', ARRAY_LENGTH(input_strings)) $$ """.format(project=client.project, dataset="your_dataset") ) # 执行创建(如果已存在则覆盖) routine = client.create_routine( "your_project.your_dataset.test_array_func", routine_config, exists_ok=True )
内容的提问来源于stack exchange,提问作者Harshith S H
相关产品推荐
相关产品推荐

