問題
在Databricks運行時版本5。X及以上,當寫小數點時亞馬遜紅移使用Spark-Avro作為默認的臨時文件格式,要麼寫操作失敗,但有例外:
當將數據加載到Redshift時出現錯誤(代碼1207):"無效的數字,值'"',Pos 0,類型:十進製"
或者write操作將寫入空值來代替十進製值。
導致
寫入Redshift時,數據首先存儲在S3中的臨時文件夾中,然後再加載到Redshift中。Apache Spark和Redshift之間存儲臨時數據的默認格式為Spark- avro。然而,Spark-Avro將小數存儲為二進製,Redshift將其解釋為空字符串或空字符串。
解決方案
方法將臨時文件格式更改為CSVtempformat選擇。你可以使用下麵的Scala代碼示例:
%scala //創建示例數據用例類createDec(值:BigDecimal) val df = Seq(createDec(45.24))。toDS //寫入Redshift (df。write .format("com.databricks.spark.redshift") .option("url", jdbcUrl) .option("tempdir", tempdir) .option("dbtable", "testtable") .option("aws_iam_role", "your_aws_iam_role") .option("tempformat", "CSV") .mode("append") .save())