gpt4 book ai didi

scala - 如何仅将 "cube"用于 Spark 数据帧上的特定字段?

转载 作者:行者123 更新时间:2023-12-04 15:19:31 25 4
gpt4 key购买 nike

我正在使用 Spark 1.6.1,并且我有这样一个数据框。

+-------------+-----------+-----------------+-------+-------+-------+----------+-------+-------+-------+-------+
| scene_id| action_id| classifier|os_name|country|app_ver| p0value|p1value|p2value|p3value|p4value|
+-------------+-----------+-----------------+-------+-------+-------+----------+-------+-------+-------+-------+
| test_home|scene_enter| test_home|android| KR| 5.6.3|__OTHERS__| false| test| test| test|
......

我想通过使用多维数据集操作获得如下数据框。

(按所有字段分组,但只有“os_name”、“country”、“app_ver”字段被立方)

+-------------+-----------+-----------------+-------+-------+-------+----------+-------+-------+-------+-------+---+
| scene_id| action_id| classifier|os_name|country|app_ver| p0value|p1value|p2value|p3value|p4value|cnt|
+-------------+-----------+-----------------+-------+-------+-------+----------+-------+-------+-------+-------+---+
| test_home|scene_enter| test_home|android| KR| 5.6.3|__OTHERS__| false| test| test| test| 9|
| test_home|scene_enter| test_home| null| KR| 5.6.3|__OTHERS__| false| test| test| test| 35|
| test_home|scene_enter| test_home|android| null| 5.6.3|__OTHERS__| false| test| test| test| 98|
| test_home|scene_enter| test_home|android| KR| null|__OTHERS__| false| test| test| test|101|
| test_home|scene_enter| test_home| null| null| 5.6.3|__OTHERS__| false| test| test| test|301|
| test_home|scene_enter| test_home| null| KR| null|__OTHERS__| false| test| test| test|225|
| test_home|scene_enter| test_home|android| null| null|__OTHERS__| false| test| test| test|312|
| test_home|scene_enter| test_home| null| null| null|__OTHERS__| false| test| test| test|521|
......

我试过像下面这样,但它似乎又慢又丑..
var cubed = df
.cube($"scene_id", $"action_id", $"classifier", $"country", $"os_name", $"app_ver", $"p0value", $"p1value", $"p2value", $"p3value", $"p4value")
.count
.where("scene_id IS NOT NULL AND action_id IS NOT NULL AND classifier IS NOT NULL AND p0value IS NOT NULL AND p1value IS NOT NULL AND p2value IS NOT NULL AND p3value IS NOT NULL AND p4value IS NOT NULL")

有更好的解决方案吗?

最佳答案

我相信你不能完全避免这个问题,但有一个简单的技巧可以减少它的规模。这个想法是用一个占位符替换所有不应被边缘化的列。

例如,如果您有 DataFrame :

val df = Seq((1, 2, 3, 4, 5, 6)).toDF("a", "b", "c", "d", "e", "f")

并且您对被 d 边缘化的立方体感兴趣和 e并按 a..c 分组您可以定义 a..c 的替代品作为:
import org.apache.spark.sql.functions.struct
import sparkSql.implicits._

// alias here may not work in Spark 1.6
val rest = struct(Seq($"a", $"b", $"c"): _*).alias("rest")

cube :
val cubed =  Seq($"d", $"e")

// If there is a problem with aliasing rest it can done here.
val tmp = df.cube(rest.alias("rest") +: cubed: _*).count

快速过滤和选择应该处理其余的:
tmp.where($"rest".isNotNull).select($"rest.*" +: cubed :+ $"count": _*)

结果如下:

+---+---+---+----+----+-----+
| a| b| c| d| e|count|
+---+---+---+----+----+-----+
| 1| 2| 3|null| 5| 1|
| 1| 2| 3|null|null| 1|
| 1| 2| 3| 4| 5| 1|
| 1| 2| 3| 4|null| 1|
+---+---+---+----+----+-----+

关于scala - 如何仅将 "cube"用于 Spark 数据帧上的特定字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40763325/

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