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

Я получаю сообщение об ошибке выполнения, когда пытаюсь создать схему для фрейма данных в 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))  

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


person user2728349    schedule 17.12.2020    source источник
comment
Вы можете использовать тип String, а затем преобразовать его в тип даты в качестве альтернативного решения. String & Float имеет какие-то фиксированные данные, тогда как для типа даты у нас нет определенного формата даты.   -  person Srinivas    schedule 17.12.2020
comment
@Srinivas Я думаю, мы все это знаем, но разве нет более элегантного подхода?   -  person thebluephantom    schedule 17.12.2020
comment
Вы имеете в виду что-то вроде: StructField (invoicedate, to_date (StringType,, MM-dd-yyyy) .as (to_date)), true) ?? Проблема заключается в определении схемы, получение источника даты может быть строковым, а затем преобразованным, но как решить проблему типа даты схемы? , Мне нужно сохранить тип Date вместо типа String ...   -  person user2728349    schedule 17.12.2020


Ответы (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)
...
...
person thebluephantom    schedule 17.12.2020