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

У меня есть 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 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.

1 Ответ

0 голосов
/ 22 января 2020

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

Мне нужно было импортировать 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
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...