Scala写入BigQuery时Record类型字段插入为null的问题排查
问题原因及解决方案
核心原因
BigQuery的Java客户端(google-cloud-bigquery)无法直接识别并序列化Scala的case class实例为BigQuery的RECORD类型。你在AvailabilityRecord.toMap()里直接把NestedRecord实例放入Java HashMap,客户端不知道如何解析这个Scala类,因此将其视为null插入。
修复步骤
- 给
NestedRecord添加转Java Map的方法
case class NestedRecord(from: String, to: String) { def toMap(): java.util.Map[String, Any] = { val map = new java.util.HashMap[String, Any]() map.put("from", from) map.put("to", to) map } }
- 修改
AvailabilityRecord.toMap(),将nestedField转成Java Map后再放入
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.toMap()) // 关键:调用nestedField的toMap方法 map.put("timezone", timezone) map } }
额外检查项
- 确认BigQuery表的Schema中,
nestedField的类型是RECORD,且内部包含from和to两个STRING类型的字段,字段名与case class完全一致(BigQuery字段名大小写敏感) - 验证插入的
AvailabilityRecord实例中,nestedField本身不为null(比如JSON解析时是否正确绑定了嵌套字段)
内容的提问来源于stack exchange,提问作者Idhem
相关产品推荐
相关产品推荐

