我用Spark从MapR DB读表。但是timestamp列被推断为InvalidType。从Mapr db读取数据时,也没有设置模式的选项。
root
|-- Name: string (nullable = true)
|-- dt: struct (nullable = true)
| |-- InvalidType: string (nullable = true)
我试图将列转换为时间戳,但得到了以下异常。
val df = spark.loadFromMapRDB("path")
df.withColumn("dt1", $"dt" ("InvalidType").cast(TimestampType))
.drop("dt")
df.show(5, false)
com.mapr.db.spark.exceptions.SchemaMappingException:无法在com.mapr的com.mapr.db.spark.sql.utils.MapRSqlUtils $ .convertField(MapRSqlUtils.scala:250)中为列{dt}推断出模式。位于com.mapr.db的com.mapr.db.spark.sql.utils.MapRSqlUtils $ .convertRootField(MapRSqlUtils.scala:48)中的.db.spark.sql.utils.MapRSqlUtils $ .convertObject(MapRSqlUtils.scala:64) .spark.sql.utils.MapRSqlUtils $$ anonfun $ documentsToRow $ 1.apply(MapRSqlUtils.scala:34)at com.mapr.db.spark.sql.utils.MapRSqlUtils $$ anonfun $ documentsToRow $ 1.apply(MapRSqlUtils.scala: 33)scala.collection.Iterator $$ anon $ 12.nextCur(Iterator.scala:434)at scala.collection.Iterator $$ anon $ 12.hasNext(Iterator.scala:440)at scala.collection.Iterator $$ anon $ 11 .hasNext(Iterator.scala:408)在org.apache.spark.sql。sales.expressions.GeneratedClass $ GeneratedIterator.processNext(Unknown Source)org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43)at org.apache.spark.sql.execution.WholeStageCodegenExec $$ anonfun $ 8位于org.apache.spark.sql.exe.SparkPlan的org.apache.spark.sql.execution.SparkPlan $$ anonfun $ 2.apply(SparkPlan.scala:234)的$$ anon $ 1.hasNext(WholeStageCodegenExec.scala:395) $$ anonfun $ 2.apply(SparkPlan.scala:228)at org.apache.spark.rdd.RDD $$ anonfun $ mapPartitionsInternal $ 1 $$ anonfun $ apply $ 25.apply(RDD.scala:827)at org.apache.spark .rdd.RDD $$ anonfun $ mapPartitionsInternal $ 1 $$ anonfun $ apply $ 25.apply(RDD.scala:827)org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)org.apache.spark .rdd.RDD。位于org.apache的org.apache.spark.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)org.apache.spark.rdd.RDD.iterator(RDD.scala:287)的computeOrReadCheckpoint(RDD.scala:323) .spark.scheduler.Task.run(Task.scala:108)at org.apache.spark.executor.Executor $ TaskRunner.run(Executor.scala:338)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java) :1149)java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)上运行(Executor.scala:338)java.lang.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)java.lang.Thread .RUN(Thread.java:748)运行(Executor.scala:338)java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)java.lang.Thread .RUN(Thread.java:748)
如果您知道表的架构。您可以创建自己的case类来定义表的模式,然后使用此case类加载表。
浏览此链接从MapR数据库加载数据作为Apache Spark数据集
如果该特定列具有有效的模式,还要检查MapRDB中的表
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。