SCIO прочитал файл паркета с scio parquet, сгенерированный класс case не найден

У меня проблема.

Я создал проект SCIO (Apache Beam) через архетип sbt: sbt new spotify / scio.g8

Цель этого задания - прочитать паркетный файл из GS

Когда я использую ParquetIO, предоставляемый Apache Beam, непосредственно в SCIO, эта работа (GenericRecord):

val SCHEMA: Schema =
    new Schema.Parser()
      .parse(
        "{\n"
          + " \"namespace\": \"ioitavro\",\n"
          + " \"type\": \"record\",\n"
          + " \"name\": \"TestObject\",\n"
          + " \"fields\": [\n"
          + "     {\"name\": \"field1\", \"type\": \"int\"}\n,"
          + "     {\"name\": \"field2\", \"type\": \"int\"}\n"
          + " ]\n"
          + "}")

val inputIO = ParquetIO
 .read(SCHEMA)
 .from(options.getInputParquet)

sc.customInput("input", inputIO)
.map(file => file.toString)
.saveAsTextFile(args(outputTopic))

Но я хотел использовать scio-parquet: https://spotify.github.io/scio/io/Parquet.html#read-avro-parquet-files

У меня в файле build.sbt есть следующие зависимости:

val scioVersion = "0.8.0-beta2"
val beamVersion = "2.16.0"
val scalaMacrosVersion = "2.1.1"

"com.spotify" %% "scio-core" % scioVersion,
"com.spotify" %% "scio-extra" % scioVersion,
"com.spotify" %% "scio-parquet" % scioVersion,
"com.spotify" %% "scio-avro" % scioVersion,

Я использую схему

object TestModel {

  @AvroType.fromSchema(
    """{
      | "type":"record",
      | "name":"TestObject",
      | "namespace":"com.spotify.scio.avro",
      | "doc":"Record for an account",
      | "fields":[
      |   {"name":"field1","type":"int"},
      |   {"name":"field2","type":"int"}
      |  ]}
      """.stripMargin)
  class TestSchema

}

Затем в Job я использую:

import com.spotify.scio.avro.TestObject

val projection = Projection[TestObject](_.getIntField, _.getIntField)

sc.parquetAvroFile[TestObject](args(inputParquet), projection)
  .map(file => file.toString)
  .saveAsTextFile(args(outputTopic))

Но у меня следующая ошибка:

object TestObject is not a member of package com.spotify.scio.avro
[error] import com.spotify.scio.avro.TestObject
[error]        ^
[error] /mypath/my-job/src/main/scala/com/test/MyJob.scala:41:33: not found: type TestObject
[error]     val projection = Projection[TestObject](_.getIntField, _.getIntField)
[error]                                 ^
[error] /my-path/my-job/src/main/scala/test/MyJob.scala:59:26: not found: type TestObject
[error]       sc.parquetAvroFile[TestObject](args(inputParquet), projection)
[error]                          ^

Я не понимаю, почему, но, возможно, класс TestObject неправильно сгенерирован схемой @ AvroType.fromSchema.

Или, может быть, я неправильно использую api, но перехожу по ссылке: https://spotify.github.io/scio/io/Parquet.html#read-avro-parquet-files

Спасибо за вашу помощь.


person Mazlum    schedule 19.11.2019    source источник
comment
Правильно ли установлен плагин sbt-avro? TestObject должен быть файлом java, скомпилированным плагином, обычно в target/scala-2.12/src_managed/.... Это не класс case из аннотации AvroType.   -  person Neville Li    schedule 25.11.2019


Ответы (1)


С плагином sbt-avro это работает.

person Mazlum    schedule 17.12.2019