gpt4 book ai didi

scala - 如何使用 Map[String,Long] 列作为 DataFrame 的头部并保留类型?

转载 作者:行者123 更新时间:2023-12-04 18:48:12 26 4
gpt4 key购买 nike

我有一个应用了filter条件的数据框

val colNames = customerCountDF
.filter($"fiscal_year" === maxYear && $"fiscal_month" === maxMnth)

在所有选定的行中,我只想要一行的最后一列。

最后一列类型是 Map[String, Long]。我想要 map 的所有键作为 List[String]

我试过下面的语法

val colNames = customerCountDF
.filter($"fiscal_year" === maxYear && $"fiscal_month" === maxMnth)
.head
.getMap(14)
.keySet
.toList
.map(_.toString)

我正在使用 map(_.toString)List[Nothing] 转换为 List[String]。我得到的错误是:

missing parameter type for expanded function ((x$1) => x$1.toString)
[error] val colNames = customerCountDF.filter($"fiscal_year" === maxYear && $"fiscal_month" === maxMnth).head().getMap(14).keySet.toList.map(_.toString)

df如下:

+-------------+-----+----------+-----------+------------+-------------+--------------------+--------------+--------+----------------+-----------+----------------+-------------+-------------+--------------------+
|division_name| low| call_type|fiscal_year|fiscal_month| region_name|abandon_rate_percent|answered_calls|connects|equiv_week_calls|equiv_weeks|equivalent_calls|num_customers|offered_calls| pv|
+-------------+-----+----------+-----------+------------+-------------+--------------------+--------------+--------+----------------+-----------+----------------+-------------+-------------+--------------------+
| NATIONAL|PHONE|CABLE CARD| 2016| 1|ALL DIVISIONS| 0.02| 10626| 0| 0.0| 0.0| 10649.8| 0| 10864|Map(subscribers_c...|
| NATIONAL|PHONE|CABLE CARD| 2016| 1| CENTRAL| 0.02| 3591| 0| 0.0| 0.0| 3598.6| 0| 3667|Map(subscribers_c...|
+-------------+-----+----------+-----------+------------+-------------+--------------------+--------------+--------+----------------+-----------+----------------+-------------+-------------+--------------------+

选择的最后一列的一行是

[Map(subscribers_connects -> 5521287, disconnects_hsd -> 7992, subscribers_xfinity home -> 6277491, subscribers_bulk units -> 4978892, connects_cdv -> 41464, connects_disconnects -> 16945, connects_hsd -> 32908, disconnects_internet essentials -> 10319, disconnects_disconnects -> 3506, disconnects_video -> 8960, connects_xfinity home -> 43012)] 

在应用过滤条件并从数据框中只取一行后,我想将最后一列的键作为 List[String] 获取。

最佳答案

类型问题很容易解决,方法是在源代码处显式指定类型参数,即 getMap(14)。由于您知道您需要 String -> Int 键值对的 Map,只需将 getMap(14) 替换为 getMap[String, Int](14)

至于 getMap[String, Int](14) 是一个空的 Map,这与您的数据有关,您只有一个空的 map 在 head 行的 index 14 处。

更多详情

在 Scala 中,当您创建 List[A] 时,Scala 会使用可用信息推断类型。

例如,

// Explicitly provide the type parameter info
scala> val l1: List[Int] = List(1, 2)
// l1: List[Int] = List(1, 2)

// Infer the type parameter by using the arguments passed to List constructor,
scala> val l2 = List(1, 2)
// l2: List[Int] = List(1, 2)

那么,当你创建一个空列表时会发生什么,

// Explicitly provide the type parameter info
scala> val l1: List[Int] = List()
// l1: List[Int] = List()

// Infer the type parameter by using the arguments passed to List constructor,
// but surprise, there are no argument since you are creating empty list
scala> val l2 = List()
// l2: List[Nothing] = List()

因此,现在当 Scala 什么都不知道时,它会选择它能找到的最合适的类型,即“空”类型 Nothing

当您对其他集合对象执行 toList 时会发生同样的事情,它会尝试从源对象推断类型参数。

scala> val ks1 = Map.empty[Int, Int].keySet
// ks1: scala.collection.immutable.Set[Int] = Set()
scala> val l1 = ks1.toList
// l1: List[Int] = List()

scala> val ks2 = Map.empty.keySet
// ks: scala.collection.immutable.Set[Nothing] = Set()
scala> val l2 = ks2.toList
// l1: List[Nothing] = List()

同样,您在 DataFramehead Row 上调用的 getMap(14) 推断Map 的类型参数使用它从 index 14 处的 Row 获取的值。因此,如果它在所述索引处未获得任何内容,则返回的 map 将与 Map.empty 相同,这是一个 Map[Nothing, Nothing]

这意味着你的整体,

val colNames = customerCountDF.filter($"fiscal_year" === maxYear && $"fiscal_month" === maxMnth).head.getMap(14).keySet.toList.map(_.toString)

相当于,

val colNames = Map.empty.keySet.toList.map(_.toString)

因此,

scala> val l = List()
// l1: List[Nothing] = List()

val colNames = l.map(_.toString)

综上所述,任何 List[Nothing] 都只能是一个空列表。

现在,有两个问题,一个是关于 List[Nothing] 的类型问题,另一个是关于它是空的。

关于scala - 如何使用 Map[String,Long] 列作为 DataFrame 的头部并保留类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53738811/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com