У меня есть Набор данных с 48 столбцами, импортированными из Salesforce:
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 пустой тип данных не поддерживается исключение.