使用 SparkSQL 和 HiveContext 读取 Parquet 文件时出错

Posted

技术标签:

【中文标题】使用 SparkSQL 和 HiveContext 读取 Parquet 文件时出错【英文标题】:Error reading Parquet file with SparkSQL and HiveContext 【发布时间】:2016-03-31 10:32:47 【问题描述】:

我正在尝试从 Hive(嗯,它是 Impala)读取以镶木地板格式存储的表。我使用 Spark 1.3.0 和 HiveContext。

表的架构是:

(a,DoubleType)
(b,DoubleType)
(c,IntegerType)
(d,StringType)
(e,DecimalType(18,0))

我的代码是:

val sc = new SparkContext(conf)
val hc = new HiveContext(sc)
import hc.implicits._
import hc.sql
val df: DataFrame = hc.table(mytable)

跟踪日志错误是:

16/03/31 11:33:34 WARN scheduler.TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, cloudera-smm-2.desa.taiif.aeat): java.lang.ClassCastException: scala.runtime.BoxedUnit cannot be cast to org.apache.spark.sql.types.Decimal
at org.apache.spark.sql.types.Decimal$DecimalIsFractional$.toDouble(Decimal.scala:330)
at org.apache.spark.sql.catalyst.expressions.Cast$$anonfun$castToDouble$5.apply(Cast.scala:361)
at org.apache.spark.sql.catalyst.expressions.Cast$$anonfun$castToDouble$5.apply(Cast.scala:361)
at org.apache.spark.sql.catalyst.expressions.Cast.eval(Cast.scala:426)
at org.apache.spark.sql.catalyst.expressions.Alias.eval(namedExpressions.scala:105)
at org.apache.spark.sql.catalyst.expressions.InterpretedMutableProjection.apply(Projection.scala:68)
at org.apache.spark.sql.catalyst.expressions.InterpretedMutableProjection.apply(Projection.scala:52)
at scala.collection.Iterator$$anon$11.next(Iterator.scala:328)
...

十进制格式似乎没有正确转换。有什么想法吗?

【问题讨论】:

【参考方案1】:

问题在于 SparkSQL 使用其内置的元存储,而不是使用 Hive 中现有的元存储。

您应该将此属性设置为 false

hc.setConf("spark.sql.hive.convertMetastoreParquet", "false")

【讨论】:

以上是关于使用 SparkSQL 和 HiveContext 读取 Parquet 文件时出错的主要内容,如果未能解决你的问题,请参考以下文章

hive kerberos sparksql怎么创建hivecontext

HiveContext 与火花 sql

Spark SQL:HiveContext 不要忽略标头

带有 HIVE 的 SparkSQL

Spark SQL(通过 HiveContext 进行 Hive 查询)总是创建 31 个分区

理解Spark SQL(二)—— SQLContext和HiveContext