Как выполнить потоковую вставку массива JSON в таблицу BigQuery в Apache Beam - PullRequest
0 голосов
/ 25 марта 2019

Мое приложение apache beam получает сообщение в массиве JSON, но вставляет каждую строку в таблицу BigQuery.Как я могу поддержать этот сценарий использования в ApacheBeam?Могу ли я разбить каждую строку и вставить ее в таблицу один за другим?

Пример сообщения JSON:

[
  {"id": 1, "name": "post1", "price": 10},
  {"id": 2, "name": "post2", "price": 20},
  {"id": 3, "name": "post3", "price": 30}
]

Схема таблицы BigQuery:

[
    {
      "mode": "REQUIRED",
      "name": "id",
      "type": "INT64"
    },
    {
      "mode": "REQUIRED",
      "name": "name",
      "type": "STRING"
    },
    {
      "mode": "REQUIRED",
      "name": "price",
      "type": "INT64"
    }
]

1 Ответ

0 голосов
/ 26 марта 2019

Вот мое решение. Я конвертировал JSON-строку в List один раз, затем c.output один за другим. Мой код в Scala, но вы можете сделать то же самое в Java.

    case class MyTranscationRecord(id: String, name: String, price: Int)
    case class MyTranscation(recordList: List[MyTranscationRecord])
    class ConvertJSONTextToMyRecord extends DoFn[KafkaRecord[java.lang.Long, String], MyTranscation]() {
      private val logger: Logger = LoggerFactory.getLogger(classOf[ConvertJSONTextToMyRecord])
      @ProcessElement
      def processElement(c: ProcessContext): Unit = {
        try {
          val mapper: ObjectMapper = new ObjectMapper()
            .registerModule(DefaultScalaModule)
          val messageText = c.element.getKV.getValue
          val transaction: MyRecord = mapper.readValue(messageText, classOf[MyTranscation])
          logger.info(s"successfully converted to an EPC transaction = $transaction")
          for (record <- transaction.recordList) {
              c.output(record)
          }
        } catch {
          case e: Exception =>
            val message = e.getLocalizedMessage + e.getStackTrace
            logger.error(message)
        }
      }
    }
...