2017-02-27 67 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| 
+--------+----+---------+ 
相关问题