使用Spark-Avro向AWS Redshift寫入十進製值時,作業失敗

了解如何在使用Spark-Avro將十進製值寫入AWS Redshift時解決作業失敗。

寫的亞當Pavlacka

最後發布時間:2022年5月31日

問題

在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())