scala 记录类型的字段在BigQuery中插入为空

6l7fqoea  于 2023-01-26  发布在  Scala
关注(0)|答案(1)|浏览(186)

我有一个Scala作业,需要将嵌套的JSON文件插入到BigQuery中。解决方案是创建一个BQ表,其中嵌套字段的字段类型为Record。
我写了一个case类,看起来像这样:

case class AvailabilityRecord(
                              nestedField: NestedRecord,
                              timezone: String,

                             ) {

  def toMap(): java.util.Map[String, Any] = {

    val map = new java.util.HashMap[String, Any]
    map.put("nestedField", nestedField)
    map.put("timezone", timezone)

    map
  }
                             }

case class NestedRecord(
                         from: String,
                         to: String
                       )

我在程序中使用Java依赖项"com.google.cloud" % "google-cloud-bigquery" % "2.11.0",
当我尝试将解析到case类的JSON值插入BQ时,类型String的字段timezone的值被插入,但是类型Record的嵌套字段被插入为null。
对于插入,我使用以下代码:

def insertData(records: Seq[AvailabilityRecord], gcpService: GcpServiceImpl): Task[Unit] = Task.defer {

    val recordsToInsert = records.map(record => InsertBigQueryRecord("XY", record.toMap()))
    gcpService.insertIntoBq(recordsToInsert,  TableId.of("dataset", "table"))
  } 


override def insertIntoBq(records: Iterable[InsertBigQueryRecord],
                            tableId: TableId): Task[Unit] = Task {
     val builder = InsertAllRequest.newBuilder(tableId)
     records.foreach(record => builder.addRow(record.key, record.record))
     bqContext.insertAll(builder.build)
  }

记录类型的字段被插入为空值的问题可能是什么?

vuktfyat

vuktfyat1#

问题是我还需要Map子case类,因为对于API,case类对象是未知的。
为此,这帮助我解决了这个问题:

case class NestedRecord(
                         from: String,
                         to: String
                       ) {

  def toMap(): java.util.Map[String, String] = {

    val map = new java.util.HashMap[String, Any]
    map.put("from", from)
    map.put("to", to)
    map
  }
}

在父case类中,编辑将在toMap方法中进行:

map.put("nestedField", nestedField.toMap)
map.put("timezone", timezone)

相关问题