我有一个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)
}
记录类型的字段被插入为空值的问题可能是什么?
1条答案
按热度按时间vuktfyat1#
问题是我还需要Map子case类,因为对于API,case类对象是未知的。
为此,这帮助我解决了这个问题:
在父case类中,编辑将在toMap方法中进行: