我有一个数据集<行> ,其中包含从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格式编写时,不支持空数据类型例外。
答案 0 :(得分:1)
我认为您在数据集或数据框本身中存在问题。对我来说
df.coalesce(1).write.option("delimiter", "^").mode(SaveMode.Overwrite).csv("<path>")
这按预期工作。用“ ^”定界。我建议检查您的数据框或数据集的数据以及您对其执行的操作。在写入数据之前,请使用df.count一次,然后查看其是否失败