Я пытаюсь выполнить запрос ниже -
select prd_cat, product_category from
(
select split( product_category,".") as prd_cat,product_category from
test_dataset.cosme_raw_table
where product_link = "XXX"
) as a
group by prd_cat,product_category;
когда я запускал его с использованием веб-интерфейса BigQuery, он работал успешно, но когда я пытался запустить его с помощью API запросов BigQuery, он не удался с сообщением об ошибке «Группировка по выражениям типа ARRAY не разрешена в [6:10]» Ниже мой код -
String query = "select prd_cat, product_category" +
" from\n" +
"(\n" +
"select split( product_category,\".\") as prd_cat," +
"product_category " +
"from test_dataset.cosme_raw_table \n" +
"where product_link = \"XXX\"\n" +
") as a\n" +
"group by prd_cat,product_category";
QueryJobConfiguration queryJobConfiguration =
QueryJobConfiguration.newBuilder(query)
.setDestinationTable(tableId1)
.setWriteDisposition(JobInfo.WriteDisposition.WRITE_TRUNCATE)
.build();
Job loadJob1 = bigquery.create(JobInfo.of(queryJobConfiguration));
Ниже журналы -
com.google.cloud.bigquery.BigQueryException: Grouping by expressions of type ARRAY is not allowed at [6:10]
at com.google.cloud.bigquery.spi.v2.HttpBigQueryRpc.translate(HttpBigQueryRpc.java:99)
at com.google.cloud.bigquery.spi.v2.HttpBigQueryRpc.getQueryResults(HttpBigQueryRpc.java:401)
at com.google.cloud.bigquery.BigQueryImpl$23.call(BigQueryImpl.java:688)
at com.google.cloud.bigquery.BigQueryImpl$23.call(BigQueryImpl.java:683)
at com.google.api.gax.retrying.DirectRetryingExecutor.submit(DirectRetryingExecutor.java:89)
at com.google.cloud.RetryHelper.run(RetryHelper.java:74)
at com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:51)
at com.google.cloud.bigquery.BigQueryImpl.getQueryResults(BigQueryImpl.java:682)
at com.google.cloud.bigquery.BigQueryImpl.getQueryResults(BigQueryImpl.java:674)
at com.google.cloud.bigquery.Job$1.call(Job.java:329)
at com.google.cloud.bigquery.Job$1.call(Job.java:326)
at com.google.api.gax.retrying.DirectRetryingExecutor.submit(DirectRetryingExecutor.java:89)
at com.google.cloud.RetryHelper.run(RetryHelper.java:74)
at com.google.cloud.RetryHelper.poll(RetryHelper.java:63)
at com.google.cloud.bigquery.Job.waitForQueryResults(Job.java:325)
at com.google.cloud.bigquery.Job.waitFor(Job.java:240)
at TestBigQuery.explicit(TestBigQuery.java:190)
at TestBigQuery.main(TestBigQuery.java:32)
Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
{
"code" : 400,
"errors" : [ {
"domain" : "global",
"location" : "parameters.q",
"message" : "Grouping by expressions of type ARRAY is not allowed at [6:10]",
"reason" : "invalidQuery"
} ],
"message" : "Grouping by expressions of type ARRAY is not allowed at [6:10]",
"status" : "INVALID_ARGUMENT"
}
Может кто-нибудь, пожалуйста, помогите. Спасибо!!




Это происходит потому, что вы используете Устаревший SQL. Вам нужно установить его в вашем QueryJobConfiguration. Например:
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Dataset;
import com.google.cloud.bigquery.DatasetInfo;
import com.google.cloud.bigquery.FieldValue;
import com.google.cloud.bigquery.FieldValueList;
import com.google.cloud.bigquery.QueryJobConfiguration;
public class QuickstartSample {
public static void main(String... args) throws Exception {
BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
String query = "Your-Query";
//setUseLegacySql(true) below
QueryJobConfiguration queryConfig = QueryJobConfiguration.newBuilder(query).setUseLegacySql(true).build();
for (FieldValueList row : bigquery.query(queryConfig).iterateAll()) {
for (FieldValue val : row) {
System.out.printf("%s,", val.toString());
}
System.out.printf("\n");
}
}
}
В противном случае вы можете использовать TO_JSON_STRING с Стандартный SQL. Например:
String query = "WITH sample AS (SELECT 1 id, ['a,b', 'c'] a UNION ALL SELECT 1, ['a','b,c']) SELECT TO_JSON_STRING(a) arr,COUNT(DISTINCT id) cnt FROM sample GROUP BY arr";
QueryJobConfiguration queryConfig = QueryJobConfiguration.newBuilder(query).build();
В вашем случае вы можете попробовать:
WITH a AS (select split(product_category,".") as prd_cat,product_category from test_dataset.cosme_raw_table where product_link = "XXX") select TO_JSON_STRING(prd_cat) arr, product_category from a GROUP BY arr,product_category
Надеюсь, это поможет.
Спасибо за подробное объяснение. Это решило мою проблему.
Если вы используете устаревший SQL, оператор GROUP BY неявно сгладит все массивы, которые вы группируете. Если вы используете стандартный SQL, вам нужно явно сгладить массив. Обратите внимание, что:
Вы можете исправить свой запрос для работы с использованием стандартного SQL, сгладив массив, например:
select prd_cat, product_category
from test_dataset.cosme_raw_table,
UNNEST(split( product_category,".")) as prd_cat
where product_link = "XXX"
group by prd_cat,product_category;
Мне не ясно, какой результат вы надеетесь получить с запросом, но, по крайней мере, он должен выполняться.
возможно, не лучшее решение, но похоже на обходной путь: stackoverflow.com/questions/48939402/…