转换Spark Dataframe列

时间:2016-10-03 17:24:24

标签: scala apache-spark dataframe spark-dataframe

我正在使用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); } 时,它会抛出一个"任务不可序列化"例外。我究竟做错了什么?另外,有更好的方法吗?

谢谢!

1 个答案:

答案 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")))