【发布时间】:2016-07-18 18:28:31
【问题描述】:
我有以 Avro 格式存储的现有 Hive 数据。无论出于何种原因,通过执行 SELECT 来读取这些数据都非常慢。我还没弄清楚为什么。数据是分区的,我的 WHERE 子句总是跟在分区列之后。所以我决定通过导航到分区路径并使用 Spark SQLContext 直接读取数据。这工作得更快。但是,我遇到的问题是读取 DOUBLE 值。 Avro 以二进制格式存储它们。 当我在 Hive 中执行以下查询时:
select myDoubleValue from myTable;
我得到了正确的预期值
841.79
4435.13
.....
但以下 Spark 代码:
val path="PathToMyPartition"
val sqlContext = new SQLContext(sc)
val df = sqlContext.read.avro(path)
df.select("myDoubleValue").rdd.map(x => x.getAs[Double](0))
给了我这个例外
java.lang.ClassCastException : [B cannot be cast to java.lang.Double
提供架构或将以二进制格式存储的值转换为双精度格式的正确方法是什么?
【问题讨论】:
-
您的值是字符串格式的吗?数据框中的数据是什么格式的?
-
当我运行 df.schema 时,相关字段的格式如下:binary (nullable = true) 所以我假设,同样基于我得到的错误,它是二进制的
标签: apache-spark binary hive double avro