Mongo Spark Connector:MongoTypeConversionException无法将DATE_TIME转换为NullType

时间:2018-03-17 07:07:01

标签: java mongodb apache-spark apache-spark-sql

我正在尝试从mongo源读取并对其应用一些转换。但是当我尝试应用任何转换甚至做df.count()时。我收到以下错误。

MongoTypeConversionException: Cannot cast DATE_TIME into a NullType

因此,我了解某列具有混合数据类型,在本例中为NULLTIMESTAMP。我使用的是mongo-spark-connector_2.11版本2.2.1,其中 ConflictTypes 的基本类型为 StringType

因此,解决方法是传递架构,列名称和类型,以便连接器不会推断类型本身。但是我如何传递模式?

这是我从mongo

中读取的Java代码
DataFrameReader x = ss.read().format("com.mongodb.spark.sql.DefaultSource").options("spark.mongodb.input.uri", "<mongo_uri>");
Dataset<Row> = x.load();

ss是SparkSession对象。

2 个答案:

答案 0 :(得分:0)

MongoDB Connector for Spark默认使用每个字段的1000个样本来构建其架构,因此,如果一个字段包含不同的数据类型(例如Null数据类型和datetime数据类型),MongoDB Connector for Spark可能不会采样日期时间数据,并将其作为Null数据类型。至少,当您使用count方法时,连接器将尝试从mongodb加载数据到spark数据帧中的特定数据类型,并导致以下错误:“ MongoTypeConversionException无法将DATE_TIME转换为NullType”

解决方案:

添加MongoDB Connector for Spark的样本数据以构建正确的架构。例如,在pyspark中:

df = session.read.format("com.mongodb.spark.sql.DefaultSource").option('sampleSize', 50000).load()

答案 1 :(得分:0)

我使用import java.sql.Timestamp,因为我的mongo字段具有Timestamp,并且一切正常。