我有 dataset<行> 带有从Salesforce导入的48列:
Dataset<Row> df = spark.read()
.format("com.springml.spark.salesforce")
.option("username", prop.getProperty("salesforce_user"))
.option("password", prop.getProperty("salesforce_auth"))
.option("login", prop.getProperty("salesforce_login_url"))
.option("soql", "SELECT "+srcCols+" from "+tableNm)
.option("version", prop.getProperty("salesforce_version"))
.load()
列也包含null
。我需要将此数据集存储在> .txt 文件中,并由^
划定。
我尝试使用以下方式存储作为文本文件:
finalDS.coalesce(1).write().option("delimiter", "^").toString().text(hdfsExportLoaction);
但是我有错误:
Exception in thread "main" org.apache.spark.sql.AnalysisException: Try to map struct<Columns....>to Tuple1, but failed as the number of fields does not line up.;
at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveDeserializer$.org$apache$spark$sql$catalyst$analysis$Analyzer$ResolveDeserializer$$fail(Analyzer.scala:2320)
我尝试了:
finalDS.map(row -> row.mkString(), Encoders.STRING()).write().option("delimiter", "^").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("delimiter", "^").mode(SaveMode.Overwrite).csv(hdfsExportLoaction);
,但随后抱怨
Exception in thread "main" java.lang.UnsupportedOperationException: CSV data source does not support null data type.
什么都没有用。
尝试写入文本文件时,要么要删除定界符,要么只能将单列写入文本文件,
的错误尝试写入CSV时,不支持 NULL数据类型 except。
我认为您在数据集或数据帧本身中遇到了问题。对我
df.coalesce(1).write.option("delimiter", "^").mode(SaveMode.Overwrite).csv("<path>")
这是按预期工作的。我建议检查您的数据框或数据集的数据以及您正在进行的操作。在编写数据之前,请使用DF.COUNT一次,然后查看其失败