从sqoop进口为镶木地板的表不在spark中工作

时间:2015-04-15 05:26:16

标签: scala apache-spark sqoop

我使用Sqoop 1.4.5以镶木地板格式从mssql服务器导入了一个表。但是当我尝试从Spark shell加载它时,它会抛出错误,如:

scala> val df1 = sqlContext.load("/home/bipin/Customer2")
scala.collection.parallel.CompositeThrowable: Multiple exceptions thrown during a parallel computation: java.lang.NullPointerException
parquet.format.converter.ParquetMetadataConverter.fromParquetStatistics(ParquetMetadataConverter.java:249)
parquet.format.converter.ParquetMetadataConverter.fromParquetMetadata(ParquetMetadataConverter.java:543)
parquet.format.converter.ParquetMetadataConverter.readParquetMetadata(ParquetMetadataConverter.java:520)
parquet.hadoop.ParquetFileReader.readFooter(ParquetFileReader.java:426)
org.apache.spark.sql.parquet.ParquetRelation2$MetadataCache$$anonfun$refresh$6.apply(newParquet.scala:298)
org.apache.spark.sql.parquet.ParquetRelation2$MetadataCache$$anonfun$refresh$6.apply(newParquet.scala:297)
scala.collection.parallel.mutable.ParArray$Map.leaf(ParArray.scala:658)
scala.collection.parallel.Task$$anonfun$tryLeaf$1.apply$mcV$sp(Tasks.scala:54)
scala.collection.parallel.Task$$anonfun$tryLeaf$1.apply(Tasks.scala:53)
scala.collection.parallel.Task$$anonfun$tryLeaf$1.apply(Tasks.scala:53)
.
.
.
        at scala.collection.parallel.package$$anon$1.alongWith(package.scala:87)
        at scala.collection.parallel.Task$class.mergeThrowables(Tasks.scala:86)
        at scala.collection.parallel.mutable.ParArray$Map.mergeThrowables(ParArray.scala:650)
        at scala.collection.parallel.Task$class.tryMerge(Tasks.scala:72)
        at scala.collection.parallel.mutable.ParArray$Map.tryMerge(ParArray.scala:650)
        at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask$class.internal(Tasks.scala:190)
        at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.internal(Tasks.scala:514)
        at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask$class.compute(Tasks.scala:162)
        at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.compute(Tasks.scala:514)
        at scala.concurrent.forkjoin.RecursiveAction.exec(RecursiveAction.java:160)
        at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
        at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
        at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
        at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

我查看了sqoop镶木地板文件夹,它的结构与我在Spark上创建的结构不同。如何使镶木地板文件有效?

3 个答案:

答案 0 :(得分:2)

使用parquetFile代替loadload用于存储为DataFrame的数据。 guide中的更多示例。

val df1 = sqlContext.parquetFile("/home/bipin/Customer2")

答案 1 :(得分:1)

Parquet版本不兼容。 Spark 1.2使用镶木地板1.6版。但您的镶木地板文件可能在1.7或更高版本中。 Parquet1.6读者无法解析实木复合地板1.7档。

下一个版本的spark(可能是1.5)将在未来出现在master分支的pom.xml中使用parquet1.7。

答案 2 :(得分:0)

这是Spark 1.1中来自镶木地板库的错误,请参阅PARQUET-136

  

对于字符串或二进制列,如果单个列中继中的所有值都为空,则min&列中继统计信息中的最大值。但是,在检查列树干修剪的统计信息时,缺少空检查,并导致NPE。相应的代码可以在这里找到。

此修复程序已纳入Spark 1.2.0,请参阅SPARK-3968

最简单的修复可能是升级,或者如果不可能,请确保没有列只有空值!