Ошибка выполнения схемы типа данных Spark Scala

#scala #apache-spark #apache-kudu

#scala #apache-spark #apache-kudu

Вопрос:

При попытке создать схему для фрейма данных в Spark Scala я получаю сообщение об ошибке выполнения, в котором говорится:

 Exception in thread "main" java.lang.IllegalArgumentException: No support for Spark SQL type DateType
    at org.apache.kudu.spark.kudu.SparkUtil$.sparkTypeToKuduType(SparkUtil.scala:81)
    at org.apache.kudu.spark.kudu.SparkUtil$.org$apache$kudu$spark$kudu$SparkUtil$createColumnSchema(SparkUtil.scala:134)
    at org.apache.kudu.spark.kudu.SparkUtil$anonfun$kuduSchema$3.apply(SparkUtil.scala:120)
    at org.apache.kudu.spark.kudu.SparkUtil$anonfun$kuduSchema$3.apply(SparkUtil.scala:119)
    at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
    at org.apache.kudu.spark.kudu.SparkUtil$.kuduSchema(SparkUtil.scala:119)
    at org.apache.kudu.spark.kudu.KuduContext.createSchema(KuduContext.scala:234)
    at org.apache.kudu.spark.kudu.KuduContext.createTable(KuduContext.scala:210)
 

где код похож на:

 val invoicesSchema = StructType(
    List(
        StructField("id", StringType, false),
        StructField("invoicenumber", StringType, false),
        StructField("invoicedate", DateType, true)
    ))

kuduContext.createTable("invoices", invoicesSchema, Seq("id","invoicenumber"), new CreateTableOptions().setNumReplicas(3).addHashPartitions(List("id").asJava, 6))  

 

Как я могу использовать тип даты для этого вопроса? StringType и FloatType не имеют такой же проблемы в одном и том же коде

Комментарии:

1. Вы можете использовать строковый тип, а затем привести его к типу даты в качестве альтернативного решения.. String amp; Float имеет какие-то фиксированные данные, где для типа даты у нас нет определенного формата даты.

2. @Srinivas Я думаю, мы все это знаем, но разве нет более элегантного подхода?

3. Вы имеете в виду что-то вроде: StructField(«invoicedate», to_date (StringType, ,»ММ-дд-гггг»).as(«to_date») ), true)?? Проблема заключается в определении схемы, получение источника даты может быть строкой, а затем преобразовано, но как решить проблему типа даты схемы? мне нужно сохранить тип даты вместо строкового типа…

Ответ №1:

Обходной путь, как я его называю, с примером, который вам нужно адаптировать, но дает вам суть того, что вам нужно знать, я думаю:

 import org.apache.spark.sql.types.{StructType, StructField, StringType, IntegerType, DateType}
import org.apache.spark.sql.functions._

val df = Seq( ("2018-01-01", "2018-01-31", 80)
            , ("2018-01-07","2018-01-10", 10)
            , ("2018-01-07","2018-01-31", 10)
            , ("2018-01-11","2018-01-31", 5)
            , ("2018-01-25","2018-01-27", 5)
            , ("2018-02-02","2018-02-23", 100)
            ).toDF("sd","ed","coins")

val schema = List(("sd", "date"), ("ed", "date"), ("coins", "integer"))
val newColumns = schema.map(c => col(c._1).cast(c._2))
val newDF = df.select(newColumns:_*)
newDF.show(false)
...
...