#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)
...
...