从 Mapr DB 表中推断为 InvalidType 的 Spark 数据帧时间戳列

Posted

技术标签:

【中文标题】从 Mapr DB 表中推断为 InvalidType 的 Spark 数据帧时间戳列【英文标题】:Spark dataframe Timestamp column inferred as of InvalidType from Mapr DB table 【发布时间】:2019-04-29 21:24:28 【问题描述】:

我使用 Spark 从 MapR DB 读取表。但是时间戳列被推断为 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:架构不能 为列 dt 推断 在 com.mapr.db.spark.sql.utils.MapRSqlUtils$.convertField(MapRSqlUtils.scala:250) 在 com.mapr.db.spark.sql.utils.MapRSqlUtils$.convertObject(MapRSqlUtils.scala:64) 在 com.mapr.db.spark.sql.utils.MapRSqlUtils$.convertRootField(MapRSqlUtils.scala:48) 在 com.mapr.db.spark.sql.utils.MapRSqlUtils$$anonfun$documentsToRow$1.apply(MapRSqlUtils.scala:34) 在 com.mapr.db.spark.sql.utils.MapRSqlUtils$$anonfun$documentsToRow$1.apply(MapRSqlUtils.scala:33) 在 scala.collection.Iterator$$anon$12.nextCur(Iterator.scala:434) 在 scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:440) 在 scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:408) 在 org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator.processNext(未知 资源) 在 org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43) 在 org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$8$$anon$1.hasNext(WholeStageCodegenExec.scala:395) 在 org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:234) 在 org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:228) 在 org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$25.apply(RDD.scala:827) 在 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.computeOrReadCheckpoint(RDD.scala:323) 在 org.apache.spark.rdd.RDD.iterator(RDD.scala:287) 在 org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87) 在 org.apache.spark.scheduler.Task.run(Task.scala:108) 在 org.apache.spark.executor.Executor$TaskRunner.run(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)

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

如果您知道表的架构。您可以创建自己的案例类来定义表的架构,然后使用此案例类加载表。

通过此链接Loading Data from MapR Database as an Apache Spark Dataset

如果该特定列是否具有有效架构,还要检查 MapRDB 中的表

【讨论】:

以上是关于从 Mapr DB 表中推断为 InvalidType 的 Spark 数据帧时间戳列的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode -- 推断链表中是否有环

db2导出数据并导入hive临时表中

MapR 分发中使用的容器架构是啥?

一文读懂MapR Apache Hadoop的MapR发行版白皮书

从 DB2 中的表中获取值

Codeigniter:从多个表中选择