Как создать набор данных из CSV, который не имеет заголовка и имеет более 150 столбцов, используя scala spark

У меня есть csv, который мне нужно прочитать как набор данных. CSV имеет 140 столбцов и не имеет заголовка. Я создал схему с StructType(Seq(StructFiled(...), Seq(StructFiled(...), ...)) и кодом для чтения, который выглядит следующим образом:

object dataParser {
def getData(inputPath: String, delimeter: String)(implicit spark: SparkSession): Dataset[MyCaseClass] = {
  val parsedData: Dataset[MyCaseClass] = spark.read
                                         .option("header", "false")
                                         .option("delimeter", "delimeter")
                                         .option("inferSchema", "true")
                                         .schema(mySchema)
                                         .load(inputPath)
                                         .as[MyCaseClass]
  parsedData
}
}

И класс case, который я создал, выглядит так: -

case class MycaseClass(
    mycaseClass1: MyCaseClass1,
    mycaseClass2: MyCaseClass2,
    mycaseClass3: MyCaseClass3,
    mycaseClass4: MyCaseClass4,
    mycaseClass5: MyCaseClass5,
    mycaseClass6: MyCaseClass6,
    mycaseClass7: MyCaseClass7,
)

MyCaseClass1(
 first 20 columns of csv: it's datatypes
)

MyCaseClass2(
 next 20 columns of csv: it's datatypes
)

и так далее.

Но когда я пытаюсь его скомпилировать, он выдает ошибку, как показано ниже:

Unable to find encoder for type stored in a Dataset.  Primitive types (Int, String, etc) and Product types (case classes) are supported by importing spark.implicits._  Support for serializing other types will be added in future releases.
[error]                                                 .as[myCaseClass]

Я вызываю это из своего приложения Scala как: -

object MyTestApp{
 def main(args: Array[String]): Unit ={
  implicit val spark: SparkSession = SparkSession.builder().config(conf).getOrCreate()
import spark.implicits._
 run(args)
}

def run(args: Array[String])(implicit spark: SparkSession): Unit = {
val inputPath = args.get("inputData")
val delimeter = Constants.delimeter
 val myData = Dataparser.getData(inputPath, delimeter)
}
}
```
I'm not very sure about the approach also as I'm new to Dataset.
I saw multiple answers around this issue but they were mainly for very small no of columns which can be contained within the scope of a single case class and that too with header which makes this little simpler.
Any help would be really appreciated.

person Shashwat Sharma    schedule 22.01.2020    source источник
comment
Какие типы данных есть в вашем классе case?   -  person Salim    schedule 22.01.2020
comment
Поскольку у него 140 столбцов, у него есть все типы данных, в основном String, Integer и Date.   -  person Shashwat Sharma    schedule 22.01.2020


Ответы (1)


Спасибо всем зрителям. На самом деле я нашел проблему. Публикация ответа здесь, чтобы другие, столкнувшиеся с такой проблемой, могли избавиться от этой проблемы.

Мне нужно было импортировать spark.implicits._ здесь

object dataParser {
def getData(inputPath: String, delimeter: String)(implicit spark: SparkSession): Dataset[MyCaseClass] = {
**import spark.implicits._**
  val parsedData: Dataset[MyCaseClass] = spark.read
                                         .option("header", "false")
                                         .option("delimeter", "delimeter")
                                         .option("inferSchema", "true")
                                         .schema(mySchema)
                                         .load(inputPath)
                                         .as[MyCaseClass]
  parsedData
}
}
person Shashwat Sharma    schedule 22.01.2020
comment
Да, это было в приложении, но нам это нужно даже в парсере. - person Shashwat Sharma; 23.01.2020
comment
Хм, похоже, с этим кодом больше проблем. Здесь понадобится небольшая помощь. Схема тяжелая, имеет около 150 столбцов, но класс case имеет ограничение в 23. Итак, как мы можем предоставить as часть набора данных во время чтения? - person Shashwat Sharma; 03.02.2020
comment
Вы правы, класс case не может обрабатывать так много столбцов :( Но есть один трюк, который я знаю. Я опубликую ответ через некоторое время. - person Salim; 03.02.2020