具有过滤条件的 BigQuery 客户端 bigquery.listTableData
BigQuery Client bigquery.listTableData with Filter condition
我正在使用下面的代码行从 Google Bigquery 获取数据。
public class BQTEST {
public static void main(String... args) throws Exception {
String datasetName = "mydataset";
String tableName = "mytable";
String projectId = "id-gcs";
String query =
"SELECT id, " +
"qtr, " +
"sales, " +
"year " +
"FROM `id-gcs.mydataset.mytable` " +
"where MOD(id,2) = 0";
BigQuery bigquery = BigQueryOptions.newBuilder().setProjectId(projectId)
.setCredentials(
ServiceAccountCredentials.fromStream(new
FileInputStream("gcs.json"))
)
.build().getService();
TableId tableId = TableId.of(projectId, datasetName, tableName);
QueryJobConfiguration queryConfig = QueryJobConfiguration
.newBuilder(query)
.setPriority(QueryJobConfiguration.Priority.BATCH)
.build();
try {
bigquery.query(queryConfig);
} catch (InterruptedException e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
TableResult results = bigquery.listTableData(
tableId,
BigQuery.TableDataListOption.pageSize(1)
);
for (FieldValueList row : results.iterateAll()) {
System.out.printf(
"ID: %s qtr: %s sales: %s year: %s\n", row.get(0).getValue(), row.get(1).getValue(), row.get(2).getValue(), row.get(3).getValue());
}
}
}
我在源中有 12 条记录 table 从 1,2,3...12 开始的 id 值。由于我在 ID 上应用了 Mod 结果集的 id 值应该为 2,4,6,8,10,12.
相反,它将整个数据作为结果集返回。
因此,where 子句中的条件不适用。
寻求帮助。
你在这里做了两件不相关的事情:运行 一个查询,然后 试图直接从源中读取行 table 你只是查询。您没有得到过滤结果的原因是您没有从查询结果中读取行,而是直接从源 table.
读取行
经过进一步审查,这似乎是基于一些具有误导性的示例代码;我会解决这个问题。
一个可能更具启发性的简短示例:https://cloud.google.com/bigquery/docs/samples/bigquery-query#bigquery_query-java
没有table,看看bigquery.query()
返回的结果迭代器是怎样的。这就是您的过滤结果可用的地方,而不是通过对源进行迭代 table.
我正在使用下面的代码行从 Google Bigquery 获取数据。
public class BQTEST {
public static void main(String... args) throws Exception {
String datasetName = "mydataset";
String tableName = "mytable";
String projectId = "id-gcs";
String query =
"SELECT id, " +
"qtr, " +
"sales, " +
"year " +
"FROM `id-gcs.mydataset.mytable` " +
"where MOD(id,2) = 0";
BigQuery bigquery = BigQueryOptions.newBuilder().setProjectId(projectId)
.setCredentials(
ServiceAccountCredentials.fromStream(new
FileInputStream("gcs.json"))
)
.build().getService();
TableId tableId = TableId.of(projectId, datasetName, tableName);
QueryJobConfiguration queryConfig = QueryJobConfiguration
.newBuilder(query)
.setPriority(QueryJobConfiguration.Priority.BATCH)
.build();
try {
bigquery.query(queryConfig);
} catch (InterruptedException e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
TableResult results = bigquery.listTableData(
tableId,
BigQuery.TableDataListOption.pageSize(1)
);
for (FieldValueList row : results.iterateAll()) {
System.out.printf(
"ID: %s qtr: %s sales: %s year: %s\n", row.get(0).getValue(), row.get(1).getValue(), row.get(2).getValue(), row.get(3).getValue());
}
}
}
我在源中有 12 条记录 table 从 1,2,3...12 开始的 id 值。由于我在 ID 上应用了 Mod 结果集的 id 值应该为 2,4,6,8,10,12.
相反,它将整个数据作为结果集返回。
因此,where 子句中的条件不适用。
寻求帮助。
你在这里做了两件不相关的事情:运行 一个查询,然后 试图直接从源中读取行 table 你只是查询。您没有得到过滤结果的原因是您没有从查询结果中读取行,而是直接从源 table.
读取行经过进一步审查,这似乎是基于一些具有误导性的示例代码;我会解决这个问题。
一个可能更具启发性的简短示例:https://cloud.google.com/bigquery/docs/samples/bigquery-query#bigquery_query-java
没有table,看看bigquery.query()
返回的结果迭代器是怎样的。这就是您的过滤结果可用的地方,而不是通过对源进行迭代 table.