我正在尝试从mongo源读取并对其应用一些转换。但是当我尝试应用任何转换甚至做df.count()
时。我收到以下错误。
MongoTypeConversionException: Cannot cast DATE_TIME into a NullType
因此,我了解某列具有混合数据类型,在本例中为NULL
和TIMESTAMP
。我使用的是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对象。
答案 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,并且一切正常。