Apache spark spark salesforce连接器中的空类型架构

Apache spark spark salesforce连接器中的空类型架构,apache-spark,apache-spark-sql,salesforce,Apache Spark,Apache Spark Sql,Salesforce,我有一个数据集,从Salesforce导入了48列: 数据集df=spark.read() .format(“com.springml.spark.salesforce”) .option(“用户名”,prop.getProperty(“salesforce_用户”)) .option(“密码”,prop.getProperty(“salesforce_auth”)) .option(“login”,prop.getProperty(“salesforce\u login\u url”)) .选

我有一个数据集,从Salesforce导入了48列:

数据集df=spark.read() .format(“com.springml.spark.salesforce”) .option(“用户名”,prop.getProperty(“salesforce_用户”)) .option(“密码”,prop.getProperty(“salesforce_auth”)) .option(“login”,prop.getProperty(“salesforce\u login\u url”)) .选项(“soql”,“从“+tableNm”中选择“+srcCols+”) .option(“版本”,prop.getProperty(“salesforce_版本”)) .load() 列也包含
null
。 我需要将此数据集存储在.txt文件中,并以
^
分隔
我尝试使用以下方法将其存储为文本文件:

finalDS.coalesce(1).write().option(“分隔符”,“^”).toString().text(hdfsExportLoaction);
但我有一个错误:

线程“main”org.apache.spark.sql.AnalysisException中的异常:尝试将StructMap映射到Tuple1,但由于字段数不一致而失败。;
位于org.apache.spark.sql.catalyst.Analyzer$ResolveDeserializer$.org$apache$spark$sql$catalyst$Analyzer$ResolveDeserializer$$fail(Analyzer.scala:2320)
我试过:

finalDS.map(row->row.mkString(),Encoders.STRING()).write().option(“分隔符”,“^”).text(hdfsExportLoaction);
但是分隔符消失了,所有的数据都被连接起来写入

然后我尝试将其另存为csv(只是为了使其工作):

finalDS.coalesce(1).write().mode(SaveMode.Overwrite).option(“header”,“true”).option(“delimiter”,“^”).option(“nullValue”,“”“).csv(hdfsExportLoaction+“/”+tableNm);
以及:

finalDS.na().fill(“”).coalesce(1).write().option(“分隔符”,“^”).mode(SaveMode.Overwrite).csv(hdfsExportLoaction);
但后来它抱怨说

线程“main”java.lang.UnsupportedOperationException中的异常:CSV数据源不支持空数据类型。 什么也没用。
尝试作为文本文件写入时,可能会删除分隔符,也可能会出现错误,即只能将单个列写入文本文件

尝试以CSV形式写入时,则不支持空数据类型
异常。

我认为数据集或数据帧本身存在问题。对我来说

df.coalesce(1).write.option("delimiter", "^").mode(SaveMode.Overwrite).csv("<path>")
df.coalesce(1).write.option(“分隔符”,“^”).mode(SaveMode.Overwrite).csv(“”)

这工作正常。它正确地用“^”分隔。我建议检查您的数据帧或数据集的数据,以及您在其中执行的操作。在写入数据之前,请使用df.count一次并查看其失败与否

您的数据中不能有
null
,这就是它工作的原因。尝试在列中插入
null
,然后保存csv。让我知道它是否有效。我的案例中也有空数据。具有Null和字符串值的列请参见output1^^1548944642^true 1^2995029^1548937685^trueI分析了数据…在我的示例中,
Null
实际上是一个字符串
“Null”
。我应该如何解决这个问题?即使它是字符串,也不会起作用。Spark csv在所有场景中都能正常工作,因为有了新的信息,您使用的连接器中显然存在缺陷。虽然您可以尝试找到解决方法(检测带有
NullType
的列并显式转换这些列可能会起作用),但连接器的作者确实应该解决这个问题。我对问题进行了编辑,以包含您提供的信息,但如果您也能提供
df.printSchema()
的输出,那就太好了。@user10465355您是对的。正如您提到的
lit(null)
引入的问题,我将其更改为
lit(“null”)
(“null”作为文本),并且它工作正常。现在我可以保存为CVS。