Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mongo Spark连接器:MongoTypeConversionException无法将日期\时间强制转换为NullType_Java_Mongodb_Apache Spark_Apache Spark Sql - Fatal编程技术网

Java Mongo Spark连接器:MongoTypeConversionException无法将日期\时间强制转换为NullType

Java Mongo Spark连接器:MongoTypeConversionException无法将日期\时间强制转换为NullType,java,mongodb,apache-spark,apache-spark-sql,Java,Mongodb,Apache Spark,Apache Spark Sql,我试图从mongo源代码中读取数据,并对其应用一些转换。但当我尝试应用任何转换或甚至进行df.count时。我得到以下错误 MongoTypeConversionException: Cannot cast DATE_TIME into a NullType 因此,我理解列具有混合数据类型,在本例中为NULL和TIMESTAMP。我使用的是mongo-spark-connector_2.11版本2.2.1,它说ConflictTypes有一个基类型作为StringType 因此,一种解决方法是

我试图从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对象。

请导入Java SQL日期,它将解决此问题

import java.sql.Date;
//import java.util.Date;
错误类型:

Caused by: com.mongodb.spark.exceptions.MongoTypeConversionException: Cannot cast DATE_TIME into a StructType(StructField(date,IntegerType,false), S

请导入Java SQL日期,它将解决此问题

import java.sql.Date;
//import java.util.Date;
错误类型:

Caused by: com.mongodb.spark.exceptions.MongoTypeConversionException: Cannot cast DATE_TIME into a StructType(StructField(date,IntegerType,false), S

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

解决方案:

添加MongoDB Connector for Spark的示例数据,以构建正确的模式。例如,在pyspark中:

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

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

解决方案:

添加MongoDB Connector for Spark的示例数据,以构建正确的模式。例如,在pyspark中:

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

我使用import java.sql.Timestamp作为我的mongo字段的时间戳,一切正常。

我使用import java.sql.Timestamp作为我的mongo字段的时间戳,一切正常。

你能解释一下增加样本号如何解决这个问题吗?您是否仍在读取空字段?@Ted增加样本将显著增加Spark构建正确模式的可能性。如果Spark知道一个字段包含不同的数据类型,如Null数据类型和datetime数据类型,它将在dataframe中为该字段构建一个合适的列类型,如string。这应该标记为正确答案。您能否解释增加示例数将如何解决此问题?您是否仍在读取空字段?@Ted增加样本将显著增加Spark构建正确模式的可能性。如果Spark知道一个字段包含不同的数据类型,如Null数据类型和datetime数据类型,它将为dataframe中的该字段构建合适的列类型,如string。这应标记为正确答案。