【问题标题】:scala collect always returns Array of type Anyscala collect 总是返回 Any 类型的数组
【发布时间】:2020-05-22 21:04:53
【问题描述】:

我正在尝试在数据帧上运行收集,然后对结果数组的元素执行操作。

scala> scans.withColumn("src_port_list", udf((x: Seq[Int]) => x.distinct).apply($"src_port_list")).select("src_port_list").collect().map(_(0))
res29: Array[Any] = Array(WrappedArray(38897, 35378, 32947, 24280, 33181, 24782, 40937, 20824, 39685, 39841, 40191, 39031, 40981, 40919, 24436, 39765, 39784, 39881, 41037, 41079, 38874, 39916, 39788, 40468, 40041, 40941, 39325, 38902, 38896, 36151, 41061, 41016, 38921, 39269, 24437, 39001, 24282, 38923, 38920, 39835, 38901, 37585, 38922, 40977, 38898, 39862, 40926, 39909, 38743, 39774, 39761, 40918), WrappedArray(50974, 50998, 51947, 51428, 51012, 50996, 50984, 51564, 51037, 51045, 50980, 51027, 51010, 51036, 51030, 51025, 50992, 50983, 50993, 51009, 50991, 50989, 50990, 51011, 51031, 50987, 50986, 50985, 51028, 51041, 51001, 51035, 51029, 51026, 50995, 50976, 50997, 50981, 50994, 50988, 50975), WrappedArray(53148, 52396, 52318, 52422, 52420, 53064, 52394, 52329, 53156, 53072, 53126, 53...

我需要将结果数组中的 WrappedArrays 转换为集合,以便我可以执行联合/交集操作,但因为它们被视为 Any 类型,所以我无法执行任何转换操作。

【问题讨论】:

  • _(0) 返回一个 Any。也许你想要_.getAsInt(0)
  • @LuisMiguelMejíaSuárez 我想这里应该是_.getAs[Array[Int]](0)
  • @BorisAzanov 啊我没看到它是嵌套数组。那么应该是_.getSeq[Int](0)

标签: arrays scala casting any collect


【解决方案1】:

在我发布问题时想通了:

需要导入scala.collection.mutable.WrappedArray并使用.asInstanceOf[WrappedArray[Int]]

【讨论】:

  • 使用 asInstanceOf 在 scala 中是一种不好的做法,最好使用模式匹配或具有泛型类型参数的方法来获取特定类型的东西,这些方法返回你需要的类型。例如org.apache.spark.sql.Row.getAs[T](n: Int)
  • @BorisAzanov 通常我会同意,但getAs 只是asInstanceOf 的好名字。
  • @LuisMiguelMejíaSuárez 是的,你是对的,那么这也是一个糟糕的选择
  • @BorisAzanov 好吧,您实际上别无选择,这就是 Spark 的设计方式。 SQL 模块是无类型的,句号。另一种方法是改用Datasets,但话又说回来,直到运行时它才会告诉你有什么问题,你可以尽快进行检查以避免浪费计算时间。
猜你喜欢
  • 2012-12-18
  • 2021-08-20
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
相关资源
最近更新 更多