【问题标题】:WrappedArray to Array in HiveQLWrappedArray 到 HiveQL 中的数组
【发布时间】:2016-12-18 19:36:21
【问题描述】:

我正在使用collect_list 对一些列进行分组,例如:

val res = hiveContext.sql("SELECT date, time, collect_list(id) AS id_list FROM table1 GROUP BY date, time")

id_list 作为WrappedArray 返回:

WrappedArray(1,2,1,2)
WrappedArray(4,3,4)
WrappedArray(6,7,6,7,6)

但是,我将id_list 传递给myFunc,它将Array[Double] 作为输入:

def myFunc(xs: Array[Double]) {...}

我的问题是如何正确调用myFunc 来解析id_list。我有类似的东西:

res.collect.foreach(x => myFunc(x(2)))

但它给了我一个type mismatch; found : Any required: Array[Double] 错误。

WrappedArray 隐式转换为Array 的正确方法是什么,或者如何以优化的方式调用myFunc

谢谢!

【问题讨论】:

  • scala.collection.mutable.WrappedArray 有一个 def array: Array[T],所以像这样调用res.collect.foreach(x => myFunc(x(2).array)) 可能会解决你的问题。
  • @AllenChou 猜这里的主要问题是如何让Any 类型中的x(2) 首先被识别为数组,而不是直接转换它。

标签: arrays scala apache-spark apache-spark-sql hiveql


【解决方案1】:

这里的主要问题是将Any 显式转换为WrappedArray[Double],您可以这样做:

x(2).asInstanceOf[mutable.WrappedArray[Double]].toArray

在你的情况下。或者您可以使用模式匹配进行类型转换,详情请参考How to use a Scala match expression instead of isInstanceOf (to match types)

【讨论】:

  • 谢谢。我确实尝试了您的解决方案并且它有效。最初它也可以在没有mutable 的情况下工作。解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
  • 2021-09-22
相关资源
最近更新 更多