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,你需要:

  1. 声明相同的接口:
fun interface RowMapper<T> {
    fun mapRow(row: FieldValueList, rowNum: Int): T
}
  1. 想出一些方法将 RowMapper 包含到查询结果转换管道中。例如,通过 TableResult class:
  2. 的扩展方法
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))