Spark Redshift 作为 Parquet 保存到 s3
Spark Redshift saving into s3 as Parquet
将 redshift table 作为镶木地板文件保存到 s3 时出现问题...这来自日期字段。我将尝试将该列转换为 long 并将其存储为现在的 unix 时间戳。
Caused by: java.lang.NumberFormatException: multiple points
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1110)
at java.lang.Double.parseDouble(Double.java:540)
at java.text.DigitList.getDouble(DigitList.java:168)
at java.text.DecimalFormat.parse(DecimalFormat.java:1321)
at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1793)
at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1455)
at com.databricks.spark.redshift.Conversions$$anon.parse(Conversions.scala:54)
at java.text.DateFormat.parse(DateFormat.java:355)
at com.databricks.spark.redshift.Conversions$.com$databricks$spark$redshift$Conversions$$parseTimestamp(Conversions.scala:67)
at com.databricks.spark.redshift.Conversions$$anonfun.apply(Conversions.scala:122)
at com.databricks.spark.redshift.Conversions$$anonfun.apply(Conversions.scala:108)
at scala.collection.TraversableLike$$anonfun$map.apply(TraversableLike.scala:244)
at scala.collection.TraversableLike$$anonfun$map.apply(TraversableLike.scala:244)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:108)
at com.databricks.spark.redshift.Conversions$.com$databricks$spark$redshift$Conversions$$convertRow(Conversions.scala:108)
at com.databricks.spark.redshift.Conversions$$anonfun$createRowConverter.apply(Conversions.scala:135)
at com.databricks.spark.redshift.Conversions$$anonfun$createRowConverter.apply(Conversions.scala:135)
at scala.collection.Iterator$$anon.next(Iterator.scala:328)
at scala.collection.Iterator$$anon.next(Iterator.scala:328)
at org.apache.spark.sql.execution.datasources.DefaultWriterContainer.writeRows(WriterContainer.scala:241)
... 8 more
这些是我的 gradle 依赖项:
dependencies {
compile 'com.amazonaws:aws-java-sdk:1.10.31'
compile 'com.amazonaws:aws-java-sdk-redshift:1.10.31'
compile 'org.apache.spark:spark-core_2.10:1.5.1'
compile 'org.apache.spark:spark-sql_2.10:1.5.1'
compile 'com.databricks:spark-redshift_2.10:0.5.1'
compile 'com.fasterxml.jackson.module:jackson-module-scala_2.10:2.6.3'
}
编辑 1:df.write.parquet("s3n://bucket/path/log.parquet") 是我在使用 spark-redshift 加载红移数据后保存数据帧的方式。
编辑 2:我 运行 所有这些都在我的 macbook air 上,也许太多的数据会破坏 Dataframe?不确定...当我 'limit 1000' 时有效,只是不适用于整个 table... 所以 "query" 有效,但 "table" 不在 spark-redshift 中选项参数。
spark-redshift
维护者在这里。我相信您看到的错误是由 spark-redshift
中的 a thread-safety bug 引起的(Java DecimalFormat 实例不是线程安全的,我们在多个线程之间共享一个实例)。
这已在 0.5.2 release, which is available on Maven Central and Spark Packages 中修复。升级到 0.5.2,这应该可以工作!
将 redshift table 作为镶木地板文件保存到 s3 时出现问题...这来自日期字段。我将尝试将该列转换为 long 并将其存储为现在的 unix 时间戳。
Caused by: java.lang.NumberFormatException: multiple points
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1110)
at java.lang.Double.parseDouble(Double.java:540)
at java.text.DigitList.getDouble(DigitList.java:168)
at java.text.DecimalFormat.parse(DecimalFormat.java:1321)
at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1793)
at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1455)
at com.databricks.spark.redshift.Conversions$$anon.parse(Conversions.scala:54)
at java.text.DateFormat.parse(DateFormat.java:355)
at com.databricks.spark.redshift.Conversions$.com$databricks$spark$redshift$Conversions$$parseTimestamp(Conversions.scala:67)
at com.databricks.spark.redshift.Conversions$$anonfun.apply(Conversions.scala:122)
at com.databricks.spark.redshift.Conversions$$anonfun.apply(Conversions.scala:108)
at scala.collection.TraversableLike$$anonfun$map.apply(TraversableLike.scala:244)
at scala.collection.TraversableLike$$anonfun$map.apply(TraversableLike.scala:244)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:108)
at com.databricks.spark.redshift.Conversions$.com$databricks$spark$redshift$Conversions$$convertRow(Conversions.scala:108)
at com.databricks.spark.redshift.Conversions$$anonfun$createRowConverter.apply(Conversions.scala:135)
at com.databricks.spark.redshift.Conversions$$anonfun$createRowConverter.apply(Conversions.scala:135)
at scala.collection.Iterator$$anon.next(Iterator.scala:328)
at scala.collection.Iterator$$anon.next(Iterator.scala:328)
at org.apache.spark.sql.execution.datasources.DefaultWriterContainer.writeRows(WriterContainer.scala:241)
... 8 more
这些是我的 gradle 依赖项:
dependencies {
compile 'com.amazonaws:aws-java-sdk:1.10.31'
compile 'com.amazonaws:aws-java-sdk-redshift:1.10.31'
compile 'org.apache.spark:spark-core_2.10:1.5.1'
compile 'org.apache.spark:spark-sql_2.10:1.5.1'
compile 'com.databricks:spark-redshift_2.10:0.5.1'
compile 'com.fasterxml.jackson.module:jackson-module-scala_2.10:2.6.3'
}
编辑 1:df.write.parquet("s3n://bucket/path/log.parquet") 是我在使用 spark-redshift 加载红移数据后保存数据帧的方式。
编辑 2:我 运行 所有这些都在我的 macbook air 上,也许太多的数据会破坏 Dataframe?不确定...当我 'limit 1000' 时有效,只是不适用于整个 table... 所以 "query" 有效,但 "table" 不在 spark-redshift 中选项参数。
spark-redshift
维护者在这里。我相信您看到的错误是由 spark-redshift
中的 a thread-safety bug 引起的(Java DecimalFormat 实例不是线程安全的,我们在多个线程之间共享一个实例)。
这已在 0.5.2 release, which is available on Maven Central and Spark Packages 中修复。升级到 0.5.2,这应该可以工作!