2017-05-26 63 views
-2

我有一個表test與兩列a: Stringb: String。我試圖將一些函數應用於a中的值,比如說a = 23和a-b(真實邏輯可能比這更復雜),然後創建另一個列c的表作爲「是」。scala使用針對表的方法

我試着按如下方式創建一個案例類num,將錶轉換爲類night,並將該函數應用於該表。我應該怎麼做,或者這是可行的?非常感謝!

case class num (a:String, b:String){ 

      def howmany ={ 
      // how should I put the logics here?  
      } 
    } 

sqlContext.table("test").as[num].//how can I then apply function `howmany`here? 
+0

我不知道斯卡拉,但有可能是什麼像一個map()函數,可能適用於這種情況 – OnNIX

回答

1

假設你有「數」一個數據框,你可以把你的邏輯在UDF和使用數據幀的withColumn API調用你的UDF,並添加新列。你可以找到這個方法的更多細節here

1

我認爲這是你需要的。

val spark = SparkSession 
    .builder() 
    .master("local") 
    .appName("ParquetAppendMode") 
    .getOrCreate() 

    import spark.implicits._ 

    val data = spark.sparkContext.parallelize(Seq(
    ("123", "125"), 
    ("23", "25"), 
    ("5", "9") 
    )).toDF("a", "b") // create a dataframe with dummy data 

    val logic = udf((a: String, b: String) => { 
    if (a.toInt ==23 && (a.toInt - b.toInt) <5) "yes" else "no" 
    }) 

    // add column with applying logic 
    val result = data.withColumn("newCol", logic(data("a"), data("b"))) 

    result.show() 
+0

你不需要這個udf,我們可以使用本地的Spark函數。 – mtoto

+0

@mtoto我使用UDF,因爲他說實時有更復雜的邏輯。 –

+0

'.withColumn'是轉換數據集的最佳方式嗎?我的意思是,如果我想追加許多列,該怎麼辦? – user4046073

1

您可以使用DataSet的map

sqlContext.table("test").as[num] 
      .map(num => if(a == 23 && a-b < 5) (num, "yes") else (num, "no")) 

或者你可以只使用一個過濾器,然後一個選擇:

sqlContext.table("test").where($"a" == 23 && ($"a"-$"b") < 5).select($"*", "yes".as("newCol")) 
+0

謝謝。我知道'.withColumn'是可以實現的。我只是想知道是否有其他的方法。我有很多需要追加的欄目,還有很多條件,所以我會有很多的地方。 – user4046073

+0

另一個問題是,a,b可能是列 – user4046073

+0

您需要提供細節,因爲這應該處理這些場景afaik。也許你在談論你需要一個案例陳述? –