2016-08-22 64 views
0
val temp = sqlContext.sql(s"SELECT A, B, C, (CASE WHEN (D) in (1,2,3) THEN ((E)+0.000)/60 ELSE 0 END) AS Z from TEST.TEST_TABLE") 
val temp1 = temp.map({ temp => ((temp.getShort(0), temp.getString(1)), (USAGE_TEMP.getDouble(2), USAGE_TEMP.getDouble(3)))}) 
.reduceByKey((x, y) => ((x._1+y._1),(x._2+y._2))) 

而不是上面的代码在hive层上进行计算(案例评估)我希望在scala中完成转换。我会怎么做?将hive sql查询转换为Spark

填写Map中的数据时可以做同样的事吗?

+0

'withColumn'method是另一种方法除了'map'通过下面sarvesh提出的方法 –

回答

1
val temp = sqlContext.sql(s"SELECT A, B, C, D, E from TEST.TEST_TABLE") 

val tempTransform = temp.map(row => { 
    val z = List[Double](1, 2, 3).contains(row.getDouble(3)) match { 
    case true => row.getDouble(4)/60 
    case _ => 0 
    } 
    Row(row.getShort(0), Row.getString(1), Row.getDouble(2), z) 
}) 

val temp1 = tempTransform.map({ temp => ((temp.getShort(0), temp.getString(1)), (USAGE_TEMP.getDouble(2), USAGE_TEMP.getDouble(3)))}) 
    .reduceByKey((x, y) => ((x._1+y._1),(x._2+y._2))) 
1

你可以使用这个语法以及

new_df = old_df.withColumn('target_column', udf(df.name)) 

如本example

val sqlContext = new SQLContext(sc) 
import sqlContext.implicits._ // for `toDF` and $"" 
import org.apache.spark.sql.functions._ // for `when` 

val df = sc.parallelize(Seq((4, "blah", 2), (2, "", 3), (56, "foo", 3), (100, null, 5))) 
    .toDF("A", "B", "C") 

val newDf = df.withColumn("D", when($"B".isNull or $"B" === "", 0).otherwise(1)) 

在你的情况下文称,执行SQL这是数据帧像下面 val temp = sqlContext.sql(s"SELECT A, B, C, D, E from TEST.TEST_TABLE")

并申请withColumn与壳体或whenotherwise或如果需要的话火花udf

,呼叫阶功能逻辑,而不是hiveudf