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

时间:2019-02-18 13:36:53

标签: apache-spark apache-spark-sql salesforce

我有一个数据集<行> ,其中包含从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格式编写时,不支持空数据类型例外。

1 个答案:

答案 0 :(得分:1)

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

df.coalesce(1).write.option("delimiter", "^").mode(SaveMode.Overwrite).csv("<path>")

这按预期工作。用“ ^”定界。我建议检查您的数据框或数据集的数据以及您对其执行的操作。在写入数据之前,请使用df.count一次,然后查看其是否失败