scala - bigquery 在数组外添加重复记录

标签 scala google-bigquery

错误:

Exception in thread "main" java.lang.RuntimeException
{"errors":[{"debugInfo":"generic::failed_precondition: Repeated record added outside of an array.","reason":"invalid"}],"index":0}

语言:斯卡拉

Gradle bigquery 依赖项:
compile "com.google.apis:google-api-services-bigquery:v2-rev326-1.22.0"

生成表模式的代码:
import scala.collection.JavaConversions._
val orderTableSchema = new TableSchema()
orderTableSchema.setFields(Seq(
  new TableFieldSchema().setName("revisionId").setType("STRING").setMode("REQUIRED"),
  new TableFieldSchema().setName("executions").setType("RECORD").setMode("REPEATED").setFields(Seq(
    new TableFieldSchema().setName("ts").setType("INTEGER"),
    new TableFieldSchema().setName("price").setType("FLOAT"),
    new TableFieldSchema().setName("qty").setType("INTEGER")
  ))
))

该表使用正确的执行列架构成功创建,如 BigQuery Web ui 所示:
revisionId          STRING  REQUIRED    
executions          RECORD  REPEATED
executions          RECORD  REPEATED
executions.ts       INTEGER NULLABLE
executions.price    FLOAT   NULLABLE
executions.qty      INTEGER NULLABLE

插入数据失败的代码:
import scala.collection.JavaConversions._
val row = new TableRow()
  .set("revisionId", "revision1")
  .set("executions", Seq(
    new TableRow().set("ts", 1L).set("price", 100.01).set("qty", 1000)
  ))
val content = new TableDataInsertAllRequest().setRows(Seq(
  new TableDataInsertAllRequest.Rows().setJson(row)
))
val insertAll = bigQuery.tabledata().insertAll(projectId, datasetId, "order", content)
val insertResponse = insertAll.execute()

if (insertResponse.getInsertErrors != null) {
  insertResponse.getInsertErrors.foreach(println)
  // this prints:
  // {"errors":[{"debugInfo":"generic::failed_precondition: Repeated record added outside of an array.","reason":"invalid"}],"index":0}

  // throw to just terminate early for demo
  throw new RuntimeException()
}

最佳答案

发现问题了。

这是 Scala 到 Java 集合转换的困惑。我必须使用 JavaConversions.seqAsJavaList 显式添加转换,它神奇地开始工作

val row = new TableRow()
  .set("revisionId", s"revisionId$v")
  .set("executions", JavaConversions.seqAsJavaList(Seq(
    new TableRow().set("ts", 1L).set("price", 100.01).set("qty", 1000),
    new TableRow().set("ts", 2L).set("price", 100.02).set("qty", 2000),
    new TableRow().set("ts", 3L).set("price", 100.03).set("qty", 3000)
  )))

关于scala - bigquery 在数组外添加重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40187298/

相关文章:

java - 为什么 @RequestMapping 注解在 java 中接受 String 参数而在 scala 中不接受?

scala - SonarQube 的 Scala 配置文件在哪里?

具有相同名称的 Scala 对象和特征

google-bigquery - bigquery 嵌套对象 : No such field

google-bigquery - BigQuery 中的错误或新行为?

scala - 用于 Windows 的 sbt.bat

scala - 读入然后写出一个通过 List[List[String]] 的小 .csv 文件的简单(仅限 Scala)方法是什么?

google-bigquery - 大查询 : How to extract each tables creation time for a data set?

sql - 使用 Google BigQuery 中的 SQL 将字符串列转换为数字列

olap - BigQuery 中有哪些 OLAP 功能?