我正在使用Spark数据帧。我的数据框中有一个分类变量,有很多级别。我正在尝试对这个变量进行简单的转换 - 只选择具有大于n个观察值的前几个级别(比如1000)。将所有其他级别分成一个"其他"类别。
我对Spark很新,所以我一直在努力实现这一点。这是我迄今为止所取得的成就:
/static/css/custom.css
/static/css/form/button.css
/static/css/form/images/buttondisabled.png
/static/images/ui/buttons/add_item.png
/static/images/ui/menu/help.png
这给了我一个数组,其中包含我想要保留的关卡名称。接下来,我应该定义可以应用于列的转换函数。这是我陷入困境的地方。我相信我们需要创建一个用户定义的功能。这就是我试过的:
path1root /usr/local/www/style1;
path2root /usr/local/www/style2;
path3root /usr/local/www/style3;
location /static
{
try_files path1root/$uri path2root/$uri path3root/$uri (=404);
}
然而,当我尝试location /static
{
path1root /usr/local/www/style1;
path2root /usr/local/www/style2;
path3root /usr/local/www/style3;
try_files path1root/$uri path2root/$uri path3root/$uri (=404);
}
时,它会抛出一个"任务不可序列化"例外。我究竟做错了什么?另外,有更好的方法吗?
谢谢!
答案 0 :(得分:1)
在我看来,这是一个解决方案,对于这样一个简单的转换更好:坚持使用DataFrame API并信任催化剂和Tungsten进行优化(例如进行广播连接):
val levels_count = df
.groupBy($"Col_name".as("new_col_name"))
.count
.filter("count >10000")
val df_new = df
.join(levels_count,$"Col_name"===$"new_col_name", joinType="leftOuter")
.drop("Col_name")
.withColumn("new_col_name",coalesce($"new_col_name", lit("other")))