2017-02-27 29 views
0

後的代碼插入新列我怎麼可以處理數據,並使用數據框

val df = spark.sql(sql_query) 
df.show() 

我得到一個架構

// +--------+-------+ 
// | id_card| year| 
// +--------+-------+ 
// |001_1976| 2017 | 
// |015_1983| 2012 | 
// |078_1963| 2011 | 
// +--------+-------+ 

那麼我想"work_year"(year - id_card.substring(4,8)) 我有一個名爲新列閱讀源代碼有關withColumn()我注意到的withColumn列PARAM必須org.apache.spark.sqlColumn,而不是簡單的字符串,它確實讓我感到不安。

spark version: Spark 2.1.0 

scala version: 2.12.1 

jdk version: 1.8 

回答

1

你可以沿着使用withColumn功能上的數據幀DF與UDF來完成這件事。

import org.apache.spark.sql.functions.udf 

val df = sc.parallelize((Seq(("001_1976", 2017),("015_1983", 2012),("078_1963", 2011)))).toDF("c1", "c2") 

val work_year = udf((x: String) => x.substring(4,8)) 

scala> df.withColumn("work_year", work_year($"c1")).show() 
+--------+----+---------+ 
|  c1| c2|work_year| 
+--------+----+---------+ 
|001_1976|2017|  1976| 
|015_1983|2012|  1983| 
|078_1963|2011|  1963| 
+--------+----+---------+ 

或使用火花SQL如下圖所示

df.registerTempTable("temp_table") 

scala> spark.sql("SELECT c1,c2, substring(c1,5,8) from temp_table").show() 
+--------+----+-------------------+ 
|  c1| c2|substring(c1, 5, 8)| 
+--------+----+-------------------+ 
|001_1976|2017|    1976| 
|015_1983|2012|    1983| 
|078_1963|2011|    1963| 
+--------+----+-------------------+ 
+0

謝謝!我會嘗試。 – Pulga

+0

關於Java版本是什麼嗎? – Pulga

+0

java版本應該是不相關的。但我會建議ATLEAST的Java 7+ –

1

擴展@流氓一個答案

爲OP問work_year = (year - id_card.substring(4,8))

則UDF應該

val work_year = udf((x: String, y: Int) => y - x.substring(4,8).toInt) 

df.withColumn("work_year", work_year($"id_card", $"year")).show() 

輸出:

+--------+----+---------+ 
| id_card|year|work_year| 
+--------+----+---------+ 
|001_1976|2017|  41| 
|015_1983|2012|  29| 
|078_1963|2011|  48| 
+--------+----+---------+ 
相關問題