BigQuery TableResult 转换选项
BigQuery TableResult casting options
如何将 TableResult 转换为以下格式 List<Map<String, Any>>
地图分别包含列及其值。列表中添加了多行。
我试过类似的方法,但它抛出错误 -> com.google.cloud.bigquery.TableResult cannot be cast to java.util.List
val queryConfig = QueryJobConfiguration.newBuilder(
modSql
)
.setUseLegacySql(false).build()
val queryJob = bigQuery.create(JobInfo.newBuilder(queryConfig).build())
val result = queryJob.getQueryResults()
return result as List<Map<String, Any>>;
我们如何复制类似于 jdbc 模板的内容。例如使用 jdbc 模板我们可以这样做
jdbc.query(sql, rowMapper)
和这个 returns 特定 rowMapper 格式的结果。我们如何使用 BigQuery 实现这一目标?
如果你想拥有类似于 Spring 的 API,你需要:
- 声明相同的接口:
fun interface RowMapper<T> {
fun mapRow(row: FieldValueList, rowNum: Int): T
}
- 想出一些方法将
RowMapper
包含到查询结果转换管道中。例如,通过 TableResult
class: 的扩展方法
fun <T> TableResult.mapWith(rowMapper: RowMapper<T>): Iterable<T> = Iterable {
iterator {
yieldAll(iterateAll().withIndex().map { (index, row) -> rowMapper.mapRow(row, index) })
}
}
RowMapper
实现返回映射到其值的列名:
class RowMapperToMap(schema: Schema) : RowMapper<Map<String, Any>> {
private val fieldsNames = schema.fields.map { it.name }
override fun mapRow(row: FieldValueList, rowNum: Int) = fieldsNames.associateWith { row.get(it).value }
}
用法:
val result = queryJob.getQueryResults()
return result.mapWith(RowMapperToMap(result.schema))
如何将 TableResult 转换为以下格式 List<Map<String, Any>>
地图分别包含列及其值。列表中添加了多行。
我试过类似的方法,但它抛出错误 -> com.google.cloud.bigquery.TableResult cannot be cast to java.util.List
val queryConfig = QueryJobConfiguration.newBuilder(
modSql
)
.setUseLegacySql(false).build()
val queryJob = bigQuery.create(JobInfo.newBuilder(queryConfig).build())
val result = queryJob.getQueryResults()
return result as List<Map<String, Any>>;
我们如何复制类似于 jdbc 模板的内容。例如使用 jdbc 模板我们可以这样做
jdbc.query(sql, rowMapper)
和这个 returns 特定 rowMapper 格式的结果。我们如何使用 BigQuery 实现这一目标?
如果你想拥有类似于 Spring 的 API,你需要:
- 声明相同的接口:
fun interface RowMapper<T> {
fun mapRow(row: FieldValueList, rowNum: Int): T
}
- 想出一些方法将
RowMapper
包含到查询结果转换管道中。例如,通过TableResult
class: 的扩展方法
fun <T> TableResult.mapWith(rowMapper: RowMapper<T>): Iterable<T> = Iterable {
iterator {
yieldAll(iterateAll().withIndex().map { (index, row) -> rowMapper.mapRow(row, index) })
}
}
RowMapper
实现返回映射到其值的列名:
class RowMapperToMap(schema: Schema) : RowMapper<Map<String, Any>> {
private val fieldsNames = schema.fields.map { it.name }
override fun mapRow(row: FieldValueList, rowNum: Int) = fieldsNames.associateWith { row.get(it).value }
}
用法:
val result = queryJob.getQueryResults()
return result.mapWith(RowMapperToMap(result.schema))