Spark-使用多个“何时”优化查询

时间:2018-11-07 09:26:22

标签: apache-spark optimization query-optimization

有没有一种方法可以优化此查询,使其不多次使用withColumn。我最大的问题是我遇到了这个问题:https://issues.apache.org/jira/browse/SPARK-18532

查询是这样的。我有一个带有10个布尔列的数据框。 我有一些修饰符,例如:

val smallIncrease = 5
val smallDecrease = -5
val bigIncrease = 10
val bigDecrease = -10

基于每个布尔列,我想通过基于不同列中的值添加小/大增加/减少来计算最终分数。 所以现在我的查询看起来像这样:

df.withColumn("result", when(col("col1"), col("result") + lit(smallIncrease)).otherwise(col("result") + lit(smallDecrease)))
.withColumn("result", when(col("col2"), col("result") + lit(bigIncrease)).otherwise(col("result") + lit(bigDecrease)))
.withColumn("result", when(col("col3"), col("result") + lit(smallIncrease)).otherwise(col("result") + lit(smallDecrease)))
.withColumn("result", when(col("col4"), col("result") + lit(smallIncrease)).otherwise(col("result") + lit(smallDecrease)))
.withColumn("result", when(col("col5"), col("result") + lit(smallIncrease)).otherwise(col("result") + lit(bigDecrease)))
.withColumn("result", when(col("col6"), col("result") + lit(bigIncrease)).otherwise(col("result") + lit(smallDecrease)))
.withColumn("result", when(col("col7"), col("result") + lit(smallIncrease)).otherwise(col("result") + lit(smallDecrease)))

有没有一种方法可以压缩此查询并避免多个withColumns。 Unfortunaltey UDF不建议使用,因为要考虑的布尔列超过10个,并且UDF限制为10列。也许我可以将其拆分为2个UDF,但这对我来说看起来很丑...

1 个答案:

答案 0 :(得分:0)

这样的事情怎么样?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
  char dayofweek[] = "Friday";
  int day = 13;
  char month[] = "May";
  int year = 1927; 
  char *string; //I want to save my date into this string
  const size_t memory;


//trying to allocate memory
memory = malloc(strlen(dayofweek)+strlen(month)+intlen(day)+intlen(year));

//trying to write my strings and ints into one string
snprintf(string, memory, "%s der %d.%s %d\n", dayofweek, day, month, year);


printf("%s\n", string);


free(string);
return 0;
}